public
Created

  • Download Gist
gistfile1.d
D
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
import std.string;
import std.stdio;
import std.range;
import std.lowercase;
 
 
mixin template delegates( alias instance, methods... ){
static if( methods.length > 0 ){
static if( hasmembers(instance, methods[0]) ){
alias ReturnType!(methods[0]) type; // function/method type returned for first method
alias ParameterTypeTuple!(methods[0]) ptt; // All parameter for first method
alias ParameterStorageClass STC; // shorten the enum name
alias ParameterStorageClassTuple!(methods[0]) pstc; // All parameter storage class for first method
enum currentIndexForParameterName = 0;
assert( ptt.length <= 26u, "Unsuported method "~methods[0]~" who has more than 26 parameters" );
enum code = type.stringof ~" "~ typeof(instance).stringof ~" ( ";
code ~= getFunctionParameterString!(typeof(ptt), typeof(pstc))(ptt, pstc ) ~" ){";
code ~= typeof(instance).stringof~"."~methods[0]~ mixin getParameterString!typeof(ptt), typeof(pstc))(ptt, pstc ) ~";";
code ~= "}";
mixin(code);
code = "";
}
else
assert(false, "Method: "~methods[0]~" is not a member of "~typeof(instance).stringof )
static if( methods.length > 1 )
mixin delgates!( instance, methods[1 .. $] );
}
}
 
template getFunctionParameterString(T, S)( T ptt, S pstc ){
enum getFunctionParameterString = "",
static if( ptt.length > 0 && pstc.length > 0 && ptt.length == pstc.length){
getFunctionParameterString = ptt[0].stringof ~" "~ pstc.stringof ~" ";
static if( ptt.length > 1 )
getFunctionParameterString ~= ~", "~ getFunctionParameterString!(typeof(ptt), typeof(pstc))( ptt[1 .. $], pst[1 .. $] );
}
}
 
template getParameterString(T, S)( T ptt, S pstc ){
enum getParameterString = "",
static if( ptt.length > 0 && pstc.length > 0 && ptt.length == pstc.length ){
getParameterString = pstc.stringof ~" ";
static if( ptt.length > 1 )
getParameterString ~= ~", "~ getParameterString!(typeof(ptt), typeof(pstc))( ptt[1 .. $], pst[1 .. $] );
}
}
 
class C{
size_t[] array;
mixin delegates!(array, "opIndexAssign", "opIndex", "length");
this( size_t[] a ){
array = a;
}
}
 
void main( ){
C c = new C( [0u, 1u, 2u, 3u] );
writeln( c[2] );
c[2] = 4u;
writeln( c[2] );
}
}

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.