Mercurial > hg > orthanc-stone
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 } |