D: Unexpected output when using a delegate and EnumMembers

Travis Gockel travis at gockelhut.com
Tue Jun 19 07:44:35 PDT 2012


I have some rather odd behavior in my D program that I've narrowed down to this:

    import std.algorithm;
    import std.stdio;
    import std.traits;

    enum E { a, b, c };

    struct S { E e; };

    void main()
    {
        immutable(S)[] source = [ S(E.a), S(E.a), S(E.b) ];
        foreach (e; EnumMembers!E)
        {
            size_t c = count!(x => x.e == e)(source);
            writeln(e, " -> ", c);
        }
    }

I would expect the output of this program to be something along the lines of:

    a -> 2
    b -> 1
    c -> 0

But the actual result is:

    a -> 2
    b -> 2
    c -> 2

Curiously, changing the for loop to foreach (e; [ E.a, E.b, E.c ]) produces my
expected output. Using foreach (e; [ EnumMembers!E ]) also produces my
expected result, so clearly my use of the range from EnumMemebers is the
problem here...I just don't know why.

By moving the count call to a separate function:

    size_t counte(Range)(E e, Range src)
    {
        return count!(x => x.e == e)(src);
    }

and changing c's initialization to size_t c = counte(e, source);, the program
works as I would expect.

I am clearly doing something wrong, but I have no idea what and would
appreciate some insight.

My compiler is DMD64 D Compiler v2.059 on Linux.
begin 644 enum_delegate.d
M(R$O=7-R+V)I;B]R9&UD"@II;7!O<G0@<W1D+F%L9V]R:71H;3L*:6UP;W)T
M('-T9"YS=&1I;SL*:6UP;W)T('-T9"YT<F%I=',["@IE;G5M($4@>R!A+"!B
M+"!C('T["@IS=')U8W0 at 4R![($4 at 93L@?3L*"G-I>F5?="!C;W5N=&4H4F%N
M9V4I*$4 at 92P@4F%N9V4@<W)C*0I["B`@("!R971U<FX at 8V]U;G0A*'@@/3X@
M>"YE(#T](&4I*'-R8RD["GT*"G9O:60@;6%I;B at I"GL*("`@(&EM;75T86)L
M92A3*5M=('-O=7)C92`](%L at 4RA%+F$I+"!3*$4N82DL(%,H12YB*2!=.PH@
M("`@9F]R96%C:"`H93L at 16YU;4UE;6)E<G,A12D*("`@('L*("`@("`@("!V
M97)S:6]N("AC;W5N=&4I"B`@("`@("`@("`@('-I>F5?="!C(#T at 8V]U;G1E
M*&4L('-O=7)C92D["B`@("`@("`@96QS90H@("`@("`@("`@("!S:7IE7W0@
M8R`](&-O=6YT(2AX(#T^('@N92`]/2!E*2AS;W5R8V4I.PH@("`@("`@('=R
<:71E;&XH92P@(B`M/B`B+"!C*3L*("`@('T*?0``
`
end


More information about the Digitalmars-d-learn mailing list