diff options
Diffstat (limited to 'src/common/Utilities')
| -rw-r--r-- | src/common/Utilities/EventProcessor.h | 29 | 
1 files changed, 28 insertions, 1 deletions
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 <map>  #include "Random.h" +#include "advstd.h" +#include <map>  class EventProcessor; @@ -69,6 +70,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<!advstd::is_base_of_v<BasicEvent, std::remove_pointer_t<advstd::remove_cvref_t<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<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; }          std::multimap<uint64, BasicEvent*> const& GetEvents() const { return m_events; }  | 
