/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: WorkBasic.hpp Date: 2021-11-1 Author: Reece ***/ #pragma once namespace Aurora::Async { /// --- THREAD POOL -- template, typename Job_t = FJob, class a = const Job_t &, class b = Task_t &, class WorkerPId_tt = WorkerPId_t, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v)> static AuSPtr NewWork(const WorkerPId_tt &worker, a task, b job, bool enableWait = false) { return worker.pool->NewWorkItem(worker, AuMakeShared>(task, job), enableWait); } template, typename Job_t = FJob, class a = const Job_t &, class b = Task_t &, class WorkerPId_tt = WorkerPId_t, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v)> static AuSPtr DispatchWork(const WorkerPId_tt &worker, a task, b job, bool enableWait = false) { return NewWork(worker, task, job, enableWait)->Dispatch(); } template, typename Job_t = FJob, class a, class b = Job_t, class c, class WorkerPId_tt = WorkerPId_t, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v)> static AuSPtr NewWork(const WorkerPId_tt &worker, a task, b job, c info, bool enableWait = false) { return worker.pool->NewWorkItem(worker, AuMakeShared>(task, job, info), enableWait); } template, typename Job_t = FJob, class a, class b = Job_t, class c, class WorkerPId_tt = WorkerPId_t, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v)> static AuSPtr DispatchWork(const WorkerPId_tt &worker, a task, b job, c info, bool enableWait = false) { return NewWork(worker, task, job, info, enableWait)->Dispatch(); } template, typename Job_t = FJob, typename ClazzImpl, class a = const Job_t &, class b = const Info_t &, class WorkerPId_tt = WorkerPId_t, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v)> AuSPtr DispatchFunctional(const WorkerPId_tt &worker, ClazzImpl task, a job, b inputParameters, bool enableWait = false) { return NewWork(worker, TaskFromConsumerRefT(task), job, inputParameters, enableWait); } template, typename Job_t = FJob, typename ClazzImpl, class a = const Job_t &, class b = const Info_t &, class WorkerPId_tt = WorkerPId_t, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v)> AuSPtr DispatchFunctor(const WorkerPId_tt &worker, ClazzImpl task, a job, b inputParameters, bool enableWait = false) { return NewWork(worker, TaskFromConsumerRefT(task), job, inputParameters, enableWait); } template, typename Job_t = FJob, typename ClazzImpl, class a = const Job_t &, class b = const Info_t &, class WorkerPId_tt = WorkerPId_t, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v)> AuSPtr DispatchVoid(const WorkerPId_tt &worker, ClazzImpl task, a job, b inputParameters, bool enableWait = false) { return NewWork(worker, TaskFromVoidVoid(task), job, inputParameters, enableWait); } /// --- ASYNC APP -- template, typename Job_t = FJob, class a = const Job_t &, class b = Task_t &, class WorkerId_tt = WorkerId_t, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v)> static AuSPtr NewWork(const WorkerId_tt &worker, a task, b job, bool enableWait = false) { return NewWorkItem(worker, AuMakeShared>(task, job), enableWait); } template, typename Job_t = FJob, class a = const Job_t &, class b = Task_t &, class WorkerId_tt = WorkerId_t, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v)> static AuSPtr DispatchWork(const WorkerId_tt &worker, a task, b job, bool enableWait = false) { return NewWork(worker, task, job, enableWait)->Dispatch(); } template, typename Job_t = FJob, class a, class b = Job_t, class c, class WorkerId_tt = WorkerId_t, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v)> static AuSPtr NewWork(const WorkerId_tt &worker, a task, b job, c info, bool enableWait = false) { return NewWorkItem(worker, AuMakeShared>(task, job, info), enableWait); } template, typename Job_t = FJob, class a, class b = Job_t, class c, class WorkerId_tt = WorkerId_t, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v)> static AuSPtr DispatchWork(const WorkerId_tt &worker, a task, b job, c info, bool enableWait = false) { return NewWork(worker, task, job, info, enableWait)->Dispatch(); } template, typename Job_t = FJob, typename ClazzImpl, class a = const Job_t &, class b = const Info_t &, class WorkerId_tt = WorkerId_t, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v)> AuSPtr DispatchFunctional(const WorkerId_tt &worker, ClazzImpl task, a job, b inputParameters, bool enableWait = false) { return NewWork(worker, TaskFromConsumerRefT(task), job, inputParameters, enableWait); } template, typename Job_t = FJob, typename ClazzImpl, class a = const Job_t &, class b = const Info_t &, class WorkerId_tt = WorkerId_t, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v)> AuSPtr DispatchFunctor(const WorkerId_tt &worker, ClazzImpl task, a job, b inputParameters, bool enableWait = false) { return NewWork(worker, TaskFromConsumerRefT(task), job, inputParameters, enableWait); } template, typename Job_t = FJob, typename ClazzImpl, class a = const Job_t &, class b = const Info_t &, class WorkerId_tt = WorkerId_t, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v)> AuSPtr DispatchVoid(const WorkerId_t &worker, ClazzImpl task, a job, b inputParameters, bool enableWait = false) { return NewWork(worker, TaskFromVoidVoid(task), job, inputParameters, enableWait); } template static AuSPtr DispathSmartWork(const WorkerId_t &worker, AuSPtr owner, FunctorTask_t task, FuckYou_t job, Args ... in) { return DispatchWork, Args...>, ReturnValue_t>(worker, TaskFromTupleCallableWithBindOwner2, Args...>, ReturnValue_t>, ReturnValue_t, FunctorTask_t>(task), Async::JobFromTupleClazz, Args...>(job), std::make_tuple, Args...>(AU_FWD(owner), std::forward(in)...), false); } template static AuSPtr DispathSmartWorkEx(const WorkerId_t &worker, AuSPtr owner, FunctorTask_t task, FuckYou_t success, FuckYou2_t failure, Args ... in) { return DispatchWork, Args...>, ReturnValue_t>(worker, TaskFromTupleCallableWithBindOwner2, Args...>, ReturnValue_t>, ReturnValue_t, FunctorTask_t>(task), Async::JobFromTupleClazzEx, Args...>(success, failure), std::make_tuple, Args...>(AU_FWD(owner), std::forward(in)...), false); } }