Changeset d85532
- Timestamp:
- Dec 13, 2011, 12:00:30 PM (14 years ago)
- Children:
- b760ac5
- Parents:
- 2c11c1
- git-author:
- Frederik Heber <heber@…> (12/02/11 10:10:17)
- git-committer:
- Frederik Heber <heber@…> (12/13/11 12:00:30)
- Location:
- src
- Files:
-
- 10 edited
-
Makefile.am (modified) (2 diffs)
-
Patterns/Observer/Notification.hpp (modified) (2 diffs)
-
Patterns/Observer/Observable.hpp (modified) (1 diff)
-
Patterns/Observer/Observer.hpp (modified) (1 diff)
-
Patterns/Observer/Relay.cpp (modified) (6 diffs)
-
Patterns/Observer/Relay.hpp (modified) (1 diff)
-
Patterns/Observer/unittests/ObserverUnitTest.cpp (modified) (3 diffs)
-
Patterns/Observer/unittests/ObserverUnitTest.hpp (modified) (4 diffs)
-
Patterns/Observer/unittests/stubs/ObserverStub.cpp (modified) (1 diff)
-
Patterns/Observer/unittests/stubs/ObserverStub.hpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Makefile.am
r2c11c1 rd85532 41 41 Patterns/Observer/Notification.cpp \ 42 42 Patterns/Observer/Observable.cpp \ 43 Patterns/Observer/Observer.cpp 43 Patterns/Observer/Observer.cpp \ 44 Patterns/Observer/Relay.cpp 44 45 PATTERNSOURCEDEBUG = \ 45 46 $(PATTERNSOURCE) \ … … 64 65 Patterns/Observer/ObservedIterator.hpp \ 65 66 Patterns/Observer/ObservedContainer_impl.hpp \ 67 Patterns/Observer/Relay.hpp \ 66 68 Patterns/Registry_impl.hpp \ 67 69 Patterns/Singleton_impl.hpp \ -
src/Patterns/Observer/Notification.hpp
r2c11c1 rd85532 16 16 #include <set> 17 17 18 class Channels;19 18 class Observable; 20 19 class Observer; 20 class Relay; 21 21 22 22 /** Notifications are sort of news channels of an Observable. … … 28 28 */ 29 29 class Notification { 30 //!> grant Observable access to notifyAll() 30 31 friend class Observable; 31 friend class Channels; 32 //!> grant Relay access to notifyAll() 33 friend class Relay; 32 34 public: 33 35 Notification(size_t _channelno); -
src/Patterns/Observer/Observable.hpp
r2c11c1 rd85532 114 114 static PriorityLevel PriorityDefault; 115 115 116 pr ivate:116 protected: 117 117 typedef std::multimap<int,Observer*> callees_t; 118 118 typedef std::set<Notification*> notificationSet; -
src/Patterns/Observer/Observer.hpp
r2c11c1 rd85532 44 44 class Observer 45 45 { 46 friend class Notification; 46 47 friend class Observable; 47 friend class Notification;48 friend class Relay; 48 49 template<class> friend class ObservedIterator; 49 50 -
src/Patterns/Observer/Relay.cpp
r2c11c1 rd85532 22 22 #include "Relay.hpp" 23 23 24 #include "Assert.hpp" 25 #include "Channels.hpp" 26 #include "defs.hpp" 27 #include "Notification.hpp" 28 24 29 25 30 /** Constructor for class Relay. 26 31 */ 27 Relay::Relay(string name) : 28 Observer(Observer::BaseConstructor()) 32 Relay::Relay(std::string name) : 33 Observable(name), 34 Updater(NULL) 29 35 { 30 36 #ifdef LOG_OBSERVER … … 42 48 observerLog().addMessage() << "-- Destroying Relay " << observerLog().getName(this); 43 49 #endif 44 if(callTable.count(this)) {45 // delete all entries for this observable46 callees_t callees = callTable[this];47 callees_t::iterator iter;48 for(iter=callees.begin();iter!=callees.end();++iter){49 (*iter).second->subjectKilled(this);50 }51 callTable.erase(this);52 }53 50 } 54 51 55 52 56 53 /** Notify all Observers of changes. 57 * Puts \a *this into Relay::busy Relays, calls Observer::update() for all in callee_t54 * Puts \a *this into Relay::busyObservables, calls Observer::update() for all in callee_t 58 55 * and removes from busy list. 59 56 */ 60 57 void Relay::notifyAll() { 58 ASSERT(Updater != NULL, 59 "Relay::notifyAll() called while Updater is NULL."); 61 60 // we are busy notifying others right now 62 61 // add ourselves to the list of busy subjects to enable circle detection 63 busy Relays.insert(this);62 busyObservables.insert(this); 64 63 // see if anyone has signed up for observation 65 64 // and call all observers … … 86 85 // send out all notifications that need to be done 87 86 88 notificationSet currentNotifications = notifications[ this];87 notificationSet currentNotifications = notifications[Updater]; 89 88 for(notificationSet::iterator it = currentNotifications.begin(); 90 89 it != currentNotifications.end();++it){ 91 (*it)->notifyAll( );90 (*it)->notifyAll(Updater); 92 91 } 93 92 94 notifications.erase( this);93 notifications.erase(Updater); 95 94 96 95 // done with notification, we can leave the set of busy subjects 97 busy Relays.erase(this);96 busyObservables.erase(this); 98 97 } 99 98 … … 106 105 void Relay::update(Observable *publisher) { 107 106 // circle detection 108 if(busy Relays.find(this)!=busyRelays.end()) {107 if(busyObservables.find(this)!=busyObservables.end()) { 109 108 // somehow a circle was introduced... we were busy notifying our 110 109 // observers, but still we are called by one of our sub-Relays … … 122 121 #ifdef LOG_OBSERVER 123 122 observerLog().addMessage() << "-* Update from " << observerLog().getName(publisher) 124 << " relayed by " << observerLog().getName(this) << endl;123 << " relayed by " << observerLog().getName(this); 125 124 #endif 126 125 Updater = publisher; … … 130 129 #ifdef LOG_OBSERVER 131 130 observerLog().addMessage() << "-| Update from " << observerLog().getName(publisher) 132 << " not relayed by " << observerLog().getName(this) << endl;131 << " not relayed by " << observerLog().getName(this); 133 132 #endif 134 133 } -
src/Patterns/Observer/Relay.hpp
r2c11c1 rd85532 17 17 18 18 /** 19 * A nRelay acts as a node in a many-to-one observation.19 * A Relay acts as a node in a many-to-one observation. 20 20 * 21 21 * All Observable::update() calls will pass through this relay. Hence, if an -
src/Patterns/Observer/unittests/ObserverUnitTest.cpp
r2c11c1 rd85532 68 68 notificationObserver2 = new NotificationObserver( 69 69 notificationObservable->getChannel(NotificationObservable::Operation2Notify)); 70 71 RelayObservable = new RelayTest; 72 RelayObserver = new RelayCountObserver(RelayObservable); 70 73 } 71 74 … … 79 82 delete obsset; 80 83 delete obsmap; 84 delete RelayObservable; 85 delete RelayObserver; 81 86 82 87 delete observer1; … … 237 242 } 238 243 244 void ObserverTest::relayTest() 245 { 246 // sign on some observables to the relay 247 simpleObservable1->signOn(RelayObservable); 248 simpleObservable2->signOn(RelayObservable); 249 250 // sign on an observer to the relay 251 RelayObservable->signOn(RelayObserver); 252 simpleObservable1->signOn(observer1); 253 254 // check that all is zero 255 CPPUNIT_ASSERT_EQUAL( 0, RelayObserver->updates ); 256 CPPUNIT_ASSERT_EQUAL( 0, observer1->updates ); 257 258 // signal update 259 simpleObservable1->changeMethod(); 260 261 // check that both the change 262 // (and RelayObserver checks being called correctly) 263 CPPUNIT_ASSERT_EQUAL( 1, RelayObserver->updates ); 264 CPPUNIT_ASSERT_EQUAL( 1, observer1->updates ); 265 266 // signal update through relay only 267 simpleObservable2->changeMethod(); 268 269 // check that only one got the change 270 CPPUNIT_ASSERT_EQUAL( 2, RelayObserver->updates ); 271 CPPUNIT_ASSERT_EQUAL( 1, observer1->updates ); 272 273 // check on signOff 274 simpleObservable1->signOff(RelayObservable); 275 simpleObservable1->signOff(observer1); 276 } 277 239 278 void ObserverTest::CircleDetectionTest() { 240 279 std::cout << std::endl << "Warning: the next test involved methods that can produce infinite loops." << std::endl; -
src/Patterns/Observer/unittests/ObserverUnitTest.hpp
r2c11c1 rd85532 24 24 class ObservableSet; 25 25 class ObservableMap; 26 class RelayObservable; 26 27 class BlockObservable; 27 28 class NotificationObservable; 29 class RelayCountObserver; 28 30 29 31 class ObserverTest : public CppUnit::TestFixture … … 37 39 CPPUNIT_TEST ( doesReportTest ); 38 40 CPPUNIT_TEST ( iteratorTest ); 41 CPPUNIT_TEST ( relayTest ); 39 42 CPPUNIT_TEST ( CircleDetectionTest ); 40 43 CPPUNIT_TEST_SUITE_END(); … … 51 54 void doesReportTest(); 52 55 void iteratorTest(); 56 void relayTest(); 53 57 void CircleDetectionTest(); 54 58 … … 70 74 ObservableSet *obsset; 71 75 ObservableMap *obsmap; 72 76 RelayTest *RelayObservable; 77 RelayCountObserver *RelayObserver; 73 78 }; 74 79 -
src/Patterns/Observer/unittests/stubs/ObserverStub.cpp
r2c11c1 rd85532 230 230 } 231 231 232 /****************** Relay *********************/ 233 234 RelayTest::RelayTest() : 235 Relay(std::string("RelayTest")) 236 {} 237 238 RelayTest::~RelayTest() 239 {} 240 241 /************ RelayCountObserver ***************/ 242 243 RelayCountObserver::RelayCountObserver(const Observable * const _relay) : 244 Observer("RelayCountObserver"), 245 updates(0), 246 relay(_relay) 247 {} 248 249 RelayCountObserver::~RelayCountObserver() 250 {} 251 252 void RelayCountObserver::update(Observable *publisher){ 253 // check that we are not called by the relay itself 254 CPPUNIT_ASSERT(publisher != relay); 255 updates++; 256 } 257 258 void RelayCountObserver::subjectKilled(Observable *publisher) { 259 } 260 -
src/Patterns/Observer/unittests/stubs/ObserverStub.hpp
r2c11c1 rd85532 12 12 #include "Observer/Observable.hpp" 13 13 #include "Observer/ObservedIterator.hpp" 14 #include "Observer/Relay.hpp" 14 15 15 16 class UpdateCountObserver : public Observer { … … 126 127 }; 127 128 129 class RelayTest : public Relay 130 { 131 public: 132 RelayTest(); 133 ~RelayTest(); 134 private: 135 }; 136 137 class RelayCountObserver : public Observer { 138 public: 139 RelayCountObserver(const Observable * const relay); 140 virtual ~RelayCountObserver(); 141 142 void update(Observable *publisher); 143 void subjectKilled(Observable *publisher); 144 145 int updates; 146 private: 147 const Observable * const relay; 148 }; 128 149 129 150 #endif /* OBSERVERSTUB_HPP_ */
Note:
See TracChangeset
for help on using the changeset viewer.
