module dwisdet.var; private import std.boxer, std.stdarg; class Var { private Box myBox; private this (Box b) { myBox = b; } this (TypeInfo type, va_list argptr) { myBox = box(type, argptr); } this (...) in { assert (_arguments.length == 1); } body { this(_arguments[0], _argptr); } template get (T) { T get () { return unbox!(T)(myBox); } } template isType (T) { bool isType () { return unboxable!(T)(myBox); } } } Var var (TypeInfo type, va_list argptr) { return new Var(type, argptr); } Var var (...) in { assert (_arguments.length == 1); } body { return var(_arguments[0], _argptr); } Var[] varArray (TypeInfo[] types, va_list argsptr) { Var[] ret = new Var[types.length]; foreach (size_t i, Box b; boxArray(types, argsptr)) ret[i] = new Var(b); return ret; } Var[] varArray (...) { return varArray(_arguments, _argptr); } void varArrayToArguments (Var[] arguments, out TypeInfo[] types, out va_list data) { Box[] ba = new Box[arguments.length]; foreach (size_t i, Var v; arguments) ba[i] = v.myBox; boxArrayToArguments(ba, types, data); } unittest { debug writefln("%s begin unittest...", __FILE__); Var v; Var[] va; v = var("asdf"); assert (v.isType!(char[])); assert (v.get!(char[]) == "asdf"); v = var(-4.57249e12); assert (v.isType!(double)); assert (v.get!(double) == -4.57249e12); va = varArray(987, "blah", 0.123f); assert (va.length == 3); assert (va[0].isType!(int)); assert (va[0].get!(int) == 987); assert (va[1].isType!(char[])); assert (va[1].get!(char[]) == "blah"); assert (va[2].isType!(float)); assert (va[2].get!(float) == 0.123f); TypeInfo[] types; va_list args; varArrayToArguments(va, types, args); assert (types.length == 3); assert (types[0] is typeid(int)); assert (va_arg!(int)(args) == 987); assert (types[1] is typeid(char[])); assert (va_arg!(char[])(args) == "blah"); assert (types[2] is typeid(float)); assert (va_arg!(float)(args) == 0.123f); debug writefln("%s unittest success.", __FILE__); } version (VarMainUnittest) { debug private import std.stdio; void main () { } }