#ifndef modern_callproc_h__ #define modern_callproc_h__ namespace call { #include ////////////////////////////////////////////////////////////////////////// // USE AS // ret = call::sync( proc, param1, param2 ... etc) ////////////////////////////////////////////////////////////////////////// // internal realization enum ASYNC_T { ASYNC = 0, SYNC }; int __ProcessCall( class __baseCall * pStorage, ASYNC_T async ); class __baseCall { public: virtual int __DoCallStorageProc() =0; virtual ~__baseCall() {}; }; template< class R > class _callParams0 : public __baseCall { public: R(*_proc)(); _callParams0( R (*proc)() ) : _proc(proc){}; int __DoCallStorageProc() { return (int)_proc(); } }; template<> class _callParams0 : public __baseCall { public: void(*_proc)(); _callParams0( void (*proc)() ) : _proc(proc){}; int __DoCallStorageProc() { _proc(); return 0; } }; template< class R, class A> class _callParams1 : public __baseCall { public: R(*_proc)(A); A _a; _callParams1( R(*proc)(A), A a) : _proc(proc), _a(a) {}; int __DoCallStorageProc() { return (int)_proc(_a); } }; template class _callParams1 : public __baseCall { public: void(*_proc)(A); A _a; _callParams1( void(*proc)(A), A a) : _proc(proc), _a(a) {}; int __DoCallStorageProc() { _proc(_a); return 0; } }; template< class R, class A, class B> class _callParams2 : public __baseCall { public: R (*_proc)(A, B); A _a; B _b; _callParams2( R (*proc)(A, B), A a, B b) : _proc(proc), _a(a), _b(b) {}; int __DoCallStorageProc() { return (int)_proc(_a, _b); } }; template< class A, class B> class _callParams2 : public __baseCall { public: void (*_proc)(A, B); A _a; B _b; _callParams2( void (*proc)(A, B), A a, B b) : _proc(proc), _a(a), _b(b) {}; int __DoCallStorageProc() { _proc(_a, _b); return 0; } }; template< class R, class A, class B, class C> class _callParams3 : public __baseCall { public: R (*_proc)(A, B, C); A _a; B _b; C _c; _callParams3( R (*proc)(A, B, C), A a, B b, C c ) : _proc(proc), _a(a), _b(b), _c(c) {}; int __DoCallStorageProc() { return (int)_proc(_a,_b,_c); } }; template< class A, class B, class C> class _callParams3 : public __baseCall { public: void (*_proc)(A, B, C); A _a; B _b; C _c; _callParams3( void (*proc)(A, B, C), A a, B b, C c ) : _proc(proc), _a(a), _b(b), _c(c) {}; int __DoCallStorageProc() { _proc(_a,_b,_c); return 0;} }; template < class R > R __DoCall( R(*__proc)(), ASYNC_T sync_mode ) { typedef _callParams0< R > callClass; callClass * storage = new callClass( __proc ); return (R) call::__ProcessCall( storage, sync_mode ); }; template < class R, class A > R __DoCall( R(*__proc)( A ), A a, ASYNC_T sync_mode ) { typedef _callParams1< R, A > callClass; callClass * storage = new callClass( __proc, a ); return (R)__ProcessCall( storage, sync_mode ); }; template < class R, class A, class B > R __DoCall( R(*__proc)( A, B ), A a, B b, ASYNC_T sync_mode ) { typedef _callParams2< R, A, B > callClass; callClass * storage = new callClass( __proc, a, b); return (R)__ProcessCall( storage, sync_mode ); }; template < class R, class A, class B, class C > R __DoCall( R(*__proc)( A, B, C ), A a, B b, C c, ASYNC_T sync_mode ) { typedef _callParams3< R, A, B, C > callClass; callClass * storage = new callClass( __proc, a, b, c); return (R)__ProcessCall( storage, sync_mode ); }; template < class R > R sync( R(*_proc)() ) { return __DoCall(_proc, SYNC); }; template < class R, class A > R sync( R(*_proc)( A ), A a ) { return __DoCall(_proc, a, SYNC); }; template < class R, class A, class B > R sync( R(*_proc)( A,B), A a, B b ) { return __DoCall(_proc, a, b, SYNC); }; template < class R, class A, class B, class C > R sync( R(*_proc)( A,B,C ), A a, B b, C c) { return __DoCall(_proc, a, b, c, SYNC); }; template < class R > int async( R(*_proc)() ) { return __DoCall(_proc, ASYNC); }; template < class R, class A > R async( R(*_proc)( A ), A a ) { return __DoCall(_proc, a, ASYNC); }; template < class R, class A, class B > R async( R(*_proc)( A,B), A a, B b ) { return __DoCall(_proc, a, b, ASYNC); }; template < class R, class A, class B, class C > R async( R(*_proc)( A,B,C ), A a, B b, C c) { return __DoCall(_proc, a, b, c, ASYNC); }; }; // namespace call #endif // modern_callproc_h__