00001
00031 #ifndef __adevs_abstract_simulator_h_
00032 #define __adevs_abstract_simulator_h_
00033 #include "adevs_models.h"
00034 #include "adevs_event_listener.h"
00035 #include "adevs_bag.h"
00036
00037 namespace adevs
00038 {
00039
00045 template <class X, class T = double> class AbstractSimulator
00046 {
00047 public:
00048 AbstractSimulator(){}
00053 void addEventListener(EventListener<X,T>* l)
00054 {
00055 listeners.insert(l);
00056 }
00058 void removeEventListener(EventListener<X,T>* l)
00059 {
00060 listeners.erase(l);
00061 }
00063 virtual T nextEventTime() = 0;
00065 virtual void execUntil(T tend) = 0;
00067 virtual ~AbstractSimulator(){}
00069 void notify_output_listeners(Devs<X,T>* model, const X& value, T t);
00071 void notify_state_listeners(Atomic<X,T>* model, T t);
00072 private:
00074 Bag<EventListener<X,T>*> listeners;
00075
00076 };
00077
00078 template <class X, class T>
00079 void AbstractSimulator<X,T>::notify_output_listeners(Devs<X,T>* model, const X& value, T t)
00080 {
00081 Event<X,T> event(model,value);
00082 typename Bag<EventListener<X,T>*>::iterator iter;
00083 for (iter = listeners.begin(); iter != listeners.end(); iter++)
00084 {
00085 (*iter)->outputEvent(event,t);
00086 }
00087 }
00088
00089 template <class X, class T>
00090 void AbstractSimulator<X,T>::notify_state_listeners(Atomic<X,T>* model, T t)
00091 {
00092 typename Bag<EventListener<X,T>*>::iterator iter;
00093 for (iter = listeners.begin(); iter != listeners.end(); iter++)
00094 {
00095 (*iter)->stateChange(model,t);
00096 }
00097 }
00098
00099 }
00100
00101 #endif