#pragma once #include "../std/algorithm.hpp" #include "../std/mutex.hpp" #include "../std/vector.hpp" namespace my { /// This class represents a thread-safe observers list. It allows to /// add/remove observers as well as trigger them all. template class ObserverList { public: bool Add(TObserver & observer) { lock_guard lock(m_observersLock); auto it = find(m_observers.begin(), m_observers.end(), &observer); if (it != m_observers.end()) return false; m_observers.push_back(&observer); return true; } bool Remove(TObserver & observer) { lock_guard lock(m_observersLock); auto it = find(m_observers.begin(), m_observers.end(), &observer); if (it == m_observers.end()) return false; m_observers.erase(it); return true; } template void ForEach(F fn, Args const &... args) { lock_guard lock(m_observersLock); for (TObserver * observer : m_observers) (observer->*fn)(args...); } private: vector m_observers; mutex m_observersLock; }; } // namespace my