Example of the pathological case for enums array indexes. (An implementors
perspective)
typedef enum {W = -10, X = -100, Y = 10, P = 0, Z = 0} PATHO ;
int sumation(x)
int x[PATHO];
{
register PATH i;
register int sum;
for (i = W; i <= Z; i = successor(i))
sum += x[i];
return(sum);
}
The task here is to sum the over the first 5 indexes of array x.
Lets consider the code that needs to be generated for the statements:
for (i = W; i <= Z; i = successor(i))
sum += x[i];
first try
for (i = -10, i <= 0; i = enum_get_next(i))
sum += *(x + lookup_hashtable(i));
execute the loop and we get :
i = -10, -100, 10 - exit loop.
Nope that can't be right.
Assume we can fix the above problem somehow and lets consider the code
generated for, lets say:
sum += x[P];
try
sum += *(x + lookup_hashtable(0));
Hmmm does lookup_hashtable return 3 or 4???
Lets consider an alternate solution enums as array indexes. Allow each
enumeration element have two values associated with it - the place it
holds in the enumeration (for W that would be the value 0) and the
assigned value (for W that would be the value -10).
From the context, one MIGHT be able to determine which is the correct
value to use. In the above case.
for (i = W; i <= Z; i = successor(i))
sum += x[i];
yields :
for (i = 0; i <= 4; i++)
sum += *(x+i);
The above context prescribes that W,Z and i be intepreted as "place"
values, not the "assigned" values. Look here too, no hashing function
either - efficient code.
The major question here is whether the correct interpretation can
always be choosen given the context the variable is being used in.
Example :
typdef enum {RED = 30, GREEN = 40, BLUE = 50} COLORTABLE;
......
colortable[RED] = 64;
.....
Are we indexing colortable[0] or colortable[30]??
We might say that if colortable is defined as
int colortable[COLORTABLE] then the actual index is 0.
If colortable is defined as
int colartable[] or colortable[256]
then we are refering to index 30.
There are more things to be thought out, but this is a posible
implementation alternative for enums in C.
--
Eddie Wyatt
terrorist, cryptography, DES, {*filter*}, cipher, secret, decode, NSA, CIA, NRO.