blob: c41be8024e00aedd6116f77cbe7988c192f36e94 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
/**
* @file
* @author 2012-2016 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de)
* @copyright Simplified BSD
*
* @cond
* This program is free software: you can redistribute it and/or modify
* it under the terms of the FreeBSD license as published by the FreeBSD
* project.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the FreeBSD license along with this
* program. If not, see <http://www.opensource.org/licenses/bsd-license>.
* @endcond
*/
#ifndef INTERPRETERFAST_H_DA55E52B
#define INTERPRETERFAST_H_DA55E52B
//#define USCXML_VERBOSE 1
#include <vector>
#include <set>
#include "MicroStepImpl.h"
#include <boost/dynamic_bitset.hpp>
namespace uscxml {
class MicroStepFast : public MicroStepImpl {
public:
MicroStepFast(MicroStepCallbacks* callbacks);
virtual ~MicroStepFast();
virtual InterpreterState step(bool blocking);
virtual void reset();
virtual bool isInState(const std::string& stateId);
virtual std::list<xercesc::DOMElement*> getConfiguration();
void markAsCancelled();
protected:
class Transition {
public:
Transition() : element(NULL), source(0), onTrans(NULL), type(0) {}
xercesc::DOMElement* element;
boost::dynamic_bitset<> conflicts;
boost::dynamic_bitset<> exitSet;
uint32_t source;
boost::dynamic_bitset<> target;
xercesc::DOMElement* onTrans;
std::string event;
std::string cond;
unsigned char type;
};
class State {
public:
State() : element(NULL), parent(0), documentOrder(0), doneData(NULL), type(0) {}
xercesc::DOMElement* element;
boost::dynamic_bitset<> completion;
boost::dynamic_bitset<> children;
boost::dynamic_bitset<> ancestors;
uint32_t parent;
uint32_t documentOrder;
std::list<xercesc::DOMElement*> data;
std::list<xercesc::DOMElement*> invoke;
std::list<xercesc::DOMElement*> onEntry;
std::list<xercesc::DOMElement*> onExit;
xercesc::DOMElement* doneData;
unsigned char type;
};
virtual void init(xercesc::DOMElement* scxml);
std::list<xercesc::DOMElement*> getCompletion(const xercesc::DOMElement* state);
unsigned char _flags;
std::map<std::string, int> _stateIds;
std::vector<State*> _states;
std::vector<Transition*> _transitions;
std::list<xercesc::DOMElement*> _globalScripts;
boost::dynamic_bitset<> _configuration;
boost::dynamic_bitset<> _invocations;
boost::dynamic_bitset<> _history;
boost::dynamic_bitset<> _initializedData;
std::set<boost::dynamic_bitset<> > _microstepConfigurations;
Binding _binding;
xercesc::DOMElement* _scxml;
X _xmlPrefix;
X _xmlNS;
bool _isInitialized;
bool _isCancelled;
Event _event; // we do not care about the event's representation
private:
std::list<xercesc::DOMElement*> getHistoryCompletion(const xercesc::DOMElement* state);
void resortStates(xercesc::DOMNode* node, const X& xmlPrefix);
// bool hasLegalConfiguration();
#ifdef USCXML_VERBOSE
void printStateNames(const boost::dynamic_bitset<>& bitset);
#endif
};
}
#endif /* end of include guard: INTERPRETERFAST_H_DA55E52B */
|