[Issue 9924] New: Handy enum accessors

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Apr 11 17:20:50 PDT 2013


http://d.puremagic.com/issues/show_bug.cgi?id=9924

           Summary: Handy enum accessors
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: Phobos
        AssignedTo: nobody at puremagic.com
        ReportedBy: bearophile_hugs at eml.cc


--- Comment #0 from bearophile_hugs at eml.cc 2013-04-11 17:20:49 PDT ---
To better use enums I suggest to add to Phobos four small templates/functions
like this (similar things are builtins in Ada):


import std.conv: text;
import std.traits: EnumMembers;

template FirstMember(E) if (is(E == enum)) {
    enum FirstMember = EnumMembers!E[0];
}

template LastMember(E) if (is(E == enum)) {
    enum LastMember = EnumMembers!E[$ - 1];
}

E predMember(E)(E e) /*pure nothrow*/ if (is(E == enum))
in {
    assert(e != FirstMember!E);
} body {
    switch (e) {
        foreach (i, e2; EnumMembers!E[1 .. $])
            mixin("case E." ~ text(cast(E)e2) ~ ": return E."
                  ~ text(cast(E)(EnumMembers!E[i])) ~ ";");
        default: assert(0);
    }
}

E nextMember(E)(E e) /*pure nothrow*/ if (is(E == enum))
in {
    assert(e != LastMember!E);
} body {
    switch (e) {
        foreach (i, e2; EnumMembers!E[0 .. $ - 1])
            mixin("case E." ~ text(cast(E)e2) ~ ": return E."
                  ~ text(cast(E)(EnumMembers!E[i + 1])) ~ ";");
        default: assert(0);
    }
}

void main() { // Demo -----------------------
    import std.stdio;

    enum Choice { rock, paper, scissors }

    static Choice whatBeats(in Choice ch) /*pure nothrow*/ {
        if (ch == LastMember!Choice)
            return FirstMember!Choice;
        else
            return nextMember(ch);
    }

    foreach (e; [EnumMembers!Choice])
        writeln(e, " ", whatBeats(e));
    writeln(predMember(Choice.paper));
    writeln(predMember(Choice.scissors));
    writeln(nextMember(Choice.rock));
    writeln(nextMember(Choice.paper));
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list