My Project
machines.h
1 #ifndef MACHINES_H_INCLUDED_
2 #define MACHINES_H_INCLUDED_
3 
4 #include "interpolate.h"
5 
6 #include "kblib/kblib.h"
7 #include <vector>
8 
9 namespace fsm {
10 
11 // TODO(killerbee13): Change state machines to do arbitrary string prefix
12 // matching instead of using char32_t
13 // see: https://conlang.lianamir.com/2019/11/the-dailies-november-5-2019/
14 
15 // TODO(killerbee13): Add template-states for state machines.
16 
17 class state {
18  public:
19  std::pair<std::string, const state*> step(char32_t c) const;
20  const std::string& suf() const { return end; }
21 
22  private:
23  struct action_t {
24  std::string format;
25  const state* dest;
26  };
27  vmap<char32_t, action_t, 16> cmap;
28  struct set_action_t {
29  small_vector<char32_t, 64> matches;
30  action_t action;
31  };
32  std::vector<set_action_t> set;
33  struct map_action_t {
34  small_vector<char32_t, 64> in_set;
35  small_vector<char32_t, 64> out_set;
36  const state* dest;
37  };
38  std::vector<map_action_t> map;
39  struct match_action_t {
40  small_vector<char32_t, 64> matches;
41  const state* dest;
42  };
43  std::vector<match_action_t> match;
44  std::optional<action_t> def;
45  const state* ret;
46  std::string end;
47 
48  public:
49  std::string_view name;
50 
51  friend std::optional<state> toState(const YAML::Node&);
52  friend bool set_dests(std::map<std::string, state>& states, std::string name,
53  const YAML::Node& data);
54 };
55 
57  public:
58  enum dir_override : unsigned char {
59  none = 0,
60  r_in = 1,
61  r_out = 2,
62  r_both = 3,
63  };
64 
65  // be a valid string_transformer
66  word_data_t operator()(Word, channelID) const;
67 
68  private:
69  // using std::map for reference stability
70  std::map<std::string, state> states;
71  dir_override dir;
72 
73  friend struct YAML::convert<state_machine>;
74 };
75 
76 } // namespace fsm
77 
78 namespace YAML {
79 
80 template <>
81 struct convert<fsm::state_machine> {
82  static bool decode(const Node& node, fsm::state_machine& sm);
83 };
84 
85 template <>
86 struct convert<fsm::state> {
87  static bool decode(const Node& node, fsm::state& s);
88 };
89 
90 } // namespace YAML
91 
92 #endif // MACHINES_H_INCLUDED_
Definition: interpolate.h:167
Definition: machines.h:17
Definition: machines.h:56
Definition: loader.cpp:367
Definition: main.cpp:142
Definition: interpolate.h:139
Definition: loader.cpp:602