Advertisement
Danol

D language Proxy class

Jan 20th, 2014
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 2.96 KB | None | 0 0
  1. module test;
  2.  
  3. import std.stdio;
  4. import std.conv;
  5. import std.traits;
  6.  
  7. interface Ia {
  8.  
  9.   void a( string s );
  10.   void a( string s, int a );
  11.   int a( int b, int c );
  12.  
  13. }
  14. interface Ib {
  15.  
  16.   string b( string s );
  17.   void b( string s, int a );
  18.   int b( int b, int c );
  19.  
  20. }
  21.  
  22.  
  23. final class Proxy( T ) : InterfacesTuple!T {
  24.  
  25.   private template ProxyPImpl( I, string M, O, string Str, Parameters ... ) {
  26.     static if( Parameters.length > 0 ) {
  27.       alias P = Parameters[ 0 ];
  28.       enum str = fullyQualifiedName!P ~ " " ~ Str;
  29.  
  30.       static if( Parameters.length > 1 )
  31.         enum ProxyPImpl = str ~ ", " ~ ProxyPImpl!(  I, M, O, Str ~ "a", Parameters[ 1 .. $ ] );
  32.       else
  33.         enum ProxyPImpl = str;
  34.  
  35.     } else enum ProxyPImpl = "";
  36.   }
  37.   private template ProxyOPImpl( I, string M, O, string Str, Parameters ... ) {
  38.     static if( Parameters.length > 0 ) {
  39.       alias P = Parameters[ 0 ];
  40.       enum str = Str;
  41.  
  42.       static if( Parameters.length > 1 )
  43.         enum ProxyOPImpl = str ~ ", " ~ ProxyOPImpl!(  I, M, O, Str ~ "a", Parameters[ 1 .. $ ] );
  44.       else
  45.         enum ProxyOPImpl = str;
  46.  
  47.     } else enum ProxyOPImpl = "";
  48.   }
  49.  
  50.   private template ProxyOImpl( I, string M, Overloads ... ) {
  51.     static if( Overloads.length > 0 ) {
  52.       alias O = Overloads[ 0 ];
  53.       enum str = /* return type */ fullyQualifiedName!( ReturnType!O ) ~ " " ~ /* function name */ M
  54.         ~ "(" ~ /* argument list */ ProxyPImpl!( I, M, O, "a", ParameterTypeTuple!O ) ~ ")"
  55.           ~ " {\n\treturn obj." ~ M ~ "(" ~ ProxyOPImpl!( I, M, O, "a", ParameterTypeTuple!O ) ~ ");\n}\n";
  56.  
  57.       static if( Overloads.length > 1 )
  58.         enum ProxyOImpl = str ~ " " ~ ProxyOImpl!( I, M, Overloads[ 1 .. $ ] );
  59.       else
  60.         enum ProxyOImpl = str;
  61.  
  62.     } else enum ProxyOImpl = " ";
  63.   }
  64.   private template ProxyMImpl( I, Members ... ) {
  65.     static if( Members.length > 0 ) {
  66.       enum M = Members[ 0 ];
  67.       enum str = ProxyOImpl!( I, M, typeof( __traits( getOverloads, I, M ) ) );
  68.      
  69.       static if( Members.length > 1 )
  70.         enum ProxyMImpl = str ~ " " ~ ProxyMImpl!( I, Members[ 1 .. $ ] );
  71.       else
  72.         enum ProxyMImpl = str;
  73.  
  74.     } else enum ProxyMImpl = " ";
  75.   }
  76.   private template ProxyIImpl( I, Interfaces ... ) {
  77.     enum str = ProxyMImpl!( I, __traits( allMembers, I ) );
  78.  
  79.     static if( Interfaces.length )
  80.       enum ProxyIImpl = str ~ " " ~ ProxyIImpl!Interfaces;
  81.     else
  82.       enum ProxyIImpl = str;
  83.   }
  84.  
  85. public:
  86.   T obj;
  87.  
  88.   mixin( ProxyIImpl!( InterfacesTuple!T ) );
  89.  
  90. }
  91.  
  92. class C : Ia, Ib {
  93.  
  94.   void a( string s ) {
  95.  
  96.   };
  97.   void a( string s, int a ){
  98.    
  99.   };
  100.   int a( int b, int c ){
  101.     return 5;
  102.   };
  103.  
  104.   string b( string s ){
  105.     return "as";
  106.   };
  107.   void b( string s, int a ){
  108.    
  109.   };
  110.   int b( int b, int c ){
  111.     return 9;
  112.   };
  113. }
  114.  
  115. interface Ic : Ia, Ib {
  116.  
  117. }
  118.  
  119. void main() {
  120.   Proxy!C p = new Proxy!C();
  121.   p.obj = new C();
  122.  
  123.   Ia a = cast( Ia ) p;
  124.   writeln( a.a( 5, 5 ) ); // returns 5
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement