00001
00002
00003
00004
00005
00006
00007
00008 #include "Observable.h"
00009
00017 void Observable::addObserver(std::string aKey, Observer & o)
00018 {
00019 map<string, set<Observer *> >::iterator it = observers.find(aKey);
00020 set<Observer *> *aSet;
00021
00022 if (it != observers.end())
00023 aSet = &(*it).second;
00024 else
00025 aSet = new set<Observer *>();
00026
00027 aSet->insert(&o);
00028 observers[aKey] = *aSet;
00029 }
00030
00038 void Observable::removeObserver(string aKey, Observer& o)
00039 {
00040 map<string, set<Observer *> >::iterator it = observers.find(aKey);
00041 if (it == observers.end())
00042 return;
00043
00044 set<Observer *> *aSet = &(*it).second;
00045 aSet->erase(aSet->find(&o));
00046 observers[aKey] = *aSet;
00047 }
00048
00052 void Observable::removeAllObservers()
00053 {
00054 observers.clear();
00055 }
00056
00062 int Observable::countObservers()
00063 {
00064 return observers.size();
00065 }
00066
00073 void Observable::willChangeValueForKey(string aKey)
00074 {
00075 map<string, set<Observer *> >::iterator it = observers.find(aKey);
00076 if (it == observers.end())
00077 return;
00078
00079 set<Observer *> *aSet = &(*it).second;
00080 set<Observer *>::iterator sit;
00081 for (sit = aSet->begin(); sit != aSet->end(); sit++)
00082 (*sit)->willChangeValueForKey(aKey, this);
00083 }
00084
00090 void Observable::didChangevalueForKey(string aKey)
00091 {
00092 map<string, set<Observer *> >::iterator it = observers.find(aKey);
00093 if (it == observers.end())
00094 return;
00095
00096 set<Observer *> *aSet = &(*it).second;
00097 set<Observer *>::iterator sit;
00098 for (sit = aSet->begin(); sit != aSet->end(); sit++)
00099 (*sit)->didChangeValueForKey(aKey, this);
00100 }