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