TuringSim
C++ framework to simulate abstract computing models
machine.h
1 #pragma once
2 
3 #include <transition/transition.h>
4 #include <machine/acceptingMachine.h>
5 
9 namespace TuringSim::Machine {
26  template <
27  typename TransitionType,
28  bool deterministic,
29  AcceptingStyle acceptingStyle,
30  template <typename...> class TransitionContainer = std::vector,
31  template <typename...> class InitialStateContainer = std::vector
32  >
33  class Machine;
34 
48  template <
49  typename TransitionType_,
50  AcceptingStyle acceptingStyle,
51  template <typename...> class TransitionContainer_,
52  template <typename...> class InitialStateContainer_
53  >
54  class Machine<TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_> :
55  public AcceptingMachine<TransitionType_, acceptingStyle> {
56  public:
60  typedef TransitionType_ TransitionType;
61 
67  typedef typename TransitionType::StateType StateType;
68 
75  typedef typename TransitionType::StorageType StorageType;
76 
85  typedef typename TransitionType::ApplyHelperType ApplyHelperType;
86 
94  typedef TransitionContainer_<std::pair<const TransitionType&, ApplyHelperType>> TransitionContainer;
95 
99  typedef std::optional<std::pair<const TransitionType&, ApplyHelperType>> OptionalHelpedTransition;
100 
106  typedef InitialStateContainer_<StateType> InitialStateContainer;
107 
113  typedef std::false_type IsDeterministic;
114 
116  "TransitionType must be a derived class from Transition::Transition<StateType, StorageType, ApplyHelperType>.");
117 
119  Machine() = default;
120 
122  Machine(const Machine&) = default;
123 
125  Machine(Machine&&) = default;
126 
130  Machine& operator=(const Machine&) = default;
131 
135  Machine& operator=(Machine&&) = default;
136 
138  virtual ~Machine() = default;
139 
147  virtual InitialStateContainer getInitialStates() const noexcept = 0;
148 
159  virtual TransitionContainer getMatchingTransitions(const StateType& state, const StorageType& storage) const noexcept = 0;
160 
180  virtual bool isHaltingConfiguration(const StateType& state, const StorageType& storage) const noexcept = 0;
181  };
182 
196  template <
197  typename TransitionType_,
198  AcceptingStyle acceptingStyle,
199  template <typename...> class TransitionContainer_,
200  template <typename...> class InitialStateContainer_
201  >
202  class Machine<TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_> :
203  public AcceptingMachine<TransitionType_, acceptingStyle> {
205  public:
206  using typename AcceptingMachine_::IsAccepting;
207  using typename AcceptingMachine_::IsAlternating;
208 
212  typedef TransitionType_ TransitionType;
218  typedef typename TransitionType::StateType StateType;
225  typedef typename TransitionType::StorageType StorageType;
234  typedef typename TransitionType::ApplyHelperType ApplyHelperType;
242  typedef TransitionContainer_<std::pair<const TransitionType&, ApplyHelperType>> TransitionContainer;
250  typedef std::optional<std::pair<const TransitionType&, ApplyHelperType>> OptionalHelpedTransition;
256  typedef InitialStateContainer_<StateType> InitialStateContainer;
262  typedef std::true_type IsDeterministic;
263 
265  "TransitionType must be a derived class from Transition::Transition<StateType, StorageType, ApplyHelperType>.");
266 
268  Machine() = default;
270  Machine(const Machine&) = default;
272  Machine(Machine&&) = default;
276  Machine& operator=(const Machine&) = default;
280  Machine& operator=(Machine&&) = default;
282  virtual ~Machine() = default;
283 
291  virtual StateType getInitialState() const noexcept = 0;
292 
303  virtual InitialStateContainer getInitialStates() const noexcept final {
304  return InitialStateContainer{this->getInitialState()};
305  }
306 
320  virtual OptionalHelpedTransition getMatchingTransition(const StateType& state, const StorageType& storage) const noexcept = 0;
321 
337  virtual TransitionContainer getMatchingTransitions(const StateType& state, const StorageType& storage) const noexcept final {
338  std::optional<std::pair<TransitionType, ApplyHelperType>> transition = this->getMatchingTransition(state, storage);
339  if(transition) {
340  return TransitionContainer {{*transition}};
341  }
342  return TransitionContainer {};
343  }
344 
364  virtual bool isHaltingConfiguration(const StateType& state, const StorageType& storage) const noexcept = 0;
365  };
366 }
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::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
Machine & operator=(const Machine &)=default
The default copy assignment operator.
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::Machine
Machine()=default
The default constructor.
TuringSim::Transition::Transition
Base class for transitions.
Definition: transition.h:67
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::Machine
Machine(Machine &&)=default
The default move 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_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::Machine
Machine(const Machine &)=default
The default copy constructor.
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
Machine & operator=(const Machine &)=default
The default copy assignment operator.
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
Machine & operator=(Machine &&)=default
The default move assignment operator.
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_ >::~Machine
virtual ~Machine()=default
The default virtual destructor.
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::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::Machine
Machine(const Machine &)=default
The default copy constructor.
TuringSim::Machine
The namespace that contains machines. To run them, see TuringSim::Runner.
Definition: acceptingMachine.h:7
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::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_ >::getMatchingTransitions
virtual TransitionContainer getMatchingTransitions(const StateType &state, const StorageType &storage) const noexcept final
Get matching transitions for the next step.
Definition: machine.h:337
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::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::Machine
Machine(Machine &&)=default
The default move constructor.
TuringSim::Machine::AcceptingMachine
Base class for accepting machines.
Definition: acceptingMachine.h:74
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getInitialState
virtual StateType getInitialState() const noexcept=0
Returns the initial state of the machine.
TuringSim::Machine::AcceptingStyle
AcceptingStyle
Whether the machine is accepting, alternating or nothing.
Definition: acceptingMachine.h:11
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::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::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::Machine
Machine()=default
The default constructor.
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::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getMatchingTransition
virtual OptionalHelpedTransition getMatchingTransition(const StateType &state, const StorageType &storage) const noexcept=0
Get matching transition for the next step.
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::isHaltingConfiguration
virtual bool isHaltingConfiguration(const StateType &state, const StorageType &storage) const noexcept=0
Test if a given configuration is a halting one.
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::getInitialStates
virtual InitialStateContainer getInitialStates() const noexcept=0
Returns the initial states of the machine.
TuringSim::Machine::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::TransitionType
TransitionType_ TransitionType
The type of the transitions.
Definition: machine.h:60
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::Machine< TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::operator=
Machine & operator=(Machine &&)=default
The default move assignment operator.
TuringSim::Machine::Machine< TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_ >::~Machine
virtual ~Machine()=default
The default virtual destructor.