45 namespace plugin_events
49 template <
typename... Arguments>
63 virtual void operator()(Arguments... aArguments)
const = 0;
68 template <
typename... Arguments>
71 typedef std::function<void(Arguments...)> base_type;
73 using base_type::base_type;
77 base_type::operator()(aArguments...);
86 template <
typename... Arguments>
100 virtual bool trigger(Arguments... aArguments)
const = 0;
109 return event_handle{ do_subscribe(aCallback, aUniqueId) };
113 return event_handle{ do_subscribe(aCallback, aUniqueId) };
115 template <
typename T>
118 return event_handle{ do_subscribe(aCallback,
static_cast<const void*
>(aUniqueIdObject)) };
120 template <
typename T>
123 return event_handle{ do_subscribe(aCallback,
static_cast<const void*
>(aUniqueIdObject)) };
125 template <
typename T>
128 return event_handle{ do_subscribe(aCallback,
static_cast<const void*
>(&aUniqueIdObject)) };
130 template <
typename T>
133 return event_handle{ do_subscribe(aCallback,
static_cast<const void*
>(&aUniqueIdObject)) };
137 return do_unsubscribe(aHandle);
141 return do_unsubscribe(aUniqueId);
143 template <
typename T>
146 return do_unsubscribe(
static_cast<const void*
>(aUniqueIdObject));
148 template <
typename T>
151 return do_unsubscribe(
static_cast<const void*
>(&aUniqueIdObject));
155 virtual void do_unsubscribe(
event_handle aHandle)
const = 0;
156 virtual void do_unsubscribe(
const void* aUniqueId)
const = 0;
159 #define detail_event_subscribe( declName, ... ) \
160 neolib::event_handle declName(const neolib::plugin_events::event_callback<__VA_ARGS__>& aCallback, const void* aUniqueId = nullptr) const { return declName()(aCallback, aUniqueId); }\
161 neolib::event_handle declName(const neolib::plugin_events::event_callback<__VA_ARGS__>& aCallback, const void* aUniqueId = nullptr) { return declName()(aCallback, aUniqueId); }\
162 template <typename T>\
163 neolib::event_handle declName(const neolib::plugin_events::event_callback<__VA_ARGS__>& aCallback, const T* aUniqueObject) const { return declName()(aCallback, static_cast<const void*>(aUniqueObject)); }\
164 template <typename T>\
165 neolib::event_handle declName(const neolib::plugin_events::event_callback<__VA_ARGS__>& aCallback, const T* aUniqueObject) { return declName()(aCallback, static_cast<const void*>(aUniqueObject)); }\
166 template <typename T>\
167 neolib::event_handle declName(const neolib::plugin_events::event_callback<__VA_ARGS__>& aCallback, T&& aUniqueObject) const { return declName()(aCallback, static_cast<const void*>(&aUniqueObject)); }\
168 template <typename T>\
169 neolib::event_handle declName(const neolib::plugin_events::event_callback<__VA_ARGS__>& aCallback, T&& aUniqueObject) { return declName()(aCallback, static_cast<const void*>(&aUniqueObject)); }
171 #define declare_event( declName, ... ) \
172 virtual const neolib::plugin_events::i_event<__VA_ARGS__>& ev_##declName() const = 0;\
173 virtual neolib::plugin_events::i_event<__VA_ARGS__>& ev_##declName() = 0;\
174 const neolib::plugin_events::i_event<__VA_ARGS__>& declName() const { return ev_##declName(); }\
175 neolib::plugin_events::i_event<__VA_ARGS__>& declName() { return ev_##declName(); }\
176 detail_event_subscribe(declName, __VA_ARGS__)
178 template <
typename... Arguments>
181 #define define_declared_event( name, declName, ... ) \
182 neolib::plugin_events::event<__VA_ARGS__> name; \
183 const neolib::plugin_events::i_event<__VA_ARGS__>& ev_##declName() const override { return name; };\
184 neolib::plugin_events::i_event<__VA_ARGS__>& ev_##declName() override { return name; };
186 #define define_event( name, declName, ... ) \
187 neolib::plugin_events::event<__VA_ARGS__> name; \
188 const neolib::plugin_events::i_event<__VA_ARGS__>& ev_##declName() const { return name; };\
189 neolib::plugin_events::i_event<__VA_ARGS__>& ev_##declName() { return name; };\
190 const neolib::plugin_events::i_event<__VA_ARGS__>& declName() const { return ev_##declName(); }\
191 neolib::plugin_events::i_event<__VA_ARGS__>& declName() { return ev_##declName(); }\
192 detail_event_subscribe(declName, __VA_ARGS__)