Changes in src/Patterns/Observer.hpp [d5f216:50fc88c]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Patterns/Observer.hpp
rd5f216 r50fc88c 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 wrapped in19 * START_OBSERVER ... END_OBSERVER blocks. If other methods are called that also contain20 * Observation blocks from there, these functions wont trigger notifications. Only the end21 * of the final observation block triggers the update of Observers.18 * In the Observable code that changes attributes should be started with OBSERVE;. This macro 19 * locks the observer mechanism while changes are done. At the end of the scope in which the 20 * macro was placed the lock is released. When the last lock is released all changes are 21 * propagated to the 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 );49 virtual void signOn(Observer *target, int priority=0); 50 50 virtual void signOff(Observer *target); 51 51 … … 59 59 /** 60 60 * Internal method. 61 * Do not call directly. Use START_OBSERVERmacro instead61 * Do not call directly. Use OBSERVE 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 FINISH_OBSERVERmacro instead66 * Do not call directly. Use OBSERVE 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; 71 72 static std::map<Observable*, int> depth; 72 static std::m ultimap<Observable*,Observer*> callTable;73 static std::map<Observable*,callees_t*> callTable; 73 74 static std::set<Observable*> busyObservables; 75 76 // Structure for RAII-Style notification 77 protected: 78 class _Observable_protector { 79 public: 80 _Observable_protector(Observable *); 81 ~_Observable_protector(); 82 private: 83 Observable *protege; 84 }; 74 85 }; 75 86 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) 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) 80 95 #endif /* OBSERVER_HPP_ */
Note:
See TracChangeset
for help on using the changeset viewer.