#ifndef CALL_BACK_H #define CALL_BACK_H namespace fw { class Callback { public: friend class ThreadsWrapper; typedef uint32 CallbackSlot; class Parameter : public DataParameters { friend class Callback; public: Parameter(); virtual ~Parameter(); #define CALLBACK_RETURN_PARAM_NAME "ReturnData" template<typename T> T GetReturnValue() const { if (GetParametersCount() > 0) { return (T)GetParameterAsPointer<T>(CALLBACK_RETURN_PARAM_NAME); } else { return (T) nullptr; } } template<typename T> void SetReturnValue(T value) { SetParam(CALLBACK_RETURN_PARAM_NAME, value); } }; Callback(const std::string& sName = UNKNOWN); virtual ~Callback(); template<typename C, typename ThisPointer> void AddCallbackFunction(bool (C::*f) (const Parameter&), ThisPointer p) { std::function <bool(const Parameter&)> func = std::bind(f, p, std::placeholders::_1); m_callbacksParam.push_back(func); } template<typename C, typename ThisPointer> void AddCallbackFunction(bool (C::*f) (), ThisPointer p) { std::function <bool()> func = std::bind(f, p); m_callbacksSimple.push_back(func); } void operator() (); void operator() (const Parameter& parameter); bool InvokeCallbacks(const Parameter& parameter) const { if (m_callbacksParam.size() == 0 && m_callbacksSimple.size() == 0) { return false; } bool bOK = false; for (uint32 i = 0; i < m_callbacksParam.size(); i++) { std::function<bool(Parameter)> func = m_callbacksParam[i]; bool bSuccess = func(parameter); bOK |= bSuccess; } for (uint32 i = 0; i < m_callbacksSimple.size(); i++) { std::function<bool()> func = m_callbacksSimple[i]; bool bSuccess = func(); bOK |= bSuccess; } return bOK; } private: std::string m_sName; std::vector<std::function<bool()>> m_callbacksSimple; std::vector<std::function<bool(const Parameter&)>> m_callbacksParam; }; } #endif