Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Patterns/Observer.cpp

    rc296c2 rcf1a07  
    2424// See [Gamma et al, 1995] p. 297
    2525
    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
     26map<Observable*, int> Observable::depth;
     27map<Observable*,multimap<int,Observer*>*> Observable::callTable;
     28set<Observable*> Observable::busyObservables;
    2929
    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  */
     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
    3935void Observable::start_observer_internal(Observable *publisher){
    4036  // increase the count for this observable by one
     
    4440}
    4541
    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  */
    5642void Observable::finish_observer_internal(Observable *publisher){
    5743  // decrease the count for this observable
     
    6753}
    6854
    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  */
    7555Observable::_Observable_protector::_Observable_protector(Observable *_protege) :
    7656  protege(_protege)
     
    7959}
    8060
    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  */
    8761Observable::_Observable_protector::~_Observable_protector()
    8862{
     
    9266/************* Notification mechanism for observables **************/
    9367
    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  */
     68
    9869void Observable::notifyAll() {
    9970  // we are busy notifying others right now
     
    10879    callees_t *callees = callTable[this];
    10980    callees_t::iterator iter;
    110     for(iter=callees->begin();iter!=callees->end();iter++){
     81    for(iter=callees->begin();iter!=callees->end();++iter){
    11182      (*iter).second->update(this);
    11283    }
     
    11687}
    11788
    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  */
     89// this handles passing on updates from sub-Observables
    12390void Observable::update(Observable *publisher) {
    12491  // circle detection
     
    142109}
    143110
    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  */
     111// methods to sign-on and off
    149112void Observable::signOn(Observer *target,int priority) {
    150113  assert(priority>=-20 && priority<=+20 && "Priority out of range [-20:+20]");
     
    160123
    161124  callees_t::iterator iter;
    162   for(iter=callees->begin();iter!=callees->end();iter++){
     125  for(iter=callees->begin();iter!=callees->end();++iter){
    163126    res |= ((*iter).second == target);
    164127  }
     
    167130}
    168131
    169 /** Sign off an Observer from this Observable.
    170  * Removes \a *target from Observable::callTable list.
    171  * \param *target Observer
    172  */
    173132void Observable::signOff(Observer *target) {
    174133  assert(callTable.count(this) && "SignOff called for an Observable without Observers.");
    175134  callees_t *callees = callTable[this];
    176135  callees_t::iterator iter;
    177   callees_t::iterator deliter;
    178136  for(iter=callees->begin();iter!=callees->end();) {
    179     deliter=iter++;
    180     if((*deliter).second == target)
    181       callees->erase(deliter);
     137    if((*iter).second == target) {
     138      callees->erase(iter++);
     139    }
     140    else {
     141      ++iter;
     142    }
    182143  }
    183144  if(callees->empty()){
     
    187148}
    188149
    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  */
     150// when an sub-observerable dies we usually don't need to do anything
    193151void Observable::subjectKilled(Observable *publisher){
    194152}
    195153
    196 /** Constructor for class Observable.
    197  */
    198154Observable::Observable()
    199155{}
    200156
    201 /** Destructor for class Observable.
    202  * When an observable is deleted, we let all our observers know. \sa Observable::subjectKilled().
    203  */
     157// when an observable is deleted, we let all our observers know
    204158Observable::~Observable()
    205159{
     
    208162    callees_t *callees = callTable[this];
    209163    callees_t::iterator iter;
    210     for(iter=callees->begin();iter!=callees->end();iter++){
     164    for(iter=callees->begin();iter!=callees->end();++iter){
    211165      (*iter).second->subjectKilled(this);
    212166    }
     
    216170}
    217171
    218 /** Constructor for class Observer.
    219  */
    220172Observer::Observer()
    221173{}
    222174
    223 /** Destructor for class Observer.
    224  */
    225175Observer::~Observer()
    226176{}
Note: See TracChangeset for help on using the changeset viewer.