Mercurial > hg > orthanc-stone
diff Framework/Messages/IObservable.h @ 302:4a79193ffb58 am-callable-and-promise
support for custom messages + no leaks in unit-tests
author | am@osimis.io |
---|---|
date | Tue, 18 Sep 2018 18:04:53 +0200 |
parents | b4abaeb783b1 |
children | b66d13708f40 |
line wrap: on
line diff
--- a/Framework/Messages/IObservable.h Tue Sep 18 15:34:28 2018 +0200 +++ b/Framework/Messages/IObservable.h Tue Sep 18 18:04:53 2018 +0200 @@ -27,13 +27,16 @@ #include <iostream> #include <map> + #include "MessageBroker.h" #include "MessageType.h" #include "ICallable.h" #include "IObserver.h" +#include "MessageForwarder.h" namespace OrthancStone { + class IObservable : public boost::noncopyable { protected: @@ -42,6 +45,9 @@ typedef std::map<int, std::set<ICallable*> > Callables; Callables callables_; + typedef std::set<IMessageForwarder*> Forwarders; + Forwarders forwarders_; + public: IObservable(MessageBroker& broker) @@ -50,6 +56,7 @@ } virtual ~IObservable() { + // delete all callables (this will also unregister them from the broker) for (Callables::const_iterator it = callables_.begin(); it != callables_.end(); ++it) { @@ -59,6 +66,13 @@ delete *it2; } } + + // unregister the forwarders but don't delete them (they'll be deleted by the observable they are observing as any other callable) + for (Forwarders::iterator it = forwarders_.begin(); + it != forwarders_.end(); ++it) + { + broker_.Unregister(dynamic_cast<IObserver&>(**it)); + } } void RegisterObserverCallback(ICallable* callable) @@ -85,6 +99,11 @@ } } + void RegisterForwarder(IMessageForwarder* forwarder) + { + forwarders_.insert(forwarder); + } + }; }