TuringSim
C++ framework to simulate abstract computing models
maybeEpsilonFiniteStateMachineTransition.h
1 #pragma once
2 
3 #include <transition/FSM/finiteStateMachineTransition.h>
4 
13  template <
14  typename StateType_,
15  typename SymbolType_
16  >
18  public FiniteStateMachineTransition<StateType_, SymbolType_> {
20  public:
25 
26  static_assert(std::is_same_v<StateType, StateType_>);
27  static_assert(std::is_same_v<StorageType, Memory::Word::Word<SymbolType_>>);
28  static_assert(std::is_same_v<ApplyHelperType, std::monostate>);
29 
31 
38  const StateType& preState,
39  const std::optional<SymbolType>& preLetter,
40  const StateType& postState) :
41  preState(preState),
42  preLetter(preLetter),
43  postState(postState)
44  {}
45 
51  const StateType& preState,
52  const StateType& postState) :
53  preState(preState),
54  preLetter(std::nullopt),
55  postState(postState)
56  {}
57 
60 
63 
68 
73 
75  virtual ~MaybeEpsilonFiniteStateMachineTransition() override = default;
76 
77  virtual std::optional<ApplyHelperType> matchFromCurrentLetter(const StateType& state, const std::optional<SymbolType>& letter) const override final {
78  if(state == preState && (!preLetter || *letter == preLetter)) {
79  return {std::monostate{}};
80  }
81  return std::nullopt;
82  }
83 
84 #pragma clang diagnostic push
85 #pragma clang diagnostic ignored "-Wunused-parameter"
86 
93  virtual StateType apply(const StateType& state, StorageType& storage, ApplyHelperType&& helper, bool& running) const override final {
94  if(preLetter) {
95  storage.read();
96  }
97  return postState;
98  }
99 #pragma clang diagnostic pop
100 
104  const StateType& getPreState() const noexcept {
105  return preState;
106  }
107 
111  const std::optional<SymbolType>& getPreLetter() const noexcept {
112  return preLetter;
113  }
114 
120  if(preState < other.preState) {
121  return -1;
122  }
123  if(preState > other.preState) {
124  return 1;
125  }
126  if(preLetter < other.preLetter) {
127  return -1;
128  }
129  if(preLetter > other.preLetter) {
130  return 1;
131  }
132  if(postState < other.postState) {
133  return -1;
134  }
135  if(postState > other.postState) {
136  return 1;
137  }
138  return 0;
139  }
140 
146  return compare(other) < 0;
147  }
148 
154  return compare(other) == 0;
155  }
156 
164  template<typename CharT, typename Traits = std::char_traits<CharT>>
165  friend std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os, const MaybeEpsilonFiniteStateMachineTransition& transition) {
166  if(transition.preLetter) {
167  return os << "(" << transition.preState << ", " << *transition.preLetter << ") -> "
168  << transition.postState;
169  }
170  return os << transition.preState << " -> " << transition.postState;
171  }
172 
173 
174  private:
175  StateType preState;
176  std::optional<SymbolType> preLetter;
177  StateType postState;
178  };
179 }
180 
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition::MaybeEpsilonFiniteStateMachineTransition
MaybeEpsilonFiniteStateMachineTransition(const MaybeEpsilonFiniteStateMachineTransition &)=default
The default copy constructor.
TuringSim::Memory::Word::Word
Class to represent a word memory, as used by a FSA.
Definition: word.h:21
TuringSim::Transition::FSM::FiniteStateMachineTransition::StorageType
StorageType_ StorageType
The type of storage.
Definition: transition.h:77
TuringSim::Transition::FSM::FiniteStateMachineTransition::SymbolType
SymbolType_ SymbolType
The type of symbols on the tape.
Definition: finiteStateMachineTransition.h:33
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition::operator<<
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const MaybeEpsilonFiniteStateMachineTransition &transition)
Debug printer for transitions.
Definition: maybeEpsilonFiniteStateMachineTransition.h:165
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition::MaybeEpsilonFiniteStateMachineTransition
MaybeEpsilonFiniteStateMachineTransition(const StateType &preState, const StateType &postState)
Builds an epsilon transition.
Definition: maybeEpsilonFiniteStateMachineTransition.h:50
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition::operator<
bool operator<(const MaybeEpsilonFiniteStateMachineTransition &other) const
Less than operator. Strong order.
Definition: maybeEpsilonFiniteStateMachineTransition.h:145
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition::StateType
StateType_ StateType
The type of states.
Definition: transition.h:72
TuringSim::Transition::FSM::FiniteStateMachineTransition::ApplyHelperType
ApplyHelperType_ ApplyHelperType
The type of apply helpers.
Definition: transition.h:82
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition::operator=
MaybeEpsilonFiniteStateMachineTransition & operator=(const MaybeEpsilonFiniteStateMachineTransition &)=default
The default copy assignment operator.
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition::operator==
bool operator==(const MaybeEpsilonFiniteStateMachineTransition &other) const
Equality operator.
Definition: maybeEpsilonFiniteStateMachineTransition.h:153
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition
Transition of finite state machines, i.e. transition on a word, without epsilon-transitions.
Definition: maybeEpsilonFiniteStateMachineTransition.h:18
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition::apply
virtual StateType apply(const StateType &state, StorageType &storage, ApplyHelperType &&helper, bool &running) const override final
Eat the current letter and return the new state.
Definition: maybeEpsilonFiniteStateMachineTransition.h:93
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition::compare
int compare(const MaybeEpsilonFiniteStateMachineTransition &other) const
Compare two transitions. OCaml style, waiting for <=>. Strong ordering.
Definition: maybeEpsilonFiniteStateMachineTransition.h:119
TuringSim::Transition::FSM::FiniteStateMachineTransition::StateType
StateType_ StateType
The type of states.
Definition: transition.h:72
TuringSim::Transition::FSM
Transitions for finite-state machines.
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition::MaybeEpsilonFiniteStateMachineTransition
MaybeEpsilonFiniteStateMachineTransition(MaybeEpsilonFiniteStateMachineTransition &&)=default
The default move constructor.
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition::operator=
MaybeEpsilonFiniteStateMachineTransition & operator=(MaybeEpsilonFiniteStateMachineTransition &&)=default
The default move assignment operator.
TuringSim::Transition::FSM::FiniteStateMachineTransition
Transition of finite state machines, i.e. transition on a word.
Definition: finiteStateMachineTransition.h:22
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition::getPreState
const StateType & getPreState() const noexcept
Get the pre-state for optimized containers.
Definition: maybeEpsilonFiniteStateMachineTransition.h:104
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition::getPreLetter
const std::optional< SymbolType > & getPreLetter() const noexcept
Get the pre-letter for optimized containers.
Definition: maybeEpsilonFiniteStateMachineTransition.h:111
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition::~MaybeEpsilonFiniteStateMachineTransition
virtual ~MaybeEpsilonFiniteStateMachineTransition() override=default
The default virtual destructor.
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition::matchFromCurrentLetter
virtual std::optional< ApplyHelperType > matchFromCurrentLetter(const StateType &state, const std::optional< SymbolType > &letter) const override final
Test whether the transition matches a configuration. Returned optional is empty iff the transition do...
Definition: maybeEpsilonFiniteStateMachineTransition.h:77
TuringSim::Transition::FSM::MaybeEpsilonFiniteStateMachineTransition::MaybeEpsilonFiniteStateMachineTransition
MaybeEpsilonFiniteStateMachineTransition(const StateType &preState, const std::optional< SymbolType > &preLetter, const StateType &postState)
Builds a MaybeEpsilonFiniteStateMachineTransition from its elements.
Definition: maybeEpsilonFiniteStateMachineTransition.h:37