Program Listing for File ObserveObject.h

Program Listing for File ObserveObject.h#

Return to documentation for file (src/util/support/ObserveObject.h)

#ifndef OBSERVE_OBJECT
#define OBSERVE_OBJECT

#include <assert.h>
#include <PtrSet.h>
#include <string>

template <class Observer>
class ObserveInfo
{
 public:
  virtual void UpdateObserver( Observer& o) const = 0;
  virtual std::string toString() { return ""; };
  virtual ~ObserveInfo() {}
};

template <class Observer>
class ObserveObject
{
    typedef PtrSetWrap<Observer> ObSetType;
    ObSetType obList;
  public:
    typedef typename PtrSetWrap<Observer>::const_iterator Iterator;
    virtual ~ObserveObject() {}
    void AttachObserver( Observer *o)
        { assert(!obList.IsMember(o) );
          obList.insert( o ); }
    void DetachObserver( Observer *o)
        { obList.erase( o ); }

    Iterator GetObserverIterator() const { return obList.begin(); }
    void Notify( const ObserveInfo<Observer> &info)
       {
        Iterator p = obList.begin();
        Observer* o = 0;
        while ( !p.ReachEnd() ) {
           o = *p;
           p++;
           info.UpdateObserver( *o );
        }
       }
    unsigned NumberOfObservers() const { return obList.NumberOfEntries(); }
};

#endif