19 #ifndef MIR_BASIC_OBSERVERS_H_
20 #define MIR_BASIC_OBSERVERS_H_
29 template<
class Observer>
33 void add(std::shared_ptr<Observer>
const& observer);
34 void remove(std::shared_ptr<Observer>
const& observer);
35 void for_each(std::function<
void(std::shared_ptr<Observer>
const& observer)>
const& f);
42 std::shared_ptr<Observer> observer;
43 std::atomic<ListItem*> next{
nullptr};
45 ~ListItem() {
delete next.load(); }
49 template<
class Observer>
51 std::function<
void(std::shared_ptr<Observer>
const& observer)>
const& f)
53 ListItem* current_item = &head;
60 if (
auto const copy_of_observer = current_item->observer) f(copy_of_observer);
62 current_item = current_item->next;
66 template<
class Observer>
69 ListItem* current_item = &head;
77 if (current_item->observer)
continue;
82 if (!current_item->observer)
84 current_item->observer = observer;
88 while (current_item->next && (current_item = current_item->next));
91 auto new_item =
new ListItem;
92 new_item->observer = observer;
94 for (ListItem* expected{
nullptr};
95 !current_item->next.compare_exchange_weak(expected, new_item);
98 if (expected) current_item = expected;
102 template<
class Observer>
105 ListItem* current_item = &head;
111 if (current_item->observer != observer)
continue;
116 if (current_item->observer == observer)
118 current_item->observer.reset();
122 while ((current_item = current_item->next));
All things Mir.
Definition: aging_buffer.h:24
Definition: recursive_read_write_mutex.h:56
a recursive read-write mutex.
Definition: recursive_read_write_mutex.h:31
void for_each(std::function< void(std::shared_ptr< Observer > const &observer)> const &f)
Definition: basic_observers.h:50
Definition: basic_observers.h:30
void remove(std::shared_ptr< Observer > const &observer)
Definition: basic_observers.h:103
Definition: recursive_read_write_mutex.h:66
void add(std::shared_ptr< Observer > const &observer)
Definition: basic_observers.h:67