TuringSim
C++ framework to simulate abstract computing models
deterministicSimpleFiniteStateMachine.h
1 #pragma once
2 
3 #include <machine/FSM/simpleFiniteStateMachine.h>
4 #include <transition/FSM/simpleFiniteStateMachineTransition.h>
5 
19  template <
20  typename StateType,
21  typename SymbolType,
22  AcceptingStyle acceptingStyle = AcceptingStyle::Accepting,
24  >
26 
38  template <
39  typename StateType_,
40  typename SymbolType_,
41  AcceptingStyle acceptingStyle,
42  typename... Args
43  >
44  class DeterministicSimpleFiniteStateMachine<StateType_, SymbolType_, acceptingStyle, std::tuple<Args...>>
45  : public SimpleFiniteStateMachine<StateType_, SymbolType_, true, acceptingStyle, std::set, std::set>{
48  public:
49  using typename SimpleFiniteStateMachine_::StateType;
50  using typename SimpleFiniteStateMachine_::SymbolType;
51  using typename SimpleFiniteStateMachine_::IsAccepting;
52  using typename SimpleFiniteStateMachine_::StorageType;
53  using typename SimpleFiniteStateMachine_::IsAlternating;
54  using typename SimpleFiniteStateMachine_::TransitionType;
55  using typename SimpleFiniteStateMachine_::ApplyHelperType;
56  using typename SimpleFiniteStateMachine_::IsDeterministic;
57  using typename SimpleFiniteStateMachine_::TransitionContainer;
58  using typename SimpleFiniteStateMachine_::InitialStateContainer;
59  using typename SimpleFiniteStateMachine_::OptionalHelpedTransition;
60 
61  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
62  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
63  static_assert(std::is_same_v<TransitionType, TransitionType_>);
64  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
65  static_assert(std::is_same_v<ApplyHelperType, std::monostate>);
66  static_assert(std::is_same_v<IsDeterministic, std::true_type>);
67  static_assert(std::is_same_v<TransitionContainer, std::set<std::pair<const TransitionType&, ApplyHelperType>>>);
68  static_assert(std::is_same_v<InitialStateContainer, std::set<StateType>>);
69  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
70 
71  static_assert(std::is_same_v<StorageType, Memory::Word::Word<SymbolType>>,
72  "StorageType should be a word.");
73  static_assert(std::is_same_v<TransitionType_, TransitionType>,
74  "TransitionType must be SimpleFiniteStateMachineTransition");
75  static_assert(std::is_same_v<std::tuple<Args...>, typename impl_details_::StateAcceptingMachineArgs<StateType, acceptingStyle>::AcceptingConstructorArgs>,
76  "The only valid value for AcceptingConstructorArgs is the default parameter.");
77 
80 
87  const StateType& initialState,
88  const std::vector<TransitionType>& transitions,
89  Args... acceptingArgs
90  ) :
91  SimpleFiniteStateMachine_(acceptingArgs...),
92  initialState(initialState),
93  transitions()
94  {
95  for(const TransitionType& transition: transitions) {
96  this->transitions[transition.getPreState()].insert({transition.getPreLetter(), transition});
97  }
98  }
99 
113  virtual ~DeterministicSimpleFiniteStateMachine() override = default;
114 
122  virtual StateType getInitialState() const noexcept override final {
123  return initialState;
124  }
125 
139  virtual OptionalHelpedTransition getMatchingTransitionFromCurrentLetter(const StateType& state, const std::optional<SymbolType>& letter) const noexcept override final {
140  try {
141  return {{transitions.at(state).at(letter.value()), std::monostate()}};
142  }
143  catch(std::out_of_range) {
144  return {std::nullopt};
145  }
146  catch(std::bad_optional_access) {
147  return {std::nullopt};
148  }
149  }
150 
151  protected:
154  StateType initialState;
155 
158  std::map<StateType, std::map<SymbolType, TransitionType>> transitions;
159  };
160 }
TuringSim::Machine::FSM::SimpleFiniteStateMachine
The class to represent a finite state machine.
Definition: simpleFiniteStateMachine.h:26
TuringSim::Memory::Word::Word< SymbolType >
TuringSim::Machine::FSM::DeterministicSimpleFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::DeterministicSimpleFiniteStateMachine
DeterministicSimpleFiniteStateMachine(DeterministicSimpleFiniteStateMachine &&)=default
The default move constructor.
TuringSim::Machine::impl_details_::StateAcceptingMachineArgs
This class provide a single type AcceptingConstructorArgs that is the tuple of parameters used to dec...
Definition: stateAcceptingMachine.h:38
TuringSim::Machine::FSM::DeterministicSimpleFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::DeterministicSimpleFiniteStateMachine
DeterministicSimpleFiniteStateMachine(const StateType &initialState, const std::vector< TransitionType > &transitions, Args... acceptingArgs)
Builds a DeterministicSimpleFiniteStateMachine from its components.
Definition: deterministicSimpleFiniteStateMachine.h:86
TuringSim::Transition::FSM::SimpleFiniteStateMachineTransition
Transition of finite state machines, i.e. transition on a word, without epsilon-transitions.
Definition: simpleFiniteStateMachineTransition.h:19
TuringSim::Machine::FSM::DeterministicSimpleFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::DeterministicSimpleFiniteStateMachine
DeterministicSimpleFiniteStateMachine()=delete
The deleted default constructor.
TuringSim::Machine::AcceptingStyle
AcceptingStyle
Whether the machine is accepting, alternating or nothing.
Definition: acceptingMachine.h:11
TuringSim::Machine::FSM::DeterministicSimpleFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::operator=
DeterministicSimpleFiniteStateMachine & operator=(DeterministicSimpleFiniteStateMachine &&)=default
The default move assignment operator.
TuringSim::Machine::FSM
Namespace of finite-state machines, that is whose storage is a word.
Definition: deterministicSimpleFiniteStateMachine.h:6
TuringSim::Machine::FSM::DeterministicSimpleFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::getMatchingTransitionFromCurrentLetter
virtual OptionalHelpedTransition getMatchingTransitionFromCurrentLetter(const StateType &state, const std::optional< SymbolType > &letter) const noexcept override final
Get matching transition for the next step.
Definition: deterministicSimpleFiniteStateMachine.h:139
TuringSim::Machine::FSM::DeterministicSimpleFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::DeterministicSimpleFiniteStateMachine
DeterministicSimpleFiniteStateMachine(const DeterministicSimpleFiniteStateMachine &)=default
The default copy constructor.
TuringSim::Machine::FSM::DeterministicSimpleFiniteStateMachine
The class to represent a deterministic finite state machine.
Definition: deterministicSimpleFiniteStateMachine.h:25
TuringSim::Machine::FSM::DeterministicSimpleFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::operator=
DeterministicSimpleFiniteStateMachine & operator=(const DeterministicSimpleFiniteStateMachine &)=default
The default copy assignment operator.
TuringSim::Machine::FSM::DeterministicSimpleFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::getInitialState
virtual StateType getInitialState() const noexcept override final
Returns the initial state of the machine.
Definition: deterministicSimpleFiniteStateMachine.h:122
TuringSim::Machine::FSM::DeterministicSimpleFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::~DeterministicSimpleFiniteStateMachine
virtual ~DeterministicSimpleFiniteStateMachine() override=default
The default virtual destructor.
TuringSim::Machine::FSM::DeterministicSimpleFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::transitions
std::map< StateType, std::map< SymbolType, TransitionType > > transitions
The map of transitions as a 2-level map: pre-state to pre-symbol to transition.
Definition: deterministicSimpleFiniteStateMachine.h:158
TuringSim::Machine::FSM::DeterministicSimpleFiniteStateMachine< StateType_, SymbolType_, acceptingStyle, std::tuple< Args... > >::initialState
StateType initialState
The initial state of the machine.
Definition: deterministicSimpleFiniteStateMachine.h:154