Andrei Alexandrescu <seewebsiteforem...@erdani.org> wrote:

alias Flags!(ubyte, "do_nothing",
                     "walk_dog"
                     "cook_breakfast"
                     "deliver_newspaper"
                     "visit_miss_kerbopple"
                     "wash_covers") Todo;

I encourage you to code that up and see how it swims. We need to stop inventing syntax for any single thing that seems useful, and start eating our dogfood. If our mechanism for code generation is not good enough, we should improve it, not generate by hand ever new constructs.


template withType( alias F ) {
        template withType( alias s ) {
                enum withType = F!( typeof( s ) );
        }
}

mixin template Flags_mixin( T, U, U value, string name, V... ) {
        // Does not work, due to std.metastrings.toStringNow not supporting 
ubyte.
        //mixin( Format!( "enum %s = T( %s );", name, value ) );
        mixin( "enum " ~ name ~ " = T( " ~ to!string( value ) ~ " );" );
        static if ( V.length > 0 ) {
                mixin Flags_mixin!( T, U, value + 1, V );
        }
}

struct Flags( T = uint, U... ) if ( allSatisfy!( withType!( isSomeString
), U ) && isIntegral!( T ) ) {
        T value;
        mixin Flags_mixin!( typeof( this ), T, T.init, U );
}

usage:

void foo( ) {
        alias Flags!( ubyte, "a", "b", "c" ) myFlags;
        myFlags f = myFlags.a;
        writeln( f.value );

        alias Flags!( "d", "e", "f" ) myOtherFlags;
        myOtherFlags
}

It could do with some sanity checking (valid identifier names), but as
this was just a proof of concept, I have not written that.

btw, I really wish OpenGL headers could use a mechanism like this. Having
to look up every single function to see which flags are allowed can be a
PITA.

--
Simen

Reply via email to