DMD 0.173 release
Jarrett Billingsley
kb3ctd2 at yahoo.com
Thu Nov 2 12:40:09 PST 2006
"Jarrett Billingsley" <kb3ctd2 at yahoo.com> wrote in message
news:eidi8o$11o4$2 at digitaldaemon.com...
> Un. Be. Liev. A. Ble.
>
> Not only are variadic templates _amazing_ things, they're also _exactly_
> what I'll need to do the MiniD binding library (and Kirk is understandably
> happy as well!).
Waaahaha! This is so cool. A variadic "call" function for MiniD which used
to look like:
public void easyCall(MDClosure func, uint numReturns, ...)
{
uint funcReg = push(func);
for(int i = 0; i < _arguments.length; i++)
{
TypeInfo ti = _arguments[i];
if(ti == typeid(bool))
push(cast(bool)va_arg!(bool)(_argptr));
else if(ti == typeid(byte)) push(cast(int)va_arg!(byte)(_argptr));
else if(ti == typeid(ubyte))
push(cast(int)va_arg!(ubyte)(_argptr));
else if(ti == typeid(short))
push(cast(int)va_arg!(ushort)(_argptr));
else if(ti == typeid(ushort))
push(cast(int)va_arg!(ushort)(_argptr));
else if(ti == typeid(int)) push(cast(int)va_arg!(int)(_argptr));
else if(ti == typeid(uint)) push(cast(int)va_arg!(uint)(_argptr));
else if(ti == typeid(long)) push(cast(int)va_arg!(long)(_argptr));
else if(ti == typeid(ulong))
push(cast(int)va_arg!(ulong)(_argptr));
else if(ti == typeid(float))
push(cast(float)va_arg!(float)(_argptr));
else if(ti == typeid(double))
push(cast(float)va_arg!(double)(_argptr));
else if(ti == typeid(real))
push(cast(float)va_arg!(real)(_argptr));
else if(ti == typeid(char[])) push(new
MDString(va_arg!(char[])(_argptr)));
else if(ti == typeid(wchar[])) push(new
MDString(va_arg!(wchar[])(_argptr)));
else if(ti == typeid(dchar[])) push(new
MDString(va_arg!(dchar[])(_argptr)));
else if(ti == typeid(MDObject))
push(cast(MDObject)va_arg!(MDObject)(_argptr));
else if(ti == typeid(MDUserdata))
push(cast(MDUserdata)va_arg!(MDUserdata)(_argptr));
else if(ti == typeid(MDClosure))
push(cast(MDClosure)va_arg!(MDClosure)(_argptr));
else if(ti == typeid(MDTable))
push(cast(MDTable)va_arg!(MDTable)(_argptr));
else if(ti == typeid(MDArray))
push(cast(MDArray)va_arg!(MDArray)(_argptr));
else throw new MDRuntimeException(this, "MDState.easyCall(): invalid
parameter ", i);
}
call(funcReg, _arguments.length, numReturns);
}
Has now become:
public void easyCall(T...)(MDClosure func, uint numReturns, T params)
{
uint funcReg = push(func);
foreach(param; params)
push(param);
call(funcReg, params.length, numReturns);
}
Not only is it magnitudes easier to read, it's also far more efficient.
Amazing, amazing, amazing. Thank you so much, again and again.
More information about the Digitalmars-d-announce
mailing list