Efficient enum array keys?

Julian julian.fondren at gmail.com
Thu Apr 11 07:56:42 UTC 2019


On Thursday, 11 April 2019 at 06:45:23 UTC, Basile B. wrote:
> On Thursday, 11 April 2019 at 06:20:05 UTC, Julian wrote:
>> Is there a nicer way to have enum array keys in D?
>
> No. I've myself written my own EnumIndexedArray [1] type. It's 
> pretty simple. Just a couple of operator overload to preovide 
> the syntax.
>
> I went from ObjFPC/Delphi which has what you describe from Ada 
> too and missed it.
> (typically: `enum TStuff = (); var stuffStrings: array[TStuff] 
> of string;` ...)
>
> [1] 
> https://github.com/Basile-z/iz/blob/9ce6fc0e2e0c74f97d530ce598a6842b7b048f25/import/iz/enumset.d#L1086

Thanks. That still seems like enough work that I'd rather
do things the D way. At least if I don't also want Enum sets.

That gave me the idea for this though:

   import std.stdio;

   struct EnumRange(E) {
       int begin = E.min;
       int end = E.max + 1;
       bool empty() { return begin == end; }
       void popFront() { ++begin; }
       E front() { return cast(E) begin; }
   }

   enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, 
Friday, Saturday }

   void main() {
       int[Days.max+1] worklog;
       ++worklog[Days.Saturday];
       writeln("- worklog");
       EnumRange!(Days) why;
       foreach (day; why)
           writefln("%5d %s", worklog[day], day);
   }

Which I'm still disappointed is not:

    foreach (day; EnumRange!(Days))

Also, this isn't too bad:

   void main() {
       int[Days.max+1] worklog;
       ++worklog[Days.Saturday];
       writeln("- worklog");
       foreach (day, count; worklog)
           writefln("%5d %s", count, cast(Days) day);
   }

I don't see a difference in micro-benchmarks. *shrug*


More information about the Digitalmars-d-learn mailing list