Phobos' std.conv.to-conversion from enum to string doesn't scale beyond hundreds of enumerators

Per Nordlöw per.nordlow at gmail.com
Sun Jun 24 23:34:49 UTC 2018


On Sunday, 24 June 2018 at 23:21:44 UTC, Steven Schveighoffer 
wrote:
>>      @property string toString() @safe pure nothrow @nogc
>>      {
>>          final switch (_enum)
>>          {
>>              static foreach (index, member; 
>> __traits(allMembers, E))
>>              {
>>                  static if (index == 0 ||
>>                             (__traits(getMember, E, 
>> __traits(allMembers, E)[index - 1]) !=
>>                              __traits(getMember, E, member)))
>>                  {
>>                  case __traits(getMember, E, member):
>>                      return member;
>>                  }
>>              }
>>          }
>>      }
>>      E _enum;                    // the wrapped enum
>>      alias _enum this;
>> }

Provided that

     __traits(allMembers, E)

is a cheap operation as it's called once for every enumerator. I 
could get it out of the loop; if I do as

     @property string toString() @safe pure nothrow @nogc
     {
         final switch (_enum)
         {
             enum members = __traits(allMembers, E);
             static foreach (index, member; __traits(allMembers, 
E))
             {
                 static if (index == 0 ||
                            (__traits(getMember, E, members[index 
- 1]) !=
                             __traits(getMember, E, member)))
                 {
                 case __traits(getMember, E, member):
                     return member;
                 }
             }
         }
     }

the compiler complains as

enum_ex.d(19,29): Error: expression expected as second argument 
of __traits `getMember`

Is

     __traits(allMembers, ...)

cached by the compiler?


More information about the Digitalmars-d mailing list