24#include <unordered_map>
30template <
typename... Args>
54 m_disconnect = std::exchange(other.m_disconnect, {});
67 m_disconnect =
nullptr;
73 m_disconnect =
nullptr;
77 return static_cast<bool>(m_disconnect);
81 template <
typename... Args>
83 explicit Connection(std::function<
void()> disconnect) : m_disconnect(std::move(disconnect)) {}
85 std::function<void()> m_disconnect;
99template <
typename... Args>
103 using Slot = std::function<void(Args...)>;
123 const SlotId id = m_state->nextId++;
124 m_state->slots.emplace(
id, std::move(slot));
125 std::weak_ptr<State> weak = m_state;
127 if (
auto state = weak.lock()) {
128 state->slots.erase(id);
139 void Emit(Args... args)
const {
140 std::vector<Slot> snapshot;
141 snapshot.reserve(m_state->slots.size());
142 for (
const auto& entry : m_state->slots) {
143 snapshot.push_back(entry.second);
145 for (
auto& slot : snapshot) {
151 return m_state->slots.size();
156 std::unordered_map<SlotId, Slot> slots;
159 std::shared_ptr<State> m_state = std::make_shared<State>();