NSL
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends
matchers.h
Go to the documentation of this file.
1 #ifndef NSL_MATCHERS_H
2 #define NSL_MATCHERS_H
3 
4 // NAIA headers
5 #include <Chain/Event.h>
6 
7 // c++ headers
8 #include <functional>
9 #include <memory>
10 
12 
13 namespace NSL {
14 
16 
17 class matcher {
18 public:
19  using funcType = std::function<bool(Event &)>;
20  using hookType = std::function<void(Event &)>;
21 
22  virtual bool operator()(Event &ev) {
23  // run pre-hooks
24  std::for_each(begin(m_preHooks), end(m_preHooks), [&ev](const auto &hook) { hook(ev); });
25 
26  // check the condition
27  bool result = check(ev);
28 
29  // run post-hooks
30  std::for_each(begin(m_postHooks), end(m_postHooks), [&ev, result](const auto &hook_pair) {
31  if (hook_pair.second == PostHookCondition::Always ||
32  (hook_pair.second == PostHookCondition::OnSuccess && result) ||
33  (hook_pair.second == PostHookCondition::OnFailure && !result)) {
34  hook_pair.first(ev);
35  }
36  });
37 
38  return result;
39  };
40 
41  virtual void AddPreHook(const hookType &hook) { m_preHooks.push_back(hook); }
42  virtual void AddPreHook(hookType &&hook) { m_preHooks.push_back(hook); }
43 
44  virtual void AddPostHook(const hookType &hook, PostHookCondition condition) {
45  m_postHooks.emplace_back(hook, condition);
46  }
47  virtual void AddPostHook(hookType &&hook, PostHookCondition condition) { m_postHooks.emplace_back(hook, condition); }
48 
49 private:
50  virtual bool check(Event &ev) = 0;
51 
52  std::vector<hookType> m_preHooks{};
53  std::vector<std::pair<hookType, PostHookCondition>> m_postHooks{};
54 };
55 
56 using RefCMatcher = std::shared_ptr<matcher>;
57 
58 class boolMatcher : public matcher {
59 public:
60  explicit boolMatcher(funcType match) : m_match{std::move(match)} {};
61  ~boolMatcher() = default;
62 
63 private:
64  bool check(Event &ev) override { return m_match(ev); }
65 
66 private:
67  funcType m_match;
68 };
69 
70 class andMatcher : public matcher {
71 public:
72  andMatcher(RefCMatcher lhs, RefCMatcher rhs) : m_lhs{std::move(lhs)}, m_rhs{std::move(rhs)} {};
73 
74 private:
75  bool check(Event &ev) override { return (*m_lhs)(ev) && (*m_rhs)(ev); };
76 
77 protected:
78  RefCMatcher m_lhs;
80 };
81 
82 class orMatcher : public matcher {
83 public:
84  orMatcher(RefCMatcher lhs, RefCMatcher rhs) : m_lhs{std::move(lhs)}, m_rhs{std::move(rhs)} {};
85 
86 private:
87  bool check(Event &ev) override { return (*m_lhs)(ev) || (*m_rhs)(ev); };
88 
89 protected:
90  RefCMatcher m_lhs;
92 };
93 
94 class notMatcher : public matcher {
95 public:
96  explicit notMatcher(RefCMatcher lhs) : m_lhs{std::move(lhs)} {};
97 
98 private:
99  bool check(Event &ev) override { return !(*m_lhs)(ev); };
100 
101 protected:
102  RefCMatcher m_lhs;
103 };
104 
105 } // namespace NSL
106 
107 #endif
bool check(Event &ev) override
Definition: matchers.h:64
std::vector< hookType > m_preHooks
Definition: matchers.h:52
NAIA::Event Event
Definition: matchers.h:11
notMatcher(RefCMatcher lhs)
Definition: matchers.h:96
virtual void AddPreHook(const hookType &hook)
Definition: matchers.h:41
virtual bool operator()(Event &ev)
Definition: matchers.h:22
virtual void AddPreHook(hookType &&hook)
Definition: matchers.h:42
std::function< bool(Event &)> funcType
Definition: matchers.h:19
RefCMatcher m_rhs
Definition: matchers.h:91
virtual bool check(Event &ev)=0
PostHookCondition
Definition: matchers.h:15
virtual void AddPostHook(hookType &&hook, PostHookCondition condition)
Definition: matchers.h:47
andMatcher(RefCMatcher lhs, RefCMatcher rhs)
Definition: matchers.h:72
virtual void AddPostHook(const hookType &hook, PostHookCondition condition)
Definition: matchers.h:44
std::vector< std::pair< hookType, PostHookCondition > > m_postHooks
Definition: matchers.h:53
funcType m_match
Definition: matchers.h:67
std::shared_ptr< matcher > RefCMatcher
Definition: matchers.h:56
orMatcher(RefCMatcher lhs, RefCMatcher rhs)
Definition: matchers.h:84
boolMatcher(funcType match)
Definition: matchers.h:60
RefCMatcher m_rhs
Definition: matchers.h:79
std::function< void(Event &)> hookType
Definition: matchers.h:20