TuringSim
C++ framework to simulate abstract computing models
machineRunner.h
1 #pragma once
2 
3 #include <machine/machine.h>
4 #include <listener/listener.h>
5 
9 namespace TuringSim::Runner {
15  template<typename MachineType, typename Enable = void>
17 
22  template<typename MachineType_>
23  class MachineRunner_accepting_impl<MachineType_, std::enable_if_t<!MachineType_::IsAccepting::value>> {
24  public:
27 
30 
33 
38 
43 
45  virtual ~MachineRunner_accepting_impl() = default;
46  };
47 
52  template<typename MachineType_>
53  class MachineRunner_accepting_impl<MachineType_, std::enable_if_t<MachineType_::IsAccepting::value>> {
54  public:
57 
60 
63 
68 
73 
75  virtual ~MachineRunner_accepting_impl() = default;
76 
84  virtual bool accept() = 0;
85  };
86 
92  template <typename MachineType, typename ListenerType>
97  typedef std::tuple<const MachineType&, ListenerType&> ConstructorArgs;
101  typedef std::tuple<ListenerType&> ListenerConstructorArgs;
102  };
103 
109  template <typename MachineType>
110  struct MachineRunnerArgs<MachineType, void> {
114  typedef std::tuple<const MachineType&> ConstructorArgs;
118  typedef std::tuple<> ListenerConstructorArgs;
119  };
120 
131  template <typename MachineType_, typename ListenerType_>
132  class MachineRunner : public MachineRunner_accepting_impl<MachineType_> {
133  public:
137  typedef MachineType_ MachineType;
138 
142  typedef ListenerType_ ListenerType;
143 
144 
148  typedef typename MachineType::StateType StateType;
149 
153  typedef typename MachineType::StorageType StorageType;
154 
158  typedef typename MachineType::TransitionType TransitionType;
159 
163  typedef typename MachineType::ApplyHelperType ApplyHelperType;
164 
165 
169  typedef typename ListenerType::IdType ListenerIdType;
170 
171  static_assert(std::is_same_v<typename ListenerType::MachineType, MachineType>,
172  "The listener must be made for the same machine type as the runner.");
173  static_assert(std::is_base_of_v<Listener::Listener<MachineType, ListenerIdType>, ListenerType>,
174  "The listener must be a derived class of TuringSim::Runner::Listener");
175 
182  machine(machine),
184  {}
185 
189  constexpr MachineRunner(const MachineRunner& other) = default;
190 
194  constexpr MachineRunner(MachineRunner&& other) = default;
195 
200  constexpr MachineRunner& operator=(const MachineRunner& other) = default;
201 
206  constexpr MachineRunner& operator=(MachineRunner&& other) = default;
207 
210  virtual ~MachineRunner() override = default;
211 
215  virtual void step(size_t nbIter = 1) = 0;
216 
221  virtual void exec() = 0;
222 
223  protected:
226  virtual void oneStep() = 0;
227 
231 
235  };
236 
242  template <typename MachineType_>
243  class MachineRunner<MachineType_, void> : public MachineRunner_accepting_impl<MachineType_> {
244  public:
248  typedef MachineType_ MachineType;
249 
253  typedef void ListenerType;
254 
258  typedef void ListenerIdType;
259 
260 
264  typedef typename MachineType::StateType StateType;
265 
269  typedef typename MachineType::StorageType StorageType;
270 
274  typedef typename MachineType::TransitionType TransitionType;
275 
279  typedef typename MachineType::ApplyHelperType ApplyHelperType;
280 
281 
289  {}
290 
294  constexpr MachineRunner(const MachineRunner& other) = default;
295 
299  constexpr MachineRunner(MachineRunner&& other) = default;
304  constexpr MachineRunner& operator=(const MachineRunner& other) = default;
305 
310  constexpr MachineRunner& operator=(MachineRunner&& other) = default;
311 
314  virtual ~MachineRunner() override = default;
315 
319  virtual void step(size_t nbIter = 1) = 0;
320 
325  virtual void exec() = 0;
326 
327  protected:
331  virtual void oneStep() = 0;
332 
337  };
338 
339 }
TuringSim::Runner::MachineRunner_accepting_impl
Internal class to add a "void accept()" member for accepting machines.
Definition: machineRunner.h:16
TuringSim::Runner::MachineRunner::operator=
constexpr MachineRunner & operator=(const MachineRunner &other)=default
Copy a runner.
TuringSim::Runner::MachineRunner_accepting_impl< MachineType_, std::enable_if_t<!MachineType_::IsAccepting::value > >::MachineRunner_accepting_impl
MachineRunner_accepting_impl()=default
The default constructor.
TuringSim::Runner::MachineRunner::machine
const MachineType & machine
The simulated machine.
Definition: machineRunner.h:230
TuringSim::Runner::MachineRunner::ApplyHelperType
MachineType::ApplyHelperType ApplyHelperType
The type of transitions apply helpers of the machine.
Definition: machineRunner.h:163
TuringSim::Runner::MachineRunner::exec
virtual void exec()=0
Run the machine until it halts.
TuringSim::Runner::MachineRunner< MachineType_, void >::ApplyHelperType
MachineType::ApplyHelperType ApplyHelperType
The type of transitions apply helpers of the machine.
Definition: machineRunner.h:279
TuringSim::Runner::MachineRunner< MachineType_, void >::ListenerType
void ListenerType
The type of the listener. Compatibility with the case where there is a listener.
Definition: machineRunner.h:253
TuringSim::Runner::MachineRunner_accepting_impl< MachineType_, std::enable_if_t<!MachineType_::IsAccepting::value > >::operator=
MachineRunner_accepting_impl & operator=(const MachineRunner_accepting_impl &)=default
The default copy assignment operator.
TuringSim::Runner::MachineRunner< MachineType_, void >::StateType
MachineType::StateType StateType
The type of states of the machine.
Definition: machineRunner.h:264
TuringSim::Runner::MachineRunner_accepting_impl< MachineType_, std::enable_if_t< MachineType_::IsAccepting::value > >::operator=
MachineRunner_accepting_impl & operator=(const MachineRunner_accepting_impl &)=default
The default copy assignment operator.
TuringSim::Runner::MachineRunner::oneStep
virtual void oneStep()=0
Execute one step of the machine.
TuringSim::Runner::MachineRunner< MachineType_, void >::ListenerIdType
void ListenerIdType
The type of identifiers of the listener. Compatibility with the case where there is a listener.
Definition: machineRunner.h:258
TuringSim::Runner::MachineRunnerArgs
Provides types to use in constructors for generic versions.
Definition: machineRunner.h:93
TuringSim::Runner::MachineRunner_accepting_impl< MachineType_, std::enable_if_t<!MachineType_::IsAccepting::value > >::MachineRunner_accepting_impl
MachineRunner_accepting_impl(const MachineRunner_accepting_impl &)=default
The default copy constructor.
TuringSim::Runner::MachineRunner< MachineType_, void >::oneStep
virtual void oneStep()=0
Execute one step of the machine.
TuringSim::Runner::MachineRunner::TransitionType
MachineType::TransitionType TransitionType
The type of transitions of the machine.
Definition: machineRunner.h:158
TuringSim::Listener::Listener
The base class for listeners.
Definition: listener.h:18
TuringSim::Runner::MachineRunner_accepting_impl< MachineType_, std::enable_if_t< MachineType_::IsAccepting::value > >::operator=
MachineRunner_accepting_impl & operator=(MachineRunner_accepting_impl &&)=default
The default move assignment operator.
TuringSim::Runner
The namespace of machine runners.
Definition: deterministicMachineRunner.h:5
TuringSim::Runner::MachineRunner::listener
ListenerType & listener
The listener.
Definition: machineRunner.h:234
TuringSim::Runner::MachineRunner::MachineRunner
MachineRunner(const MachineType &machine, ListenerType &listener)
Construct a MachineRunner from a Machine.
Definition: machineRunner.h:181
TuringSim::Runner::MachineRunner::StateType
MachineType::StateType StateType
The type of states of the machine.
Definition: machineRunner.h:148
TuringSim::Runner::MachineRunner::MachineRunner
constexpr MachineRunner(const MachineRunner &other)=default
Copy a runner.
TuringSim::Runner::MachineRunner< MachineType_, void >::MachineRunner
constexpr MachineRunner(MachineRunner &&other)=default
Move a runner.
TuringSim::Runner::MachineRunner_accepting_impl< MachineType_, std::enable_if_t< MachineType_::IsAccepting::value > >::MachineRunner_accepting_impl
MachineRunner_accepting_impl(const MachineRunner_accepting_impl &)=default
The default copy constructor.
TuringSim::Runner::MachineRunner< MachineType_, void >::operator=
constexpr MachineRunner & operator=(const MachineRunner &other)=default
Copy a runner.
TuringSim::Runner::MachineRunnerArgs< MachineType, void >::ConstructorArgs
std::tuple< const MachineType & > ConstructorArgs
The tuple of parameters of a runner without listener.
Definition: machineRunner.h:114
TuringSim::Runner::MachineRunner< MachineType_, void >::step
virtual void step(size_t nbIter=1)=0
Execute a given number of steps of the machine, one step by default.
TuringSim::Runner::MachineRunner_accepting_impl< MachineType_, std::enable_if_t< MachineType_::IsAccepting::value > >::MachineRunner_accepting_impl
MachineRunner_accepting_impl(MachineRunner_accepting_impl &&)=default
The default move constructor.
TuringSim::Runner::MachineRunner::MachineRunner
constexpr MachineRunner(MachineRunner &&other)=default
Move a runner.
TuringSim::Runner::MachineRunner< MachineType_, void >::exec
virtual void exec()=0
Run the machine until it halts.
TuringSim::Runner::MachineRunner< MachineType_, void >::TransitionType
MachineType::TransitionType TransitionType
The type of transitions of the machine.
Definition: machineRunner.h:274
TuringSim::Runner::MachineRunner< MachineType_, void >::MachineRunner
constexpr MachineRunner(const MachineRunner &other)=default
Copy a runner.
TuringSim::Runner::MachineRunnerArgs::ConstructorArgs
std::tuple< const MachineType &, ListenerType & > ConstructorArgs
The tuple of parameters of a runner.
Definition: machineRunner.h:97
TuringSim::Runner::MachineRunner::ListenerType
ListenerType_ ListenerType
The type of the listener.
Definition: machineRunner.h:142
TuringSim::Runner::MachineRunner_accepting_impl< MachineType_, std::enable_if_t< MachineType_::IsAccepting::value > >::~MachineRunner_accepting_impl
virtual ~MachineRunner_accepting_impl()=default
The default virtual destructor.
TuringSim::Runner::MachineRunner< MachineType_, void >::machine
const MachineType & machine
The simulated machine.
Definition: machineRunner.h:336
TuringSim::Runner::MachineRunner_accepting_impl< MachineType_, std::enable_if_t< MachineType_::IsAccepting::value > >::accept
virtual bool accept()=0
Run the machine until it can decide acceptance.
TuringSim::Runner::MachineRunner< MachineType_, void >::operator=
constexpr MachineRunner & operator=(MachineRunner &&other)=default
Move a runner.
TuringSim::Runner::MachineRunner< MachineType_, void >::MachineRunner
MachineRunner(const MachineType &machine)
Construct a MachineRunner from a Machine.
Definition: machineRunner.h:287
TuringSim::Runner::MachineRunnerArgs< MachineType, void >::ListenerConstructorArgs
std::tuple ListenerConstructorArgs
The tuple of parameters of a runner, excluding the machine parameter.
Definition: machineRunner.h:118
TuringSim::Runner::MachineRunner_accepting_impl< MachineType_, std::enable_if_t<!MachineType_::IsAccepting::value > >::~MachineRunner_accepting_impl
virtual ~MachineRunner_accepting_impl()=default
The default virtual destructor.
TuringSim::Runner::MachineRunner_accepting_impl< MachineType_, std::enable_if_t<!MachineType_::IsAccepting::value > >::operator=
MachineRunner_accepting_impl & operator=(MachineRunner_accepting_impl &&)=default
The default move assignment operator.
TuringSim::Runner::MachineRunner< MachineType_, void >::StorageType
MachineType::StorageType StorageType
The type of the memory of the machine.
Definition: machineRunner.h:269
TuringSim::Runner::MachineRunner< MachineType_, void >::~MachineRunner
virtual ~MachineRunner() override=default
Destroy the runner.
TuringSim::Runner::MachineRunnerArgs::ListenerConstructorArgs
std::tuple< ListenerType & > ListenerConstructorArgs
The tuple of parameters of a runner, excluding the machine parameter.
Definition: machineRunner.h:101
TuringSim::Runner::MachineRunner::~MachineRunner
virtual ~MachineRunner() override=default
Destroy the runner.
TuringSim::Runner::MachineRunner::step
virtual void step(size_t nbIter=1)=0
Execute a given number of steps of the machine, one step by default.
TuringSim::Runner::MachineRunner_accepting_impl< MachineType_, std::enable_if_t<!MachineType_::IsAccepting::value > >::MachineRunner_accepting_impl
MachineRunner_accepting_impl(MachineRunner_accepting_impl &&)=default
The default move constructor.
TuringSim::Runner::MachineRunner::operator=
constexpr MachineRunner & operator=(MachineRunner &&other)=default
Move a runner.
TuringSim::Runner::MachineRunner::ListenerIdType
ListenerType::IdType ListenerIdType
The type of identifiers used by the listener.
Definition: machineRunner.h:169
TuringSim::Runner::MachineRunner::StorageType
MachineType::StorageType StorageType
The type of the memory of the machine.
Definition: machineRunner.h:153
TuringSim::Runner::MachineRunner
A class to run a simulate the execution of a Machine.
Definition: machineRunner.h:132
TuringSim::Runner::MachineRunner< MachineType_, void >::MachineType
MachineType_ MachineType
The type of the simulated machine.
Definition: machineRunner.h:248
TuringSim::Runner::MachineRunner_accepting_impl< MachineType_, std::enable_if_t< MachineType_::IsAccepting::value > >::MachineRunner_accepting_impl
MachineRunner_accepting_impl()=default
The default constructor.
TuringSim::Runner::MachineRunner::MachineType
MachineType_ MachineType
The type of the simulated machine.
Definition: machineRunner.h:137