00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef TYPES_INCLUDES
00022 #error "You can't include observ.h directly; Instead, You have to include types.h"
00023
00024 #define OBSERV_H
00025 #endif
00026
00027 #ifndef OBSERV_H
00028 #define OBSERV_H
00029
00034 #include <list>
00035 #include <algorithm>
00036
00037
00038 namespace nnfw {
00039
00046 class NNFW_API NotifyEvent {
00047 public:
00051 NotifyEvent( int type = 0 ) : etype(type) { };
00052
00054
00056
00058 int type() const {
00059 return etype;
00060 };
00062
00063 protected:
00065 int etype;
00066 };
00067
00073 class NNFW_API Observer {
00074 public:
00077
00080 virtual ~Observer() { };
00081
00083
00085
00088 virtual void notify( const NotifyEvent& ) = 0;
00090 };
00091
00092
00098 class NNFW_API Observable {
00099 public:
00102
00105 Observable() : observers() {
00106
00107 };
00108
00110
00112
00115 void addObserver( Observer* ob ) {
00116 std::list<Observer*>::iterator it = std::find( observers.begin(), observers.end(), ob );
00117 if ( it != observers.end() ) return;
00118 observers.push_back( ob );
00119 };
00120
00123 void delObserver( Observer* ob ) {
00124 std::list<Observer*>::iterator it = std::find( observers.begin(), observers.end(), ob );
00125 if ( it == observers.end() ) return;
00126 observers.erase( it );
00127 };
00128
00131 void notifyAll( const NotifyEvent& event = NotifyEvent() ) {
00132 std::list<Observer*>::iterator it = observers.begin();
00133 std::list<Observer*>::iterator end = observers.end();
00134 while( it != end ) {
00135 (*it)->notify( event );
00136 it++;
00137 }
00138 };
00139
00141
00142 private:
00144 std::list<Observer*> observers;
00145 };
00146
00147 }
00148
00149 #endif