Making enum join variadic

"Nordlöw" via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri May 2 03:59:09 PDT 2014


> artur

Thx!

Here's my final version that compiles and run:

import std.stdio: writeln;
import traits_ex: isEnum;
import std.typetuple: allSatisfy;

/** Join/Chain/Concatenate/Unite Enums $(D E1), $(D E2), ... into 
$(D E).
     See also: 
http://forum.dlang.org/thread/f9vc6p$1b7k$1@digitalmars.com
*/
template join(ES...) if (allSatisfy!(isEnum, ES)) {
     mixin({
             string r = "enum join { ";
             foreach (E; ES) {
                 import std.range: join;
                 r ~= [__traits(allMembers, E), " "].join(",");
             }
             return r ~ "}";
         }());
}

unittest
{
     enum E1 { a, b, c }
     enum E2 { e, f, g }
     enum E3 { h, i, j}
     alias E1_ = join!(E1);
     alias E12 = join!(E1, E2);
     alias E123 = join!(E1, E2, E3);
     writeln(E123.min, ",", E123.max);
}

Some final questions:

- Is join a good naming for this? Is chain better?
- Is it better to be verbose with joinEnums?
- What other useful enum algorithms are you missing?
- Should this perhaps go into Phobos? If so in what module? 
std.algorithm, range, traits?


More information about the Digitalmars-d-learn mailing list