On Thursday, 18 May 2017 at 22:31:47 UTC, Stefan Koch wrote:

Granted this version will result in undefined behavior if you pass something like (cast(ET) 3) to it.
But the 55x increase in compilation speed is well worth it :)

This code will replicate to!string behavior perfectly but will only take 30 milliseconds to compile:

string enumToString(E)(E v)
{
static assert(is(E == enum), "emumToString is only meant for enums");
    mixin({
    string result = "switch(v) {\n";
    foreach(m;[__traits(allMembers, E)])
    {
        result ~= "\tcase E." ~ m ~ " :\n"
            ~ "\t\treturn \"" ~ m ~ "\";\n";
    }
    result ~= "\tdefault: break;\n";
    result ~= "}\n";
    enum headLength = E.stringof.length + "cast()".length;
    result ~= `
    enum headLength = ` ~ headLength.stringof ~ `;
    uint val = v;
char[` ~ (headLength + 10).stringof ~ `] res = "cast(` ~ E.stringof ~ `)"; uint log10Val = (val < 10) ? 0 : (val < 100) ? 1 : (val < 1000) ? 2 : (val < 10000) ? 3 : (val < 100000) ? 4 : (val < 1000000) ? 5 : (val < 10000000) ? 6
        : (val < 100000000) ? 7 : (val < 1000000000) ? 8 : 9;
    foreach(i;0 .. log10Val + 1)
    {
res[headLength + log10Val - i] = cast(char) ('0' + (val % 10));
        val /= 10;
    }

    return res[0 .. headLength + log10Val + 1].idup;
`;
   return result;
    } ());
}


Reply via email to