00001 /* #start# *********************************************************** 00002 00003 Scheduling Simulator 00004 Lehrstuhl f"ur Effiziente Algorithmen 00005 Technische Universit"at M"unchen 00006 00007 File : $Id: SObservable.h,v 1.4 2003/01/08 18:57:11 meierb Exp $ 00008 00009 Purpose : the observable part in the classical observer-pattern 00010 CAUTION: since the observer-mechanism is somewhat implicit 00011 the following policy should be obeyed under all 00012 circumstances in order to avoid confusion: 00013 events are generated exactly when the state changes (in the 00014 same method where the state of an object changes). 00015 00016 RCS-Log: 00017 $Log: SObservable.h,v $ 00018 Revision 1.4 2003/01/08 18:57:11 meierb 00019 added randomized release times 00020 00021 Revision 1.1.1.1 2002/12/02 22:26:19 meierb 00022 my_schedule 00023 00024 Revision 1.2 2002/11/13 18:42:59 taeubig 00025 Adaptation of the compare() function for LEDA 4.4 (namespace leda) 00026 00027 Revision 1.1 2002/08/29 12:59:58 taeubig 00028 Added the sources 00029 00030 Revision 1.12 2000/05/24 12:28:49 taeubig 00031 New compiler (gcc-2.95) and new Qt (2.1) 00032 Replaced "list" by "leda_list" etc. 00033 00034 Revision 1.11 2000/01/11 17:26:11 zoidl 00035 added javadoc comments 00036 00037 Revision 1.10 1999/11/19 16:10:50 hall 00038 changed SObserver::update( SEvent & ) to ...( const SEvent & ) 00039 00040 Revision 1.9 1999/11/19 14:54:47 hall 00041 a nice destructor added to SObserver 00042 00043 Revision 1.8 1999/08/05 13:02:38 schickin 00044 redesign: event list for algorithm is generated by logger now 00045 00046 Revision 1.7 1999/08/05 08:47:50 schickin 00047 purpose of important classes noted in the header-files 00048 00049 Revision 1.6 1999/04/27 13:38:51 schickin 00050 well folks, that's the first demo version that really runs 8-) 00051 00052 Revision 1.5 1999/02/10 15:53:26 hall 00053 TypeInfo, Observer works 00054 00055 Revision 1.4 1999/02/10 10:50:43 schickin 00056 main loop for simulation added 00057 00058 Revision 1.3 1999/01/29 10:03:29 schickin 00059 Project-Headers added. 00060 00061 * #end# ************************************************************* */ 00062 00063 #ifndef SOBSERVABLE_H 00064 #define SOBSERVABLE_H 00065 00066 // system header files 00067 #include <cassert> 00068 00069 #include <LEDA/list.h> 00070 00071 // project header files 00072 #include "SObserver.h" 00073 #include "SEvent.h" 00074 00075 00088 // ----------------------------------------------------------------------- 00089 class SObservable { 00090 public: 00093 SObservable() : _observers() {}; 00094 00097 SObservable(const SObservable& rObs); 00098 00101 virtual ~SObservable(); 00102 00110 void addObserver(SObserver &obs); 00116 void deleteObserver(SObserver &obs); 00117 00124 void notifyObservers(const SEvent& event); 00125 00126 private: 00127 leda_list<SObserver *> _observers; 00128 }; 00129 // ----------------------------------------------------------------------- 00130 00131 // ----------------------------------------------------------------------- 00132 inline 00133 SObservable::SObservable(const SObservable& rObs) { 00134 // don't copy observables which are being observed 00135 assert(_observers.size() == 0); 00136 } 00137 // ----------------------------------------------------------------------- 00138 inline 00139 SObservable::~SObservable() { 00140 SObserver *pObs; 00141 00142 // perhaps send a SObsEvent message here 00143 00144 forall(pObs, _observers) { 00145 pObs->deleteObservable(*this); 00146 } 00147 } 00148 // ----------------------------------------------------------------------- 00149 inline 00150 void SObservable::addObserver(SObserver &obs) { 00151 _observers.append(&obs); 00152 obs.addObservable(*this); 00153 } 00154 // ----------------------------------------------------------------------- 00155 inline 00156 void SObservable::deleteObserver(SObserver &obs) { 00157 _observers.remove(&obs); 00158 obs.deleteObservable(*this); 00159 } 00160 // ----------------------------------------------------------------------- 00161 inline 00162 void SObservable::notifyObservers(const SEvent& event){ 00163 SObserver *pObs; 00164 00165 forall(pObs, _observers) { 00166 pObs->update(event); 00167 } 00168 } 00169 // ----------------------------------------------------------------------- 00170 00171 // ----------------------------------------------------------------------- 00172 #if __LEDA__ >= 440 00173 namespace leda { 00174 #endif 00175 inline 00176 int compare(SObservable *const & obs1, SObservable *const & obs2) { 00177 if( obs1 < obs2 ) 00178 return -1; 00179 else if( obs1 > obs2 ) 00180 return 1; 00181 else 00182 return 0; 00183 } 00184 #if __LEDA__ >= 440 00185 } 00186 #endif 00187 // ----------------------------------------------------------------------- 00188 00189 #endif //SOBSERVABLE_H