1#ifndef ALGORITHMS_SUBSCRIBER_H
2#define ALGORITHMS_SUBSCRIBER_H
5#include <unordered_set>
40class SubscriberService;
49 friend class SubscriberService<T>;
50 std::unordered_set<const SubscriberService<T> *> services;
51 virtual void notify_service_destroyed(
const T *) = 0;
53 virtual ~Subscriber() {
58 std::unordered_set<const SubscriberService<T> *> services_copy(services);
59 for (
const SubscriberService<T> *service : services_copy) {
60 service->unsubscribe(
this);
66class SubscriberService {
76 mutable std::unordered_set<Subscriber<T> *> subscribers;
78 virtual ~SubscriberService() {
83 std::unordered_set<Subscriber<T> *> subscribers_copy(subscribers);
84 for (Subscriber<T> *subscriber : subscribers_copy) {
85 subscriber->notify_service_destroyed(
static_cast<T *
>(
this));
86 unsubscribe(subscriber);
90 void subscribe(Subscriber<T> *subscriber)
const {
91 assert(subscribers.find(subscriber) == subscribers.end());
92 subscribers.insert(subscriber);
93 assert(subscriber->services.find(
this) == subscriber->services.end());
94 subscriber->services.insert(
this);
97 void unsubscribe(Subscriber<T> *subscriber)
const {
98 assert(subscribers.find(subscriber) != subscribers.end());
99 subscribers.erase(subscriber);
100 assert(subscriber->services.find(
this) != subscriber->services.end());
101 subscriber->services.erase(
this);