Skip to content

Instantly share code, notes, and snippets.

@bioinfornatics
Created March 4, 2012 17:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bioinfornatics/1974033 to your computer and use it in GitHub Desktop.
Save bioinfornatics/1974033 to your computer and use it in GitHub Desktop.
import std.traits;
import std.stdio;
import std.string;
import std.range;
import std.ascii; // lowercase
static string getFunctionParameterString(T, S)( T ptt, S pstc ) @safe pure nothrow{
enum result = "";
static if( ptt.length > 0 && pstc.length > 0 && ptt.length == pstc.length){
result = ptt[0].stringof ~" "~ pstc.stringof ~" ";
static if( ptt.length > 1 )
result ~= ", "~ getFunctionParameterString!(typeof(ptt), typeof(pstc))( ptt[1 .. $], pstc[1 .. $] );
}
return result;
}
static string getParameterString(T, S)( T ptt, S pstc ) @safe pure nothrow{
enum result = "";
static if( ptt.length > 0 && pstc.length > 0 && ptt.length == pstc.length ){
result = pstc.stringof ~" ";
static if( ptt.length > 1 )
result ~= ", "~ getParameterString!(typeof(ptt), typeof(pstc))( ptt[1 .. $], pstc[1 .. $] );
}
return result;
}
mixin template delegates( alias instance, methods... ){
static if( methods.length > 0 ){
static if( hasMember!(typeof(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;
// static assert( ptt.length <= 26u, "Unsuported method "~methods[0]~" who has more than 26 parameters" );
mixin(
type.stringof ~" "~ typeof(instance).stringof ~" ( "
~ getFunctionParameterString!(typeof(ptt), typeof(pstc))(ptt, pstc ) ~" ){"
~ typeof(instance).stringof~"."~methods[0]~ getParameterString!(typeof(ptt), typeof(pstc))(ptt, pstc ) ~";"
~ "}"
);
}
else
static assert(false, "Method: "~methods[0]~" is not a member of "~typeof(instance).stringof );
static if( methods.length > 1 )
mixin delgates!( instance, methods[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] );
}
@9rnsr
Copy link

9rnsr commented Mar 5, 2012

A new utility std.typecons.Proxy, introduced in dmd 2.059, would be helpful for yours.
dlang/phobos@608218d#L0R2771

@bioinfornatics
Copy link
Author

Proxy seem to be really interesting but i can not choose which function to enable for selected member, no ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment