On Tuesday, 31 January 2017 at 17:20:00 UTC, John Colvin wrote:
It's a bug, please report it. The initializer should be statically disallowed.

Adding a .dup works around the problem.

OK. Hmm, but the real use case was a bit more complicated, more like:

-----
int n = 10;
foreach (i; 0..n)
    foreach (j; 0..n)
        foreach (k; 0..n)
            ... and maybe a couple more ...
            if ([i: true, j: true, k: true].length == 3)
                {...} // i, j, k is a set of distinct values
-----

Here, we don't know i, j and k statically, yet the problem is the same.

Anyway, I'll file a bug report.

By the way, you can do sets like this, avoiding storing any dummy values, only keys:

struct Set(T)
{
        void[0][T] data;
        
        void insert(T x)
        {
                data[x] = (void[0]).init;
        }
        
        void remove(T x)
        {
                data.remove(x);
        }
        
        bool opBinaryRight(string op : "in")(T e)
        {
                return !!(e in data);
        }
        
        // other things like length, etc.
}

unittest
{
        Set!int s;
        s.insert(4);
        assert(4 in s);
        s.remove(4);
        assert(4 !in s);
}

Yeah, thanks for the recipe! I usually do bool [key] since it does not add much overhead, but would definitely like the real set (void[0] or otherwise) when performance matters.

Ivan Kazmenko.

Reply via email to