#pragma once //#include #include "bfc/platform/types.h" #include "bfc/platform/guid.h" #ifdef WIN32 #ifndef NOVTABLE #define NOVTABLE __declspec(novtable) #endif #else #define NOVTABLE #endif class DispatchableCallback; #pragma warning(disable: 4786) #pragma warning(disable: 4275) #pragma warning(disable: 4100) enum { DISPATCH_SUCCESS = 0, DISPATCH_FAILURE = 1, }; class NOVTABLE Dispatchable { public: // // fake virtual destructor // void destruct() { _voidcall(DESTRUCT); } // this is virtual so it is visible across modules virtual int _dispatch( int msg, void *retval, void **params = 0, int nparam = 0 ) = 0; /* added 22 May 2007. these aren't used yet. To be used in the future in the meantime, don't use negative numbers for your msg values */ int AddRef(); int Release(); int QueryInterface( GUID interface_guid, void **object ); enum { ADDREF = -1, RELEASE = -2, QUERYINTERFACE = -3, }; protected: // // protected real destructor // ~Dispatchable() {} // helper templates to implement client-side methods int _voidcall( int msg ) { return _dispatch( msg, 0 ); } template int _voidcall( int msg, PARAM1 param1 ) { void *params[ 1 ] = { ¶m1 }; return _dispatch( msg, 0, params, 1 ); } template int _voidcall( int msg, PARAM1 param1, PARAM2 param2 ) { void *params[ 2 ] = { ¶m1, ¶m2 }; return _dispatch( msg, 0, params, 2 ); } template int _voidcall( int msg, PARAM1 param1, PARAM2 param2, PARAM3 param3 ) { void *params[ 3 ] = { ¶m1, ¶m2, ¶m3 }; return _dispatch( msg, 0, params, 3 ); } template int _voidcall( int msg, PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4 ) { void *params[ 4 ] = { ¶m1, ¶m2, ¶m3, ¶m4 }; return _dispatch( msg, 0, params, 4 ); } template int _voidcall( int msg, PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4, PARAM5 param5 ) { // void *params[4] = { ¶m1, ¶m2, ¶m3, ¶m4, ¶m5 }; // mig found another bug void *params[ 5 ] = { ¶m1, ¶m2, ¶m3, ¶m4, ¶m5 }; return _dispatch( msg, 0, params, 5 ); } template int _voidcall( int msg, PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4, PARAM5 param5, PARAM6 param6 ) { // void *params[4] = { ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6 }; // mig found another bug void *params[ 6 ] = { ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6 }; return _dispatch( msg, 0, params, 6 ); } template int _voidcall( int msg, PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4, PARAM5 param5, PARAM6 param6, PARAM7 param7 ) { void *params[ 7 ] = { ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6 , ¶m7 }; return _dispatch( msg, 0, params, 7 ); } template int _voidcall( int msg, PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4, PARAM5 param5, PARAM6 param6, PARAM7 param7, PARAM8 param8 ) { void *params[ 8 ] = { ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6 , ¶m7 , ¶m8 }; return _dispatch( msg, 0, params, 8 ); } template int _voidcall( int msg, PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4, PARAM5 param5, PARAM6 param6, PARAM7 param7, PARAM8 param8, PARAM9 param9 ) { void *params[ 9 ] = { ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6 , ¶m7 , ¶m8 , ¶m9 }; return _dispatch( msg, 0, params, 9 ); } template int _voidcall( int msg, PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4, PARAM5 param5, PARAM6 param6, PARAM7 param7, PARAM8 param8, PARAM9 param9, PARAM10 param10 ) { void *params[ 10 ] = { ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6 , ¶m7 , ¶m8 , ¶m9 , ¶m10 }; return _dispatch( msg, 0, params, 10 ); } template int _voidcall( int msg, PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4, PARAM5 param5, PARAM6 param6, PARAM7 param7, PARAM8 param8, PARAM9 param9, PARAM10 param10, PARAM11 param11, PARAM12 param12, PARAM13 param13, PARAM14 param14 ) { void *params[ 14 ] = { ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6 , ¶m7 , ¶m8 , ¶m9 , ¶m10 , ¶m11 , ¶m12 , ¶m13 , ¶m14 }; return _dispatch( msg, 0, params, 14 ); } template int _voidcall( int msg, PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4, PARAM5 param5, PARAM6 param6, PARAM7 param7, PARAM8 param8, PARAM9 param9, PARAM10 param10, PARAM11 param11, PARAM12 param12, PARAM13 param13, PARAM14 param14, PARAM15 param15, PARAM16 param16 ) { void *params[ 16 ] = { ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6 , ¶m7 , ¶m8 , ¶m9 , ¶m10 , ¶m11 , ¶m12 , ¶m13 , ¶m14 , ¶m15 , ¶m16 }; return _dispatch( msg, 0, params, 16 ); } template int _voidcall( int msg, PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4, PARAM5 param5, PARAM6 param6, PARAM7 param7, PARAM8 param8, PARAM9 param9, PARAM10 param10, PARAM11 param11, PARAM12 param12, PARAM13 param13, PARAM14 param14, PARAM15 param15, PARAM16 param16, PARAM17 param17 ) { void *params[ 17 ] = { ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6 , ¶m7 , ¶m8 , ¶m9 , ¶m10 , ¶m11 , ¶m12 , ¶m13 , ¶m14 , ¶m15 , ¶m16 , ¶m17 }; return _dispatch( msg, 0, params, 17 ); } template RETURN_TYPE _call( int msg, RETURN_TYPE defval ) { RETURN_TYPE retval; if ( _dispatch( msg, &retval ) ) return retval; return defval; } template RETURN_TYPE _call( int msg, RETURN_TYPE defval, PARAM1 param1 ) { void *params[ 1 ] = { ¶m1 }; RETURN_TYPE retval; if ( _dispatch( msg, &retval, params, 1 ) ) return retval; return defval; } template RETURN_TYPE _call( int msg, RETURN_TYPE defval, PARAM1 param1, PARAM2 param2 ) { void *params[ 2 ] = { ¶m1, ¶m2 }; RETURN_TYPE retval; if ( _dispatch( msg, &retval, params, 2 ) ) return retval; return defval; } template RETURN_TYPE _call( int msg, RETURN_TYPE defval, PARAM1 param1, PARAM2 param2, PARAM3 param3 ) { void *params[ 3 ] = { ¶m1, ¶m2, ¶m3 }; RETURN_TYPE retval; if ( _dispatch( msg, &retval, params, 3 ) ) return retval; return defval; } template RETURN_TYPE _call( int msg, RETURN_TYPE defval, PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4 ) { void *params[ 4 ] = { ¶m1, ¶m2, ¶m3, ¶m4 }; RETURN_TYPE retval; if ( _dispatch( msg, &retval, params, 4 ) ) return retval; return defval; } template RETURN_TYPE _call( int msg, RETURN_TYPE defval, PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4, PARAM5 param5 ) { void *params[ 5 ] = { ¶m1, ¶m2, ¶m3, ¶m4, ¶m5 }; RETURN_TYPE retval; if ( _dispatch( msg, &retval, params, 5 ) ) return retval; return defval; } template RETURN_TYPE _call( int msg, RETURN_TYPE defval, PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4, PARAM5 param5, PARAM6 param6 ) { void *params[ 6 ] = { ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6 }; RETURN_TYPE retval; if ( _dispatch( msg, &retval, params, 6 ) ) return retval; return defval; } template RETURN_TYPE _call( int msg, RETURN_TYPE defval, PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4, PARAM5 param5, PARAM6 param6, PARAM7 param7 ) { void *params[ 7 ] = { ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6, ¶m7 }; RETURN_TYPE retval; if ( _dispatch( msg, &retval, params, 7 ) ) return retval; return defval; } template RETURN_TYPE _call( int msg, RETURN_TYPE defval, PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4, PARAM5 param5, PARAM6 param6, PARAM7 param7, PARAM8 param8 ) { void *params[ 8 ] = { ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6, ¶m7, ¶m8 }; RETURN_TYPE retval; if ( _dispatch( msg, &retval, params, 8 ) ) return retval; return defval; } template RETURN_TYPE _call( int msg, RETURN_TYPE defval, PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4, PARAM5 param5, PARAM6 param6, PARAM7 param7, PARAM8 param8, PARAM9 param9 ) { void *params[ 9 ] = { ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6, ¶m7, ¶m8, ¶m9 }; RETURN_TYPE retval; if ( _dispatch( msg, &retval, params, 9 ) ) return retval; return defval; } template RETURN_TYPE _call( int msg, RETURN_TYPE defval, PARAM1 param1, PARAM2 param2, PARAM3 param3, PARAM4 param4, PARAM5 param5, PARAM6 param6, PARAM7 param7, PARAM8 param8, PARAM9 param9, PARAM10 param10 ) { void *params[ 10 ] = { ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, ¶m6, ¶m7, ¶m8, ¶m9, ¶m10 }; RETURN_TYPE retval; if ( _dispatch( msg, &retval, params, 10 ) ) return retval; return defval; } template void cb( RETVAL( CLASSNAME:: *fn )( ), void *retval, void **params ) { *static_cast( retval ) = ( static_cast( static_cast( this ) )->*fn )( ); } template void vcb( void ( CLASSNAME:: *fn )( ), void *retval, void **params ) { ( static_cast( static_cast( this ) )->*fn )( ); } template void cb( RETVAL( CLASSNAME:: *fn )( PARAM1 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); *static_cast( retval ) = ( static_cast( static_cast( this ) )->*fn )( *p1 ); } template void vcb( void ( CLASSNAME:: *fn )( PARAM1 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); ( static_cast( static_cast( this ) )->*fn )( *p1 ); } template void vcb( void ( CLASSNAME:: *fn )( PARAM1, PARAM2 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); ( static_cast( static_cast( this ) )->*fn )( *p1, *p2 ); } template void cb( RETVAL( CLASSNAME:: *fn )( PARAM1, PARAM2 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); *static_cast( retval ) = ( static_cast( static_cast( this ) )->*fn )( *p1, *p2 ); } // 3 params template void vcb( void ( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3 ); } template void cb( RETVAL( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); *static_cast( retval ) = ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3 ); } // 4 params template void vcb( void ( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3, PARAM4 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); PARAM4 *p4 = static_cast( params[ 3 ] ); ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3, *p4 ); } template void cb( RETVAL( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3, PARAM4 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); PARAM4 *p4 = static_cast( params[ 3 ] ); *static_cast( retval ) = ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3, *p4 ); } // 5 params template void vcb( void ( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); PARAM4 *p4 = static_cast( params[ 3 ] ); PARAM5 *p5 = static_cast( params[ 4 ] ); ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3, *p4, *p5 ); } template void cb( RETVAL( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); PARAM4 *p4 = static_cast( params[ 3 ] ); PARAM5 *p5 = static_cast( params[ 4 ] ); *static_cast( retval ) = ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3, *p4, *p5 ); } // 6 params template void vcb( void ( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5, PARAM6 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); PARAM4 *p4 = static_cast( params[ 3 ] ); PARAM5 *p5 = static_cast( params[ 4 ] ); PARAM6 *p6 = static_cast( params[ 5 ] ); ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3, *p4, *p5, *p6 ); } template void cb( RETVAL( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5, PARAM6 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); PARAM4 *p4 = static_cast( params[ 3 ] ); PARAM5 *p5 = static_cast( params[ 4 ] ); PARAM6 *p6 = static_cast( params[ 5 ] ); *static_cast( retval ) = ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3, *p4, *p5, *p6 ); } // 7 params template void vcb( void ( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5, PARAM6, PARAM7 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); PARAM4 *p4 = static_cast( params[ 3 ] ); PARAM5 *p5 = static_cast( params[ 4 ] ); PARAM6 *p6 = static_cast( params[ 5 ] ); PARAM7 *p7 = static_cast( params[ 6 ] ); ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3, *p4, *p5, *p6, *p7 ); } template void cb( RETVAL( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5, PARAM6, PARAM7 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); PARAM4 *p4 = static_cast( params[ 3 ] ); PARAM5 *p5 = static_cast( params[ 4 ] ); PARAM6 *p6 = static_cast( params[ 5 ] ); PARAM7 *p7 = static_cast( params[ 6 ] ); *static_cast( retval ) = ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3, *p4, *p5, *p6, *p7 ); } // 8 params template void vcb( void ( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5, PARAM6, PARAM7, PARAM8 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); PARAM4 *p4 = static_cast( params[ 3 ] ); PARAM5 *p5 = static_cast( params[ 4 ] ); PARAM6 *p6 = static_cast( params[ 5 ] ); PARAM7 *p7 = static_cast( params[ 6 ] ); PARAM8 *p8 = static_cast( params[ 7 ] ); ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8 ); } template void cb( RETVAL( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5, PARAM6, PARAM7, PARAM8 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); PARAM4 *p4 = static_cast( params[ 3 ] ); PARAM5 *p5 = static_cast( params[ 4 ] ); PARAM6 *p6 = static_cast( params[ 5 ] ); PARAM7 *p7 = static_cast( params[ 6 ] ); PARAM8 *p8 = static_cast( params[ 7 ] ); *static_cast( retval ) = ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8 ); } // 9 params template void vcb( void ( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5, PARAM6, PARAM7, PARAM8, PARAM9 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); PARAM4 *p4 = static_cast( params[ 3 ] ); PARAM5 *p5 = static_cast( params[ 4 ] ); PARAM6 *p6 = static_cast( params[ 5 ] ); PARAM7 *p7 = static_cast( params[ 6 ] ); PARAM8 *p8 = static_cast( params[ 7 ] ); PARAM9 *p9 = static_cast( params[ 8 ] ); ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9 ); } template void cb( RETVAL( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5, PARAM6, PARAM7, PARAM8, PARAM9 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); PARAM4 *p4 = static_cast( params[ 3 ] ); PARAM5 *p5 = static_cast( params[ 4 ] ); PARAM6 *p6 = static_cast( params[ 5 ] ); PARAM7 *p7 = static_cast( params[ 6 ] ); PARAM8 *p8 = static_cast( params[ 7 ] ); PARAM9 *p9 = static_cast( params[ 8 ] ); *static_cast( retval ) = ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9 ); } // 10 params template void vcb( void ( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5, PARAM6, PARAM7, PARAM8, PARAM9, PARAM10 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); PARAM4 *p4 = static_cast( params[ 3 ] ); PARAM5 *p5 = static_cast( params[ 4 ] ); PARAM6 *p6 = static_cast( params[ 5 ] ); PARAM7 *p7 = static_cast( params[ 6 ] ); PARAM8 *p8 = static_cast( params[ 7 ] ); PARAM9 *p9 = static_cast( params[ 8 ] ); PARAM10 *p10 = static_cast( params[ 9 ] ); ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9, *p10 ); } template void cb( RETVAL( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5, PARAM6, PARAM7, PARAM8, PARAM9, PARAM10 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); PARAM4 *p4 = static_cast( params[ 3 ] ); PARAM5 *p5 = static_cast( params[ 4 ] ); PARAM6 *p6 = static_cast( params[ 5 ] ); PARAM7 *p7 = static_cast( params[ 6 ] ); PARAM8 *p8 = static_cast( params[ 7 ] ); PARAM9 *p9 = static_cast( params[ 8 ] ); PARAM10 *p10 = static_cast( params[ 9 ] ); *static_cast( retval ) = ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9, *p10 ); } // 14 params template void vcb( void ( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5, PARAM6, PARAM7, PARAM8, PARAM9, PARAM10, PARAM11, PARAM12, PARAM13, PARAM14 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); PARAM4 *p4 = static_cast( params[ 3 ] ); PARAM5 *p5 = static_cast( params[ 4 ] ); PARAM6 *p6 = static_cast( params[ 5 ] ); PARAM7 *p7 = static_cast( params[ 6 ] ); PARAM8 *p8 = static_cast( params[ 7 ] ); PARAM9 *p9 = static_cast( params[ 8 ] ); PARAM10 *p10 = static_cast( params[ 9 ] ); PARAM11 *p11 = static_cast( params[ 10 ] ); PARAM12 *p12 = static_cast( params[ 11 ] ); PARAM13 *p13 = static_cast( params[ 12 ] ); PARAM14 *p14 = static_cast( params[ 13 ] ); ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9, *p10, *p11, *p12, *p13, *p14 ); } // 16 params template void vcb( void ( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5, PARAM6, PARAM7, PARAM8, PARAM9, PARAM10, PARAM11, PARAM12, PARAM13, PARAM14, PARAM15, PARAM16 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); PARAM4 *p4 = static_cast( params[ 3 ] ); PARAM5 *p5 = static_cast( params[ 4 ] ); PARAM6 *p6 = static_cast( params[ 5 ] ); PARAM7 *p7 = static_cast( params[ 6 ] ); PARAM8 *p8 = static_cast( params[ 7 ] ); PARAM9 *p9 = static_cast( params[ 8 ] ); PARAM10 *p10 = static_cast( params[ 9 ] ); PARAM11 *p11 = static_cast( params[ 10 ] ); PARAM12 *p12 = static_cast( params[ 11 ] ); PARAM13 *p13 = static_cast( params[ 12 ] ); PARAM14 *p14 = static_cast( params[ 13 ] ); PARAM15 *p15 = static_cast( params[ 14 ] ); PARAM16 *p16 = static_cast( params[ 15 ] ); ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9, *p10, *p11, *p12, *p13, *p14, *p15, *p16 ); } // 17 params template void vcb( void ( CLASSNAME:: *fn )( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5, PARAM6, PARAM7, PARAM8, PARAM9, PARAM10, PARAM11, PARAM12, PARAM13, PARAM14, PARAM15, PARAM16, PARAM17 ), void *retval, void **params ) { PARAM1 *p1 = static_cast( params[ 0 ] ); PARAM2 *p2 = static_cast( params[ 1 ] ); PARAM3 *p3 = static_cast( params[ 2 ] ); PARAM4 *p4 = static_cast( params[ 3 ] ); PARAM5 *p5 = static_cast( params[ 4 ] ); PARAM6 *p6 = static_cast( params[ 5 ] ); PARAM7 *p7 = static_cast( params[ 6 ] ); PARAM8 *p8 = static_cast( params[ 7 ] ); PARAM9 *p9 = static_cast( params[ 8 ] ); PARAM10 *p10 = static_cast( params[ 9 ] ); PARAM11 *p11 = static_cast( params[ 10 ] ); PARAM12 *p12 = static_cast( params[ 11 ] ); PARAM13 *p13 = static_cast( params[ 12 ] ); PARAM14 *p14 = static_cast( params[ 13 ] ); PARAM15 *p15 = static_cast( params[ 14 ] ); PARAM16 *p16 = static_cast( params[ 15 ] ); PARAM17 *p17 = static_cast( params[ 16 ] ); ( static_cast( static_cast( this ) )->*fn )( *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9, *p10, *p11, *p12, *p13, *p14, *p15, *p16, *p17 ); } enum { DESTRUCT = 0xffff }; }; #define CB(x, y) case (x): cb(&CBCLASS::y, retval, params); break; #define CBT(x, y) case (x): cb(&CBCLASS::y, retval, params); break; #define VCB(x, y) case (x): vcb(&CBCLASS::y, retval, params); break; #define VCBT(x, y) case (x): vcb(&CBCLASS::y, retval, params); break; #define RECVS_DISPATCH virtual int _dispatch(int msg, void *retval, void **params=0, int nparam=0) #define START_DISPATCH \ int CBCLASS::_dispatch(int msg, void *retval, void **params, int nparam) { \ switch (msg) { #define START_DISPATCH_INLINE \ int _dispatch(int msg, void *retval, void **params, int nparam) { \ switch (msg) { //FINISH case DESTRUCT: delete this; return 1; #define END_DISPATCH \ default: return 0; \ } \ return 1; \ } #define FORWARD_DISPATCH(x) \ default: return x::_dispatch(msg, retval, params, nparam); \ } \ return 1; \ } #define DISPATCH_CODES enum inline int Dispatchable::AddRef() { return _call( Dispatchable::ADDREF, 0 ); } inline int Dispatchable::Release() { return _call( Dispatchable::RELEASE, 0 ); } inline int Dispatchable::QueryInterface( GUID interface_guid, void **object ) { return _call( Dispatchable::QUERYINTERFACE, 0, interface_guid, object ); } #ifndef DECLARE_EXTERNAL_SERVICE #define DECLARE_EXTERNAL_SERVICE(_type, _name) extern _type *_name #endif #ifndef DEFINE_EXTERNAL_SERVICE #define DEFINE_EXTERNAL_SERVICE(_type, _name) _type *_name=0 #endif