| 1 | Alternate Enumeration Types
 | 
|---|
| 2 | ===========================
 | 
|---|
| 3 | A proposal to rework enumeration types.
 | 
|---|
| 4 | 
 | 
|---|
| 5 | This is a new design for enumerations in Cforall.
 | 
|---|
| 6 | They are based around extending C enumerations focusing on the logical
 | 
|---|
| 7 | view of enumerations, keeping the underlying representation opaque.
 | 
|---|
| 8 | 
 | 
|---|
| 9 | This does replace some of the existing features of Cforall; so implementing
 | 
|---|
| 10 | it will require redoing some work. However, while I do think the improvement
 | 
|---|
| 11 | will be worth it, I have included notes about how to regain some of the
 | 
|---|
| 12 | functionality/ease-of-use of typed enumerations. Because many of these uses
 | 
|---|
| 13 | were in the area of "enums as macros", some are not even enumeration features.
 | 
|---|
| 14 | 
 | 
|---|
| 15 | Note that all the new syntax and names are only examples;
 | 
|---|
| 16 | in addition to any functionally changes that could happen.
 | 
|---|
| 17 | 
 | 
|---|
| 18 | Sequential Enumerations
 | 
|---|
| 19 | ----------------------
 | 
|---|
| 20 | The sequential enumeration is the most basic form of enumeration.
 | 
|---|
| 21 | 
 | 
|---|
| 22 | ```cfa
 | 
|---|
| 23 | enum Colour seq {
 | 
|---|
| 24 |   Red,
 | 
|---|
| 25 |   Purple,
 | 
|---|
| 26 |   Violet = Purple,
 | 
|---|
| 27 |   Blue,
 | 
|---|
| 28 |   Green,
 | 
|---|
| 29 |   Yellow,
 | 
|---|
| 30 |   Orange,
 | 
|---|
| 31 | };
 | 
|---|
| 32 | ```
 | 
|---|
| 33 | 
 | 
|---|
| 34 | Uses traditional enum declaration syntax, where each label is uninitialized
 | 
|---|
| 35 | or initialized to another label in the enumeration (no cycles, possibly
 | 
|---|
| 36 | limited to previous labels).
 | 
|---|
| 37 | 
 | 
|---|
| 38 | Uninitialized labels introduce a new possible value into the enumeration.
 | 
|---|
| 39 | This value has no representation beyond the label(s) that represents it.
 | 
|---|
| 40 | Initialized labels are simple aliases to an existing value.
 | 
|---|
| 41 | 
 | 
|---|
| 42 | A type created this way automatically supports: copy construction,
 | 
|---|
| 43 | copy assignment, destruction and equality, inequality and ordering with
 | 
|---|
| 44 | itself. Each value is equal only to itself, so labels are equal to themselves
 | 
|---|
| 45 | and other labels via aliasing. Values are ordered low to high by first to
 | 
|---|
| 46 | last appearance of the uninitialized label.
 | 
|---|
| 47 | They can also be used in a switch statement with the labels used in case
 | 
|---|
| 48 | labels.
 | 
|---|
| 49 | (Default construction could be added by picking one of the labels - say the
 | 
|---|
| 50 | first - to be the default.)
 | 
|---|
| 51 | 
 | 
|---|
| 52 | Note: This does not add the enumeration labels to the enclosing scope. Use
 | 
|---|
| 53 | qualification to access it or write `inline enum Colour seq ...` to begin
 | 
|---|
| 54 | the enumeration.
 | 
|---|
| 55 | This is dependent on the module and namespacing system design.
 | 
|---|
| 56 | 
 | 
|---|
| 57 | Enumerated Arrays
 | 
|---|
| 58 | -----------------
 | 
|---|
| 59 | Arrays that use an enumeration as their index. The entire enumeration type
 | 
|---|
| 60 | (instead of a subset of int) is used in the index operation.
 | 
|---|
| 61 | 
 | 
|---|
| 62 | ```cfa
 | 
|---|
| 63 | extern string colourNames[Colour];
 | 
|---|
| 64 | ```
 | 
|---|
| 65 | 
 | 
|---|
| 66 | This example is a forward declaration that declares the symbol but does not
 | 
|---|
| 67 | give the values or allocate any storage. This is used in header files.
 | 
|---|
| 68 | The type of colourNames would be a new type `string[Colour]`.
 | 
|---|
| 69 | 
 | 
|---|
| 70 | In implementation tiles it is safe to give the array's values;
 | 
|---|
| 71 | whether it the array has been previously forward declared or not.
 | 
|---|
| 72 | ```cfa
 | 
|---|
| 73 | string colourNames[Colour] = {
 | 
|---|
| 74 |   "red",
 | 
|---|
| 75 |   "violet",
 | 
|---|
| 76 |   "blue",
 | 
|---|
| 77 |   // Or without worrying about ordering:
 | 
|---|
| 78 |   [Green] = "green",
 | 
|---|
| 79 |   [Orange] = "orange",
 | 
|---|
| 80 |   [Yellow] = "yellow",
 | 
|---|
| 81 | };
 | 
|---|
| 82 | ```
 | 
|---|
| 83 | 
 | 
|---|
| 84 | The forward declaration and full definition variants allow the user to manage
 | 
|---|
| 85 | memory themselves, following the same rules as `extern` variables.
 | 
|---|
| 86 | The user can use `const` to fix the values in the array.
 | 
|---|
| 87 | 
 | 
|---|
| 88 | Except for the index type (and that the size of the array is fixed per
 | 
|---|
| 89 | index type, as it always covers the whole enumeration) it should be the same
 | 
