#if !defined (__CALLBACK__) #define __CALLBACK__ #include "include.hpp" #include "failure.hpp" namespace xgx_support { class gx_countedBody { public: gx_countedBody() : counter(0) {} virtual ~gx_countedBody() {} void inc() throw() { counter++;} void dec() throw() { counter--;} unsigned int count() const throw() {return counter;} private: unsigned int counter; }; class gx_callbackBaseBody : public gx_countedBody { public: gx_callbackBaseBody() {} virtual ~gx_callbackBaseBody() {} virtual void operator ()() const = 0; }; class gx_callback { public: gx_callback(gx_callbackBaseBody *ptr) : entity(ptr) {incEntityCount();} gx_callback(gx_callback const & arg) : entity(arg.entity) {incEntityCount();} ~gx_callback() { decEntityCount();entity = 0;return;} void operator ()() { (*entity)();} void incEntityCount() throw() {entity->inc();return;} void decEntityCount() throw() {entity->dec();if(!entity->count()) delete entity;return;} template static gx_callback make_M2(CLIENT &,CLIENTMEMBER &); template static gx_callback make_M3P(CLIENT &,CLIENTMEMBER &,PARAMETER &); template static gx_callback make_M3R(CLIENT &,CLIENTMEMBER &,RESULT &); template static gx_callback make_M4(CLIENT &,CLIENTMEMBER &,PARAMETER &,RESULT &); template static gx_callback make_F(FUNCTION &); template static gx_callback make_F2P(FUNCTION &,PARAMETER &); template static gx_callback make_F2R(FUNCTION &,RESULT &); template static gx_callback make_F3(FUNCTION &,PARAMETER &,RESULT &); private: gx_callbackBaseBody *entity; }; template class gx_memberCB : public gx_callbackBaseBody { public: gx_memberCB(CLIENT &clnt,MEMBER &clntmem) : client(clnt),clientmember(clntmem) {} virtual void operator () () { ((&client) ->*member)();} private: CLIENT &client; MEMBER &clientmember; }; template class gx_memberCBP : public gx_callbackBaseBody { public: gx_memberCBP(CLIENT &clnt,MEMBER &clntmem,PARAMETER &parm) : client(clnt),clientmember(clntmem),parameter(parm) {} virtual void operator () () { ((&client) ->*member)(parameter);} private: CLIENT &client; MEMBER &clientmember; PARAMETER ¶meter; }; template class gx_memberCBR : public gx_callbackBaseBody { public: gx_memberCBR(CLIENT &clnt,MEMBER &clntmem,RESULT &res) : client(clnt),clientmember(clntmem),result(res) {} virtual void operator () () { ((&client) ->*member)(res);} private: CLIENT &client; MEMBER &clientmember; RESULT &result; }; template class gx_memberCBPR : public gx_callbackBaseBody { public: gx_memberCBPR(CLIENT &clnt,MEMBER &clntmem,PARAMETER &parm,RESULT &res) : client(clnt),clientmember(clntmem),parameter(parm),result(res) {} virtual void operator () () { (result = (&client) ->*member)(parameter);} private: CLIENT &client; MEMBER &clientmember; PARAMETER ¶meter; RESULT &result; }; template class gx_functionCB : public gx_callbackBaseBody { public: gx_functionCB(FUNCTION &func) : function(func) {} virtual void operator() () { function();} private: FUNCTION &function; }; template class gx_functionCBP : public gx_callbackBaseBody { public: gx_functionCBP(FUNCTION &func,PARAMETER &parm) : function(func),parameter(parm) {} virtual void operator() () { function(parameter);} private: FUNCTION &function; PARAMETER ¶meter; }; template class gx_functionCBR : public gx_callbackBaseBody { public: gx_functionCBR(FUNCTION &func) : function(func) {} virtual void operator() () { result = function();} private: FUNCTION &function; RESULT &result; }; template class gx_functionCBPR : public gx_callbackBaseBody { public: gx_functionCBPR(FUNCTION &func,PARAMETER ¶,RESULT &res) : function(func),parameter(para),result(res) {} virtual void operator() () { result = function(parameter);} private: FUNCTION &function; PARAMETER ¶meter; RESULT &result; }; template gx_callback gx_callback::make_M2(CLIENT &c,CLIENTMEMBER &cm) { return gx_callback(new gx_memberCB(c,cm)); } template gx_callback gx_callback::make_M3P(CLIENT &c,CLIENTMEMBER &cm,PARAMETER &p) { return gx_callback(new gx_memberCBP(c,cm,p)); } template gx_callback gx_callback::make_M3R(CLIENT &c,CLIENTMEMBER &cm,RESULT &r) { return gx_callback(new gx_memberCBR(c,cm,r)); } template gx_callback gx_callback::make_M4(CLIENT &c,CLIENTMEMBER &cm,PARAMETER &p,RESULT &r) { return gx_callback(new gx_memberCBPR(c,cm,p,r)); } template gx_callback gx_callback::make_F(FUNCTION &f) { return gx_callback(new gx_functionCB(f)); } template gx_callback gx_callback::make_F2P(FUNCTION &f,PARAMETER &p) { return gx_callback(new gx_functionCBP(f,p)); } template gx_callback gx_callback::make_F2R(FUNCTION &f,RESULT &r) { return gx_callback(new gx_functionCBR(f,r)); } template gx_callback gx_callback::make_F3(FUNCTION &f,PARAMETER &r,RESULT &p) { return gx_callback(new gx_functionCBPR(f,p,r)); } } //namespace xgx_support #endif