00001
00002 #ifndef __DAQpp_ObserverModel_h__
00003 #define __DAQpp_ObserverModel_h__
00004
00005 #include <vector>
00006 #include <string>
00007
00009 class Observable;
00018 class Argument
00019 {
00021 std::string code;
00022 public:
00024 Argument()
00025 {
00026 }
00028 Argument(const std::string &s) :
00029 code(s)
00030 {
00031 }
00033 virtual ~Argument()
00034 {
00035 }
00036 ;
00037
00039 const std::string &get_code() const
00040 {
00041 return code;
00042 }
00044 void set_code(const std::string &s)
00045 {
00046 code = s;
00047 }
00048 };
00049
00056 template <class T>
00057 class Arg : public Argument
00058 {
00059 private:
00061 T value;
00062 public:
00064 Arg(const T &v, const std::string &code = "")
00065 : Argument(code), value(v)
00066 {}
00068 T &get_value()
00069 {
00070 return value;
00071 }
00073 operator T()
00074 {
00075 return value;
00076 }
00078 T const &operator()() const
00079 {
00080 return value;
00081 }
00082 };
00083
00092 class Observer
00093 {
00094 public:
00096 virtual ~Observer()
00097 {}
00099 virtual void update(Observable *o, Argument *arg) = 0;
00100 };
00101
00108 typedef std::vector<Observer *> ObserverList;
00109 class Observable
00110 {
00111 private:
00113 bool changed;
00114 protected:
00116 virtual void setChanged()
00117 {
00118 changed = true;
00119 }
00121 virtual void clearChanged()
00122 {
00123 changed = false;
00124 }
00126 ObserverList observers;
00127 public:
00129 virtual ~Observable()
00130 {
00131 }
00133 ObserverList::iterator find(Observer &o)
00134 {
00135 return std::find(begin(),end(),&o);
00136 }
00137 ObserverList::iterator begin()
00138 {
00139 return observers.begin();
00140 }
00141 ObserverList::iterator end()
00142 {
00143 return observers.end();
00144 }
00146 virtual void addObserver(Observer &o)
00147 {
00148 observers.push_back(&o);
00149 }
00151 virtual void deleteObserver(Observer &o)
00152 {
00153 ObserverList::iterator ip = std::find(observers.begin(),observers.end(), &o);
00154 if (ip!=observers.end())
00155 observers.erase(ip);
00156 }
00158 virtual void deleteObservers()
00159 {
00160 observers.clear();
00161 }
00163 virtual int countObservers()
00164 {
00165 return observers.size();
00166 }
00170 virtual bool hasChanged()
00171 {
00172 return changed;
00173 }
00175 virtual void notifyObservers(Argument *arg = 0);
00176
00178 template <class _Function>
00179 _Function for_each_observer(_Function __f)
00180 {
00181 ObserverList::iterator ip;
00182 for (ip = observers.begin();ip != observers.end();++ip)
00183 __f( *ip );
00184
00185 return __f;
00186 }
00187
00189 ObserverList const &Observers() const
00190 {
00191 return observers;
00192 }
00193 };
00194
00195 inline void Observable::notifyObservers(Argument *arg)
00196 {
00197 ObserverList::iterator it;
00198 for (it = observers.begin();it != observers.end();++it)
00199 (*it)->update(this, arg);
00200
00201 }
00202
00203 #endif