From 67d5452c59a739bedb4fc326b56f452e1ef6c220 Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Sat, 20 Nov 2021 22:33:57 +0100 Subject: [PATCH] feat(Core/Misc): Added lambda support to EventProcessor. (#9263) --- src/common/Utilities/EventProcessor.h | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/common/Utilities/EventProcessor.h b/src/common/Utilities/EventProcessor.h index b63239b5a..ea96c153f 100644 --- a/src/common/Utilities/EventProcessor.h +++ b/src/common/Utilities/EventProcessor.h @@ -20,8 +20,11 @@ #include "Define.h" #include "Duration.h" +#include "Random.h" +#include "advstd.h" #include +#include class EventProcessor; @@ -69,6 +72,26 @@ class BasicEvent uint64 m_execTime; // planned time of next execution, filled by event handler }; +template +class LambdaBasicEvent : public BasicEvent +{ + public: + LambdaBasicEvent(T&& callback) : BasicEvent(), _callback(std::move(callback)) { } + + bool Execute(uint64, uint32) override + { + _callback(); + return true; + } + + private: + + T _callback; +}; + +template +using is_lambda_event = std::enable_if_t>>>; + typedef std::multimap EventList; class EventProcessor @@ -80,6 +103,14 @@ class EventProcessor void Update(uint32 p_time); void KillAllEvents(bool force); void AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime = true); + template + is_lambda_event AddEvent(T&& event, Milliseconds e_time, bool set_addtime = true) { AddEvent(new LambdaBasicEvent(std::move(event)), e_time, set_addtime); } + void AddEventAtOffset(BasicEvent* event, Milliseconds offset) { AddEvent(event, CalculateTime(offset.count())); } + void AddEventAtOffset(BasicEvent* event, Milliseconds offset, Milliseconds offset2) { AddEvent(event, CalculateTime(randtime(offset, offset2).count())); } + template + is_lambda_event AddEventAtOffset(T&& event, Milliseconds offset) { AddEventAtOffset(new LambdaBasicEvent(std::move(event)), offset); } + template + is_lambda_event AddEventAtOffset(T&& event, Milliseconds offset, Milliseconds offset2) { AddEventAtOffset(new LambdaBasicEvent(std::move(event)), offset, offset2); } void ModifyEventTime(BasicEvent* event, Milliseconds newTime); [[nodiscard]] uint64 CalculateTime(uint64 t_offset) const;