comparison 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
comparison
equal deleted inserted replaced
301:547e1cf7aa7b 302:4a79193ffb58
25 #include <assert.h> 25 #include <assert.h>
26 #include <algorithm> 26 #include <algorithm>
27 #include <iostream> 27 #include <iostream>
28 #include <map> 28 #include <map>
29 29
30
30 #include "MessageBroker.h" 31 #include "MessageBroker.h"
31 #include "MessageType.h" 32 #include "MessageType.h"
32 #include "ICallable.h" 33 #include "ICallable.h"
33 #include "IObserver.h" 34 #include "IObserver.h"
35 #include "MessageForwarder.h"
34 36
35 namespace OrthancStone { 37 namespace OrthancStone {
38
36 39
37 class IObservable : public boost::noncopyable 40 class IObservable : public boost::noncopyable
38 { 41 {
39 protected: 42 protected:
40 MessageBroker& broker_; 43 MessageBroker& broker_;
41 44
42 typedef std::map<int, std::set<ICallable*> > Callables; 45 typedef std::map<int, std::set<ICallable*> > Callables;
43 Callables callables_; 46 Callables callables_;
44 47
48 typedef std::set<IMessageForwarder*> Forwarders;
49 Forwarders forwarders_;
50
45 public: 51 public:
46 52
47 IObservable(MessageBroker& broker) 53 IObservable(MessageBroker& broker)
48 : broker_(broker) 54 : broker_(broker)
49 { 55 {
50 } 56 }
51 virtual ~IObservable() 57 virtual ~IObservable()
52 { 58 {
59 // delete all callables (this will also unregister them from the broker)
53 for (Callables::const_iterator it = callables_.begin(); 60 for (Callables::const_iterator it = callables_.begin();
54 it != callables_.end(); ++it) 61 it != callables_.end(); ++it)
55 { 62 {
56 for (std::set<ICallable*>::const_iterator 63 for (std::set<ICallable*>::const_iterator
57 it2 = it->second.begin(); it2 != it->second.end(); ++it2) 64 it2 = it->second.begin(); it2 != it->second.end(); ++it2)
58 { 65 {
59 delete *it2; 66 delete *it2;
60 } 67 }
68 }
69
70 // unregister the forwarders but don't delete them (they'll be deleted by the observable they are observing as any other callable)
71 for (Forwarders::iterator it = forwarders_.begin();
72 it != forwarders_.end(); ++it)
73 {
74 broker_.Unregister(dynamic_cast<IObserver&>(**it));
61 } 75 }
62 } 76 }
63 77
64 void RegisterObserverCallback(ICallable* callable) 78 void RegisterObserverCallback(ICallable* callable)
65 { 79 {
83 } 97 }
84 } 98 }
85 } 99 }
86 } 100 }
87 101
102 void RegisterForwarder(IMessageForwarder* forwarder)
103 {
104 forwarders_.insert(forwarder);
105 }
106
88 }; 107 };
89 108
90 } 109 }