#pragma once #ifndef THREAD_H #define THREAD_H #include "defines.h" #include #include #include #include #include template class TaskRunning { public: explicit TaskRunning(std::future r) : run_(std::move(r)) {} bool IsComplete() { return run_.wait_for(0us) == std::future_status::ready; } auto Get() { return run_.get(); } private: std::future run_; }; class TaskBase { public: template static __forceinline TaskRunning::type> Run(Func&& f, Args&&... args) { using ReturnType = typename std::invoke_result::type; return TaskRunning( std::async(std::launch::async, std::forward(f), std::forward(args)...)); } }; template class Task { public: explicit Task(Func f) : func_(std::move(f)) {} template __forceinline TaskRunning::type> Start(Args&&... args) { using ReturnType = typename std::invoke_result::type; return TaskRunning( std::async(std::launch::async, func_, std::forward(args)...)); } private: Func func_; }; #endif