13 #ifndef BERRYMESSAGE_H_ 14 #define BERRYMESSAGE_H_ 17 #include <Poco/Mutex.h> 23 #define berryNewMessageMacro(msgHandleObject) \ 24 private: Message<> m_ ## msgHandleObject ## Message; \ 26 inline void Add ## msgHandleObject ## Listener(const MessageAbstractDelegate<>& delegate) \ 27 { m_ ## msgHandleObject ## Message += delegate; } \ 28 inline void Remove ## msgHandleObject ## Listener(const MessageAbstractDelegate<>& delegate) \ 29 { m_ ## msgHandleObject ## Message -= delegate; } \ 32 #define berryNewMessageWithReturnMacro(msgHandleObject, returnType) \ 33 private: Message<returnType> m_ ## msgHandleObject ## Message; \ 35 inline void Add ## msgHandleObject ## Listener(const MessageAbstractDelegate<returnType>& delegate) \ 36 { m_ ## msgHandleObject ## Message += delegate; } \ 37 inline void Remove ## msgHandleObject ## Listener(const MessageAbstractDelegate<returnType>& delegate) \ 38 { m_ ## msgHandleObject ## Message -= delegate; } \ 41 #define berryNewMessage1Macro(msgHandleObject, type1) \ 42 private: Message1< type1 > m_msgHandleObject ## Message; \ 44 void Add ## msgHandleObject ## Listener(const MessageAbstractDelegate1< type1 >& delegate) \ 45 { m_ ## msgHandleObject ## Message += delegate; } \ 46 void Remove ## msgHandleObject ## Listener(const MessageAbstractDelegate1< type1 >& delegate) \ 47 { m_ ## msgHandleObject ## Message -= delegate; } \ 53 template<
typename A =
void>
67 template<
typename T,
typename A =
void>
81 template<
typename T,
typename U,
typename A =
void>
90 virtual A
Execute(T t, U u)
const = 0;
95 template<
typename T,
typename U,
typename V,
typename A =
void>
104 virtual A
Execute(T t, U u, V v)
const = 0;
109 template<
typename T,
typename U,
typename V,
typename W,
typename A =
void>
118 virtual A
Execute(T t, U u, V v, W w)
const = 0;
123 template<
class R,
typename A =
void>
131 m_Object(object), m_MemberFunctionPointer(memberFunctionPointer)
142 return (m_Object->*m_MemberFunctionPointer)();
152 if ((
void*) this->m_Object != (
void*) cmd->m_Object)
154 if (this->m_MemberFunctionPointer != cmd->m_MemberFunctionPointer)
166 A (R::*m_MemberFunctionPointer)();
169 template<
class R,
typename T,
typename A =
void>
177 m_Object(object), m_MemberFunctionPointer(memberFunctionPointer)
188 return (m_Object->*m_MemberFunctionPointer)(t);
198 if ((
void*) this->m_Object != (
void*) cmd->m_Object)
200 if (this->m_MemberFunctionPointer != cmd->m_MemberFunctionPointer)
212 A (R::*m_MemberFunctionPointer)(T);
215 template<
class R,
typename T,
typename U,
typename A =
void>
223 m_Object(object), m_MemberFunctionPointer(memberFunctionPointer)
234 return (m_Object->*m_MemberFunctionPointer)(t, u);
244 if ((
void*) this->m_Object != (
void*) cmd->m_Object)
246 if (this->m_MemberFunctionPointer != cmd->m_MemberFunctionPointer)
258 A (R::*m_MemberFunctionPointer)(T, U);
261 template<
class R,
typename T,
typename U,
typename V,
typename A =
void>
269 m_Object(object), m_MemberFunctionPointer(memberFunctionPointer)
280 return (m_Object->*m_MemberFunctionPointer)(t, u, v);
290 if ((
void*) this->m_Object != (
void*) cmd->m_Object)
292 if (this->m_MemberFunctionPointer != cmd->m_MemberFunctionPointer)
304 A (R::*m_MemberFunctionPointer)(T, U, V);
307 template<
class R,
typename T,
typename U,
typename V,
typename W,
316 m_Object(object), m_MemberFunctionPointer(memberFunctionPointer)
327 return (m_Object->*m_MemberFunctionPointer)(t, u, v, w);
337 if ((
void*) this->m_Object != (
void*) cmd->m_Object)
339 if (this->m_MemberFunctionPointer != cmd->m_MemberFunctionPointer)
351 A (R::*m_MemberFunctionPointer)(T, U, V, W);
356 virtual void HandleException(
const std::exception& exc) = 0;
367 typedef void (R::*HandleExceptionCallback)(
const std::exception&);
370 m_Object(r), m_ExceptionCallback(c)
376 (m_Object->*m_ExceptionCallback)(exc);
381 if (!m_Object)
return nullptr;
388 HandleExceptionCallback m_ExceptionCallback;
401 m_ExcHandler(nullptr)
408 for (
auto iter = m_Delegates.begin(); iter
409 != m_Delegates.end(); ++iter)
417 void Add(
const Delegate& d)
const 419 Delegate* copy = d.
Clone();
421 Poco::FastMutex::ScopedLock lock(m_Mutex);
422 for (
auto iter = m_Delegates.begin(); iter
423 != m_Delegates.end(); ++iter)
425 if ((*iter)->operator==(copy))
431 m_Delegates.push_back(copy);
436 Poco::FastMutex::ScopedLock lock(m_Mutex);
437 for (
auto iter = m_Delegates.begin(); iter
438 != m_Delegates.end(); ++iter)
440 if ((*iter)->operator==(&d))
443 m_Delegates.erase(iter);
451 return m_Delegates.empty();
454 template<
typename Dummy>
460 Poco::FastMutex::ScopedLock lock(m_Mutex);
461 delegates.assign(m_Delegates.begin(), m_Delegates.end());
464 for (
auto iter = delegates.begin(); iter
465 != delegates.end(); ++iter)
472 catch (
const std::exception& e)
476 m_ExcHandler->HandleException(e);
487 m_ExcHandler->HandleException(std::exception());
501 Poco::FastMutex::ScopedLock lock(m_Mutex);
502 delegates.assign(m_Delegates.begin(), m_Delegates.end());
505 for (
auto iter = delegates.begin(); iter
506 != delegates.end(); ++iter)
513 catch (
const std::exception& e)
517 m_ExcHandler->HandleException(e);
528 m_ExcHandler->HandleException(std::exception());
535 template<
typename T,
typename U>
541 Poco::FastMutex::ScopedLock lock(m_Mutex);
542 delegates.assign(m_Delegates.begin(), m_Delegates.end());
545 for (
auto iter = delegates.begin(); iter
546 != delegates.end(); ++iter)
551 (*iter)->Execute(t, u);
553 catch (
const std::exception& e)
557 m_ExcHandler->HandleException(e);
568 m_ExcHandler->HandleException(std::exception());
575 template<
typename T,
typename U,
typename V>
581 Poco::FastMutex::ScopedLock lock(m_Mutex);
582 delegates.assign(m_Delegates.begin(), m_Delegates.end());
585 for (
auto iter = delegates.begin(); iter
586 != delegates.end(); ++iter)
591 (*iter)->Execute(t, u, v);
593 catch (
const std::exception& e)
597 m_ExcHandler->HandleException(e);
608 m_ExcHandler->HandleException(std::exception());
615 template<
typename T,
typename U,
typename V,
typename W>
616 void Send4(T t, U u, V v, W w)
const 621 Poco::FastMutex::ScopedLock lock(m_Mutex);
622 delegates.assign(m_Delegates.begin(), m_Delegates.end());
625 for (
auto iter = delegates.begin(); iter
626 != delegates.end(); ++iter)
631 (*iter)->Execute(t, u, v, w);
633 catch (
const std::exception& e)
637 m_ExcHandler->HandleException(e);
648 m_ExcHandler->HandleException(std::exception());
657 Poco::FastMutex::ScopedLock lock(m_Mutex);
659 m_ExcHandler = handler.
Clone();
664 Poco::FastMutex::ScopedLock lock(m_Mutex);
665 if (m_ExcHandler)
return m_ExcHandler->Clone();
671 Poco::FastMutex::ScopedLock lock(m_Mutex);
694 mutable std::vector<Delegate*> m_Delegates;
697 mutable Poco::FastMutex m_Mutex;
715 template<
typename A =
void>
726 delegates.Add(delegate);
729 void operator +=(
const AbstractDelegate& delegate)
const 731 this->AddListener(delegate);
736 delegates.Remove(delegate);
739 void operator -=(
const AbstractDelegate& delegate)
const 741 this->RemoveListener(delegate);
756 delegates.SetExceptionHandler(handler);
761 return delegates.GetExceptionHandler();
766 return delegates.GetDelegates();
771 return !delegates.IsEmpty();
776 return delegates.IsEmpty();
786 template<
typename T,
typename A =
void>
797 delegates.Add(delegate);
800 void operator +=(
const AbstractDelegate& delegate)
const 802 this->AddListener(delegate);
807 delegates.Remove(delegate);
810 void operator -=(
const AbstractDelegate& delegate)
const 812 this->RemoveListener(delegate);
827 delegates.SetExceptionHandler(handler);
832 return delegates.GetExceptionHandler();
837 return delegates.GetDelegates();
842 return !delegates.IsEmpty();
847 return delegates.IsEmpty();
857 template<
typename T,
typename U,
typename A =
void>
868 delegates.Add(delegate);
871 void operator +=(
const AbstractDelegate& delegate)
const 873 this->AddListener(delegate);
878 delegates.Remove(delegate);
881 void operator -=(
const AbstractDelegate& delegate)
const 883 this->RemoveListener(delegate);
888 delegates.Send2(t, u);
898 delegates.SetExceptionHandler(handler);
903 return delegates.GetExceptionHandler();
908 return delegates.GetDelegates();
913 return !delegates.IsEmpty();
918 return delegates.IsEmpty();
928 template<
typename T,
typename U,
typename V,
typename A =
void>
939 delegates.Add(delegate);
942 void operator +=(
const AbstractDelegate& delegate)
const 944 this->AddListener(delegate);
949 delegates.Remove(delegate);
952 void operator -=(
const AbstractDelegate& delegate)
const 954 this->RemoveListener(delegate);
959 delegates.Send3(t, u, v);
969 delegates.SetExceptionHandler(handler);
974 return delegates.GetExceptionHandler();
979 return delegates.GetDelegates();
984 return !delegates.IsEmpty();
989 return delegates.IsEmpty();
999 template<
typename T,
typename U,
typename V,
typename W,
typename A =
void>
1010 delegates.Add(delegate);
1013 void operator +=(
const AbstractDelegate& delegate)
const 1015 this->AddListener(delegate);
1020 delegates.Remove(delegate);
1023 void operator -=(
const AbstractDelegate& delegate)
const 1025 this->RemoveListener(delegate);
1028 void Send(T t, U u, V v, W w)
const 1030 delegates.Send4(t, u, v, w);
1035 this->Send(t, u , v, w);
1040 delegates.SetExceptionHandler(handler);
1045 return delegates.GetExceptionHandler();
1050 return delegates.GetDelegates();
1055 return !delegates.IsEmpty();
1060 return delegates.IsEmpty();
static MsgHandler handler
DelegateList< AbstractDelegate >::ListType ListenerList
ListenerList GetListeners() const
A Execute(T t, U u, V v, W w) const override
void AddListener(const AbstractDelegate &delegate) const
virtual ~MessageAbstractDelegate4()
ListType GetDelegates() const
MessageDelegate3(R *object, A(R::*memberFunctionPointer)(T, U, V))
ListenerList GetListeners() const
void SetExceptionHandler(const AbstractExceptionHandler &handler)
AbstractExceptionHandler * GetExceptionHandler() const
void RemoveListener(const AbstractDelegate &delegate) const
DelegateList< AbstractDelegate > delegates
void RemoveListener(const AbstractDelegate &delegate) const
void operator()(T t, U u, V v) const
void operator()(T t, U u, V v, W w) const
bool operator==(const MessageAbstractDelegate< A > *c) override
MessageAbstractDelegate3< T, U, V, A > AbstractDelegate
void Send(T t, U u, V v, W w) const
void SetExceptionHandler(const AbstractExceptionHandler &handler)
MessageDelegate(R *object, A(R::*memberFunctionPointer)())
bool operator==(const MessageAbstractDelegate2< T, U, A > *c) override
AbstractExceptionHandler * Clone() const override
DelegateList< AbstractDelegate > delegates
~MessageDelegate() override
AbstractExceptionHandler * GetExceptionHandler() const
MessageDelegate4(R *object, A(R::*memberFunctionPointer)(T, U, V, W))
void RemoveListener(const AbstractDelegate &delegate) const
virtual ~MessageAbstractDelegate3()
void SetExceptionHandler(const AbstractExceptionHandler &handler)
std::vector< Delegate * > ListType
MessageDelegate2(R *object, A(R::*memberFunctionPointer)(T, U))
AbstractExceptionHandler * GetExceptionHandler() const
AbstractExceptionHandler * GetExceptionHandler() const
DelegateList< AbstractDelegate >::ListType ListenerList
DelegateList< AbstractDelegate >::ListType ListenerList
void SetExceptionHandler(const AbstractExceptionHandler &handler)
virtual bool operator==(const MessageAbstractDelegate *cmd)=0
MessageAbstractDelegate2< T, U, A > * Clone() const override
MessageAbstractDelegate< A > * Clone() const override
MessageAbstractDelegate4< T, U, V, W, A > * Clone() const override
bool HasListeners() const
AbstractExceptionHandler * GetExceptionHandler() const
MessageDelegate1(R *object, A(R::*memberFunctionPointer)(T))
void SetExceptionHandler(const AbstractExceptionHandler &handler)
MessageAbstractDelegate4< T, U, V, W, A > AbstractDelegate
bool operator==(const MessageAbstractDelegate1< T, A > *c) override
DelegateList< AbstractDelegate > delegates
void SetExceptionHandler(const AbstractExceptionHandler &handler)
void AddListener(const AbstractDelegate &delegate) const
~MessageDelegate3() override
A Execute(T t, U u) const override
MessageExceptionHandler(R *r, HandleExceptionCallback c)
MessageAbstractDelegate< A > AbstractDelegate
MessageAbstractDelegate1< T, A > AbstractDelegate
virtual ~MessageAbstractDelegate()
bool operator==(const MessageAbstractDelegate4< T, U, V, W, A > *c) override
~MessageDelegate2() override
ListenerList GetListeners() const
AbstractExceptionHandler * GetExceptionHandler() const
void Send(T t, U u) const
MessageAbstractDelegate2< T, U, A > AbstractDelegate
virtual MessageAbstractDelegate * Clone() const =0
bool operator==(const MessageAbstractDelegate3< T, U, V, A > *c) override
ListenerList GetListeners() const
void Add(const Delegate &d) const
DelegateList< AbstractDelegate > delegates
void operator()(T t, U u) const
bool HasListeners() const
DelegateList< AbstractDelegate > delegates
virtual MessageAbstractDelegate4 * Clone() const =0
A Execute(T t, U u, V v) const override
Event/message/notification class.
virtual AbstractExceptionHandler * Clone() const =0
~MessageDelegate1() override
MessageAbstractDelegate1< T, A > * Clone() const override
virtual ~MessageAbstractDelegate2()
void HandleException(const std::exception &exc) override
bool HasListeners() const
bool HasListeners() const
void AddListener(const AbstractDelegate &delegate) const
DelegateList< AbstractDelegate >::ListType ListenerList
~MessageDelegate4() override
bool HasListeners() const
void Remove(const Delegate &d) const
void operator()(T t) const
void Send(T t, U u, V v) const
DelegateList< AbstractDelegate >::ListType ListenerList
void Send4(T t, U u, V v, W w) const
void AddListener(const AbstractDelegate &delegate) const
void Send2(T t, U u) const
void RemoveListener(const AbstractDelegate &delegate) const
virtual ~AbstractExceptionHandler()
void Send3(T t, U u, V v) const
ListenerList GetListeners() const
MessageAbstractDelegate3< T, U, V, A > * Clone() const override
void AddListener(const AbstractDelegate &delegate) const
void RemoveListener(const AbstractDelegate &delegate) const
virtual ~MessageAbstractDelegate1()