crash fix

This commit is contained in:
Jorijn van der Graaf 2025-11-26 01:38:30 +01:00
commit c0400d31c3

View file

@ -70,19 +70,23 @@ namespace Crafter {
EventBase(EventBase&& other) : listeners(std::move(other.listeners)) {
for (const auto& listenerSlice : listeners) {
for (const auto& listener : listenerSlice.second) {
if(listener) {
listener->eventToListenTo = this;
}
}
}
}
EventBase(EventBase&) = delete;
EventBase& operator=(EventBase&) = delete;
virtual ~EventBase() {
for (const auto& listenerSlice : listeners) {
for (const auto& listener : listenerSlice.second) {
if(listener) {
listener->eventToListenTo = nullptr;
}
}
}
}
void AddListener(EventListener<T>* listener, int priority = 0) {
if (listeners.contains(priority)) {
@ -94,12 +98,8 @@ namespace Crafter {
}
void RemoveListener(EventListener<T>* listener) {
listeners[listener->priority].erase(
std::remove(listeners[listener->priority].begin(),
listeners[listener->priority].end(),
listener),
listeners[listener->priority].end()
);
auto pos = listeners.find(listener->priority);
std::replace(pos->second.begin(), pos->second.end(), listener, static_cast<EventListener<T>*>(nullptr));
}
#ifdef CRAFTER_TIMING
@ -159,8 +159,8 @@ namespace Crafter {
// Clear previous timing data
this->listenerTimes.clear();
auto listenersCopy = this->listeners;
for (const auto& listenerSlice : listenersCopy) {
this->listeners.erase(std::remove(this->listeners.begin(), this->listeners.end(), nullptr), this->listeners.end());
for (const auto& listenerSlice : this->listeners) {
for (const auto& listener : listenerSlice.second) {
auto start = std::chrono::high_resolution_clock::now();
listener->function();
@ -191,8 +191,8 @@ namespace Crafter {
// Clear previous timing data
this->listenerTimes.clear();
auto listenersCopy = this->listeners;
for (const auto& listenerSlice : listenersCopy) {
this->listeners.erase(std::remove(this->listeners.begin(), this->listeners.end(), nullptr), this->listeners.end());
for (const auto& listenerSlice : this->listeners) {
for (const auto& listener : listenerSlice.second) {
auto start = std::chrono::high_resolution_clock::now();
listener->function(data);