mirror of
https://github.com/sogou/workflow.git
synced 2026-10-29 03:27:04 +08:00
Add WFRepeaterTask
This commit is contained in:
+61
-1
@@ -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<class INPUT, class OUTPUT>
|
||||
@@ -721,6 +721,66 @@ protected:
|
||||
virtual ~WFGoTask() { }
|
||||
};
|
||||
|
||||
class WFRepeaterTask : public WFGenericTask
|
||||
{
|
||||
public:
|
||||
void set_create(std::function<SubTask *(WFRepeaterTask *)> create)
|
||||
{
|
||||
this->create = std::move(create);
|
||||
}
|
||||
|
||||
void set_callback(std::function<void (WFRepeaterTask *)> 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<SubTask *(WFRepeaterTask *)> create;
|
||||
std::function<void (WFRepeaterTask *)> callback;
|
||||
|
||||
public:
|
||||
WFRepeaterTask(std::function<SubTask *(WFRepeaterTask *)>&& create,
|
||||
std::function<void (WFRepeaterTask *)>&& cb) :
|
||||
create(std::move(create)),
|
||||
callback(std::move(cb))
|
||||
{
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual ~WFRepeaterTask() { }
|
||||
};
|
||||
|
||||
class WFModuleTask : public ParallelTask, protected SeriesWork
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -99,6 +99,9 @@ using WFEmptyTask = WFGenericTask;
|
||||
using WFDynamicTask = WFGenericTask;
|
||||
using dynamic_create_t = std::function<SubTask *(WFDynamicTask *)>;
|
||||
|
||||
using repeated_create_t = std::function<SubTask *(WFRepeaterTask *)>;
|
||||
using repeater_callback_t = std::function<void (WFRepeaterTask *)>;
|
||||
|
||||
using module_callback_t = std::function<void (const WFModuleTask *)>;
|
||||
|
||||
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)
|
||||
|
||||
@@ -143,8 +143,8 @@ protected:
|
||||
std::function<SubTask *(WFDynamicTask *)> create;
|
||||
|
||||
public:
|
||||
__WFDynamicTask(std::function<SubTask *(WFDynamicTask *)>&& func) :
|
||||
create(std::move(func))
|
||||
__WFDynamicTask(std::function<SubTask *(WFDynamicTask *)>&& create) :
|
||||
create(std::move(create))
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user