/// @file BasicEvent.hpp /// @description Templated BasicEvent Hook Class modeled after C# events /// @author Josh O'Leary - Redacted Software /// @revision 3 /// @lastedit 2024-06-01 /// @license Unlicense - Public Domain #pragma once #include #include #include // TODO: ThreadSafeEvent / AsyncEvent version of the class. // TODO: ConsumableEvent - a version that can be "consumed" by a callback by returning true. It will be sunk and not passed to further callbacks. /// template class Connection; /// BasicEvent is a templated class that can be used to raise events that can be listened in on /// at other points in a codebase without having to tightly couple the two pieces of code. /// @param delegate A type that can be invoked via operator() 'Call operator'. /// @param Args... The arguments that will be expected by this event and passed to it's delegate. template class BasicEvent { public: friend Connection; using connection = Connection; using event_ptr = std::shared_ptr; public: void Await(Args& ... arg); virtual void Invoke(Args... args); void operator()(Args... args); connection Connect(delegate callback); void Disconnect(connection &conn); connection operator+=(delegate callback); protected: std::vector listeners; //uint64_t listenerCounter = 0; }; template Connection BasicEvent::operator+=(delegate callback) { return Connect(callback); } template void BasicEvent::operator()(Args... args) { Invoke(args...);} template void BasicEvent::Invoke(Args... args) { for (event_ptr &connection_ptr: this->listeners) { connection_ptr->Invoke(args...); } } template Connection BasicEvent::Connect(delegate callback) { event_ptr retval(new connection(this, callback)); this->listeners.push_back(retval); return *retval; } template void BasicEvent::Disconnect(connection &conn) { listeners.erase(std::remove(listeners.begin(), listeners.end(), 99), listeners.end()); } template using Event = BasicEvent, Args...>;