aboutsummaryrefslogtreecommitdiff
path: root/src/common/Utilities/EventProcessor.h
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2019-02-15 21:32:07 +0100
committerShauren <shauren.trinity@gmail.com>2019-02-15 21:34:56 +0100
commit813f693768ee94864b0d24423b9265bde2c9903d (patch)
tree93ca90a7074de19dee5cb61b8b7f9f0f111f942a /src/common/Utilities/EventProcessor.h
parent5b7ead65bb116195f4336934bcff830e1b2af5bb (diff)
Core/Misc: Added lambda support to EventProcessor
Closes #22909
Diffstat (limited to 'src/common/Utilities/EventProcessor.h')
-rw-r--r--src/common/Utilities/EventProcessor.h29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/common/Utilities/EventProcessor.h b/src/common/Utilities/EventProcessor.h
index 83ab7acbf38..b79a851d54d 100644
--- a/src/common/Utilities/EventProcessor.h
+++ b/src/common/Utilities/EventProcessor.h
@@ -21,8 +21,9 @@
#include "Define.h"
#include "Duration.h"
-#include <map>
#include "Random.h"
+#include "advstd.h"
+#include <map>
class EventProcessor;
@@ -70,6 +71,26 @@ class TC_COMMON_API BasicEvent
uint64 m_execTime; // planned time of next execution, filled by event handler
};
+template<typename T>
+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<typename T>
+using is_lambda_event = std::enable_if_t<!std::is_base_of_v<BasicEvent, std::remove_pointer_t<T>>>;
+
class TC_COMMON_API EventProcessor
{
public:
@@ -79,8 +100,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<typename T>
+ is_lambda_event<T> AddEvent(T&& event, uint64 e_time, bool set_addtime = true) { AddEvent(new LambdaBasicEvent<T>(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<typename T>
+ is_lambda_event<T> AddEventAtOffset(T&& event, Milliseconds offset) { AddEventAtOffset(new LambdaBasicEvent<T>(std::move(event)), offset); }
+ template<typename T>
+ is_lambda_event<T> AddEventAtOffset(T&& event, Milliseconds offset, Milliseconds offset2) { AddEventAtOffset(new LambdaBasicEvent<T>(std::move(event)), offset, offset2); }
void ModifyEventTime(BasicEvent* event, uint64 newTime);
uint64 CalculateTime(uint64 t_offset) const { return m_time + t_offset; }