import std.stdio, std.typecons;
/* hack for old ass ideone compiler
* compilers prior to 2.042 (Feb 2010)
*/
static if (__VERSION__ <= 2042)
{
struct My_Tuple(T...)
{
Tuple!T base;
alias base this;
this(T args) { this.base(args); }
U opIndex(U)(size_t idx) { return this.field[idx]; }
}
}
else /* 2.043 and newer */
{
alias Tuple My_Tuple;
}
My_Tuple!T make_tuple(T...)(T args)
{
return typeof(return)(args);
}
/* TESTING FUNCTION */
int[] foo(T...)(T args)
{
writeln("Called foo ...");
foreach (i, arg; args)
writefln(" args[%d] == %s", i, arg);
writeln("... foo end");
return [ 5, 10, 15, 20 ];
}
/* UNPACKER */
auto unpack(alias fun, V...)(ref My_Tuple!V t)
{
auto f(size_t i, U...)(U args)
{
static if (i == 0)
return fun(args);
else
return f!(i - 1)(t.field[i - 1], args);
}
return f!(V.length)();
}
/* main */
void main()
{
auto tup = make_tuple(
5, 3.14f, "hello world", [ 5, 10, 15 ], [ "foo":5, "bar":10 ]
);
auto ret = unpack!foo(tup);
writeln("retval from foo: ", ret);
}
aW1wb3J0IHN0ZC5zdGRpbywgc3RkLnR5cGVjb25zOwoKLyogaGFjayBmb3Igb2xkIGFzcyBpZGVvbmUgY29tcGlsZXIgCiAqIGNvbXBpbGVycyBwcmlvciB0byAyLjA0MiAoRmViIDIwMTApCiAqLwpzdGF0aWMgaWYgKF9fVkVSU0lPTl9fIDw9IDIwNDIpCnsKICAgIHN0cnVjdCBNeV9UdXBsZShULi4uKQogICAgewogICAgICAgIFR1cGxlIVQgYmFzZTsKICAgICAgICBhbGlhcyBiYXNlIHRoaXM7CgogICAgICAgIHRoaXMoVCBhcmdzKSB7IHRoaXMuYmFzZShhcmdzKTsgfQogICAgICAgIFUgb3BJbmRleChVKShzaXplX3QgaWR4KSB7IHJldHVybiB0aGlzLmZpZWxkW2lkeF07IH0KICAgIH0KfQplbHNlIC8qIDIuMDQzIGFuZCBuZXdlciAqLwp7CiAgICBhbGlhcyBUdXBsZSBNeV9UdXBsZTsKfQoKTXlfVHVwbGUhVCBtYWtlX3R1cGxlKFQuLi4pKFQgYXJncykKewogICAgcmV0dXJuIHR5cGVvZihyZXR1cm4pKGFyZ3MpOwp9CgovKiBURVNUSU5HIEZVTkNUSU9OICovCgppbnRbXSBmb28oVC4uLikoVCBhcmdzKQp7CiAgICB3cml0ZWxuKCJDYWxsZWQgZm9vIC4uLiIpOwogICAgZm9yZWFjaCAoaSwgYXJnOyBhcmdzKQogICAgICAgIHdyaXRlZmxuKCIgICAgYXJnc1slZF0gPT0gJXMiLCBpLCBhcmcpOwogICAgd3JpdGVsbigiLi4uIGZvbyBlbmQiKTsKCiAgICByZXR1cm4gWyA1LCAxMCwgMTUsIDIwIF07Cn0KCi8qIFVOUEFDS0VSICovCgphdXRvIHVucGFjayhhbGlhcyBmdW4sIFYuLi4pKHJlZiBNeV9UdXBsZSFWIHQpCnsKICAgIGF1dG8gZihzaXplX3QgaSwgVS4uLikoVSBhcmdzKQogICAgewogICAgICAgIHN0YXRpYyBpZiAoaSA9PSAwKQogICAgICAgICAgICByZXR1cm4gZnVuKGFyZ3MpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuIGYhKGkgLSAxKSh0LmZpZWxkW2kgLSAxXSwgYXJncyk7CiAgICB9CiAgICByZXR1cm4gZiEoVi5sZW5ndGgpKCk7Cn0KCi8qIG1haW4gKi8KCnZvaWQgbWFpbigpCnsKICAgIGF1dG8gdHVwID0gbWFrZV90dXBsZSgKICAgICAgICA1LCAzLjE0ZiwgImhlbGxvIHdvcmxkIiwgWyA1LCAxMCwgMTUgXSwgWyAiZm9vIjo1LCAiYmFyIjoxMCBdCiAgICApOwoKICAgIGF1dG8gcmV0ID0gdW5wYWNrIWZvbyh0dXApOwogICAgd3JpdGVsbigicmV0dmFsIGZyb20gZm9vOiAiLCByZXQpOwp9Cg==