1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>AARM95 - Limited Types</TITLE>
<META NAME="Author" CONTENT="JTC1/SC22/WG9/ARG, by Randall Brukardt, ARG Editor">
<META NAME="GENERATOR" CONTENT="Arm_Form.Exe, Ada Reference Manual generator">
<STYLE type="text/css">
DIV.paranum {position: absolute; font-family: Arial, Helvetica, sans-serif; left: 0.5 em; top: auto}
TT {font-family: "Courier New", monospace}
DT {display: compact}
DIV.Normal {font-family: "Times New Roman", Times, serif; margin-bottom: 0.6em}
DIV.Wide {font-family: "Times New Roman", Times, serif; margin-top: 0.6em; margin-bottom: 0.6em}
DIV.Annotations {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-bottom: 0.6em}
DIV.WideAnnotations {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0.6em; margin-bottom: 0.6em}
DIV.Index {font-family: "Times New Roman", Times, serif}
DIV.SyntaxSummary {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.4em}
DIV.Notes {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.6em}
DIV.NotesHeader {font-family: "Times New Roman", Times, serif; margin-left: 2.0em}
DIV.SyntaxIndented {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.4em}
DIV.Indented {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-bottom: 0.6em}
DIV.CodeIndented {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-bottom: 0.6em}
DIV.SmallIndented {font-family: "Times New Roman", Times, serif; margin-left: 10.0em; margin-bottom: 0.6em}
DIV.SmallCodeIndented {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-bottom: 0.6em}
DIV.Examples {font-family: "Courier New", monospace; margin-left: 2.0em; margin-bottom: 0.6em}
DIV.SmallExamples {font-family: "Courier New", monospace; font-size: 80%; margin-left: 7.5em; margin-bottom: 0.6em}
DIV.IndentedExamples {font-family: "Courier New", monospace; margin-left: 8.0em; margin-bottom: 0.6em}
DIV.SmallIndentedExamples {font-family: "Courier New", monospace; font-size: 80%; margin-left: 15.0em; margin-bottom: 0.6em}
UL.Bulleted {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.SmallBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.NestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.SmallNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.IndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.CodeIndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.CodeIndentedNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.SyntaxIndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.NotesBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.NotesNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
DL.Hanging {font-family: "Times New Roman", Times, serif; margin-top: 0em; margin-bottom: 0.6em}
DD.Hanging {margin-left: 6.0em}
DL.IndentedHanging {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0em; margin-bottom: 0.6em}
DD.IndentedHanging {margin-left: 2.0em}
DL.HangingInBulleted {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.HangingInBulleted {margin-left: 4.0em}
DL.SmallHanging {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0em; margin-bottom: 0.6em}
DD.SmallHanging {margin-left: 7.5em}
DL.SmallIndentedHanging {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-top: 0em; margin-bottom: 0.6em}
DD.SmallIndentedHanging {margin-left: 2.0em}
DL.SmallHangingInBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.SmallHangingInBulleted {margin-left: 5.0em}
DL.Enumerated {font-family: "Times New Roman", Times, serif; margin-right: 0.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.Enumerated {margin-left: 2.0em}
DL.SmallEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.SmallEnumerated {margin-left: 2.5em}
DL.NestedEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
DL.SmallNestedEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
</STYLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFF0" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
<P><A HREF="AA-TOC.html">Contents</A> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-7-4.html">Previous</A> <A HREF="AA-7-6.html">Next</A></P>
<HR>
<H1> 7.5 Limited Types</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal"> [<A NAME="I3252"></A>A limited type is (a view
of) a type for which the assignment operation is not allowed. A nonlimited
type is a (view of a) type for which the assignment operation is allowed.]
</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>1.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Discussion: </B>The concept
of the <I>value</I> of a limited type is difficult to define, since the
abstract value of a limited type often extends beyond its physical representation.
In some sense, values of a limited type cannot be divorced from their
object. The value <I>is</I> the object.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>1.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>In Ada 83, in the two places where
limited types were defined by the language, namely tasks and files, an
implicit level of indirection was implied by the semantics to avoid the
separation of the value from an associated object. In Ada 95, most limited
types are passed by reference, and even return-ed by reference. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>1.c</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>To be honest: </B>For a limited
partial view whose full view is nonlimited, assignment is possible on
parameter passing and function return. To prevent any copying whatsoever,
one should make both the partial <I>and</I> full views limited. </FONT></DIV>
<H4 ALIGN=CENTER>Legality Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="Normal"> If a tagged record type has any limited components,
then the reserved word <B>limited</B> shall appear in its <FONT FACE="Arial, Helvetica">record_type_definition</FONT>.
</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>2.a</FONT></DIV>
<DIV Class="Annotations" Style="margin-bottom: 0.4em"><FONT SIZE=-1><B>Reason:
</B>This prevents tagged limited types from becoming nonlimited. Otherwise,
the following could happen: </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>2.b</FONT></DIV>
<DIV Class="SmallExamples"><TT><B>package</B> P <B>is</B><BR>
<B>type</B> T <B>is</B> <B>limited</B> <B>private</B>;<BR>
<B>type</B> R <B>is</B> <B>tagged</B><BR>
<B>record</B> --<I> Illegal!</I><BR>
--<I> This should say ``<B>limited record</B>''.</I><BR>
X : T;<BR>
<B>end</B> <B>record</B>;<BR>
<B>private</B><BR>
<B>type</B> T <B>is</B> <B>new</B> Integer; --<I> R becomes nonlimited here.</I><BR>
<B>end</B> P;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>2.c</FONT></DIV>
<DIV Class="SmallExamples"><TT><B>package</B> Q <B>is</B><BR>
<B>type</B> R2(Access_Discrim : <B>access</B> ...) <B>is</B> <B>new</B> R <B>with</B><BR>
<B>record</B><BR>
Y : Some_Task_Type;<BR>
<B>end</B> <B>record</B>;<BR>
<B>end</B> Q;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>2.d</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>If the above were legal, then
assignment would be defined for R'Class in the body of P, which is bad
news, given the access discriminant and the task. </FONT></DIV>
<H4 ALIGN=CENTER>Static Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> <A NAME="I3253"></A>A
type is <I>limited</I> if it is a descendant of one of the following:
</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>a type with the reserved word <B>limited</B> in its definition;
</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>4.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>Note that
there is always a ``definition,'' conceptually, even if there is no syntactic
category called ``..._definition''. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>a task or protected type;</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>a composite type with a limited component. </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<DIV Class="Normal"> <A NAME="I3254"></A>Otherwise, the type is nonlimited.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Normal"> [There are no predefined equality operators for
a limited type.] </DIV>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<DIV Class="Notes" Style="margin-bottom: 0.4em"><FONT SIZE=-1>13 The
following are consequences of the rules for limited types: </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<UL Class="NotesBulleted"><FONT SIZE=-1><LI TYPE=DISC>An initialization expression is not allowed in an <FONT FACE="Arial, Helvetica">object_declaration</FONT>
if the type of the object is limited.</LI></FONT></UL>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<UL Class="NotesBulleted"><FONT SIZE=-1><LI TYPE=DISC>A default expression is not allowed in a <FONT FACE="Arial, Helvetica">component_declaration</FONT>
if the type of the record component is limited.</LI></FONT></UL>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<UL Class="NotesBulleted"><FONT SIZE=-1><LI TYPE=DISC>An initialized allocator is not allowed if the designated
type is limited.</LI></FONT></UL>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<UL Class="NotesBulleted"><FONT SIZE=-1><LI TYPE=DISC>A generic formal parameter of mode <B>in</B> must not be
of a limited type. </LI></FONT></UL>
<DIV Class="Paranum"><FONT SIZE=-2>14</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>14 <FONT FACE="Arial, Helvetica">Aggregate</FONT>s
are not available for a limited composite type. Concatenation is not
available for a limited array type.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>15 The rules do not exclude
a <FONT FACE="Arial, Helvetica">default_expression</FONT> for a formal
parameter of a limited type; they do not exclude a deferred constant
of a limited type if the full declaration of the constant is of a nonlimited
type.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>16</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>16 <A NAME="I3255"></A><A NAME="I3256"></A><A NAME="I3257"></A>As
illustrated in <A HREF="AA-7-3-1.html">7.3.1</A>, an untagged limited
type can become nonlimited under certain circumstances. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>16.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>Limited private
types do not become nonlimited; instead, their full view can be nonlimited,
which has a similar effect.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>16.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>It is important to remember that
a single nonprivate type can be both limited and nonlimited in different
parts of its scope. In other words, ``limited'' is a property that depends
on where you are in the scope of the type. We don't call this a ``view
property'' because there is no particular declaration to declare the
nonlimited view.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>16.c</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>Tagged types never become nonlimited.
</FONT></DIV>
<H4 ALIGN=CENTER>Examples</H4>
<DIV Class="Paranum"><FONT SIZE=-2>17</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> <I>Example of a
package with a limited type:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>18</FONT></DIV>
<DIV Class="Examples"><TT><B>package</B> IO_Package <B>is</B><BR>
<B>type</B> File_Name <B>is</B> <B>limited</B> <B>private</B>;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>19</FONT></DIV>
<DIV Class="Examples"><TT> <B>procedure</B> Open (F : <B>in</B> <B>out</B> File_Name);<BR>
<B>procedure</B> Close(F : <B>in</B> <B>out</B> File_Name);<BR>
<B>procedure</B> Read (F : <B>in</B> File_Name; Item : <B>out</B> Integer);<BR>
<B>procedure</B> Write(F : <B>in</B> File_Name; Item : <B>in</B> Integer);<BR>
<B>private</B><BR>
<B>type</B> File_Name <B>is</B><BR>
<B>limited</B> <B>record</B><BR>
Internal_Name : Integer := 0;<BR>
<B>end</B> <B>record</B>;<BR>
<B>end</B> IO_Package;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>20</FONT></DIV>
<DIV Class="Examples"><TT><B>package</B> <B>body</B> IO_Package <B>is</B><BR>
Limit : <B>constant</B> := 200;<BR>
<B>type</B> File_Descriptor <B>is</B> <B>record</B> ... <B>end</B> <B>record</B>;<BR>
Directory : <B>array</B> (1 .. Limit) <B>of</B> File_Descriptor;<BR>
...<BR>
<B>procedure</B> Open (F : <B>in</B> <B>out</B> File_Name) <B>is</B> ... <B>end</B>;<BR>
<B>procedure</B> Close(F : <B>in</B> <B>out</B> File_Name) <B>is</B> ... <B>end</B>;<BR>
<B>procedure</B> Read (F : <B>in</B> File_Name; Item : <B>out</B> Integer) <B>is</B> ... <B>end</B>;<BR>
<B>procedure</B> Write(F : <B>in</B> File_Name; Item : <B>in</B> Integer) <B>is</B> ... <B>end</B>;<BR>
<B>begin</B><BR>
...<BR>
<B>end</B> IO_Package;</TT></DIV>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>21</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>17 <I>Notes on the example:</I>
In the example above, an outside subprogram making use of IO_Package
may obtain a file name by calling Open and later use it in calls to Read
and Write. Thus, outside the package, a file name obtained from Open
acts as a kind of password; its internal properties (such as containing
a numeric value) are not known and no other operations (such as addition
or comparison of internal names) can be performed on a file name. Most
importantly, clients of the package cannot make copies of objects of
type File_Name.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>22</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>This example is characteristic of any
case where complete control over the operations of a type is desired.
Such packages serve a dual purpose. They prevent a user from making use
of the internal structure of the type. They also implement the notion
of an encapsulated data type where the only operations on the type are
those given in the package specification.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>23</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>The fact that the full view of File_Name
is explicitly declared <B>limited</B> means that parameter passing and
function return will always be by reference (see <A HREF="AA-6-2.html">6.2</A>
and <A HREF="AA-6-5.html">6.5</A>). </FONT></DIV>
<H4 ALIGN=CENTER>Extensions to Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>23.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><A NAME="I3258"></A>The restrictions
in RM83-7.4.4(4), which disallowed <B>out</B> parameters of limited types
in certain cases, are removed. </FONT></DIV>
<H4 ALIGN=CENTER>Wording Changes from Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>23.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>Since limitedness and privateness
are orthogonal in Ada 95 (and to some extent in Ada 83), this is now
its own clause rather than being a subclause of <A HREF="AA-7-3.html">7.3</A>,
``<A HREF="AA-7-3.html">Private Types and Private Extensions</A>''. </FONT></DIV>
<HR>
<P><A HREF="AA-TOC.html">Contents</A> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-7-4.html">Previous</A> <A HREF="AA-7-6.html">Next</A> <A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>
|