From c694169c84eda530d601f7f58631ebf2b65ed18d Mon Sep 17 00:00:00 2001 From: XieHan Date: Tue, 2 Aug 2022 21:02:55 +0800 Subject: [PATCH] Add WFRepeaterTask --- src/factory/WFTask.h | 62 ++++++++++++++++++++++++++++++++++- src/factory/WFTaskFactory.h | 9 +++++ src/factory/WFTaskFactory.inl | 4 +-- 3 files changed, 72 insertions(+), 3 deletions(-) diff --git a/src/factory/WFTask.h b/src/factory/WFTask.h index 6df92a74..a9e958c2 100644 --- a/src/factory/WFTask.h +++ b/src/factory/WFTask.h @@ -45,7 +45,7 @@ enum WFT_STATE_SSL_ERROR = 65, WFT_STATE_DNS_ERROR = 66, /* for client task only */ WFT_STATE_TASK_ERROR = 67, - WFT_STATE_ABORTED = CS_STATE_STOPPED /* main process terminated */ + WFT_STATE_ABORTED = CS_STATE_STOPPED }; template @@ -721,6 +721,66 @@ protected: virtual ~WFGoTask() { } }; +class WFRepeaterTask : public WFGenericTask +{ +public: + void set_create(std::function create) + { + this->create = std::move(create); + } + + void set_callback(std::function callback) + { + this->callback = std::move(callback); + } + +protected: + virtual void dispatch() + { + SubTask *task = this->create(this); + + if (task) + { + series_of(this)->push_front(this); + series_of(this)->push_front(task); + } + else + this->state = WFT_STATE_SUCCESS; + + this->subtask_done(); + } + + virtual SubTask *done() + { + SeriesWork *series = series_of(this); + + if (this->state != WFT_STATE_UNDEFINED) + { + if (this->callback) + this->callback(this); + + delete this; + } + + return series->pop(); + } + +protected: + std::function create; + std::function callback; + +public: + WFRepeaterTask(std::function&& create, + std::function&& cb) : + create(std::move(create)), + callback(std::move(cb)) + { + } + +protected: + virtual ~WFRepeaterTask() { } +}; + class WFModuleTask : public ParallelTask, protected SeriesWork { public: diff --git a/src/factory/WFTaskFactory.h b/src/factory/WFTaskFactory.h index d8444ccc..17fb00b2 100644 --- a/src/factory/WFTaskFactory.h +++ b/src/factory/WFTaskFactory.h @@ -99,6 +99,9 @@ using WFEmptyTask = WFGenericTask; using WFDynamicTask = WFGenericTask; using dynamic_create_t = std::function; +using repeated_create_t = std::function; +using repeater_callback_t = std::function; + using module_callback_t = std::function; class WFTaskFactory @@ -289,6 +292,12 @@ public: static WFDynamicTask *create_dynamic_task(dynamic_create_t create); + static WFRepeaterTask *create_repeater_task(repeated_create_t create, + repeater_callback_t callback) + { + return new WFRepeaterTask(std::move(create), std::move(callback)); + } + public: static WFModuleTask *create_module_task(SubTask *first, module_callback_t callback) diff --git a/src/factory/WFTaskFactory.inl b/src/factory/WFTaskFactory.inl index c98be57f..09b94bed 100644 --- a/src/factory/WFTaskFactory.inl +++ b/src/factory/WFTaskFactory.inl @@ -143,8 +143,8 @@ protected: std::function create; public: - __WFDynamicTask(std::function&& func) : - create(std::move(func)) + __WFDynamicTask(std::function&& create) : + create(std::move(create)) { } };