Changeset bb9503 for molecuilder
- Timestamp:
- Feb 3, 2010, 2:11:10 PM (16 years ago)
- Children:
- ef4966
- Parents:
- 4272f0
- git-author:
- Tillmann Crueger <crueger@…> (02/03/10 14:07:23)
- git-committer:
- Tillmann Crueger <crueger@…> (02/03/10 14:11:10)
- Location:
- molecuilder/src/Patterns
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
molecuilder/src/Patterns/Observer.cpp
r4272f0 rbb9503 10 10 11 11 #include <iostream> 12 #include <cassert> 12 13 13 14 using namespace std; … … 24 25 25 26 map<Observable*, int> Observable::depth; 26 m ultimap<Observable*,Observer*> Observable::callTable;27 map<Observable*,multimap<int,Observer*>*> Observable::callTable; 27 28 set<Observable*> Observable::busyObservables; 28 29 … … 54 55 /************* Notification mechanism for observables **************/ 55 56 56 typedef multimap<Observable*,Observer*>::iterator callIterator;57 typedef pair<callIterator, callIterator> iteratorRange;58 57 59 58 void Observable::notifyAll() { … … 64 63 // and call all observers 65 64 if(callTable.count(this)) { 66 iteratorRange callerRange = callTable.equal_range(this); 67 callIterator iter; 68 for(iter=callerRange.first;iter!=callerRange.second;iter++){ 69 (*iter).second->update(this); 70 } 65 // elements are stored sorted by keys in the multimap 66 // so iterating over it gives us a the callees sorted by 67 // the priorities 68 callees_t *callees = callTable[this]; 69 callees_t::iterator iter; 70 for(iter=callees->begin();iter!=callees->end();iter++){ 71 (*iter).second->update(this); 72 } 71 73 } 72 74 // done with notification, we can leave the set of busy subjects … … 97 99 98 100 // methods to sign-on and off 99 void Observable::signOn(Observer *target) { 101 void Observable::signOn(Observer *target,int priority) { 102 assert(priority>=-20 && priority<=+20 && "Priority out of range [-20:+20]"); 100 103 bool res = false; 101 iteratorRange callerRange = callTable.equal_range(this); 102 callIterator iter; 103 for(iter=callerRange.first;iter!=callerRange.second;iter++){ 104 callees_t *callees = 0; 105 if(callTable.count(this)){ 106 callees = callTable[this]; 107 } 108 else { 109 callees = new multimap<int,Observer*>; 110 callTable.insert(pair<Observable*,callees_t*>(this,callees)); 111 } 112 113 callees_t::iterator iter; 114 for(iter=callees->begin();iter!=callees->end();iter++){ 104 115 res |= ((*iter).second == target); 105 116 } 106 117 if(!res) 107 call Table.insert(pair<Observable*,Observer*>(this,target));118 callees->insert(pair<int,Observer*>(priority,target)); 108 119 } 109 120 110 121 void Observable::signOff(Observer *target) { 111 iteratorRange callerRange = callTable.equal_range(this); 112 callIterator iter; 113 for(iter=callerRange.first;iter!=callerRange.second;iter++) { 122 assert(callTable.count(this) && "SignOff called for an Observable without Observers."); 123 callees_t *callees = callTable[this]; 124 callees_t::iterator iter; 125 for(iter=callees->begin();iter!=callees->end();iter++) { 114 126 if((*iter).second == target) 115 callTable.erase(iter); 127 callees->erase(iter); 128 } 129 if(callees->empty()){ 130 callTable.erase(this); 131 delete callees; 116 132 } 117 133 } … … 127 143 Observable::~Observable() 128 144 { 129 // delete all entries for this observable 130 iteratorRange callerRange = callTable.equal_range(this); 131 callIterator iter; 132 for(iter=callerRange.first;iter!=callerRange.second;iter++){ 133 (*iter).second->subjectKilled(this); 145 if(callTable.count(this)) { 146 // delete all entries for this observable 147 callees_t *callees = callTable[this]; 148 callees_t::iterator iter; 149 for(iter=callees->begin();iter!=callees->end();iter++){ 150 (*iter).second->subjectKilled(this); 151 } 152 callTable.erase(this); 153 delete callees; 134 154 } 135 callTable.erase(callerRange.first,callerRange.second);136 155 } 137 156 -
molecuilder/src/Patterns/Observer.hpp
r4272f0 rbb9503 50 50 virtual ~Observable(); 51 51 52 virtual void signOn(Observer *target );52 virtual void signOn(Observer *target, int priority=0); 53 53 virtual void signOff(Observer *target); 54 54 … … 72 72 73 73 private: 74 typedef std::multimap<int,Observer*> callees_t; 74 75 static std::map<Observable*, int> depth; 75 static std::m ultimap<Observable*,Observer*> callTable;76 static std::map<Observable*,callees_t*> callTable; 76 77 static std::set<Observable*> busyObservables; 77 78 };
Note:
See TracChangeset
for help on using the changeset viewer.