Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

general/SObservable.h

Go to the documentation of this file.
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

Generated on Thu May 22 16:48:08 2003 for Sketch-it! by doxygen1.2.18