////////////////////////////// // Dennis Andersen 2013 // ////////////////////////////// #ifndef MISC_OYSTER_CALLBACK_H #define MISC_OYSTER_CALLBACK_H #include "PostBox\IPostBox.h" namespace Oyster { namespace Callback { template struct CallbackFunction { typedef ReturnVal (*FNC)(ParamVal); }; template struct CallbackObject { virtual ReturnVal ObjectCallback(ParamVal) = 0; }; enum CallbackType { CallbackType_PostBox, CallbackType_Function, CallbackType_Object, CallbackType_Unknown, }; template union OysterCallbackValue { IPostBox* callbackPostBox; CallbackObject *callbackObject; typename CallbackFunction::FNC callbackFunction; OysterCallbackValue() { memset(this, 0, sizeof(OysterCallbackValue)); } OysterCallbackValue(IPostBox* postbox) { callbackPostBox = postbox; } OysterCallbackValue(CallbackObject* obj) { callbackObject = obj; } OysterCallbackValue(typename CallbackFunction::FNC function) { callbackFunction = function; } }; template struct OysterCallback { OysterCallbackValue value; CallbackType callbackType; OysterCallback() :callbackType(CallbackType_Unknown){} bool operator()() { return true; } bool operator()(ParamVal e) { switch (callbackType) { case CallbackType_Function: if(value.callbackFunction) value.callbackFunction(e); return true; break; case CallbackType_Object: if(value.callbackObject) value.callbackObject->ObjectCallback(e); return true; break; case CallbackType_PostBox: value.callbackPostBox->Post(e); return true; break; } return false; } }; } } #endif