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
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>AARM95 - Enumeration Representation Clauses</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-13-3.html">Previous</A> <A HREF="AA-13-5.html">Next</A></P>
<HR>
<H1> 13.4 Enumeration Representation Clauses</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal"> [An <FONT FACE="Arial, Helvetica">enumeration_representation_clause</FONT>
specifies the internal codes for enumeration literals.] </DIV>
<H4 ALIGN=CENTER>Syntax</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">enumeration_representation_clause<A NAME="I4460"></A>
::= </FONT><BR>
<B>for</B> <I>first_subtype_</I><A NAME="I4461"></A><FONT FACE="Arial, Helvetica">local_name</FONT> <B>use</B> <A NAME="I4462"></A><FONT FACE="Arial, Helvetica">enumeration_aggregate</FONT>;</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">enumeration_aggregate<A NAME="I4463"></A>
::= </FONT><A NAME="I4464"></A><FONT FACE="Arial, Helvetica">array_aggregate</FONT></DIV>
<H4 ALIGN=CENTER>Name Resolution Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="Normal"> <A NAME="I4465"></A>The <FONT FACE="Arial, Helvetica">enumeration_aggregate</FONT>
shall be written as a one-dimensional <FONT FACE="Arial, Helvetica">array_aggregate</FONT>,
for which the index subtype is the unconstrained subtype of the enumeration
type, and each component expression is expected to be of any integer
type. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>The ``full
coverage rules'' for <FONT FACE="Arial, Helvetica">aggregate</FONT>s
applies. An <B>others</B> is not allowed -- there is no applicable index
constraint in this context. </FONT></DIV>
<H4 ALIGN=CENTER>Legality Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="Normal"> The <I>first_subtype_</I><FONT FACE="Arial, Helvetica">local_name</FONT>
of an <FONT FACE="Arial, Helvetica">enumeration_representation_clause</FONT>
shall denote an enumeration subtype. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>As for all
type-related representation items, the <FONT FACE="Arial, Helvetica">local_name</FONT>
is required to denote a first subtype. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="Normal"> The expressions given in the <FONT FACE="Arial, Helvetica">array_aggregate</FONT>
shall be static, and shall specify distinct integer codes for each value
of the enumeration type; the associated integer codes shall satisfy the
predefined ordering relation of the type. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>Each value of the
enumeration type has to be given an internal code, even if the first
subtype of the enumeration type is constrained to only a subrange (this
is only possible if the enumeration type is a derived type). This ``full
coverage'' requirement is important because one may refer to Enum'Base'First
and Enum'Base'Last, which need to have defined representations. </FONT></DIV>
<H4 ALIGN=CENTER>Static Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<DIV Class="Normal"> <A NAME="I4466"></A><A NAME="I4467"></A>An <FONT FACE="Arial, Helvetica">enumeration_representation_clause</FONT>
specifies the <I>coding</I> aspect of representation. <A NAME="I4468"></A>The
coding consists of the <I>internal code</I> for each enumeration literal,
that is, the integral value used internally to represent each literal.</DIV>
<H4 ALIGN=CENTER>Implementation Requirements</H4>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Normal"> For nonboolean enumeration types, if the coding
is not specified for the type, then for each value of the type, the internal
code shall be equal to its position number. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>This default representation
is already used by all known Ada compilers for nonboolean enumeration
types. Therefore, we make it a requirement so users can depend on it,
rather than feeling obliged to supply for every enumeration type an enumeration
representation clause that is equivalent to this default rule. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Discussion: </B>For boolean
types, it is relatively common to use all ones for True, and all zeros
for False, since some hardware supports that directly. Of course, for
a one-bit Boolean object (like in a packed array), False is presumably
zero and True is presumably one (choosing the reverse would be extremely
unfriendly!). </FONT></DIV>
<H4 ALIGN=CENTER>Implementation Advice</H4>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> <A NAME="I4469"></A>The
recommended level of support for <FONT FACE="Arial, Helvetica">enumeration_representation_clause</FONT>s
is: </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>An implementation should support at least the internal
codes in the range System.Min_Int..System.Max_Int. An implementation
need not support <FONT FACE="Arial, Helvetica">enumeration_representation_clause</FONT>s
for boolean types. </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>10.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>The implementation
may support numbers outside the above range, such as numbers greater
than System.Max_Int. See AI83-00564. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>The benefits of
specifying the internal coding of a boolean type do not outweigh the
implementation costs. Consider, for example, the implementation of the
logical operators on a packed array of booleans with strange internal
codes. It's implementable, but not worth it. </FONT></DIV>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11/1</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>11 {<I><A HREF="defect1.html#8652/0009">8652/0009</A></I>}
Unchecked_Conversion may be used to query the internal codes used for
an enumeration type. The attributes of the type, such as Succ, Pred,
and Pos, are unaffected by the <FONT FACE="Arial, Helvetica"><U>enumeration_</U>representation_clause</FONT>.
For example, Pos always returns the position number, <I>not</I> the internal
integer code that might have been specified in a <FONT FACE="Arial, Helvetica"><U>enumeration_</U>representation_clause</FONT>.
</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11.a</FONT></DIV>
<DIV Class="Annotations" Style="margin-bottom: 0.4em"><FONT SIZE=-1><B>Discussion:
</B>Suppose the enumeration type in question is derived: </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11.b</FONT></DIV>
<DIV Class="SmallExamples"><TT><B>type</B> T1 <B>is</B> (Red, Green, Blue);<BR>
<B>subtype</B> S1 <B>is</B> T1 <B>range</B> Red .. Green;<BR>
<B>type</B> S2 <B>is</B> <B>new</B> S1;<BR>
<B>for</B> S2 <B>use</B> (Red => 10, Green => 20, Blue => 30);</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11.c/1</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>{<I><A HREF="defect1.html#8652/0009">8652/0009</A></I>}
The <FONT FACE="Arial, Helvetica"><U>enumeration_</U>representation_clause</FONT>
has to specify values for all enumerals, even ones that are not in S2
(such as Blue). The Base attribute can be used to get at these values.
For example: </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11.d</FONT></DIV>
<DIV Class="SmallExamples" Style="margin-bottom: 0.4em"><TT><B>for</B> I <B>in</B> S2'Base <B>loop</B><BR>
... --<I> When I equals Blue, the internal code is 30.</I><BR>
<B>end</B> <B>loop</B>;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11.e</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>We considered allowing or requiring
``<B>for</B> S2'Base <B>use</B> ...'' in cases like this, but it didn't
seem worth the trouble. </FONT></DIV>
<H4 ALIGN=CENTER>Examples</H4>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> <I>Example of an
enumeration representation clause:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<DIV Class="Examples"><TT><B>type</B> Mix_Code <B>is</B> (ADD, SUB, MUL, LDA, STA, STZ);</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14</FONT></DIV>
<DIV Class="Examples"><TT><B>for</B> Mix_Code <B>use</B><BR>
(ADD => 1, SUB => 2, MUL => 3, LDA => 8, STA => 24, STZ =>33);</TT></DIV>
<H4 ALIGN=CENTER>Extensions to Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>14.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><A NAME="I4470"></A>As in other
similar contexts, Ada 95 allows expressions of any integer type, not
just expressions of type <I>universal_integer</I>, for the component
expressions in the <FONT FACE="Arial, Helvetica">enumeration_aggregate</FONT>.
The preference rules for the predefined operators of <I>root_integer</I>
eliminate any ambiguity.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>For portability, we now require
that the default coding for an enumeration type be the ``obvious'' coding
using position numbers. This is satisfied by all known implementations.
</FONT></DIV>
<HR>
<P><A HREF="AA-TOC.html">Contents</A> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-13-3.html">Previous</A> <A HREF="AA-13-5.html">Next</A> <A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>
|