rad  2.0.0
 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 <memory>
13 #include <stdexcept>
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 { any, statemachine };
28 
32  std::string id;
33 
37  std::type_index payload;
38 
41 };
42 
43 class AnyEvent;
44 using SharedEvent = std::shared_ptr<const AnyEvent>;
45 using UniqueEvent = std::unique_ptr<AnyEvent>;
46 
52 class AnyEvent {
53  public:
54  virtual ~AnyEvent();
55 
60  inline char const* GetId() const { return m_id; }
61 
65  virtual AnyEvent* Clone() const = 0;
66 
67  protected:
68  AnyEvent(char const* id);
70 
71  AnyEvent(AnyEvent const& e) = default;
72  AnyEvent(AnyEvent&& e) = default;
73  AnyEvent& operator=(AnyEvent const& e) = default;
75 
76  private:
77  // needs to point to a static area in memory
78  char const* m_id;
79 };
80 
92 template <typename EventTrait>
93 class EventT final : public ::rad::AnyEvent {
94  public:
95  static constexpr char const* ID = EventTrait::ID;
96  using payload_t = typename EventTrait::payload_t;
97 
98  template <typename... Args, typename = typename std::enable_if<
99  std::is_constructible<payload_t, Args...>::value>::type>
100  EventT(Args&&... args) : AnyEvent(EventT::ID), m_payload(std::forward<Args>(args)...) {}
101 
102  EventT(EventT const&) = default;
103  EventT(EventT&&) = default;
104  EventT& operator=(EventT const& e) = default;
105 
106  payload_t const& GetPayload() const { return m_payload; }
107 
108  payload_t& GetPayload() { return m_payload; }
109 
110  AnyEvent* Clone() const override { return new EventT(*this); }
111 
112  private:
113  payload_t m_payload;
114 };
115 
116 } // namespace rad
117 
118 #endif // RAD_ANYEVENT_HPP
Definition: testCoroActivity.cpp:16
Context context
Definition: anyEvent.hpp:40
static constexpr char const * ID
Definition: anyEvent.hpp:95
AnyEvent * Clone() const override
Definition: anyEvent.hpp:110
Definition: anyEvent.hpp:26
virtual ~AnyEvent()
Definition: anyEvent.cpp:15
virtual AnyEvent * Clone() const =0
typename EventTrait::payload_t payload_t
Definition: anyEvent.hpp:96
EventT(Args &&...args)
Definition: anyEvent.hpp:100
std::string id
Definition: anyEvent.hpp:32
payload_t & GetPayload()
Definition: anyEvent.hpp:108
Definition: anyEvent.hpp:93
AnyEvent & operator=(AnyEvent const &e)=default
EventT & operator=(EventT const &e)=default
std::unique_ptr< AnyEvent > UniqueEvent
Definition: anyEvent.hpp:45
Definition: anyEvent.hpp:52
std::shared_ptr< const AnyEvent > SharedEvent
Definition: anyEvent.hpp:44
AnyEvent(char const *id)
Definition: anyEvent.cpp:13
payload_t const & GetPayload() const
Definition: anyEvent.hpp:106
char const * GetId() const
Definition: anyEvent.hpp:60
std::type_index payload
Definition: anyEvent.hpp:37
Definition: anyEvent.hpp:19