67 if (_callbacks.find(name) == _callbacks.end()) {
68 _callbacks[name] = std::vector<EventHandle*>();
73 auto activeIt = _callbackActive.find(name);
74 if (activeIt != _callbackActive.end()) {
75 auto callbackIt = _callbacks.find(name);
76 if (callbackIt != _callbacks.end() && activeIt->second == callbackIt->second) {
77 _callbackActive[name] = std::vector<EventHandle*>(activeIt->second);
81 auto evt = std::make_unique<EventHandle>(
this, name, std::move(callback), scope,
once);
83 _eventHandles.push_back(std::move(evt));
85 _callbacks[name].push_back(evtRaw);
91 auto preserveActiveList = [
this](
const std::string& eventName) {
92 auto activeIt = _callbackActive.find(eventName);
93 if (activeIt == _callbackActive.end()) {
97 auto callbackIt = _callbacks.find(eventName);
98 if (callbackIt != _callbacks.end() && activeIt->second == callbackIt->second) {
99 _callbackActive[eventName] = std::vector<EventHandle*>(activeIt->second);
108 if (scope && evt->_scope != scope) {
116 return callbacksEquivalent(evt->_callback, callback);
120 for (
const auto& [eventName, callbacks] : _callbacks) {
122 preserveActiveList(eventName);
125 for (
auto& [_, callbacks] : _callbacks) {
126 callbacks.erase(std::remove_if(callbacks.begin(), callbacks.end(),
128 if (removePredicate(evt)) {
129 evt->setRemoved(true);
130 evt->_handler = nullptr;
131 evt->_callback = HandleEventCallback();
135 }), callbacks.end());
138 for (
auto it = _callbacks.begin(); it != _callbacks.end();) {
139 if (it->second.empty()) {
140 it = _callbacks.erase(it);
146 compactRemovedHandles();
151 preserveActiveList(name);
152 auto callbackIt = _callbacks.find(name);
153 if (callbackIt == _callbacks.end()) {
157 std::vector<EventHandle*>& callbacks = callbackIt->second;
158 callbacks.erase(std::remove_if(callbacks.begin(), callbacks.end(),
159 [&](EventHandle* evt) {
160 if (removePredicate(evt)) {
161 evt->setRemoved(true);
162 evt->_handler = nullptr;
163 evt->_callback = HandleEventCallback();
167 }), callbacks.end());
169 if (callbacks.empty()) {
170 _callbacks.erase(name);
173 compactRemovedHandles();
180 if (!handle || handle->_removed) {
184 const std::string& name = handle->_name;
186 handle->_handler =
nullptr;
189 auto activeIt = _callbackActive.find(name);
190 if (activeIt != _callbackActive.end()) {
191 auto callbackIt = _callbacks.find(name);
192 if (callbackIt != _callbacks.end() && activeIt->second == callbackIt->second) {
193 _callbackActive[name] = std::vector<EventHandle*>(activeIt->second);
197 auto callbacksIt = _callbacks.find(name);
198 if (callbacksIt == _callbacks.end()) {
202 std::vector<EventHandle*>& callbacks = callbacksIt->second;
203 callbacks.erase(std::remove(callbacks.begin(), callbacks.end(), handle), callbacks.end());
205 if (callbacks.empty()) {
206 _callbacks.erase(name);
209 compactRemovedHandles();