[Issue 12850] ICE when passing associative array to template

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Sat Jun 7 08:22:26 PDT 2014


https://issues.dlang.org/show_bug.cgi?id=12850

--- Comment #2 from Kenji Hara <k.hara.pg at gmail.com> ---
Please paste case code directly, or attach the source file.

// From http://dpaste.dzfl.pl/b2918df47beb
template toTypeTuple(alias range)
{
    import std.range : isInputRange;
    import std.traits : isArray, isNarrowString;
    import std.typetuple: TypeTuple;
    alias Arr = typeof(range);
    static if (isArray!Arr && !isNarrowString!Arr)
    {
        static if (range.length == 0)
        {
            alias toTypeTuple = TypeTuple!();
        }
        else static if (range.length == 1)
        {
            alias toTypeTuple = TypeTuple!(range[0]);
        }
        else
        {
            alias toTypeTuple = TypeTuple!(toTypeTuple!(range[0 .. $/2]),
toTypeTuple!(range[$/2 .. $]));
        }
    }
    else static if (isInputRange!Arr)
    {
        import std.array : array;
        alias toTypeTuple = toTypeTuple!(array(range));
    }
    else
    {
        import std.string : format;
        static assert (0, format("Cannot transform %s of type %s into a
TypeTuple.", range, Arr.stringof));
    }
}

template staticZip(alias values, Indices...)
{
    import std.typetuple;

    template Pair(T...)
        if (T.length == 2)
    {
        alias Pair = TypeTuple!(T);
    }

    static if (Indices.length == 1 && values.length == 1)
    {
        alias staticZip = TypeTuple!(Pair!(Indices[0], values[0]));
    }
    else
    {
        alias staticZip = TypeTuple!(Pair!(Indices[0], values[0]),
staticZip!(Indices[1..$], values[1..$]));
    }
}

struct Index(int upperBound)
if (upperBound > 0)
{
    import std.range;

    enum range = toTypeTuple!(iota(upperBound));
    enum length = range.length;

    alias rangeType = typeof(range[0]);
    alias rangeType this;
}

alias N = Index!5;

void main()
{
    import std.typetuple;

    int[N] arr;
    pragma(msg, staticZip!(arr, N));
}

--


More information about the Digitalmars-d-bugs mailing list