From c14cf5a892f62a8700d1a6ccde102549bde1be8e Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 15 Feb 2019 21:32:07 +0100 Subject: Core/Misc: Added lambda support to EventProcessor Closes #22909 (cherry picked from commit 813f693768ee94864b0d24423b9265bde2c9903d) --- src/common/Utilities/EventProcessor.h | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'src/common/Utilities/EventProcessor.h') diff --git a/src/common/Utilities/EventProcessor.h b/src/common/Utilities/EventProcessor.h index 11ca046bd18..8da9c47a19f 100644 --- a/src/common/Utilities/EventProcessor.h +++ b/src/common/Utilities/EventProcessor.h @@ -20,8 +20,9 @@ #include "Define.h" #include "Duration.h" -#include #include "Random.h" +#include "advstd.h" +#include class EventProcessor; @@ -69,6 +70,26 @@ class TC_COMMON_API 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>>>; + class TC_COMMON_API EventProcessor { public: @@ -78,8 +99,14 @@ class TC_COMMON_API 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, uint64 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(urand(offset.count(), 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, uint64 newTime); uint64 CalculateTime(uint64 t_offset) const { return m_time + t_offset; } std::multimap const& GetEvents() const { return m_events; } -- cgit v1.2.3