Skip to content

Commit b58c30e

Browse files
committed
feat(event): add update
1 parent be0cf39 commit b58c30e

2 files changed

Lines changed: 18 additions & 10 deletions

File tree

include/ereignis/event/event.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
#pragma once
22

33
#include <mutex>
4-
#include <memory>
4+
#include <atomic>
55

66
#include <map>
7+
#include <memory>
78
#include <functional>
89

910
#include <coco/promise/promise.hpp>
@@ -53,7 +54,7 @@ namespace ereignis
5354

5455
private:
5556
std::mutex m_mutex;
56-
std::size_t m_counter{0};
57+
std::atomic_size_t m_counter{0};
5758
std::map<std::size_t, std::shared_ptr<listener>> m_listeners;
5859

5960
private:
@@ -67,6 +68,9 @@ namespace ereignis
6768

6869
public:
6970
std::size_t add(listener);
71+
void update(std::size_t, listener);
72+
73+
public:
7074
void once(listener::callback);
7175

7276
public:

include/ereignis/event/event.inl

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -97,21 +97,25 @@ namespace ereignis
9797
}
9898

9999
template <auto Id, typename R, typename... Ts>
100-
std::size_t event<Id, R(Ts...)>::add(listener l)
100+
std::size_t event<Id, R(Ts...)>::add(listener value)
101101
{
102-
auto lock = std::lock_guard{m_mutex};
103-
auto id = m_counter++;
104-
105-
m_listeners.emplace(id, std::make_shared<listener>(std::move(l)));
102+
const auto id = m_counter++;
103+
update(id, std::move(value));
106104

107105
return id;
108106
}
109107

110108
template <auto Id, typename R, typename... Ts>
111-
void event<Id, R(Ts...)>::once(listener::callback cb)
109+
void event<Id, R(Ts...)>::update(std::size_t id, listener value)
112110
{
113111
auto lock = std::lock_guard{m_mutex};
114-
auto id = m_counter++;
112+
m_listeners.insert_or_assign(id, std::make_shared<listener>(std::move(value)));
113+
}
114+
115+
template <auto Id, typename R, typename... Ts>
116+
void event<Id, R(Ts...)>::once(listener::callback cb)
117+
{
118+
const auto id = m_counter++;
115119

116120
auto wrapper = [this, state = std::make_tuple(id, std::move(cb))]<typename... Us>(Us &&...args) mutable
117121
{
@@ -121,7 +125,7 @@ namespace ereignis
121125
return std::invoke(cb, std::forward<Us>(args)...);
122126
};
123127

124-
m_listeners.emplace(id, std::make_shared<listener>(std::move(wrapper)));
128+
update(id, std::move(wrapper));
125129
}
126130

127131
template <auto Id, typename R, typename... Ts>

0 commit comments

Comments
 (0)