Ignore:
Timestamp:
Sep 5, 2013, 2:14:06 PM (12 years ago)
Author:
Frederik Heber <heber@…>
Children:
44f368
Parents:
37d941
git-author:
Frederik Heber <heber@…> (09/05/13 14:09:44)
git-committer:
Frederik Heber <heber@…> (09/05/13 14:14:06)
Message:

Added Graveyard for to-be-destroyed Observables.

  • also added Zombie class that wraps an Observable.
  • Notification and Observable have new function getNumberOfObservers().
  • added unit test for Graveyard.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Observer/Observable.cpp

    r37d941 rb324a3  
    2727#include "CodePatterns/Observer/Notification.hpp"
    2828
     29//!> This function does nothing with the given Observable
     30void NoOp_informer(const Observable *)
     31{}
     32
     33Observable::graveyard_informer_t Observable::noop_informer(&NoOp_informer);
    2934
    3035// All infrastructure for the observer-pattern is bundled at a central place
     
    271276    callTable.erase(const_cast<Observable *>(this));
    272277  }
     278  graveyard_informer(this);
    273279}
    274280
     
    293299#endif
    294300  notification->removeObserver(target);
     301  graveyard_informer(this);
    295302}
    296303
     
    311318}
    312319
     320size_t Observable::getNumberOfObservers() const
     321{
     322  size_t ObserverCount = 0;
     323  {
     324    std::map<Observable*,callees_t>::const_iterator callTableiter =
     325        callTable.find(const_cast<Observable *>(this));
     326    // if not present, then we have zero observers
     327    if (callTableiter != callTable.end())
     328      ObserverCount += callTableiter->second.size();
     329  }
     330  {
     331    const ChannelMap::const_iterator iter =
     332        NotificationChannels.find(const_cast<Observable * const>(this));
     333    // if not present, then we have zero observers
     334    if (iter != NotificationChannels.end())
     335      for (Channels::NotificationTypetoRefMap::const_iterator channeliter = iter->second->ChannelMap.begin();
     336          channeliter != iter->second->ChannelMap.end();
     337          ++channeliter)
     338        ObserverCount += (channeliter->second)->getNumberOfObservers();
     339  }
     340  return ObserverCount;
     341}
     342
    313343/** Handles sub-observables that just got killed
    314344 *  when an sub-observerable dies we usually don't need to do anything
     
    321351 */
    322352Observable::Observable(std::string name) :
    323   Observer(Observer::BaseConstructor())
     353  Observer(Observer::BaseConstructor()),
     354  graveyard_informer(noop_informer)
    324355{
    325356#ifdef LOG_OBSERVER
Note: See TracChangeset for help on using the changeset viewer.