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!