On Sunday, 7 July 2013 at 20:28:12 UTC, John Colvin wrote:
On Sunday, 7 July 2013 at 20:22:59 UTC, Simen Kjaeraas wrote:
On 2013-07-07, 21:55, QAston wrote:

I have a large enum in my code (opcodes for a protocol) - using std.traits.EnumMembers gives me a recursive template error.

How can i increase max number recursive template expansions?

You can't. However, you can amend std.traits.EnumMembers to work
with larger enums by using this version:



import std.typetuple;

template EnumMembers(E)
   if (is(E == enum))
{
   // Supply the specified identifier to an constant value.
   template WithIdentifier(string ident)
   {
       static if (ident == "Symbolize")
       {
           template Symbolize(alias value)
           {
               enum Symbolize = value;
           }
       }
       else
       {
           mixin("template Symbolize(alias "~ ident ~")"
                ~"{"
                    ~"alias "~ ident ~" Symbolize;"
                ~"}");
       }
   }

   template EnumSpecificMembers(names...)
   {
       static if (names.length > 200)
       {
           alias TypeTuple!(
                   EnumSpecificMembers!(names[0..$/2]),
                   EnumSpecificMembers!(names[$/2..$]),
               ) EnumSpecificMembers;
       }
       else static if (names.length > 0)
       {
           alias TypeTuple!(
                   WithIdentifier!(names[0])
.Symbolize!(__traits(getMember, E, names[0])),
                   EnumSpecificMembers!(names[1 .. $]),
               ) EnumSpecificMembers;
       }
       else
       {
           alias TypeTuple!() EnumSpecificMembers;
       }
   }

alias EnumSpecificMembers!(__traits(allMembers, E)) EnumMembers;
}



Here, this line:
       static if (names.length > 200)
uses divide-and-conquer to reduce the number of template instantiations.

We came up with almost identical solutions, posted within 19 seconds of each other!

Thanks guys, you're awesome!

Reply via email to