Refactor Event class to support any delegate type.

This commit is contained in:
2024-08-21 13:21:57 -04:00
parent c9df4cf7a7
commit e01acbed26
5 changed files with 65 additions and 44 deletions

View File

@@ -1,4 +1,4 @@
/// @file EventConnection.hpp
/// @file Connection.hpp
/// @description Callback handler for event connections
/// @author Josh O'Leary - Redacted Software
/// @revision 3
@@ -10,32 +10,32 @@
#include <functional>
#include <Event.h>
template <typename ... Args>
class Event;
template <typename delegate, typename ... Args>
class BasicEvent;
template <typename ... Args>
class EventConnection {
/// A type that represents a handle to an active event connection.
template <typename delegate, typename ... Args>
class Connection {
private:
using delegate = std::function<void(Args...)>;
public:
EventConnection(Event<Args...> *creator, delegate cb);
Connection(BasicEvent<delegate, Args...> *creator, delegate cb);
bool Disconnect(); // Breaks the event connection, but does not destroy the instance
void Invoke(Args... e);
private:
Event<Args...> * owner;
BasicEvent<delegate, Args...> * owner;
delegate callback;
bool active = true;
};
template<typename... Args>
EventConnection<Args...>::EventConnection(Event<Args...> *creator, EventConnection::delegate cb) : owner(creator), callback(std::move(cb)) {}
template<typename delegate, typename... Args>
Connection<delegate, Args...>::Connection(BasicEvent<delegate, Args...> *creator, delegate cb) : owner(creator), callback(std::move(cb)) {}
template <typename... Args>
void EventConnection<Args...>::Invoke(Args... e) { callback(e...); }
template <typename delegate, typename... Args>
void Connection<delegate, Args...>::Invoke(Args... e) { callback(e...); }
template <typename ... Args>
bool EventConnection<Args...>::Disconnect() {
template <typename delegate, typename ... Args>
bool Connection<delegate, Args...>::Disconnect() {
if (active) {
owner->Disconnect(this);
active = false;