Changes in src/Patterns/Observer.hpp [50fc88c:d5f216]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Patterns/Observer.hpp
r50fc88c rd5f216 16 16 * 17 17 * Observers register themselves with the observables to be notified when something changes. 18 * In the Observable code that changes attributes should be started with OBSERVE;. This macro19 * locks the observer mechanism while changes are done. At the end of the scope in which the20 * macro was placed the lock is released. When the last lock is released all changes are21 * propagated to the observers.18 * In the Observable code that changes attributes should be wrapped in 19 * START_OBSERVER ... END_OBSERVER blocks. If other methods are called that also contain 20 * Observation blocks from there, these functions wont trigger notifications. Only the end 21 * of the final observation block triggers the update of Observers. 22 22 * 23 23 * Each observerable can have sub-observables. When one of these sub-observables changes and … … 47 47 virtual ~Observable(); 48 48 49 virtual void signOn(Observer *target , int priority=0);49 virtual void signOn(Observer *target); 50 50 virtual void signOff(Observer *target); 51 51 … … 59 59 /** 60 60 * Internal method. 61 * Do not call directly. Use OBSERVEmacro instead61 * Do not call directly. Use START_OBSERVER macro instead 62 62 */ 63 63 static void start_observer_internal(Observable *publisher); 64 64 /** 65 65 * Internal method. 66 * Do not call directly. Use OBSERVEmacro instead66 * Do not call directly. Use FINISH_OBSERVER macro instead 67 67 */ 68 68 static void finish_observer_internal(Observable *publisher); 69 69 70 70 private: 71 typedef std::multimap<int,Observer*> callees_t;72 71 static std::map<Observable*, int> depth; 73 static std::m ap<Observable*,callees_t*> callTable;72 static std::multimap<Observable*,Observer*> callTable; 74 73 static std::set<Observable*> busyObservables; 75 76 // Structure for RAII-Style notification77 protected:78 class _Observable_protector {79 public:80 _Observable_protector(Observable *);81 ~_Observable_protector();82 private:83 Observable *protege;84 };85 74 }; 86 75 87 // extra macro is necessary to work with __LINE__ 88 #define PASTE(a,b) PASTE_HELPER(a,b) 89 #define PASTE_HELPER(a,b) a ## b 90 #define OBSERVE Observable::_Observable_protector PASTE(_scope_obs_protector_,__LINE__)(this) 91 // deprecated macros from before RAII was used 92 //#define START_OBSERVER Observable::start_observer_internal(this);do{do{}while(0) 93 //#define FINISH_OBSERVER }while(0);Observable::finish_observer_internal(this) 94 //#define RETURN_OBSERVER( retval ) do{Observable::finish_observer_internal(this); return (retval);}while(0) 76 77 78 #define START_OBSERVER Observable::start_observer_internal(this);do{do{}while(0) 79 #define FINISH_OBSERVER }while(0);Observable::finish_observer_internal(this) 95 80 #endif /* OBSERVER_HPP_ */
Note:
See TracChangeset
for help on using the changeset viewer.