TuringSim
C++ framework to simulate abstract computing models
simpleFiniteStateMachine.h
1 #pragma once
2 
3 #include <machine/FSM/stateAcceptingFiniteStateMachine.h>
4 #include <transition/FSM/simpleFiniteStateMachineTransition.h>
5 
6 namespace TuringSim::Machine::FSM {
17  template <
18  typename StateType,
19  typename SymbolType,
20  bool deterministic,
21  AcceptingStyle acceptingStyle = AcceptingStyle::Accepting,
22  template <typename...> class TransitionContainer = std::vector,
23  template <typename...> class InitialStateContainer = std::vector,
24  typename AcceptingConstructorArgs = typename impl_details_::StateAcceptingMachineArgs<StateType, acceptingStyle>::AcceptingConstructorArgs
25  >
27 
44  template <
45  typename StateType_,
46  typename SymbolType_,
47  bool deterministic,
48  AcceptingStyle acceptingStyle,
49  template <typename...> class TransitionContainer_,
50  template <typename...> class InitialStateContainer_,
51  typename... Args
52  >
53  class SimpleFiniteStateMachine<StateType_, SymbolType_, deterministic, acceptingStyle, TransitionContainer_, InitialStateContainer_, std::tuple<Args...>>
54  : public StateAcceptingFiniteStateMachine<Transition::FSM::SimpleFiniteStateMachineTransition<StateType_, SymbolType_>, deterministic, acceptingStyle, TransitionContainer_, InitialStateContainer_> {
57  public:
58  using typename StateAcceptingFiniteStateMachine_::StateType;
59  using typename StateAcceptingFiniteStateMachine_::SymbolType;
60  using typename StateAcceptingFiniteStateMachine_::IsAccepting;
61  using typename StateAcceptingFiniteStateMachine_::StorageType;
62  using typename StateAcceptingFiniteStateMachine_::IsAlternating;
63  using typename StateAcceptingFiniteStateMachine_::TransitionType;
64  using typename StateAcceptingFiniteStateMachine_::ApplyHelperType;
65  using typename StateAcceptingFiniteStateMachine_::IsDeterministic;
66  using typename StateAcceptingFiniteStateMachine_::TransitionContainer;
67  using typename StateAcceptingFiniteStateMachine_::InitialStateContainer;
68  using typename StateAcceptingFiniteStateMachine_::OptionalHelpedTransition;
69 
70  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
71  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
72  static_assert(std::is_same_v<TransitionType, TransitionType_>);
73  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
74  static_assert(std::is_same_v<ApplyHelperType, std::monostate>);
75  static_assert(std::is_same_v<IsDeterministic, std::integral_constant<bool, deterministic>>);
76  static_assert(std::is_same_v<TransitionContainer, TransitionContainer_<std::pair<const TransitionType&, ApplyHelperType>>>);
77  static_assert(std::is_same_v<InitialStateContainer, InitialStateContainer_<StateType>>);
78  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
79 
80  static_assert(std::is_same_v<StorageType, Memory::Word::Word<SymbolType>>,
81  "StorageType should be a word.");
82  static_assert(std::is_same_v<TransitionType_, TransitionType>,
83  "TransitionType must be SimpleFiniteStateMachineTransition");
84  static_assert(std::is_same_v<std::tuple<Args...>, typename impl_details_::StateAcceptingMachineArgs<StateType, acceptingStyle>::AcceptingConstructorArgs>,
85  "The only valid value for AcceptingConstructorArgs is the default parameter.");
86 
96  SimpleFiniteStateMachine(Args... args) :
98  {}
99 
113  virtual ~SimpleFiniteStateMachine() override = default;
114 
115 #pragma clang diagnostic push
116 #pragma clang diagnostic ignored "-Wunused-parameter"
117 
137  virtual bool isHaltingConfiguration(const StateType& state, const StorageType& storage) const noexcept override final {
138  return storage.isEndOfWord();
139  }
140 #pragma clang diagnostic pop
141  };
142 }
TuringSim::Machine::FSM::SimpleFiniteStateMachine
The class to represent a finite state machine.
Definition: simpleFiniteStateMachine.h:26
TuringSim::Memory::Word::Word< SymbolType >
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::SimpleFiniteStateMachine< StateType_, SymbolType_, deterministic, acceptingStyle, TransitionContainer_, InitialStateContainer_, std::tuple< Args... > >::isHaltingConfiguration
virtual bool isHaltingConfiguration(const StateType &state, const StorageType &storage) const noexcept override final
Test if a given configuration is a halting one.
Definition: simpleFiniteStateMachine.h:137
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::SimpleFiniteStateMachine< StateType_, SymbolType_, deterministic, acceptingStyle, TransitionContainer_, InitialStateContainer_, std::tuple< Args... > >::SimpleFiniteStateMachine
SimpleFiniteStateMachine(SimpleFiniteStateMachine &&)=default
The default move constructor.
TuringSim::Machine::FSM::SimpleFiniteStateMachine< StateType_, SymbolType_, deterministic, acceptingStyle, TransitionContainer_, InitialStateContainer_, std::tuple< Args... > >::operator=
SimpleFiniteStateMachine & operator=(SimpleFiniteStateMachine &&)=default
The default move assignment operator.
TuringSim::Machine::FSM::SimpleFiniteStateMachine< StateType_, SymbolType_, deterministic, acceptingStyle, TransitionContainer_, InitialStateContainer_, std::tuple< Args... > >::operator=
SimpleFiniteStateMachine & operator=(const SimpleFiniteStateMachine &)=default
The default copy assignment operator.
TuringSim::Machine::FSM::SimpleFiniteStateMachine< StateType_, SymbolType_, deterministic, acceptingStyle, TransitionContainer_, InitialStateContainer_, std::tuple< Args... > >::SimpleFiniteStateMachine
SimpleFiniteStateMachine(Args... args)
Builds a SimpleFiniteStateMachine given a set of accepting states.
Definition: simpleFiniteStateMachine.h:96
TuringSim::Machine::AcceptingStyle
AcceptingStyle
Whether the machine is accepting, alternating or nothing.
Definition: acceptingMachine.h:11
TuringSim::Machine::FSM
Namespace of finite-state machines, that is whose storage is a word.
Definition: deterministicSimpleFiniteStateMachine.h:6
TuringSim::Machine::StateAcceptingMachine
Definition: stateAcceptingMachine.h:93
TuringSim::Machine::FSM::SimpleFiniteStateMachine< StateType_, SymbolType_, deterministic, acceptingStyle, TransitionContainer_, InitialStateContainer_, std::tuple< Args... > >::SimpleFiniteStateMachine
SimpleFiniteStateMachine(const SimpleFiniteStateMachine &)=default
The default copy constructor.
TuringSim::Machine::FSM::SimpleFiniteStateMachine< StateType_, SymbolType_, deterministic, acceptingStyle, TransitionContainer_, InitialStateContainer_, std::tuple< Args... > >::~SimpleFiniteStateMachine
virtual ~SimpleFiniteStateMachine() override=default
The default virtual destructor.