Changes in src/Patterns/Observer.cpp [cf1a07:c296c2]
- File:
-
- 1 edited
-
src/Patterns/Observer.cpp (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Patterns/Observer.cpp
rcf1a07 rc296c2 24 24 // See [Gamma et al, 1995] p. 297 25 25 26 map<Observable*, int> Observable::depth; 27 map<Observable*,multimap<int,Observer*>*> Observable::callTable; 28 set<Observable*> Observable::busyObservables; 29 30 // The two functions start_observer_internal and finish_observer_internal 31 // have to be used together at all time. Never use these functions directly 32 // START_OBSERVER and FINISH_OBSERVER also construct a bogus while(0) loop 33 // thus producing compiler-errors whenever only one is used 34 26 map<Observable*, int> Observable::depth; //!< Map of Observables to the depth of the DAG of Observers 27 map<Observable*,multimap<int,Observer*>*> Observable::callTable; //!< Table for each Observable of all its Observers 28 set<Observable*> Observable::busyObservables; //!< Set of Observables that are currently busy notifying their sign-on'ed Observers 29 30 /** Attaching Sub-observables to Observables. 31 * Increases entry in Observable::depth for this \a *publisher by one. 32 * 33 * The two functions \sa start_observer_internal() and \sa finish_observer_internal() 34 * have to be used together at all time. Never use these functions directly 35 * START_OBSERVER and FINISH_OBSERVER also construct a bogus while(0) loop 36 * thus producing compiler-errors whenever only one is used. 37 * \param *publisher reference of sub-observable 38 */ 35 39 void Observable::start_observer_internal(Observable *publisher){ 36 40 // increase the count for this observable by one … … 40 44 } 41 45 46 /** Detaching Sub-observables from Observables. 47 * Decreases entry in Observable::depth for this \a *publisher by one. If zero, we 48 * start notifying all our Observers. 49 * 50 * The two functions start_observer_internal() and finish_observer_internal() 51 * have to be used together at all time. Never use these functions directly 52 * START_OBSERVER and FINISH_OBSERVER also construct a bogus while(0) loop 53 * thus producing compiler-errors whenever only one is used. 54 * \param *publisher reference of sub-observable 55 */ 42 56 void Observable::finish_observer_internal(Observable *publisher){ 43 57 // decrease the count for this observable … … 53 67 } 54 68 69 /** Constructor for Observable Protector. 70 * Basically, calls start_observer_internal(). Hence use this class instead of 71 * calling the function directly. 72 * 73 * \param *protege Observable to be protected. 74 */ 55 75 Observable::_Observable_protector::_Observable_protector(Observable *_protege) : 56 76 protege(_protege) … … 59 79 } 60 80 81 /** Destructor for Observable Protector. 82 * Basically, calls finish_observer_internal(). Hence use this class instead of 83 * calling the function directly. 84 * 85 * \param *protege Observable to be protected. 86 */ 61 87 Observable::_Observable_protector::~_Observable_protector() 62 88 { … … 66 92 /************* Notification mechanism for observables **************/ 67 93 68 94 /** Notify all Observers of changes. 95 * Puts \a *this into Observable::busyObservables, calls Observer::update() for all in callee_t 96 * and removes from busy list. 97 */ 69 98 void Observable::notifyAll() { 70 99 // we are busy notifying others right now … … 79 108 callees_t *callees = callTable[this]; 80 109 callees_t::iterator iter; 81 for(iter=callees->begin();iter!=callees->end(); ++iter){110 for(iter=callees->begin();iter!=callees->end();iter++){ 82 111 (*iter).second->update(this); 83 112 } … … 87 116 } 88 117 89 // this handles passing on updates from sub-Observables 118 /** Handles passing on updates from sub-Observables. 119 * Mimicks basically the Observer::update() function. 120 * 121 * \param *publisher The \a *this we observe. 122 */ 90 123 void Observable::update(Observable *publisher) { 91 124 // circle detection … … 109 142 } 110 143 111 // methods to sign-on and off 144 /** Sign on an Observer to this Observable. 145 * Puts \a *target into Observable::callTable list. 146 * \param *target Observer 147 * \param priority number in [-20,20] 148 */ 112 149 void Observable::signOn(Observer *target,int priority) { 113 150 assert(priority>=-20 && priority<=+20 && "Priority out of range [-20:+20]"); … … 123 160 124 161 callees_t::iterator iter; 125 for(iter=callees->begin();iter!=callees->end(); ++iter){162 for(iter=callees->begin();iter!=callees->end();iter++){ 126 163 res |= ((*iter).second == target); 127 164 } … … 130 167 } 131 168 169 /** Sign off an Observer from this Observable. 170 * Removes \a *target from Observable::callTable list. 171 * \param *target Observer 172 */ 132 173 void Observable::signOff(Observer *target) { 133 174 assert(callTable.count(this) && "SignOff called for an Observable without Observers."); 134 175 callees_t *callees = callTable[this]; 135 176 callees_t::iterator iter; 177 callees_t::iterator deliter; 136 178 for(iter=callees->begin();iter!=callees->end();) { 137 if((*iter).second == target) { 138 callees->erase(iter++); 139 } 140 else { 141 ++iter; 142 } 179 deliter=iter++; 180 if((*deliter).second == target) 181 callees->erase(deliter); 143 182 } 144 183 if(callees->empty()){ … … 148 187 } 149 188 150 // when an sub-observerable dies we usually don't need to do anything 189 /** Handles sub-observables that just got killed 190 * when an sub-observerable dies we usually don't need to do anything 191 * \param *publisher Sub-Observable. 192 */ 151 193 void Observable::subjectKilled(Observable *publisher){ 152 194 } 153 195 196 /** Constructor for class Observable. 197 */ 154 198 Observable::Observable() 155 199 {} 156 200 157 // when an observable is deleted, we let all our observers know 201 /** Destructor for class Observable. 202 * When an observable is deleted, we let all our observers know. \sa Observable::subjectKilled(). 203 */ 158 204 Observable::~Observable() 159 205 { … … 162 208 callees_t *callees = callTable[this]; 163 209 callees_t::iterator iter; 164 for(iter=callees->begin();iter!=callees->end(); ++iter){210 for(iter=callees->begin();iter!=callees->end();iter++){ 165 211 (*iter).second->subjectKilled(this); 166 212 } … … 170 216 } 171 217 218 /** Constructor for class Observer. 219 */ 172 220 Observer::Observer() 173 221 {} 174 222 223 /** Destructor for class Observer. 224 */ 175 225 Observer::~Observer() 176 226 {}
Note:
See TracChangeset
for help on using the changeset viewer.
