rad  3.0.0
Executor.h
Go to the documentation of this file.
1 /*
2  * scampl4cpp/engine
3  *
4  * Copyright by European Southern Observatory, 2012
5  * All rights reserved
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20  * 02111-1307 USA.
21  */
22 
23 /*
24  * $Id: Executor.h 1061 2015-07-13 15:03:59Z landolfa $
25  */
26 
27 #ifndef SCXML4CPP_EXECUTOR_H
28 #define SCXML4CPP_EXECUTOR_H
29 
30 #ifndef __cplusplus
31 #error This is a C++ include file and cannot be used from plain C
32 #endif
33 
34 #ifndef SCXML4CPP_STATECOMPARATOR_H
35 #include "scxml4cpp/StateComparator.h"
36 #endif
37 
38 #ifndef SCXML4CPP_EVENTQUEUE_H
39 #include "scxml4cpp/EventQueue.h"
40 #endif
41 
42 #ifndef SCXML4CPP_HELPER_H
43 #include "scxml4cpp/Helper.h"
44 #endif
45 
46 #include <queue>
47 #include <set>
48 #include <string>
49 
50 namespace scxml4cpp {
51 
52 class StateMachine;
53 class State;
54 class Transition;
55 class Event;
56 class EventQueue;
57 class Context;
58 class EventListener;
59 class StatusListener;
60 
61 class Executor {
62  public:
64 
66  ~Executor();
67 
68  std::string formatStatus(const bool usefullyqualified = false);
69  std::string formatModel();
70  std::set<State*> getStatus();
71  void printStatus(const bool usefullyqualified = false);
72 
73  void setContext(Context*);
74 
77 
78  void addEventListener(EventListener* eventListener);
79  void removeEventListener(EventListener* eventListener);
81 
82  void addStatusListener(StatusListener* statusListener);
83  void removeStatusListener(StatusListener* statusListener);
85 
86  void startSM();
87  void stopSM();
88  void start();
89  void stop();
90 
91  void run();
92 
93  void postEvent(Event* e);
94  void processEvent();
95  void processEvent(Event* e);
96 
97  bool isRunning();
98  bool isFinal();
99 
100  private:
101  StateMachine& mStateMachine;
102  std::set<State*> mCurrentStatus;
103  std::set<State*> mPreviousStatus;
104  std::set<State*> mStatesToInvoke;
105  std::queue<Event*> mInternalEvents;
106  EventQueue& mExternalEvents;
107  bool mContinue; // is interpreted started
108  bool mFinal; // is top level final state reached
109  StateComparator mStateComparator;
110  Context* mContext;
111  Helper mHelper;
112  EventHandlingPolicy mEventHandlingPolicy;
113  std::list<EventListener*> mEventListeners;
114  std::list<StatusListener*> mStatusListeners;
115 
116  StateComparator getStateComparator();
117  void processInternalEvents();
118  void exitInterpreter();
119  std::list<Transition*> selectEventlessTransitions();
120  std::list<Transition*> selectTransitions(Event* e);
121  void microstep(std::list<Transition*>& enabledTransitions);
122  void exitStates(std::list<Transition*>& enabledTransitions);
123  void executeTransitionContent(std::list<Transition*>& enabledTransitions);
124  void enterStates(std::list<Transition*>& enabledTransitions);
125  void addStatesToEnter(State* s, State* root, std::list<State*>& statesToEnter,
126  std::list<State*>& statesForDefaultEntry);
127 
128  void notifyEventListeners(Event* e);
129  void notifyStatusListeners(std::set<State*>& status);
130 
131  Executor(const Executor&);
132  Executor& operator=(const Executor&);
133 };
134 
135 } // namespace scxml4cpp
136 
137 #endif // SCXML4CPP_EXECUTOR_H
scxml4cpp::Executor::start
void start()
Definition: Executor.cpp:260
scxml4cpp::Executor::addStatusListener
void addStatusListener(StatusListener *statusListener)
Definition: Executor.cpp:104
scxml4cpp
Definition: Action.h:36
scxml4cpp::Executor::removeAllEventListener
void removeAllEventListener()
Definition: Executor.cpp:99
scxml4cpp::Executor::removeAllStatusListener
void removeAllStatusListener()
Definition: Executor.cpp:120
scxml4cpp::Executor::REJECT
@ REJECT
Definition: Executor.h:63
scxml4cpp::Executor::getStatus
std::set< State * > getStatus()
Definition: Executor.cpp:140
Context
Definition: testCoroActivity.cpp:16
scxml4cpp::Executor
Definition: Executor.h:61
scxml4cpp::StateMachine
Definition: StateMachine.h:45
scxml4cpp::Executor::printStatus
void printStatus(const bool usefullyqualified=false)
Definition: Executor.cpp:145
scxml4cpp::State
Definition: State.h:48
scxml4cpp::Executor::setContext
void setContext(Context *)
Definition: Executor.cpp:67
scxml4cpp::Helper
Definition: Helper.h:48
scxml4cpp::Executor::run
void run()
Definition: Executor.cpp:250
scxml4cpp::Executor::getEventHandlingPolicy
EventHandlingPolicy getEventHandlingPolicy()
Definition: Executor.cpp:78
scxml4cpp::Executor::setEventHandlingPolicy
void setEventHandlingPolicy(const EventHandlingPolicy policy)
Definition: Executor.cpp:73
scxml4cpp::Executor::Executor
Executor(StateMachine &, Context *, EventQueue &)
Definition: Executor.cpp:52
scxml4cpp::Executor::SILENT
@ SILENT
Definition: Executor.h:63
scxml4cpp::StateComparator
Definition: StateComparator.h:40
scxml4cpp::Executor::removeStatusListener
void removeStatusListener(StatusListener *statusListener)
Definition: Executor.cpp:112
scxml4cpp::Executor::processEvent
void processEvent()
Definition: Executor.cpp:314
scxml4cpp::Executor::DEFFERRED
@ DEFFERRED
Definition: Executor.h:63
scxml4cpp::Executor::formatModel
std::string formatModel()
Definition: Executor.cpp:135
scxml4cpp::EventListener
Definition: EventListener.h:40
scxml4cpp::Executor::removeEventListener
void removeEventListener(EventListener *eventListener)
Definition: Executor.cpp:91
scxml4cpp::Executor::EventHandlingPolicy
EventHandlingPolicy
Definition: Executor.h:63
scxml4cpp::Executor::postEvent
void postEvent(Event *e)
Definition: Executor.cpp:301
scxml4cpp::Executor::stopSM
void stopSM()
Definition: Executor.cpp:283
scxml4cpp::StatusListener
Definition: StatusListener.h:41
scxml4cpp::Executor::stop
void stop()
Definition: Executor.cpp:267
scxml4cpp::Executor::isFinal
bool isFinal()
Definition: Executor.cpp:296
scxml4cpp::Event
Definition: Event.h:39
scxml4cpp::Executor::isRunning
bool isRunning()
Definition: Executor.cpp:291
scxml4cpp::Executor::~Executor
~Executor()
Definition: Executor.cpp:65
scxml4cpp::Executor::addEventListener
void addEventListener(EventListener *eventListener)
Definition: Executor.cpp:83
scxml4cpp::Executor::formatStatus
std::string formatStatus(const bool usefullyqualified=false)
Definition: Executor.cpp:130
scxml4cpp::Context
Definition: Context.h:44
scxml4cpp::EventQueue
Definition: EventQueue.h:44
scxml4cpp::Executor::startSM
void startSM()
Definition: Executor.cpp:150