• Main Page
  • Classes
  • Files
  • File List

/home/rotten/Code/adevs/trunk/include/adevs_abstract_simulator.h

00001 /***************
00002 Copyright (C) 2008 by James Nutaro
00003 
00004 This library is free software; you can redistribute it and/or
00005 modify it under the terms of the GNU Lesser General Public
00006 License as published by the Free Software Foundation; either
00007 version 2 of the License, or (at your option) any later version.
00008 
00009 This library is distributed in the hope that it will be useful,
00010 but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 Lesser General Public License for more details.
00013 
00014 You should have received a copy of the GNU Lesser General Public
00015 License along with this library; if not, write to the Free Software
00016 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00017 
00018 Bugs, comments, and questions can be sent to nutaro@gmail.com
00019 ***************/
00020 #ifndef __adevs_abstract_simulator_h_
00021 #define __adevs_abstract_simulator_h_
00022 #include "adevs_models.h"
00023 #include "adevs_event_listener.h"
00024 #include "adevs_bag.h"
00025 
00026 namespace adevs
00027 {
00028 
00034 template <class X> class AbstractSimulator 
00035 {
00036         public:
00037                 AbstractSimulator(){}
00042                 void addEventListener(EventListener<X>* l)
00043                 {
00044                         listeners.insert(l);
00045                 }
00047                 void removeEventListener(EventListener<X>* l)
00048                 {
00049                         listeners.erase(l);
00050                 }
00052                 virtual double nextEventTime() = 0;
00054                 virtual void execUntil(double tend) = 0;
00056                 virtual ~AbstractSimulator(){}
00058                 void notify_output_listeners(Devs<X>* model, const X& value, double t);
00060                 void notify_state_listeners(Atomic<X>* model, double t);
00061         private:
00063                 Bag<EventListener<X>*> listeners;
00064 
00065 };
00066 
00067 template <class X>
00068 void AbstractSimulator<X>::notify_output_listeners(Devs<X>* model, const X& value, double t)
00069 {
00070         Event<X> event(model,value);
00071         typename Bag<EventListener<X>*>::iterator iter;
00072         for (iter = listeners.begin(); iter != listeners.end(); iter++)
00073         {
00074                 (*iter)->outputEvent(event,t);
00075         }
00076 }
00077 
00078 template <class X>
00079 void AbstractSimulator<X>::notify_state_listeners(Atomic<X>* model, double t)
00080 {
00081         typename Bag<EventListener<X>*>::iterator iter;
00082         for (iter = listeners.begin(); iter != listeners.end(); iter++)
00083         {
00084                 (*iter)->stateChange(model,t);
00085         }
00086 }
00087 
00088 } // end of namespace
00089 
00090 #endif

Generated on Sun Jan 23 2011 for adevs by  doxygen 1.7.1