TuringSim
C++ framework to simulate abstract computing models
simpleFiniteStateMachineTransition.h
1 #pragma once
2 
3 #include <utils/compare.h>
4 #include <transition/FSM/finiteStateMachineTransition.h>
5 
14  template <
15  typename StateType_,
16  typename SymbolType_
17  >
19  public FiniteStateMachineTransition<StateType_, SymbolType_> {
21  public:
26 
27  static_assert(std::is_same_v<StateType, StateType_>);
28  static_assert(std::is_same_v<StorageType, Memory::Word::Word<SymbolType_>>);
29  static_assert(std::is_same_v<ApplyHelperType, std::monostate>);
30 
32 
39  StateType preState,
40  SymbolType preLetter,
41  StateType postState) :
42  preState(preState),
43  preLetter(preLetter),
44  postState(postState)
45  {}
46 
49 
52 
57 
62 
64  virtual ~SimpleFiniteStateMachineTransition() override = default;
65 
66  virtual std::optional<ApplyHelperType> matchFromCurrentLetter(const StateType& state, const std::optional<SymbolType>& letter) const override final {
67  if(state == preState && letter && *letter == preLetter) {
68  return {std::monostate{}};
69  }
70  return std::nullopt;
71  }
72 
73 #pragma clang diagnostic push
74 #pragma clang diagnostic ignored "-Wunused-parameter"
75 
82  virtual StateType apply(const StateType& state, StorageType& storage, ApplyHelperType&& helper, bool& running) const override final {
83  storage.read();
84  return postState;
85  }
86 #pragma clang diagnostic pop
87 
91  const StateType& getPreState() const noexcept {
92  return preState;
93  }
94 
98  const SymbolType& getPreLetter() const noexcept {
99  return preLetter;
100  }
101 
106  int compare(const SimpleFiniteStateMachineTransition& other) const {
107  if(preState < other.preState) {
108  return -1;
109  }
110  if(preState > other.preState) {
111  return 1;
112  }
113  if(preLetter < other.preLetter) {
114  return -1;
115  }
116  if(preLetter > other.preLetter) {
117  return 1;
118  }
119  if(postState < other.postState) {
120  return -1;
121  }
122  if(postState > other.postState) {
123  return 1;
124  }
125  return 0;
126  }
127 
133  return compare(other) < 0;
134  }
135 
141  return compare(other) == 0;
142  }
143 
151  template<typename CharT, typename Traits = std::char_traits<CharT>>
152  friend std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os, const SimpleFiniteStateMachineTransition& transition) {
153  return os << "(" << transition.preState << ", " << transition.preLetter << ") -> " << transition.postState;
154  }
155 
156  private:
157  StateType preState;
158  SymbolType preLetter;
159  StateType postState;
160  };
161 }
TuringSim::Memory::Word::Word
Class to represent a word memory, as used by a FSA.
Definition: word.h:21
TuringSim::Transition::FSM::SimpleFiniteStateMachineTransition::~SimpleFiniteStateMachineTransition
virtual ~SimpleFiniteStateMachineTransition() override=default
The default virtual destructor.
TuringSim::Transition::FSM::SimpleFiniteStateMachineTransition::compare
int compare(const SimpleFiniteStateMachineTransition &other) const
Compare two transitions. OCaml style, waiting for <=>. Strong ordering.
Definition: simpleFiniteStateMachineTransition.h:106
TuringSim::Transition::FSM::FiniteStateMachineTransition::StorageType
StorageType_ StorageType
The type of storage.
Definition: transition.h:77
TuringSim::Transition::FSM::SimpleFiniteStateMachineTransition::operator<<
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const SimpleFiniteStateMachineTransition &transition)
Debug printer for transitions.
Definition: simpleFiniteStateMachineTransition.h:152
TuringSim::Transition::FSM::FiniteStateMachineTransition::SymbolType
SymbolType_ SymbolType
The type of symbols on the tape.
Definition: finiteStateMachineTransition.h:33
TuringSim::Transition::FSM::SimpleFiniteStateMachineTransition::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: simpleFiniteStateMachineTransition.h:66
TuringSim::Transition::FSM::SimpleFiniteStateMachineTransition::operator<
bool operator<(const SimpleFiniteStateMachineTransition &other) const
Less than operator. Strong order.
Definition: simpleFiniteStateMachineTransition.h:132
TuringSim::Transition::FSM::SimpleFiniteStateMachineTransition
Transition of finite state machines, i.e. transition on a word, without epsilon-transitions.
Definition: simpleFiniteStateMachineTransition.h:19
TuringSim::Transition::FSM::SimpleFiniteStateMachineTransition::getPreLetter
const SymbolType & getPreLetter() const noexcept
Get the pre-letter for optimized containers.
Definition: simpleFiniteStateMachineTransition.h:98
TuringSim::Transition::FSM::FiniteStateMachineTransition::ApplyHelperType
ApplyHelperType_ ApplyHelperType
The type of apply helpers.
Definition: transition.h:82
TuringSim::Transition::FSM::SimpleFiniteStateMachineTransition::SimpleFiniteStateMachineTransition
SimpleFiniteStateMachineTransition(StateType preState, SymbolType preLetter, StateType postState)
Builds a SimpleFiniteStateMachineTransition from its elements.
Definition: simpleFiniteStateMachineTransition.h:38
TuringSim::Transition::FSM::SimpleFiniteStateMachineTransition::SimpleFiniteStateMachineTransition
SimpleFiniteStateMachineTransition(const SimpleFiniteStateMachineTransition &)=default
The default copy constructor.
TuringSim::Transition::FSM::SimpleFiniteStateMachineTransition::getPreState
const StateType & getPreState() const noexcept
Get the pre-state for optimized containers.
Definition: simpleFiniteStateMachineTransition.h:91
TuringSim::Transition::FSM::SimpleFiniteStateMachineTransition::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: simpleFiniteStateMachineTransition.h:82
TuringSim::Transition::FSM::SimpleFiniteStateMachineTransition::operator=
SimpleFiniteStateMachineTransition & operator=(SimpleFiniteStateMachineTransition &&)=default
The default move assignment operator.
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::SimpleFiniteStateMachineTransition::operator==
bool operator==(const SimpleFiniteStateMachineTransition &other) const
Equality operator.
Definition: simpleFiniteStateMachineTransition.h:140
TuringSim::Transition::FSM::FiniteStateMachineTransition
Transition of finite state machines, i.e. transition on a word.
Definition: finiteStateMachineTransition.h:22
TuringSim::Transition::FSM::SimpleFiniteStateMachineTransition::operator=
SimpleFiniteStateMachineTransition & operator=(const SimpleFiniteStateMachineTransition &)=default
The default copy assignment operator.
TuringSim::Transition::FSM::SimpleFiniteStateMachineTransition::SymbolType
SymbolType_ SymbolType
The type of symbols on the tape.
Definition: finiteStateMachineTransition.h:33
TuringSim::Transition::FSM::SimpleFiniteStateMachineTransition::SimpleFiniteStateMachineTransition
SimpleFiniteStateMachineTransition(SimpleFiniteStateMachineTransition &&)=default
The default move constructor.
TuringSim::Transition::FSM::SimpleFiniteStateMachineTransition::StateType
StateType_ StateType
The type of states.
Definition: transition.h:72