#ifndef POPUP_CALLBACK_CLASS #define POPUP_CALLBACK_CLASS #include "sgp.h" class popupCallback; template class popupCallbackFunction; template class popupCallbackFunction2; class popupCallback{ public: popupCallback(void){} ~popupCallback(void){} virtual void bind(void* newFun) = 0; virtual bool call(void) = 0; }; // returns something, takes three parameters template class popupCallbackFunction3: public popupCallback{ protected: R (*fun)(P1,P2,P3); P1 param_1; P2 param_2; P3 param_3; public: popupCallbackFunction3(void); popupCallbackFunction3(void * newFun, P1 param, P2 param2, P3 param3); virtual void bind(void * newFun); virtual bool call(void); }; template popupCallbackFunction3::popupCallbackFunction3(void){ this->fun = 0; this->param_1 = P1(); this->param_2 = P2(); this->param_3 = P3(); }; template popupCallbackFunction3::popupCallbackFunction3(void * newFun, P1 param, P2 param2, P3 param3){ this->fun = static_cast< R(*)(P1,P2,P3)>(newFun); this->param_1 = param; this->param_2 = param2; this->param_3 = param3; }; template void popupCallbackFunction3::bind(void * newFun){ this->fun = static_cast< R(*)(P1,P2,P3)>(newFun); }; template bool popupCallbackFunction3::call(void){ return (bool)(this->fun)(this->param_1,this->param_2,this->param_3); }; // three params, no return val template class popupCallbackFunction3: public popupCallback{ protected: void (*fun)(P1,P2,P3); P1 param_1; P2 param_2; P3 param_3; public: popupCallbackFunction3(void); popupCallbackFunction3(void * newFun, P1 param, P2 param2, P3 param3); virtual void bind(void * newFun); virtual bool call(void); }; template popupCallbackFunction3::popupCallbackFunction3(void){ this->fun = 0; this->param_1 = P1(); this->param_2 = P2(); this->param_3 = P3(); }; template popupCallbackFunction3::popupCallbackFunction3(void * newFun, P1 param, P2 param2, P3 param3){ this->fun = static_cast< void(*)(P1,P2,P3)>(newFun); this->param_1 = param; this->param_2 = param2; this->param_3 = param3; }; template void popupCallbackFunction3::bind(void * newFun){ this->fun = static_cast< void(*)(P1,P2,P3)>(newFun); }; template bool popupCallbackFunction3::call(void){ (this->fun)(this->param_1,this->param_2,this->param_3); return 1; }; // returns something, takes two parameters template class popupCallbackFunction2: public popupCallback{ protected: R (*fun)(P1,P2); P1 param_1; P2 param_2; public: popupCallbackFunction2(void); popupCallbackFunction2(void * newFun, P1 param, P2 param2); virtual void bind(void * newFun); virtual bool call(void); }; template popupCallbackFunction2::popupCallbackFunction2(void){ this->fun = 0; this->param_1 = P1(); this->param_2 = P2(); }; template popupCallbackFunction2::popupCallbackFunction2(void * newFun, P1 param, P2 param2){ this->fun = static_cast< R(*)(P1,P2)>(newFun); this->param_1 = param; this->param_2 = param2; }; template void popupCallbackFunction2::bind(void * newFun){ this->fun = static_cast< R(*)(P1,P2)>(newFun); }; template bool popupCallbackFunction2::call(void){ return (bool)(this->fun)(this->param_1,this->param_2); }; // two params, no return val template class popupCallbackFunction2: public popupCallback{ protected: void (*fun)(P1,P2); P1 param_1; P2 param_2; public: popupCallbackFunction2(void); popupCallbackFunction2(void * newFun, P1 param, P2 param2); virtual void bind(void * newFun); virtual bool call(void); }; template popupCallbackFunction2::popupCallbackFunction2(void){ this->fun = 0; this->param_1 = P1(); this->param_2 = P2(); }; template popupCallbackFunction2::popupCallbackFunction2(void * newFun, P1 param, P2 param2){ this->fun = static_cast< void(*)(P1,P2)>(newFun); this->param_1 = param; this->param_2 = param2; }; template void popupCallbackFunction2::bind(void * newFun){ this->fun = static_cast< void(*)(P1,P2)>(newFun); }; template bool popupCallbackFunction2::call(void){ (this->fun)(this->param_1,this->param_2); return 1; }; // returns something, takes one parameter template class popupCallbackFunction : public popupCallback{ protected: R (*fun)(P1); P1 param_1; public: popupCallbackFunction(void); popupCallbackFunction(void * newFun, P1 param); virtual void bind(void * newFun); virtual bool call(void); }; template popupCallbackFunction::popupCallbackFunction(void){ this->fun = 0; this->param_1 = P1(); }; template popupCallbackFunction::popupCallbackFunction(void * newFun, P1 param){ this->fun = static_cast< R(*)(P1)>(newFun); this->param_1 = param; }; template void popupCallbackFunction::bind(void * newFun){ this->fun = static_cast< R(*)(P1)>(newFun); }; template bool popupCallbackFunction::call(void){ return (bool)(this->fun)(this->param_1); } // no return type, one parameter template class popupCallbackFunction : public popupCallback{ protected: void (*fun)(P1); P1 param_1; public: popupCallbackFunction(void); popupCallbackFunction(void * newFun, P1 param); virtual void bind(void * newFun); virtual bool call(void); }; template popupCallbackFunction::popupCallbackFunction(void){ this->fun = 0; this->param_1 = P1(); }; template popupCallbackFunction::popupCallbackFunction(void * newFun, P1 param){ this->fun = static_cast< void(*)(P1)>(newFun); this->param_1 = param; }; template void popupCallbackFunction::bind(void * newFun){ this->fun = static_cast< void(*)(P1)>(newFun); }; template bool popupCallbackFunction::call(void){ try { (this->fun)(this->param_1); } catch (...) { return false; } return true; } // returns something, no parameter template class popupCallbackFunction : public popupCallback{ protected: R (*fun)(void); public: popupCallbackFunction(void); popupCallbackFunction(void * newFun); virtual void bind(void * newFun); virtual bool call(void); }; template popupCallbackFunction::popupCallbackFunction(void){ this->fun = 0; }; template popupCallbackFunction::popupCallbackFunction(void * newFun){ this->fun = static_cast< R(*)(void)>(newFun); }; template void popupCallbackFunction::bind(void * newFun){ this->fun = static_cast< R(*)(void)>(newFun); }; template bool popupCallbackFunction::call(void){ return (bool)(this->fun)(); } //template<> //bool popupCallbackFunction::call(void){ // return (this->fun)(); //} // no parameters/return types template <> class popupCallbackFunction : public popupCallback{ protected: void (*fun)(void); public: popupCallbackFunction(void){ this->fun = 0; }; popupCallbackFunction(void * newFun){ this->fun = static_cast< void(*)(void)>(newFun); }; virtual void bind(void * newFun){ this->fun = static_cast< void(*)(void)>(newFun); }; virtual bool call(void){ try { (this->fun)(); } catch (...) { return false; } return true; }; }; class popupCallbackLua : public popupCallback{ protected: CHAR16 * functionName; public: popupCallbackLua(void); popupCallbackLua(CHAR16 * newFunctionName){ this->functionName = newFunctionName; }; virtual void bind(void * newFun){ this->functionName = static_cast< CHAR16* >(newFun); }; virtual bool call(void){ return true; }; }; #endif