[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