- Timestamp:
- Sep 5, 2013, 2:14:06 PM (12 years ago)
- Children:
- 44f368
- Parents:
- 37d941
- git-author:
- Frederik Heber <heber@…> (09/05/13 14:09:44)
- git-committer:
- Frederik Heber <heber@…> (09/05/13 14:14:06)
- Location:
- src
- Files:
-
- 5 added
- 5 edited
-
CodePatterns/Observer/Graveyard.hpp (added)
-
CodePatterns/Observer/Notification.hpp (modified) (1 diff)
-
CodePatterns/Observer/Observable.hpp (modified) (4 diffs)
-
CodePatterns/Observer/Zombie.hpp (added)
-
Observer/Graveyard.cpp (added)
-
Observer/Makefile.am (modified) (3 diffs)
-
Observer/Observable.cpp (modified) (5 diffs)
-
Observer/unittests/GraveyardUnitTest.cpp (added)
-
Observer/unittests/GraveyardUnitTest.hpp (added)
-
Observer/unittests/Makefile.am (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/CodePatterns/Observer/Notification.hpp
r37d941 rb324a3 65 65 void subjectKilled(Observable * const publisher); 66 66 67 /** Getter for the number of Observer for this notification (channel). 68 * 69 * \return number of added observers 70 */ 71 size_t getNumberOfObservers() const 72 { return targets.size(); } 73 67 74 private: 68 75 typedef std::set<Observer*> targets_t; -
src/CodePatterns/Observer/Observable.hpp
r37d941 rb324a3 17 17 #include <set> 18 18 #include <string> 19 #include <boost/function.hpp> 19 20 20 21 #include "CodePatterns/Range.hpp" 21 22 #include "CodePatterns/Observer/defs.hpp" 22 23 #include "CodePatterns/Observer/Observer.hpp" 24 25 class Graveyard; 23 26 24 27 /** … … 34 37 * we call Channels::subjectKilled() to let Observers that have only signed 35 38 * on to single channel still know when their observable has died. 39 * 40 * Note that one may allow an Observable to live some over-time by using 41 * the Graveyard. This allows any Observer to still access the instance 42 * in order to properly sign off. It is destroyed when no Observer is left. 36 43 */ 37 44 class Observable : public Observer { … … 93 100 Notification_ptr getChannel(size_t no) const; 94 101 102 size_t getNumberOfObservers() const; 103 95 104 protected: 96 105 virtual void update(Observable *publisher); … … 126 135 static std::set<Observable*> busyObservables; 127 136 137 private: 138 friend class Zombie; 139 friend class Graveyard; 140 141 typedef boost::function<void (const Observable*)> graveyard_informer_t; 142 143 //!> bound function to call when Observer are signing off 144 graveyard_informer_t &graveyard_informer; 145 146 //!> default informer that does nothing 147 static graveyard_informer_t noop_informer; 148 149 /** Sets the bound function for over-time life-time management. 150 * 151 * \param _graveyard Graveyard to inform of leaving Observers 152 */ 153 void setGraveyardInformer(graveyard_informer_t &_graveyard_informer) 154 { 155 graveyard_informer = _graveyard_informer; 156 } 157 128 158 //! @cond 129 159 // Structure for RAII-Style notification -
src/Observer/Makefile.am
r37d941 rb324a3 10 10 OBSERVERSOURCE = \ 11 11 Channels.cpp \ 12 Graveyard.cpp \ 12 13 Notification.cpp \ 13 14 Observable.cpp \ … … 23 24 $(top_srcdir)/src/CodePatterns/Observer/Channels.hpp \ 24 25 $(top_srcdir)/src/CodePatterns/Observer/defs.hpp \ 26 $(top_srcdir)/src/CodePatterns/Observer/Graveyard.hpp \ 25 27 $(top_srcdir)/src/CodePatterns/Observer/Notification.hpp \ 26 28 $(top_srcdir)/src/CodePatterns/Observer/Observable.hpp \ … … 30 32 $(top_srcdir)/src/CodePatterns/Observer/ObservedIterator.hpp \ 31 33 $(top_srcdir)/src/CodePatterns/Observer/ObservedContainer_impl.hpp \ 32 $(top_srcdir)/src/CodePatterns/Observer/Relay.hpp 34 $(top_srcdir)/src/CodePatterns/Observer/Relay.hpp \ 35 $(top_srcdir)/src/CodePatterns/Observer/Zombie.hpp 33 36 34 37 OBSERVERDEBUGHEADER = -
src/Observer/Observable.cpp
r37d941 rb324a3 27 27 #include "CodePatterns/Observer/Notification.hpp" 28 28 29 //!> This function does nothing with the given Observable 30 void NoOp_informer(const Observable *) 31 {} 32 33 Observable::graveyard_informer_t Observable::noop_informer(&NoOp_informer); 29 34 30 35 // All infrastructure for the observer-pattern is bundled at a central place … … 271 276 callTable.erase(const_cast<Observable *>(this)); 272 277 } 278 graveyard_informer(this); 273 279 } 274 280 … … 293 299 #endif 294 300 notification->removeObserver(target); 301 graveyard_informer(this); 295 302 } 296 303 … … 311 318 } 312 319 320 size_t Observable::getNumberOfObservers() const 321 { 322 size_t ObserverCount = 0; 323 { 324 std::map<Observable*,callees_t>::const_iterator callTableiter = 325 callTable.find(const_cast<Observable *>(this)); 326 // if not present, then we have zero observers 327 if (callTableiter != callTable.end()) 328 ObserverCount += callTableiter->second.size(); 329 } 330 { 331 const ChannelMap::const_iterator iter = 332 NotificationChannels.find(const_cast<Observable * const>(this)); 333 // if not present, then we have zero observers 334 if (iter != NotificationChannels.end()) 335 for (Channels::NotificationTypetoRefMap::const_iterator channeliter = iter->second->ChannelMap.begin(); 336 channeliter != iter->second->ChannelMap.end(); 337 ++channeliter) 338 ObserverCount += (channeliter->second)->getNumberOfObservers(); 339 } 340 return ObserverCount; 341 } 342 313 343 /** Handles sub-observables that just got killed 314 344 * when an sub-observerable dies we usually don't need to do anything … … 321 351 */ 322 352 Observable::Observable(std::string name) : 323 Observer(Observer::BaseConstructor()) 353 Observer(Observer::BaseConstructor()), 354 graveyard_informer(noop_informer) 324 355 { 325 356 #ifdef LOG_OBSERVER -
src/Observer/unittests/Makefile.am
r37d941 rb324a3 5 5 6 6 TESTS += \ 7 GraveyardUnitTest \ 7 8 ObservedContainerUnitTest \ 8 9 ObserverUnitTest 9 10 10 11 TESTSOURCES += \ 12 ../Observer/unittests/GraveyardUnitTest.cpp \ 11 13 ../Observer/unittests/ObserverUnitTest.cpp \ 12 14 ../Observer/unittests/ObservedContainerUnitTest.cpp \ … … 14 16 15 17 TESTHEADERS += \ 18 ../Observer/unittests/GraveyardUnitTest.hpp \ 16 19 ../Observer/unittests/ObserverUnitTest.hpp \ 17 20 ../Observer/unittests/ObservedContainerUnitTest.hpp … … 38 41 ../Helpers/libCodePatterns-Helpers-debug.la 39 42 43 GraveyardUnitTest_SOURCES = UnitTestMain.cpp \ 44 ../Observer/unittests/GraveyardUnitTest.cpp \ 45 ../Observer/unittests/GraveyardUnitTest.hpp \ 46 ../Observer/unittests/stubs/ObserverStub.cpp \ 47 ../Observer/unittests/stubs/ObserverStub.hpp 48 nodist_GraveyardUnitTest_SOURCES = \ 49 $(top_srcdir)/src/CodePatterns/Observer/Channels.hpp \ 50 $(top_srcdir)/src/CodePatterns/Observer/defs.hpp \ 51 $(top_srcdir)/src/CodePatterns/Observer/Notification.hpp \ 52 $(top_srcdir)/src/CodePatterns/Observer/Observer.hpp \ 53 $(top_srcdir)/src/CodePatterns/Observer/ObserverLog.hpp \ 54 $(top_srcdir)/src/CodePatterns/Observer/ObserverContainer.hpp \ 55 $(top_srcdir)/src/CodePatterns/Observer/ObserverContainer_impl.hpp \ 56 $(top_srcdir)/src/CodePatterns/Observer/ObserverIterator.hpp 57 GraveyardUnitTest_LDADD = \ 58 ../Observer/libCodePatterns-Observer-debug.la \ 59 ../Helpers/libCodePatterns-Helpers-debug.la 60 40 61 ObservedContainerUnitTest_SOURCES = UnitTestMain.cpp \ 41 62 ../Observer/unittests/ObservedContainerUnitTest.cpp \
Note:
See TracChangeset
for help on using the changeset viewer.
