15 class smart_event final {
17 using observer_type = std::function<void(event_parameter_types_param...)>;
18 using observer_weak_ptr_type = std::weak_ptr<observer_type>;
19 using observer_shared_ptr_type = std::shared_ptr<observer_type>;
22 [[nodiscard]] observer_shared_ptr_type
subscribe(observer_type aObserverFunctor) {
23 auto pObserver = std::make_shared<observer_type>(aObserverFunctor);
24 m_Observers.insert(pObserver);
29 void notify(
const event_parameter_types_param&... params)
const {
30 std::lock_guard<std::mutex> lock(m_ObserversMutex);
31 for (
auto iter = m_Observers.begin(); iter != m_Observers.end(); ) {
32 if (
auto observer = iter->lock()) {
33 (*observer)(params...);
37 iter = m_Observers.erase(iter);
46 struct observer_weak_ptr_hasher_method {
47 std::size_t operator()(
const std::weak_ptr<observer_type>& ptr)
const {
48 if (
auto sp = ptr.lock()) {
49 return std::hash<std::shared_ptr<observer_type>>{}(sp);
55 struct observer_weak_ptr_comparator_method {
56 bool operator()(
const std::weak_ptr<observer_type>& lhs,
const std::weak_ptr<observer_type>& rhs)
const {
57 return !lhs.owner_before(rhs) && !rhs.owner_before(lhs);
60 mutable std::unordered_set<observer_weak_ptr_type, observer_weak_ptr_hasher_method, observer_weak_ptr_comparator_method> m_Observers;
61 mutable std::mutex m_ObserversMutex;
void notify(const event_parameter_types_param &... params) const
notify observers & remove any null observers
Definition smart_event.h:29