TuringSim
C++ framework to simulate abstract computing models
deterministicSimpleAmnesicMachine.h
1 #pragma once
2 
3 #include <machine/amnesic/simpleAmnesicMachine.h>
4 #include <transition/amnesic/simpleAmnesicMachineTransition.h>
5 
16  template<
17  typename StateType,
18  AcceptingStyle acceptingStyle,
19  typename AcceptingConstructorArgs = typename impl_details_::StateAcceptingMachineArgs<StateType, acceptingStyle>::AcceptingConstructorArgs
20  >
22 
29  template<
30  typename StateType_,
31  AcceptingStyle acceptingStyle,
32  typename... Args
33  >
34  class DeterministicSimpleAmnesicMachine<StateType_, acceptingStyle, std::tuple<Args...>>
35  : public SimpleAmnesicMachine<StateType_, true, acceptingStyle> {
38  public:
39  using typename SimpleAmnesicMachine_::StateType;
40  using typename SimpleAmnesicMachine_::IsAccepting;
41  using typename SimpleAmnesicMachine_::StorageType;
42  using typename SimpleAmnesicMachine_::IsAlternating;
43  using typename SimpleAmnesicMachine_::TransitionType;
44  using typename SimpleAmnesicMachine_::ApplyHelperType;
45  using typename SimpleAmnesicMachine_::IsDeterministic;
46  using typename SimpleAmnesicMachine_::TransitionContainer;
47  using typename SimpleAmnesicMachine_::InitialStateContainer;
48  using typename SimpleAmnesicMachine_::OptionalHelpedTransition;
49 
50  static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
51  static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
52  static_assert(std::is_same_v<TransitionType, TransitionType_>);
53  static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
54  static_assert(std::is_same_v<ApplyHelperType, std::monostate>);
55  static_assert(std::is_same_v<IsDeterministic, std::true_type>);
56  static_assert(std::is_same_v<TransitionContainer, std::vector<std::pair<const TransitionType &, ApplyHelperType>>>);
57  static_assert(std::is_same_v<InitialStateContainer, std::set<StateType>>);
58  static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType &, ApplyHelperType>>>);
59 
60  static_assert(std::is_same_v<StorageType, std::monostate>,
61  "StorageType should be a word.");
62  static_assert(std::is_same_v<TransitionType_, TransitionType>,
63  "TransitionType must be SimpleAmnesicMachineTransition.");
64  static_assert(std::is_same_v<std::tuple<Args...>, typename impl_details_::StateAcceptingMachineArgs<StateType, acceptingStyle>::AcceptingConstructorArgs>,
65  "The only valid value for AcceptingConstructorArgs is the default parameter.");
66 
69 
70 #pragma clang diagnostic push
71 #pragma clang diagnostic ignored "-Wshadow-field"
72 
85  const StateType &initialState,
86  const std::vector<TransitionType> &transitions,
87  const std::set<StateType> &finalStates,
88  Args... args
89  ) :
90  SimpleAmnesicMachine_(finalStates, args...),
91  initialState(initialState),
92  transitions() {
93  for (const TransitionType &transition: transitions) {
94  this->transitions.insert({transition.getPreState(), transition});
95  }
96  }
97 #pragma clang diagnostic pop
98 
101 
104 
109 
114 
116  virtual ~DeterministicSimpleAmnesicMachine() override = default;
117 
125  virtual StateType getInitialState() const noexcept override final {
126  return initialState;
127  }
128 
141  virtual OptionalHelpedTransition
142  getMatchingTransitionFromState(const StateType &state) const noexcept override final {
143  if (typename std::map<StateType, TransitionType>::const_iterator it = transitions.find(state); it !=
144  transitions.end()) {
145  return {{it->second, {}}};
146  }
147  return {};
148  }
149 
150  private:
151  StateType initialState;
152  std::map<StateType, TransitionType> transitions;
153  };
154 }
TuringSim::Machine::Amnesic::DeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::DeterministicSimpleAmnesicMachine
DeterministicSimpleAmnesicMachine(const StateType &initialState, const std::vector< TransitionType > &transitions, const std::set< StateType > &finalStates, Args... args)
Builds a DeterministicSimpleAmnesicMachine from its components.
Definition: deterministicSimpleAmnesicMachine.h:84
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::Amnesic::DeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::~DeterministicSimpleAmnesicMachine
virtual ~DeterministicSimpleAmnesicMachine() override=default
The default virtual destructor.
TuringSim::Machine::Amnesic::DeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::operator=
DeterministicSimpleAmnesicMachine & operator=(DeterministicSimpleAmnesicMachine &&)=default
The default move assignment operator.
TuringSim::Machine::Amnesic::DeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::getMatchingTransitionFromState
virtual OptionalHelpedTransition getMatchingTransitionFromState(const StateType &state) const noexcept override final
Get matching transition for the next step.
Definition: deterministicSimpleAmnesicMachine.h:142
TuringSim::Machine::Amnesic::DeterministicSimpleAmnesicMachine
Definition: deterministicSimpleAmnesicMachine.h:21
TuringSim::Machine::Amnesic::DeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::DeterministicSimpleAmnesicMachine
DeterministicSimpleAmnesicMachine(DeterministicSimpleAmnesicMachine &&)=default
The default move constructor.
TuringSim::Machine::Amnesic::SimpleAmnesicMachine
The base class of amnesic machine with simple state and explicit list of transitions.
Definition: simpleAmnesicMachine.h:46
TuringSim::Machine::Amnesic::DeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::getInitialState
virtual StateType getInitialState() const noexcept override final
Returns the initial state of the machine.
Definition: deterministicSimpleAmnesicMachine.h:125
TuringSim::Machine::AcceptingStyle
AcceptingStyle
Whether the machine is accepting, alternating or nothing.
Definition: acceptingMachine.h:11
TuringSim::Transition::Amnesic::SimpleAmnesicMachineTransition
A simple transition of an amnesic machine: from an explicit state to an explicit state.
Definition: simpleAmnesicMachineTransition.h:13
TuringSim::Machine::Amnesic
Namespace of amnesic machine, that is machines without memory.
TuringSim::Machine::Amnesic::DeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::DeterministicSimpleAmnesicMachine
DeterministicSimpleAmnesicMachine()=delete
The deleted default constructor.
TuringSim::Machine::Amnesic::DeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::operator=
DeterministicSimpleAmnesicMachine & operator=(const DeterministicSimpleAmnesicMachine &)=default
The default copy assignment operator.
TuringSim::Machine::Amnesic::DeterministicSimpleAmnesicMachine< StateType_, acceptingStyle, std::tuple< Args... > >::DeterministicSimpleAmnesicMachine
DeterministicSimpleAmnesicMachine(const DeterministicSimpleAmnesicMachine &)=default
The default copy constructor.