2023-07-21 22:07:23 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <array>
|
|
|
|
#include <vector>
|
2023-07-25 16:21:53 +02:00
|
|
|
#include <cstdint>
|
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) {
|
|
|
|
_subscribers.at(size_t(event_type)).push_back(object);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
template<typename T>
|
|
|
|
bool dispatch(enumType event_type, const T& event) {
|
|
|
|
for (auto* zei : _subscribers.at(size_t(event_type))) {
|
|
|
|
if (zei->onEvent(event)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
std::array<
|
|
|
|
std::vector<EventI*>,
|
|
|
|
size_t(enumType::MAX)
|
|
|
|
> _subscribers;
|
|
|
|
};
|
|
|
|
|