solanaceae_util/solanaceae/util/event_provider.hpp

36 lines
715 B
C++
Raw Normal View History

2023-07-21 22:07:23 +02:00
#pragma once
#include <array>
#include <vector>
2023-07-25 16:21:53 +02:00
#include <cstddef>
2023-07-21 22:07:23 +02:00
template<typename EventI>
struct EventProviderI {
using enumType = typename EventI::enumType;
virtual ~EventProviderI(void) {};
// TODO: unsub
virtual void subscribe(EventI* object, const enumType event_type) {
2023-07-25 16:21:53 +02:00
_subscribers.at(static_cast<size_t>(event_type)).push_back(object);
2023-07-21 22:07:23 +02:00
}
protected:
template<typename T>
bool dispatch(enumType event_type, const T& event) {
2023-07-25 16:21:53 +02:00
for (auto* zei : _subscribers.at(static_cast<size_t>(event_type))) {
2023-07-21 22:07:23 +02:00
if (zei->onEvent(event)) {
return true;
}
}
return false;
}
protected:
std::array<
std::vector<EventI*>,
2023-07-25 16:21:53 +02:00
static_cast<size_t>(enumType::MAX)
2023-07-21 22:07:23 +02:00
> _subscribers;
};