crash fix

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

View file

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