|---|
| 90 | as a traditional array.
 | 
|---|
| 91 | 
 | 
|---|
| 92 | Or one of the new safer Cforall arrays, as the features could be combined.
 | 
|---|
| 93 | 
 | 
|---|
| 94 | Combined Declaration
 | 
|---|
| 95 | --------------------
 | 
|---|
| 96 | People have requested, as a convenience feature, the ability to declare the
 | 
|---|
| 97 | enumeration and the array in one go. I say "People have requested" because
 | 
|---|
| 98 | I'm still working on the details, from storage to syntax, but a rough sketch
 | 
|---|
| 99 | of the feature would look like this:
 | 
|---|
| 100 | 
 | 
|---|
| 101 | ```cfa
 | 
|---|
| 102 | string colourNames[inline enum Colour] = {
 | 
|---|
| 103 |   Red = "red",
 | 
|---|
| 104 |   Purple = "violet",
 | 
|---|
| 105 |   Blue = "blue",
 | 
|---|
| 106 |   Green = "green",
 | 
|---|
| 107 |   Yellow = "yellow",
 | 
|---|
| 108 |   Orange = "orange",
 | 
|---|
| 109 | };
 | 
|---|
| 110 | ```
 | 
|---|
| 111 | 
 | 
|---|
| 112 | This should possibly be implemented as an extension.
 | 
|---|
| 113 | 
 | 
|---|
| 114 | Enumeration Iteration
 | 
|---|
| 115 | ---------------------
 | 
|---|
| 116 | Iterate through all values in a sequential enumeration.
 | 
|---|
| 117 | 
 | 
|---|
| 118 | The design very dependent on the overall design of the for-each loop and
 | 
|---|
| 119 | iterators in general (when added to the language).
 | 
|---|
| 120 | However, the behaviour should just go over every value in the enumeration in
 | 
|---|
| 121 | order of the initial appearance in the declaration.
 | 
|---|
| 122 | 
 | 
|---|
| 123 | Flag Set Enumerations
 | 
|---|
| 124 | ---------------------
 | 
|---|
| 125 | Another common use of enumerations is as a named bitset.
 | 
|---|
| 126 | 
 | 
|---|
| 127 | ```cfa
 | 
|---|
| 128 | enum Directions flag {
 | 
|---|
| 129 |   Up,
 | 
|---|
| 130 |   Down,
 | 
|---|
| 131 |   Left,
 | 
|---|
| 132 |   Right,
 | 
|---|
| 133 |   Upwards = Up,
 | 
|---|
| 134 |   Vertical = Up | Down,
 | 
|---|
| 135 | };
 | 
|---|
| 136 | ```
 | 
|---|
| 137 | 
 | 
|---|
| 138 | Uses the existing enumeration syntax, except that all initializers must be
 | 
|---|
| 139 | bitwise expressions, using only the operators |, & and ~ and, as leaf values,
 | 
|---|
| 140 | other labels from the enumeration (no cycles) and 0.
 | 
|---|
| 141 | 
 | 
|---|
| 142 | Each uninitialized label creates a new flag. Every instance of the
 | 
|---|
| 143 | enumeration will have each flag be set or unset. The labels act as instances
 | 
|---|
| 144 | of the enumeration with only that flag set.
 | 
|---|
| 145 | 
 | 
|---|
| 146 | A type created this way automatically supports: default construction,
 | 
|---|
| 147 | from zero_t construction, copy construction, copy assignment, destruction,
 | 
|---|
| 148 | equality, inequality and bitwise and (&), or (|) and not (~).
 | 
|---|
| 149 | Default construction and from zero_t construction create an instance with no
 | 
|---|
| 150 | flags set. Two instances are the same if the same flags are set.
 | 
|---|
| 151 | Bitwise operations act on the individual flags in the set.
 | 
|---|
| 152 | 
 | 
|---|
| 153 | In addition the type can be converted to a Boolean.
 | 
|---|
| 154 | An flag set is truthy if any flags are set and falsy if no flags are set.
 | 
|---|
| 155 | This is not a primitive operation, but comes from combining the zero_t
 | 
|---|
| 156 | constructor and inequality.
 | 
|---|
| 157 | 
 | 
|---|
| 158 | Note: Scoping rules are also waiting on the namespacing and module system.
 | 
|---|
| 159 | 
 | 
|---|
| 160 | Named Literal
 | 
|---|
| 161 | -------------
 | 
|---|
| 162 | (Replacing the "enum as macros" uses of typed enumerations.)
 | 
|---|
| 163 | 
 | 
|---|
| 164 | A new storage class specifier called `literal`. It specifies that the value
 | 
|---|
| 165 | is not stored but it is inlined at each use. These can be used like a macro
 | 
|---|
| 166 | except they respect scoping rules and are resolved and evaluated once.
 | 
|---|
| 167 | 
 | 
|---|
| 168 | A variable with literal storage allocates no memory and does not define
 | 
|---|
| 169 | any symbols for the linker. They must be initialized with a constant
 | 
|---|
| 170 | expression. All uses of a literal variable are rvalues (that is to say, they
 | 
|---|
| 171 | are treated as literals, you may not assign to them or get their address).
 | 
|---|
| 172 | 
 | 
|---|
| 173 | ```cfa
 | 
|---|
| 174 | literal int two = 2;
 | 
|---|
| 175 | ```
 | 
|---|
| 176 | 
 | 
|---|
| 177 | To allow this, there may have to be restrictions on the types that can be
 | 
|---|
| 178 | used with literal storage class. Some more implementation details will have
 | 
|---|
| 179 | to be known to decide what those are.
 | 
|---|