Program Listing for File KPSubject.hpp¶
↰ Return to documentation for file (src/KPSubject.hpp)
// References:
// https://embeddedartistry.com/blog/2017/02/01/improving-your-callback-game/
// https://en.cppreference.com/w/cpp/language/parameter_pack
#pragma once
#include <KPFoundation.hpp>
#include <functional>
#include <unordered_map>
template <typename T>
class KPSubject {
protected:
using ObserverType = T;
std::unordered_map<int, ObserverType *> observers;
public:
int addObserver(ObserverType * o) {
auto token = rand();
while (!observers.insert({token, o}).second) {
token = rand();
}
return token;
}
auto addObserver(ObserverType & o) -> decltype(addObserver(&o)) {
return addObserver(&o);
}
void removeObserver(int token) {
observers.erase(token);
}
template <typename F, typename... Types>
void updateObservers(F method, Types &&... args) {
for (auto & k : observers) {
println("Updating ", k.second->ObserverName());
(k.second->*method)(std::forward<Types>(args)...);
}
}
};