TuringSim
C++ framework to simulate abstract computing models
finiteStateMachine.h
1 #pragma once
2 
3 #include <machine/machine.h>
4 #include <transition/FSM/finiteStateMachineTransition.h>
5 
9 namespace TuringSim::Machine::FSM {
25  template <
26  typename TransitionType_,
27  bool deterministic,
28  AcceptingStyle acceptingStyle,
29  template <typename...> class TransitionContainer_ = std::vector,
30  template <typename...> class InitialStateContainer_ = std::vector
31  >
33 
47  template <
48  typename TransitionType_,
49  AcceptingStyle acceptingStyle,
50  template <typename...> class TransitionContainer_,
51  template <typename...> class InitialStateContainer_
52  >
53  class FiniteStateMachine<TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_> :
54  public Machine<TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_>{
56  public:
57  using typename Machine_::StateType;
58  using typename Machine_::IsAccepting;
59  using typename Machine_::StorageType;
60  using typename Machine_::IsAlternating;
61  using typename Machine_::TransitionType;
62  using typename Machine_::ApplyHelperType;
63  using typename Machine_::IsDeterministic;
64  using typename Machine_::TransitionContainer;
65  using typename Machine_::InitialStateContainer;
67 
71  typedef typename StorageType::SymbolType SymbolType;
72 
73  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
74  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
75  static_assert(std::is_same_v<TransitionType, TransitionType_>);
76  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
77  static_assert(std::is_same_v<ApplyHelperType, std::monostate>);
78  static_assert(std::is_same_v<IsDeterministic, std::true_type>);
79  static_assert(std::is_same_v<TransitionContainer, TransitionContainer_<std::pair<const TransitionType&, ApplyHelperType>>>);
80  static_assert(std::is_same_v<InitialStateContainer, InitialStateContainer_<StateType>>);
81  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
82 
83  static_assert(std::is_same_v<StorageType, Memory::Word::Word<SymbolType>>,
84  "StorageType should be a word.");
86  "TransitionType must be a derived class of FiniteStateMachineTransition");
87 
89  FiniteStateMachine() = default;
103  virtual ~FiniteStateMachine() override = default;
104 
118  virtual OptionalHelpedTransition getMatchingTransition(const StateType& state, const StorageType& storage) const noexcept override final {
119  return this->getMatchingTransitionFromCurrentLetter(state, storage.front_opt());
120  }
121 
135  virtual OptionalHelpedTransition getMatchingTransitionFromCurrentLetter(const StateType& state, const std::optional<SymbolType>& letter) const noexcept = 0;
136  };
137 
151  template <
152  typename TransitionType_,
153  AcceptingStyle acceptingStyle,
154  template <typename...> class TransitionContainer_,
155  template <typename...> class InitialStateContainer_
156  >
157  class FiniteStateMachine<TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_> :
158  public Machine<TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_> {
160  public:
161  using typename Machine_::StateType;
162  using typename Machine_::IsAccepting;
163  using typename Machine_::StorageType;
164  using typename Machine_::IsAlternating;
165  using typename Machine_::TransitionType;
166  using typename Machine_::ApplyHelperType;
167  using typename Machine_::IsDeterministic;
168  using typename Machine_::TransitionContainer;
169  using typename Machine_::InitialStateContainer;
170  using typename Machine_::OptionalHelpedTransition;
171 
175  typedef typename StorageType::SymbolType SymbolType;
176 
177  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
178  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
179  static_assert(std::is_same_v<TransitionType, TransitionType_>);
180  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
181  static_assert(std::is_same_v<ApplyHelperType, std::monostate>);
182  static_assert(std::is_same_v<IsDeterministic, std::false_type>);
183  static_assert(std::is_same_v<TransitionContainer, TransitionContainer_<std::pair<const TransitionType&, ApplyHelperType>>>);
184  static_assert(std::is_same_v<InitialStateContainer, InitialStateContainer_<StateType>>);
185  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
186 
187  static_assert(std::is_same_v<StorageType, Memory::Word::Word<SymbolType>>,
188  "StorageType should be a word.");
190  "TransitionType must be a derived class of FiniteStateMachineTransition");
191 
193  FiniteStateMachine() = default;
207  virtual ~FiniteStateMachine() override = default;
208 
222  virtual TransitionContainer getMatchingTransitions(const StateType& state, const StorageType& storage) const noexcept override final {
223  return this->getMatchingTransitionsFromCurrentLetter(state, storage.front_opt());
224  }
225 
236  virtual TransitionContainer getMatchingTransitionsFromCurrentLetter(const StateType& state, const std::optional<SymbolType>& letter) const noexcept = 0;
237  };
238 }
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::ApplyHelperType
TransitionType::ApplyHelperType ApplyHelperType
The type of the apply helper. Got from TransitionType.
Definition: machine.h:85
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getMatchingTransitions
virtual TransitionContainer getMatchingTransitions(const StateType &state, const StorageType &storage) const noexcept override final
Get matching transition for the next step.
Definition: finiteStateMachine.h:222
TuringSim::Memory::Word::Word< SymbolType >
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
FiniteStateMachine & operator=(FiniteStateMachine &&)=default
The default move assignment operator.
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::FiniteStateMachine
FiniteStateMachine()=default
The default constructor.
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::FiniteStateMachine
FiniteStateMachine(const FiniteStateMachine &)=default
The default copy constructor.
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::InitialStateContainer
InitialStateContainer_< StateType > InitialStateContainer
The type returned by getInitialStates() const that contains initial states.
Definition: machine.h:256
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::InitialStateContainer
InitialStateContainer_< StateType > InitialStateContainer
The type returned by getInitialStates() const that contains initial states.
Definition: machine.h:106
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >
Base class for non deterministic machines.
Definition: machine.h:55
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::FiniteStateMachine
FiniteStateMachine(FiniteStateMachine &&)=default
The default move constructor.
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::ApplyHelperType
TransitionType::ApplyHelperType ApplyHelperType
The type of the apply helper. Got from TransitionType.
Definition: machine.h:234
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::FiniteStateMachine
FiniteStateMachine(FiniteStateMachine &&)=default
The default move constructor.
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
FiniteStateMachine & operator=(const FiniteStateMachine &)=default
The default copy assignment operator.
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::OptionalHelpedTransition
std::optional< std::pair< const TransitionType &, ApplyHelperType > > OptionalHelpedTransition
The type returned by getMatchingTransition(const StateType&, const StorageType&) const that contains ...
Definition: machine.h:250
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
FiniteStateMachine & operator=(const FiniteStateMachine &)=default
The default copy assignment operator.
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::FiniteStateMachine
FiniteStateMachine()=default
The default constructor.
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getMatchingTransition
virtual OptionalHelpedTransition getMatchingTransition(const StateType &state, const StorageType &storage) const noexcept override final
Get matching transition for the next step.
Definition: finiteStateMachine.h:118
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::StateType
TransitionType::StateType StateType
The type of the machine states. Got from TransitionType.
Definition: machine.h:67
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::StateType
TransitionType::StateType StateType
The type of the machine states. Got from TransitionType.
Definition: machine.h:218
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getMatchingTransitionFromCurrentLetter
virtual OptionalHelpedTransition getMatchingTransitionFromCurrentLetter(const StateType &state, const std::optional< SymbolType > &letter) const noexcept=0
Get matching transition for the next step.
TuringSim::Transition::FSM::FiniteStateMachineTransition
Transition of finite state machines, i.e. transition on a word.
Definition: finiteStateMachineTransition.h:22
TuringSim::Machine::AcceptingStyle
AcceptingStyle
Whether the machine is accepting, alternating or nothing.
Definition: acceptingMachine.h:11
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::SymbolType
StorageType::SymbolType SymbolType
The type of the letter of the word.
Definition: finiteStateMachine.h:71
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::TransitionContainer
TransitionContainer_< std::pair< const TransitionType &, ApplyHelperType > > TransitionContainer
The type returned by getMatchingTransitions(const StateType&, const StorageType&) const that contains...
Definition: machine.h:94
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::TransitionType
TransitionType_ TransitionType
The type of the transitions.
Definition: machine.h:212
TuringSim::Machine::FSM
Namespace of finite-state machines, that is whose storage is a word.
Definition: deterministicSimpleFiniteStateMachine.h:6
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::StorageType
TransitionType::StorageType StorageType
The type of the machine memoryGot from TransitionType.
Definition: machine.h:75
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::IsDeterministic
std::true_type IsDeterministic
std::true_type
Definition: machine.h:262
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::TransitionContainer
TransitionContainer_< std::pair< const TransitionType &, ApplyHelperType > > TransitionContainer
The type returned by getMatchingTransitions(const StateType&, const StorageType&) const that contains...
Definition: machine.h:242
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::StorageType
TransitionType::StorageType StorageType
The type of the machine memoryGot from TransitionType.
Definition: machine.h:225
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getMatchingTransitionsFromCurrentLetter
virtual TransitionContainer getMatchingTransitionsFromCurrentLetter(const StateType &state, const std::optional< SymbolType > &letter) const noexcept=0
Get matching transitions for the next step.
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >
Base class for deterministic machines.
Definition: machine.h:203
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::OptionalHelpedTransition
std::optional< std::pair< const TransitionType &, ApplyHelperType > > OptionalHelpedTransition
Useless in non-deterministic machine. Is guaranteed to exist for compatibility with deterministic mac...
Definition: machine.h:99
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
FiniteStateMachine & operator=(FiniteStateMachine &&)=default
The default move assignment operator.
TuringSim::Machine::FSM::FiniteStateMachine
The class to represent a finite state machine.
Definition: finiteStateMachine.h:32
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::~FiniteStateMachine
virtual ~FiniteStateMachine() override=default
The default virtual destructor.
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::FiniteStateMachine
FiniteStateMachine(const FiniteStateMachine &)=default
The default copy constructor.
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::TransitionType
TransitionType_ TransitionType
The type of the transitions.
Definition: machine.h:60
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::~FiniteStateMachine
virtual ~FiniteStateMachine() override=default
The default virtual destructor.
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::IsDeterministic
std::false_type IsDeterministic
std::false_type
Definition: machine.h:113
TuringSim::Machine::Machine
Base class for machines.
Definition: machine.h:33
TuringSim::Machine::FSM::FiniteStateMachine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::SymbolType
StorageType::SymbolType SymbolType
The type of the letter of the word.
Definition: finiteStateMachine.h:175