void runDeferred(DeferredHandler f) { __EVENTEMITTER_LOCK_GUARD(mutex); auto it = deferredQueue.cbegin(); auto prevIt = deferredQueue.cbefore_begin(); for(; it != deferredQueue.cend(); prevIt = it, ++it); deferredQueue.emplace_after(prevIt, std::move(f)); }
inline int operator () (EArgs&&... args) // O(n) { if(slots.empty()) return default_return_value; auto it = slots.cbegin(), end = slots.cend(); auto prev = slots.cbefore_begin(); while(it != end) { try { (it->second)(std::forward<EArgs>(args)...); prev = it; ++it; } catch(slot_remove) { it = slots.erase_after(prev); } catch(signal_return e) { return e.get(); } } return default_return_value; }
inline bool disconnect(connection_type con) // O(n) { auto it = slots.cbegin(), end = slots.cend(); auto prev = slots.cbefore_begin(); while(it != end) { if(it == con) { slots.erase_after(prev); return true; } prev = it; ++it; } return false; }
inline connection_type connect(long priority, Slot&& f) // O(n) { auto prev = slots.cbefore_begin(), next = slots.cbegin(), end = slots.cend(); while(next != end) { // <= if(priority < next->first) { return slots.insert_after(prev, std::make_pair(priority, std::move(f))); } prev = next; ++next; } return slots.insert_after(prev, std::make_pair(priority, std::move(f))); }