8#ifndef ARP_USE_ARP_SYSTEM_CORE
10#include "Arp/Base/Core/event.hxx"
15#include "Arp/System/Core/delegate.hxx"
16#include "Arp/System/Core/slim_delegate.hxx"
17#include "Arp/System/Core/Exception.hpp"
18#include <forward_list>
38template<
class ...TEventArgs>
43 using delegate_type = delegate<void(TEventArgs...)>;
45 using slim_delegate_type = slim_delegate<void(TEventArgs...)>;
49 event(
void) =
default;
57 ~event(
void) =
default;
61 event& operator=(
const event& arg) =
default;
65 event& operator=(
event&& arg)
noexcept =
default;
75 throw Exception(
"As argument passed delegate is not valid.");
78 this->slimEventHandlers.push_front(std::move(rhs));
86 event&
operator+=(
const slim_delegate_type& rhs)
90 throw Exception(
"As argument passed delegate is not valid.");
93 this->slimEventHandlers.push_front(rhs);
100 event&
operator-=(
const slim_delegate_type& rhs)
102 this->slimEventHandlers.remove(rhs);
113 throw Exception(
"As argument passed delegate is not valid.");
117 throw Exception(
"Lambda delegates are not supported by events.");
120 this->eventHandlers.push_front(std::move(rhs));
131 throw Exception(
"As argument passed delegate is not valid.");
135 throw Exception(
"Lambda delegates are not supported by events.");
138 this->eventHandlers.push_front(rhs);
147 this->eventHandlers.remove(rhs);
157 for (
const slim_delegate_type& slimEventHandler : this->slimEventHandlers)
160 slimEventHandler(args...);
162 for(
const delegate_type& eventHandler : this->eventHandlers)
165 eventHandler(args...);
174 return this->slimEventHandlers.empty() && this->eventHandlers.empty();
178 std::forward_list<slim_delegate_type> slimEventHandlers;
179 std::forward_list<delegate_type> eventHandlers;
203 using delegate_type = delegate<void()>;
205 using slim_delegate_type = slim_delegate<void()>;
209 event(
void) =
default;
217 ~event(
void) =
default;
221 event& operator=(
const event& arg) =
default;
225 event& operator=(
event&& arg) =
default;
235 throw Exception(
"As argument passed delegate is not valid.");
238 this->slimEventHandlers.push_front(std::move(rhs));
245 event&
operator+=(
const slim_delegate_type& rhs)
249 throw Exception(
"As argument passed delegate is not valid.");
252 this->slimEventHandlers.push_front(rhs);
259 event&
operator-=(
const slim_delegate_type& rhs)
261 this->slimEventHandlers.remove(rhs);
272 throw Exception(
"As argument passed delegate is not valid.");
276 throw Exception(
"Lambda delegates are not supported by events.");
279 this->eventHandlers.push_front(std::move(rhs));
290 throw Exception(
"As argument passed delegate is not valid.");
294 throw Exception(
"Lambda delegates are not supported by events.");
297 this->eventHandlers.push_front(rhs);
306 this->eventHandlers.remove(rhs);
315 for (
const slim_delegate_type& slimEventHandler : this->slimEventHandlers)
320 for (
const delegate_type& eventHandler : this->eventHandlers)
332 return this->slimEventHandlers.empty() && this->eventHandlers.empty();
336 std::forward_list<slim_delegate_type> slimEventHandlers;
337 std::forward_list<delegate_type> eventHandlers;
event & operator+=(delegate_type &&rhs)
Adds a delegate to this event.
Definition: event.ipp:22
void operator()(Args... args) const
Fires this event instance.
Definition: event.ipp:80
bool is_empty(void) const
Checks if this event has any delegates to be invoked.
Definition: event.ipp:93
event & operator-=(const delegate_type &rhs)
Removes a delegate from this event.
Definition: event.ipp:62
event(void)
Constructs a event instance.
Root namespace for the PLCnext API