ifw  0.0.1-dev
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AnyEvent.hpp
Go to the documentation of this file.
1 
9 #ifndef RAD_ANYEVENT_HPP_
10 #define RAD_ANYEVENT_HPP_
11 
12 #include <stdexcept>
13 #include <memory>
14 #include <type_traits>
15 #include <typeindex>
16 
17 namespace rad {
18 
19 struct IncorrectEventType : public std::runtime_error {
20  using std::runtime_error::runtime_error;
21 };
22 
26 struct EventInfo {
27  enum class Context {
28  any,
30  };
31 
35  std::string id;
36 
40  std::type_index payload;
41 
44 };
45 
46 class AnyEvent;
47 using SharedEvent = std::shared_ptr<const AnyEvent>;
48 using UniqueEvent = std::unique_ptr<AnyEvent>;
49 
55 class AnyEvent {
56 public:
57  virtual ~AnyEvent();
58 
63  inline char const* getId() const {
64  return m_id;
65  }
66 
70  virtual AnyEvent* clone() const = 0;
71 
72 protected:
73  AnyEvent(char const* id);
75 
76  AnyEvent(AnyEvent const& e) = default;
77  AnyEvent(AnyEvent&& e) = default;
78  AnyEvent& operator=(AnyEvent const& e) = default;
80 
81 private:
82  // needs to point to a static area in memory
83  char const* m_id;
84 };
85 
97 template <typename EventTrait>/*, typename = typename std::enable_if<
98  !std::is_void<typename EventTrait::payload_t>::value>::type>*/
99 class EventT final : public ::rad::AnyEvent {
100  public:
101  static constexpr char const* id = EventTrait::id;
102  using payload_t = typename EventTrait::payload_t;
103 
104  template <typename... Args, typename = typename std::enable_if<
105  std::is_constructible<payload_t, Args...>::value>::type>
106  EventT(Args&&... args)
107  : AnyEvent(EventT::id)
108  , m_payload(std::forward<Args>(args)...) {
109  }
110 
111  EventT(EventT const&) = default;
112  EventT(EventT&&) = default;
113  EventT& operator=(EventT const& e) = default;
114 
115  payload_t const& getPayload() const {
116  return m_payload;
117  }
118 
120  return m_payload;
121  }
122 
123  AnyEvent* clone() const override {
124  return new EventT(*this);
125  }
126 
127 private:
128  payload_t m_payload;
129 };
130 
131 
132 } // namespace event
133 
134 #endif
double value
Definition: easylogging++.h:814
static constexpr char const * id
Definition: AnyEvent.hpp:101
Context context
Definition: AnyEvent.hpp:43
Definition: AnyEvent.hpp:26
virtual ~AnyEvent()
Definition: AnyEvent.cpp:14
Context
Definition: AnyEvent.hpp:27
typename EventTrait::payload_t payload_t
Definition: AnyEvent.hpp:102
EventT(Args &&...args)
Definition: AnyEvent.hpp:106
payload_t const & getPayload() const
Definition: AnyEvent.hpp:115
std::string id
Definition: AnyEvent.hpp:35
string id
Definition: requests.proto:15
Definition: AnyEvent.hpp:99
AnyEvent & operator=(AnyEvent const &e)=default
EventT & operator=(EventT const &e)=default
tuple Args
Definition: test_command.py:17
std::unique_ptr< AnyEvent > UniqueEvent
Definition: AnyEvent.hpp:48
char const * getId() const
Definition: AnyEvent.hpp:63
Definition: AnyEvent.hpp:55
std::shared_ptr< const AnyEvent > SharedEvent
Definition: AnyEvent.hpp:47
AnyEvent * clone() const override
Definition: AnyEvent.hpp:123
AnyEvent(char const *id)
Definition: AnyEvent.cpp:11
payload_t & getPayload()
Definition: AnyEvent.hpp:119
virtual AnyEvent * clone() const =0
std::type_index payload
Definition: AnyEvent.hpp:40
Definition: AnyEvent.hpp:19