00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef IMG_OBSERVABLE_H
00028 #define IMG_OBSERVABLE_H
00029
00030 #include <list>
00031 #include "extent.hh"
00032
00033 namespace ost { namespace img {
00034
00036
00037
00038
00039
00040
00041 template <class T>
00042 class DLLEXPORT Observable {
00043 typedef std::list<T *> ObserverList;
00044 typedef typename ObserverList::iterator ObserverIter;
00045 typedef typename ObserverList::const_iterator ObserverConstIter;
00046 public:
00047 Observable() {
00048 list_.clear();
00049 }
00050
00051
00052
00053
00054 Observable(const Observable& o) {
00055 list_.clear();
00056 }
00057
00058 ~Observable() {
00059 for(ObserverIter it=list_.begin();it!=list_.end();++it) {
00060 (*it)->ObserverInvalidate();
00061 (*it)->ObserverRelease();
00062 }
00063 }
00064
00065
00066
00067
00068 Observable& operator=(const Observable& o) {
00069 list_.clear();
00070 return *this;
00071 }
00072
00073 void Attach(T* d) {
00074 list_.push_back(d);
00075 }
00076
00077 void Detach(T* o) {
00078 list_.remove(o);
00079 }
00080
00081 void Notify() const {
00082 for(ObserverConstIter it=list_.begin();it!=list_.end();++it)
00083 (*it)->ObserverUpdate();
00084 }
00085 void Notify(const Extent& e) const {
00086 for(ObserverConstIter it=list_.begin();it!=list_.end();++it)
00087 (*it)->ObserverUpdate(e);
00088 }
00089 void Notify(const Point& p) const {
00090 for(ObserverConstIter it=list_.begin();it!=list_.end();++it)
00091 (*it)->ObserverUpdate(p);
00092 }
00093
00094 int GetListSize() const {
00095 return list_.size();
00096 }
00097
00098 long MemSize() const {
00099 return sizeof(list_) + list_.size()*sizeof(T*);
00100 }
00101
00102 private:
00103 ObserverList list_;
00104 };
00105
00106
00107 }}
00108
00109 #endif