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