[*] Update async header

This commit is contained in:
Reece Wilson 2021-09-29 09:02:27 +01:00
parent 097f805209
commit 1360e5627d

View File

@ -70,6 +70,8 @@ namespace Aurora::Async
std::function<AuOptional<Result_t>(const Info_t &)> onFrame = 0; std::function<AuOptional<Result_t>(const Info_t &)> onFrame = 0;
}; };
using FVoidTask = FTask<AVoid, AVoid>;
template<class Info_t = AVoid, class Result_t = AVoid> template<class Info_t = AVoid, class Result_t = AVoid>
struct CTask struct CTask
{ {
@ -93,6 +95,7 @@ namespace Aurora::Async
virtual bool BlockUntilComplete() = 0; virtual bool BlockUntilComplete() = 0;
virtual bool HasFinished() = 0; virtual bool HasFinished() = 0;
virtual bool HasFailed() = 0; virtual bool HasFailed() = 0;
virtual void Cancel() = 0;
}; };
AUKN_SYM AuSPtr<IWorkItem> NewWorkItem(const DispatchTarget_t &worker, const AuSPtr<IWorkItemHandler> &task, bool supportsBlocking = false); AUKN_SYM AuSPtr<IWorkItem> NewWorkItem(const DispatchTarget_t &worker, const AuSPtr<IWorkItemHandler> &task, bool supportsBlocking = false);
@ -154,6 +157,11 @@ namespace Aurora::Async
caller = GetAsyncApp()->GetCurrentThread(); caller = GetAsyncApp()->GetCurrentThread();
} }
BasicWorkCallback(Task_t &&task) : task(std::move(task))
{
caller = GetAsyncApp()->GetCurrentThread();
}
Task_t task; Task_t task;
Job_t callback; Job_t callback;
@ -309,28 +317,38 @@ namespace Aurora::Async
} }
}; };
template<typename... Args> #define ASYNC_ERROR(exp) if constexpr (std::is_same_v<T, bool>) { SysPushErrorGen(exp); return {}; } else { throw std::exception(exp); }
static std::function<void(Args...)> TranslateAsyncFunctionToDispatcher(std::function<void(Args...)> func) #define ASYNC_FINISH if constexpr (std::is_same_v<T, bool>) { return true; }
template<typename T = void, typename... Args, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v<T, bool> || std::is_void<T>::value)>
static std::function<T(Args...)> TranslateAsyncFunctionToDispatcherWithThread(WorkerId_t id, std::function<void(Args...)> func)
{ {
auto cur = GetAsyncApp()->GetCurrentThread(); return [=](Args... in) -> T
return [=](Args... in) -> void
{ {
auto work = AuMakeShared<BasicWorkStdFunc>([=]() -> void { auto work = AuMakeShared<BasicWorkStdFunc>([=]() -> void {
func(in...); func(in...);
}); });
auto workItem = NewWorkItem(cur, work); if (!work) ASYNC_ERROR("can't dispatch async call; out of memory");
if (!workItem) throw "can't dispatch async call; out of memory"; auto workItem = NewWorkItem(id, work);
if (!workItem) ASYNC_ERROR("can't dispatch async call; out of memory");
workItem->Dispatch(); workItem->Dispatch();
ASYNC_FINISH;
}; };
} }
template<typename B, typename... Args> template<typename T = void, typename... Args, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v<T, bool> || std::is_void<T>::value)>
static std::function<void(std::function<void(const B&)>, Args...)> TranslateAsyncReturnableFunctionToDispatcher(std::function<B(Args...)> func) static std::function<T(Args...)> TranslateAsyncFunctionToDispatcher(std::function<void(Args...)> func)
{ {
auto cur = GetAsyncApp()->GetCurrentThread(); return TranslateAsyncFunctionToDispatcherWithThread<T, Args>(GetAsyncApp()->GetCurrentThread(), func);
return [=](std::function<void(const B&)> callback, Args... in) -> void }
template<typename B = void, typename T, typename... Args, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v<T, bool> || std::is_void<T>::value)>
static std::function<T(std::function<void(const B&)>, Args...)> TranslateAsyncReturnableFunctionToDispatcherWithThread(WorkerId_t id, std::function<AuOptional<B>(Args...)> func)
{
return [=](std::function<T(const B&)> callback, Args... in) -> T
{ {
auto work = AuMakeShared<BasicWorkCallback<AVoid, B>>(); auto work = AuMakeShared<BasicWorkCallback<AVoid, B>>();
if (!work) ASYNC_ERROR("can't dispatch async call; out of memory");
work.task.onProcess = [](const AVoid &) -> AuOptional<B> work.task.onProcess = [](const AVoid &) -> AuOptional<B>
{ {
return func(in...); return func(in...);
@ -339,12 +357,22 @@ namespace Aurora::Async
{ {
callback(ret); callback(ret);
}; };
auto workItem = NewWorkItem(cur, work); auto workItem = NewWorkItem(id, work);
if (!workItem) throw "can't dispatch async call; out of memory"; if (!workItem) ASYNC_ERROR("can't dispatch async call; out of memory");
workItem->Dispatch(); workItem->Dispatch();
ASYNC_FINISH;
}; };
} }
template<typename B = void, typename T, typename... Args, AU_TEMPLATE_ENABLE_WHEN(std::is_same_v<T, bool> || std::is_void<T>::value)>
static std::function<T(std::function<void(const B&)>, Args...)> TranslateAsyncReturnableFunctionToDispatcher(std::function<AuOptional<B>(Args...)> func)
{
return TranslateAsyncReturnableFunctionToDispatcherWithThread<B, T, Args>(GetAsyncApp()->GetCurrentThread(), func);
}
#undef ASYNC_ERROR
#undef ASYNC_FINISH
#endif #endif
class IAsyncApp class IAsyncApp