8 #ifndef __DIADES__AUTOMATA__STATEMACHINE_HH__ 9 #define __DIADES__AUTOMATA__STATEMACHINE_HH__ 10 #include <unordered_set> 11 #include <unordered_map> 31 namespace Experimental
35 using std::unordered_set;
36 using std::unordered_map;
45 template<
typename StatePropertyId,
typename EventPropertyId,
typename NullStatePropertyId,
typename NullEventPropertyId>
50 template<
typename StatePropertyId,
typename EventPropertyId,
typename InputIterator,
typename NullStateProperty,
typename NullEventProperty>
53 template<
typename StatePropertyId,
typename EventPropertyId,
typename InputIterator,
typename NullStateProperty,
typename NullEventProperty>
58 template<
typename StatePropertyId,
typename EventPropertyId,
typename InputIterator,
typename Predicate,
typename NullStatePropertyId = NullValue<StatePropertyId>,
typename NullEventPropertyId>
80 template<
typename _StatePropertyId,
81 typename _EventPropertyId,
137 return "Automata::StateMachine";
197 template<
typename _Iterator>
222 return _eventPropertyIds[index];
233 template<
typename StateIterator>
253 _indexOfEventPropertyId(),
254 _eventPropertyIdIndexOfTransition(),
256 _stateOfStatePropertyIdIndex(),
257 _indexOfStatePropertyIdIndex(),
258 _statePropertyIdIndexOfState(),
259 _nullStatePropertyIdStates(),
260 _transitionsWithTarget(),
261 _transitionsWithSource(),
262 _sourceWithEventPropertyIdIndex(),
263 _targetWithEventPropertyIdIndex(),
264 _transitionsWithEventPropertyIdIndex()
266 _eventPropertyIdIndexOfTransition.
init(_behav);
267 _statePropertyIdIndexOfState.
init(_behav);
268 _isInitial.
init(_behav, 0);
276 _behav(machine._behav),
279 _name(machine.
name()),
281 _eventPropertyIds(machine._eventPropertyIds),
282 _indexOfEventPropertyId(machine._indexOfEventPropertyId),
283 _eventPropertyIdIndexOfTransition(),
284 _statePropertyIds(machine._statePropertyIds),
285 _stateOfStatePropertyIdIndex(),
286 _indexOfStatePropertyIdIndex(machine._indexOfStatePropertyIdIndex),
287 _statePropertyIdIndexOfState(),
288 _nullStatePropertyIdStates(),
289 _transitionsWithTarget(),
290 _transitionsWithSource(),
291 _sourceWithEventPropertyIdIndex(),
292 _targetWithEventPropertyIdIndex(),
293 _transitionsWithEventPropertyIdIndex()
312 _name = machine.
name();
345 return this == &machine;
358 return !(*
this == machine);
372 _eventPropertyIds.clear();
373 _indexOfEventPropertyId.clear();
374 _eventPropertyIdIndexOfTransition.
clear();
375 _statePropertyIds.clear();
376 _stateOfStatePropertyIdIndex.clear();
377 _indexOfStatePropertyIdIndex.clear();
378 _statePropertyIdIndexOfState.
clear();
379 _nullStatePropertyIdStates.clear();
380 _transitionsWithTarget.clear();
381 _transitionsWithSource.clear();
382 _sourceWithEventPropertyIdIndex.clear();
383 _targetWithEventPropertyIdIndex.clear();
384 _transitionsWithEventPropertyIdIndex.clear();
385 _eventPropertyIdIndexOfTransition.
init(_behav);
386 _statePropertyIdIndexOfState.
init(_behav);
387 _isInitial.
init(_behav, 0);
412 return _id = identifier;
439 return(_behav.
empty());
550 _eventPropertyIds.push_back(event);
556 if(_transitionsWithTarget.size() == _transitionsWithTarget.capacity())
559 "insertEvent: too many events, memory allocation will fail");
560 size_t capacity = _transitionsWithTarget.max_size();
565 _transitionsWithTarget.reserve(capacity);
566 _transitionsWithSource.reserve(capacity);
567 _sourceWithEventPropertyIdIndex.reserve(capacity);
568 _targetWithEventPropertyIdIndex.reserve(capacity);
569 _transitionsWithEventPropertyIdIndex.reserve(capacity);
583 ensure(
Exception, _sourceWithEventPropertyIdIndex.size() == _transitionsWithTarget.size(),
"insertEvent: size problem in internal structures (_sourceWithEvent.size() != _transitionsWithTarget.size()");
584 ensure(
Exception, _sourceWithEventPropertyIdIndex.size() == _transitionsWithSource.size(),
"insertEvent: size problem in internal structures (_sourceWithEvent.size() != _transitionsWithSource.size() ");
585 ensure(
Exception, _sourceWithEventPropertyIdIndex.size() == _targetWithEventPropertyIdIndex.size(),
"insertEvent: size problem in internal structures (_sourceWithEvent.size() != _targetWithEvent.size()");
586 ensure(
Exception, _sourceWithEventPropertyIdIndex.size() == _transitionsWithEventPropertyIdIndex.size(),
"insertEvent: size problem in internal structures (_sourceWithEvent.size() != _transitionsWithEvent.size()");
596 return _eventPropertyIds.size();
606 template<
typename EventIter>
610 EventIter it =
start;
631 return _eventPropertyIds[_eventPropertyIdIndexOfTransition[t]];
641 const vector<EventPropertyId> &
651 EventPropertyIdIterator
654 return _eventPropertyIds.begin();
661 EventPropertyIdIterator
664 return _eventPropertyIds.end();
676 return std::find(_eventPropertyIds.begin(), _eventPropertyIds.end(), e)
677 != _eventPropertyIds.end();
699 auto e1Id = _indexOfEventPropertyId.at(e1);
700 auto e2Id = _indexOfEventPropertyId.at(e2);
702 for(list<Transition>::const_iterator transIt = _transitionsWithEventPropertyIdIndex[e1Id].begin();
703 transIt != _transitionsWithEventPropertyIdIndex[e1Id].end();
706 _sourceWithEventPropertyIdIndex[e2Id].insert(transIt->source());
707 _targetWithEventPropertyIdIndex[e2Id].insert(transIt->target());
708 _transitionsWithEventPropertyIdIndex[e2Id].push_back(*transIt);
709 _eventPropertyIdIndexOfTransition[*transIt] = e2Id;
710 _transitionsWithSource[e2Id][transIt->source()].insert(*transIt);
711 _transitionsWithTarget[e2Id][transIt->target()].insert(*transIt);
750 State result = _behav.
newNode();
751 _nullStatePropertyIdStates.insert(result);
767 std::pair<State, bool>
771 bool present =
false;
774 return std::make_pair(
newState(),
true);
778 auto it = _indexOfStatePropertyIdIndex.find(sProperty);
779 if(it != _indexOfStatePropertyIdIndex.end())
781 result = _stateOfStatePropertyIdIndex[it->second];
782 assertion(
Exception, result.valid(),
"newState: _stateOfProperty is incorrectly initialised");
790 _indexOfStatePropertyIdIndex[sProperty] = _statePropertyIds.size();
791 _statePropertyIdIndexOfState[result] = _statePropertyIds.size();
792 _statePropertyIds.push_back(sProperty);
793 _stateOfStatePropertyIdIndex.push_back(result);
797 ensure(
Exception, result.valid() && (_statePropertyIdIndexOfState[result] == _indexOfStatePropertyIdIndex[sProperty]),
"newState");
799 "newState: inconsistency between getStateFromIndex/getIndexOfState");
800 return std::make_pair(result, present);
817 return _statePropertyIds[_statePropertyIdIndexOfState[state]];
835 auto it = _indexOfStatePropertyIdIndex.find(sProperty);
840 success = it == _indexOfStatePropertyIdIndex.end();
843 success = _statePropertyIdIndexOfState[state] == it->second;
855 _nullStatePropertyIdStates.erase(state);
856 _indexOfStatePropertyIdIndex[sProperty] = _statePropertyIds.size();
857 _statePropertyIdIndexOfState[state] = _statePropertyIds.size();
858 _statePropertyIds.push_back(sProperty);
859 _stateOfStatePropertyIdIndex.push_back(state);
869 _nullStatePropertyIdStates.insert(state);
873 _indexOfStatePropertyIdIndex[sProperty] = _statePropertyIds.size();
874 _statePropertyIdIndexOfState[state] = _statePropertyIds.size();
875 _statePropertyIds.push_back(sProperty);
876 _stateOfStatePropertyIdIndex.push_back(state);
881 "setStatePropertyId: inconsistency between getStateFromIndex/getIndexOfState");
894 auto it = _indexOfStatePropertyIdIndex.find(sProperty);
896 if(it == _indexOfStatePropertyIdIndex.end())
900 return _stateOfStatePropertyIdIndex[it->second];
912 require(
Exception, &state.owner() == &
_behav,
"deleteState: the state does not belong to this state machine");
917 _nullStatePropertyIdStates.erase(state);
923 if(_statePropertyIdIndexOfState[state] == _statePropertyIds.size() - 1)
926 _indexOfStatePropertyIdIndex.erase(_statePropertyIds.back());
927 _stateOfStatePropertyIdIndex.pop_back();
928 _statePropertyIds.pop_back();
934 auto stateWhosePropertyIsSwapped = _stateOfStatePropertyIdIndex[_statePropertyIds.size() - 1];
938 auto & keptProperty = _statePropertyIds[_statePropertyIdIndexOfState[state]];
939 auto & erasedProperty = _statePropertyIds[_statePropertyIds.size() - 1];
940 std::swap(keptProperty, erasedProperty);
941 size_t keptPropertyIndex = _statePropertyIdIndexOfState[state];
942 _statePropertyIdIndexOfState[stateWhosePropertyIsSwapped] = keptPropertyIndex;
943 _stateOfStatePropertyIdIndex[keptPropertyIndex] = stateWhosePropertyIsSwapped;
944 _indexOfStatePropertyIdIndex[keptProperty] = keptPropertyIndex;
946 _indexOfStatePropertyIdIndex.erase(_statePropertyIds.back());
947 _stateOfStatePropertyIdIndex.pop_back();
948 _statePropertyIds.pop_back();
1012 StatePropertyIdIterator
1015 return _statePropertyIds.begin();
1021 StatePropertyIdIterator
1024 return _statePropertyIds.end();
1035 template<
typename StateIterator>
1050 if(state.valid() && (&state.owner() == &
_behav))
1052 _initial.insert(state);
1053 _isInitial[state] = 1;
1065 if(state.valid() && (&state.owner() == &
_behav))
1067 _initial.erase(state);
1068 _isInitial[state] = 0;
1120 InitialStateIterator
1123 return _initial.begin();
1132 InitialStateIterator
1135 return _initial.end();
1147 return _initial.size();
1160 return(state.valid()) && (&state.owner() == &
_behav) && (_isInitial[state] == 1);
1202 require(
Exception, &source.owner() == &
_behav,
"newTransition: the source state does not belong to this component");
1204 require(
Exception, &target.owner() == &
_behav,
"newTransition: the target state does not belong to this component");
1212 while(!found && (it != itEnd))
1214 found = (target == it->target());
1227 result = _behav.
newEdge(source, target);
1230 _eventPropertyIdIndexOfTransition[result] = _indexOfEventPropertyId[event];
1231 assertion(
Exception, _eventPropertyIdIndexOfTransition[result] == _indexOfEventPropertyId[event],
"the event of result is not correctly set");
1232 size_t eventIndex = _indexOfEventPropertyId[event];
1234 _transitionsWithTarget[eventIndex][target].insert(result);
1235 _transitionsWithSource[eventIndex][source].insert(result);
1236 _sourceWithEventPropertyIdIndex[eventIndex].insert(source);
1237 _targetWithEventPropertyIdIndex[eventIndex].insert(target);
1238 _transitionsWithEventPropertyIdIndex[eventIndex].push_back(result);
1240 ensure(
Exception, result.valid(),
"newTransition: the returned transition is invalid!");
1241 ensure(
Exception, result.source() == source,
"newTransition: the returned transition has an incorrect source");
1242 ensure(
Exception, result.target() == target,
"newTransition: the returned transition has an incorrect target");
1243 ensure(
Exception,
getEvent(result) == event,
"newTransition: the returned transition has an incorrect event");
1272 require(
Exception, &t.owner() == &
_behav,
"deleteTransition: the transition does not belong to the component");
1274 const auto & target = t.target();
1275 const auto & source = t.source();
1276 size_t eventIndex = _indexOfEventPropertyId.at(e);
1277 _transitionsWithTarget[eventIndex][target].erase(t);
1278 if(_transitionsWithTarget[eventIndex][target].empty())
1280 _targetWithEventPropertyIdIndex[eventIndex].erase(target);
1283 _transitionsWithSource[eventIndex][source].erase(t);
1284 if(_transitionsWithSource[eventIndex][source].empty())
1286 _sourceWithEventPropertyIdIndex[eventIndex].erase(source);
1290 _transitionsWithEventPropertyIdIndex[eventIndex].remove(t);
1304 list<Transition> tmp;
1305 tmp.insert(tmp.end(),
start, end);
1320 list<Transition> tmp;
1321 tmp.insert(tmp.end(),
start, end);
1331 LabelledStateIterator
1335 "beginOfSourceStateOfEvent: the event does not belong to the component");
1336 return _sourceWithEventPropertyIdIndex[_indexOfEventPropertyId.at(e)].begin();
1344 LabelledStateIterator
1348 "endOfSourceStateOfEvent: the event does not belong to the component");
1349 return _sourceWithEventPropertyIdIndex[_indexOfEventPropertyId.at(e)].end();
1357 LabelledStateIterator
1361 "beginOfTargetStateOfEvent: the event does not belong to the component");
1362 return _targetWithEventPropertyIdIndex[_indexOfEventPropertyId.at(e)].begin();
1370 LabelledStateIterator
1374 "endOfTargetStateOfEvent: the event does not belong to the component");
1375 return _targetWithEventPropertyIdIndex[_indexOfEventPropertyId.at(e)].end();
1383 EventTransitionIterator
1387 "eventTransitionBegin: the event does not belong to the component");
1388 return _transitionsWithEventPropertyIdIndex[_indexOfEventPropertyId.at(e)].begin();
1396 EventTransitionIterator
1400 "eventTransitionEnd: the event does not belong to the component");
1401 return _transitionsWithEventPropertyIdIndex[_indexOfEventPropertyId.at(e)].end();
1411 OutputEventTransitionIterator
1416 Msg(
"outputEventTransitionBegin: the event '%1%' does not belong to the component") % e);
1417 require(
Exception, s.valid(),
"outputEventTransitionBegin: invalid state");
1418 require(
Exception, &s.owner() == &
_behav,
"outputEventTransitionBegin: the state does not belong to this component");
1419 return _transitionsWithSource[_indexOfEventPropertyId.at(e)][s].begin();
1429 OutputEventTransitionIterator
1433 Msg(
"outputEventTransitionEnd: the event '%1%' does not belong to the component") % e);
1435 require(
Exception, &s.owner() == &
_behav,
"outputEventTransitionEnd: the state does not belong to this component");
1436 return _transitionsWithSource[_indexOfEventPropertyId.at(e)][s].end();
1446 InputEventTransitionIterator
1450 Msg(
"inputEventTransitionBegin: the event '%1%' does not belong to the component") % e);
1452 require(
Exception, &s.owner() == &
_behav,
"inputEventTransitionBegin: the state does not belong to this component");
1453 return _transitionsWithTarget[_indexOfEventPropertyId.at(e)][s].begin();
1463 InputEventTransitionIterator
1467 Msg(
"inputEventTransitionEnd: the event '%1%' does not belong to the component") % e);
1469 require(
Exception, &s.owner() == &
_behav,
"inputEventTransitionEnd: the state does not belong to this component");
1470 return _transitionsWithTarget[_indexOfEventPropertyId.at(e)][s].end();
1496 OutputTransitionIterator
1499 require(
Exception, s.valid(),
"outputTransitionBegin: the state is not valid");
1500 require(
Exception, &s.owner() == &
_behav,
"outputTransitionBegin: the state does not belong to the component");
1501 return s.outEdgeBegin();
1509 OutputTransitionIterator
1512 require(
Exception, s.valid(),
"outputTransitionEnd: the state is not valid");
1513 require(
Exception, &s.owner() == &
_behav,
"outputTransitionEnd: the state does not belong to the component");
1514 return s.outEdgeEnd();
1522 InputTransitionIterator
1525 require(
Exception, s.valid(),
"inputTransitionBegin: the state is not valid");
1526 require(
Exception, &s.owner() == &
_behav,
"inputTransitionBegin: the state does not belong to the component");
1527 return s.inEdgeBegin();
1535 InputTransitionIterator
1538 require(
Exception, s.valid(),
"inputTransitionEnd: the state is not valid");
1539 require(
Exception, &s.owner() == &
_behav,
"inputTransitionEnd: the state does not belong to the component");
1540 return s.inEdgeEnd();
1572 Transition transition = _behav.
getEdge(it->id());
1573 auto eventId = _indexOfEventPropertyId[machine.
getEvent(*it)];
1574 _eventPropertyIdIndexOfTransition[transition] = eventId;
1575 _transitionsWithTarget[eventId][transition.target()].insert(transition);
1576 _transitionsWithSource[eventId][transition.source()].insert(transition);
1577 _sourceWithEventPropertyIdIndex[eventId].insert(transition.source());
1578 _targetWithEventPropertyIdIndex[eventId].insert(transition.target());
1579 _transitionsWithEventPropertyIdIndex[eventId].push_back(transition);
1591 _isInitial.
init(_behav, 0);
1607 _statePropertyIdIndexOfState.
init(_behav);
1608 _nullStatePropertyIdStates.clear();
1609 _stateOfStatePropertyIdIndex.resize(_statePropertyIds.size() + 1);
1613 State copiedState = _behav.
getNode(it->id());
1616 _nullStatePropertyIdStates.insert(copiedState);
1624 "finaliseStatePropertyIds: inconsistency between getStateFromIndex/getIndexOfState (non-null)");
1639 _eventPropertyIdIndexOfTransition.
init(_behav);
1640 for(
const auto & event : _eventPropertyIds)
1642 _transitionsWithTarget[_indexOfEventPropertyId[event]].init(_behav);
1643 _transitionsWithSource[_indexOfEventPropertyId[event]].init(_behav);
1666 if(_statePropertyIdIndexOfState[state] == _statePropertyIds.size() - 1)
1669 _indexOfStatePropertyIdIndex.erase(_statePropertyIds.back());
1670 _stateOfStatePropertyIdIndex.pop_back();
1671 _statePropertyIds.pop_back();
1672 _statePropertyIdIndexOfState[state] = 0;
1677 auto stateWhosePropertyIsSwapped = _stateOfStatePropertyIdIndex[_statePropertyIds.size() - 1];
1678 auto & keptProperty = _statePropertyIds[_statePropertyIdIndexOfState[state]];
1679 auto & erasedProperty = _statePropertyIds[_statePropertyIds.size() - 1];
1680 std::swap(keptProperty, erasedProperty);
1681 size_t keptPropertyIndex = _statePropertyIdIndexOfState[state];
1682 _statePropertyIdIndexOfState[stateWhosePropertyIsSwapped] = keptPropertyIndex;
1683 _stateOfStatePropertyIdIndex[keptPropertyIndex] = stateWhosePropertyIsSwapped;
1684 _indexOfStatePropertyIdIndex[keptProperty] = keptPropertyIndex;
1685 _indexOfStatePropertyIdIndex.erase(_statePropertyIds.back());
1686 _stateOfStatePropertyIdIndex.pop_back();
1687 _statePropertyIds.pop_back();
1688 _statePropertyIdIndexOfState[state] = 0;
1707 if(eventIndex == _eventPropertyIds.size() - 1)
1710 _indexOfEventPropertyId.erase(_eventPropertyIds.back());
1711 _eventPropertyIds.pop_back();
1712 _transitionsWithEventPropertyIdIndex.pop_back();
1713 _sourceWithEventPropertyIdIndex.pop_back();
1714 _targetWithEventPropertyIdIndex.pop_back();
1715 _transitionsWithSource.pop_back();
1716 _transitionsWithTarget.pop_back();
1721 size_t keptEventPropertyIndexBeforeSwap = _eventPropertyIds.size() - 1;
1722 _indexOfEventPropertyId.erase(_eventPropertyIds.at(eventIndex));
1724 _indexOfEventPropertyId[_eventPropertyIds[keptEventPropertyIndexAfterSwap]] = keptEventPropertyIndexAfterSwap;
1725 _transitionsWithEventPropertyIdIndex[keptEventPropertyIndexAfterSwap] = _transitionsWithEventPropertyIdIndex[keptEventPropertyIndexBeforeSwap];
1726 _transitionsWithEventPropertyIdIndex.pop_back();
1727 _sourceWithEventPropertyIdIndex[keptEventPropertyIndexAfterSwap] = _sourceWithEventPropertyIdIndex[keptEventPropertyIndexBeforeSwap];
1728 _sourceWithEventPropertyIdIndex.pop_back();
1729 _targetWithEventPropertyIdIndex[keptEventPropertyIndexAfterSwap] = _targetWithEventPropertyIdIndex[keptEventPropertyIndexBeforeSwap];
1730 _targetWithEventPropertyIdIndex.pop_back();
1731 _transitionsWithSource[keptEventPropertyIndexAfterSwap] = _transitionsWithSource[keptEventPropertyIndexBeforeSwap];
1732 _transitionsWithSource.pop_back();
1733 _transitionsWithTarget[keptEventPropertyIndexAfterSwap] = _transitionsWithTarget[keptEventPropertyIndexBeforeSwap];
1734 _transitionsWithTarget.pop_back();
1739 if(_eventPropertyIdIndexOfTransition[*it] == keptEventPropertyIndexBeforeSwap)
1741 _eventPropertyIdIndexOfTransition[*it] = keptEventPropertyIndexAfterSwap;
1748 ensure(
Exception, _sourceWithEventPropertyIdIndex.size() == _eventPropertyIds.size(),
"eraseEventProperty: size problem in internal structures");
1749 ensure(
Exception, _sourceWithEventPropertyIdIndex.size() == _transitionsWithTarget.size(),
"eraseEventProperty: size problem in internal structures (_sourceWithEvent.size() != _transitionsWithTarget.size()");
1750 ensure(
Exception, _sourceWithEventPropertyIdIndex.size() == _transitionsWithSource.size(),
"eraseEventProperty: size problem in internal structures (_sourceWithEvent.size() != _transitionsWithSource.size() ");
1751 ensure(
Exception, _sourceWithEventPropertyIdIndex.size() == _targetWithEventPropertyIdIndex.size(),
"eraseEventProperty: size problem in internal structures (_sourceWithEvent.size() != _targetWithEvent.size()");
1752 ensure(
Exception, _sourceWithEventPropertyIdIndex.size() == _transitionsWithEventPropertyIdIndex.size(),
"eraseEventProperty: size problem in internal structures (_sourceWithEvent.size() != _transitionsWithEvent.size()");
1767 if(index == _nullStatePropertyIdIndex)
1771 return _stateOfStatePropertyIdIndex.at(index);
1788 return _statePropertyIdIndexOfState[s];
1795 template<
typename StatePropertyId,
typename EventPropertyId,
typename InputIterator,
typename IsNullStatePropertyId,
typename IsNullEventProperty>
1807 template<
typename StatePropertyId,
typename EventPropertyId,
typename InputIterator,
typename IsNullStateProperty,
typename IsNullEventProperty>
1819 template<
typename StatePropertyId,
typename EventPropertyId,
typename InputIterator,
typename Predicate,
typename IsNullStateProperty,
typename IsNullEventProperty>
1834 template<
typename StatePropertyId,
typename EventPropertyId,
typename InputIterator,
typename Predicate,
typename IsNullStateProperty,
typename IsNullEventProperty,
typename StatePropertyIdInsertIterator >
1856 template<
typename Type>
1864 template<
typename Type>
1872 template<
typename Type>
1880 template<
typename Type>
void copyEventPropertyId(const StateMachine &m, const EventPropertyId &event)
bool operator==(const StateMachine &machine) const
void deleteTransition(StateMachine< StatePropertyId, EventPropertyId, NullStateProperty, NullEventProperty > &m, InputIterator first, InputIterator last)
EventPropertyIdIterator eventEnd() const
NodeIterator initValue(NodeIterator begin, NodeIterator end, ConstReference value)
const EventPropertyId nullEventPropertyId
StatePropertyIdIterator statePropertyIdBegin() const
void finaliseStatePropertyIds(const StateMachine &machine)
OutputEventTransitionIterator outputEventTransitionBegin(State s, const EventPropertyId &e) const
vector< StatePropertyId > _statePropertyIds
unordered_set< State >::const_iterator LabelledStateIterator
Diades::Graph::ConstNodeMap< Type > CstStMap
void deleteTransition(Transition t)
vector< Diades::Graph::NodeMap< unordered_set< Transition > > > _transitionsWithSource
vector< State > _stateOfStatePropertyIdIndex
void finaliseEventPropertyIdRemoval(const EventPropertyId &e)
unsigned numberOfInitialStates() const
Transition newTransition(State source, State target, const EventPropertyId &event)
EventPropertyId nullEvent() const
void copyEventPropertyIds(const StateMachine &m)
GraphIterator< Edge > EdgeIterator
unordered_set< State > _nullStatePropertyIdStates
Diades::Graph::NodeMap< StatePropertyIdIndex > _statePropertyIdIndexOfState
Edge newEdge(Node source, Node target)
vector< EventPropertyId >::const_iterator EventPropertyIdIterator
Diades::Graph::Edge Transition
void eraseStatePropertyId(State state)
bool isNullState(State state) const
EdgeSizeType numberOfEdges() const
StateMachine & operator=(const StateMachine &machine)
vector< unordered_set< State > > _sourceWithEventPropertyIdIndex
void init(Graph &g, SizeType capacity=0, ValueType dflt=ValueType())
const Data & operator()(const MapStructure &m, Iterator it) const
StatePropertyIdRangeIterator< StateIterator > statePropertyIdRangeIterator(StateIterator iterator) const
EventPropertyId getEventFromIndex(size_t index) const
_NullStatePropertyId NullStatePropertyId
size_t EventPropertyIdIndex
virtual void eraseEventPropertyId(size_t eventIndex)
unordered_set< Transition >::const_iterator OutputEventTransitionIterator
#define ensure(Exception, expr, message)
bool containsEvent(const EventPropertyId &e) const
std::vector< StatePropertyId >::const_iterator StatePropertyIdIterator
void deleteState(StateMachine< StatePropertyId, EventPropertyId, NullStateProperty, NullEventProperty > &m, InputIterator first, InputIterator last)
const StatePropertyId nullStatePropertyId
Diades::Graph::Node State
OutputTransitionIterator outputTransitionBegin(State s) const
StatePropertyIdIndex getIndexOfState(State s) const
InitialStateIterator initialStateEnd() const
unordered_set< State > _initial
Diades::Graph::EdgeMap< EventPropertyIdIndex > _eventPropertyIdIndexOfTransition
StateIterator stateEnd() const
InputTransitionIterator inputTransitionBegin(State s) const
Diades::Graph::OutEdgeIterator OutputTransitionIterator
std::pair< State, bool > newState(const StatePropertyId &sProperty)
Diades::Graph::ConstEdgeMap< Type > CstTrMap
void clearAllInitialStates()
Diades::Graph::EdgeIterator TransitionIterator
LabelledStateIterator beginOfSourceStateOfEvent(const EventPropertyId &e) const
Diades::Graph::NodeIterator StateIterator
InputEventTransitionIterator inputEventTransitionEnd(State s, const EventPropertyId &e) const
virtual void insertEventPropertyId(const EventPropertyId &event)
unordered_set< Transition >::const_iterator InputEventTransitionIterator
void removeEvent(const EventPropertyId &e)
GraphIterator< Node > NodeIterator
void insertEvent(EventIter start, EventIter end)
_StatePropertyId StatePropertyId
unordered_set< State >::const_iterator InitialStateIterator
const string & setName(const string &name)
void finaliseEventPropertyIds(const StateMachine &machine)
const EventPropertyId & getEvent(Transition t) const
const vector< EventPropertyId > & events() const
LabelledStateIterator endOfSourceStateOfEvent(const EventPropertyId &e) const
virtual void deleteState(State state)
void init(Graph &g, SizeType capacity=0, ValueType dflt=ValueType())
#define require(Exception, expr, message)
Namespace of the Diades project.
Edge getEdge(EdgeSizeType index) const
_NullInputSymbolId NullEventPropertyId
OutputTransitionIterator outputTransitionEnd(State s) const
static string defaultStateMachineName()
std::vector< T >::size_type swapRemove(std::vector< T > &myVector, typename std::vector< T >::size_type index)
bool setStatePropertyId(State state, const StatePropertyId &sProperty)
unsigned numberOfStates() const
InputTransitionIterator inputTransitionEnd(State s) const
void setInitial(State state)
_InputSymbolId EventPropertyId
Transition newTransition(const StatePropertyId &source, const StatePropertyId &target, const EventPropertyId &event)
Graph::Graph & behaviour()
list< Edge >::iterator OutEdgeIterator
virtual void deleteNode(Node &node)
Node getNode(NodeSizeType index) const
ConstIterator on the Net.
EventPropertyIdIterator eventBegin() const
virtual void deleteEdge(Edge &edge)
InitialStateIterator initialStateBegin() const
LabelledStateIterator endOfTargetStateOfEvent(const EventPropertyId &e) const
unsigned numberOfTransitions() const
StateIterator stateBegin() const
OutputEventTransitionIterator outputEventTransitionEnd(State s, const EventPropertyId &e) const
vector< EventPropertyId > _eventPropertyIds
void finaliseTransitions(const StateMachine &machine)
unordered_map< StatePropertyId, StatePropertyIdIndex > _indexOfStatePropertyIdIndex
Diades::Graph::EdgeMap< Type > TrMap
Diades::Graph::InEdgeIterator InputTransitionIterator
vector< list< Transition > > _transitionsWithEventPropertyIdIndex
void finaliseInitialStates(const StateMachine &machine)
Diades::Graph::NodeMap< Type > StMap
InputEventTransitionIterator inputEventTransitionBegin(State s, const EventPropertyId &e) const
list< Edge >::iterator InEdgeIterator
TransitionIterator transitionBegin() const
size_t StatePropertyIdAsSizeT
bool operator!=(const StateMachine &machine) const
list< Transition >::const_iterator EventTransitionIterator
StatePropertyIdIterator statePropertyIdEnd() const
size_t StatePropertyIdIndex
const StatePropertyId & getStatePropertyId(State state) const
EventTransitionIterator eventTransitionEnd(const EventPropertyId &e) const
const Graph::Graph & behaviour() const
const size_t _nullStatePropertyIdIndex
bool isNullEvent(EventPropertyId evt) const
Diades::Graph::Graph _behav
StateMachine(const StateMachine &machine)
void unsetInitial(State state)
vector< unordered_set< State > > _targetWithEventPropertyIdIndex
LabelledStateIterator beginOfTargetStateOfEvent(const EventPropertyId &e) const
Diades::Graph::NodeMap< bool > _isInitial
vector< Diades::Graph::NodeMap< unordered_set< Transition > > > _transitionsWithTarget
NodeSizeType numberOfNodes() const
void deleteTransition(TransitionIterator start, TransitionIterator end)
bool isInitial(State state) const
void deleteTransition(EventTransitionIterator start, EventTransitionIterator end)
const string & name() const
void replaceEvent(const EventPropertyId &e1, const EventPropertyId &e2)
State getState(const StatePropertyId &sProperty) const
unsigned numberOfEvents() const
TransitionIterator transitionEnd() const
State getStateFromIndex(StatePropertyIdIndex index) const
#define assertion(Exception, expr, message)
EventTransitionIterator eventTransitionBegin(const EventPropertyId &e) const
void swapInitialState(State state)
swap the status of the state as initial/non-initial
unordered_map< EventPropertyId, EventPropertyIdIndex > _indexOfEventPropertyId
void setAllInitialStates()
void deleteState(StateIterator start, StateIterator end)