1#ifndef NEFORCE_CORE_ASYNC_PACKAGED_TASK_HPP__
2#define NEFORCE_CORE_ASYNC_PACKAGED_TASK_HPP__
14NEFORCE_BEGIN_NAMESPACE__
35template <
typename Res,
typename... Args>
37 using StateType = inner::__future_base::task_state_base<Res(Args...)>;
57 template <
typename Func,
typename = enable_if_t<!is_same_v<packaged_task, remove_cvref_t<Func>>>>
59 state_ptr(inner::create_task_state<Res(Args...)>(_NEFORCE
forward<Func>(
function))) {}
67 if (
static_cast<bool>(state_ptr) && !state_ptr.unique()) {
68 state_ptr->break_promise(_NEFORCE
move(state_ptr->result_storage));
101 bool valid() const noexcept {
return static_cast<bool>(state_ptr); }
118 inner::__future_base::state_base::check(state_ptr);
131 inner::__future_base::state_base::check(state_ptr);
132 state_ptr->run_delayed(_NEFORCE
forward<Args>(args)..., state_ptr);
143 inner::__future_base::state_base::check(state_ptr);
145 temp.state_ptr = state_ptr;
146 state_ptr = state_ptr->reset();
150#ifdef NEFORCE_STANDARD_17
151template <
typename Res,
typename... Args>
152packaged_task(Res (*)(Args...)) -> packaged_task<Res(Args...)>;
154template <
typename Func,
typename Sign =
typename inner::__function_gu
ide_helper<decltype(&Func::operator())>::type>
155packaged_task(Func) -> packaged_task<Sign>;
169template <
typename BoundFunc,
typename Res>
170class __future_base::deferred_state final :
public __future_base::state_base {
172 using PtrType = __future_base::Ptr<basic_result<Res>>;
174 PtrType result_storage;
177 void complete_async()
override { state_base::set_result(create_task_setter(result_storage, function),
true); }
179 bool is_deferred_future()
const override {
return true; }
182 template <
typename... Args>
183 explicit deferred_state(Args&&... args) :
184 result_storage(new basic_result<Res>()),
185 function(_NEFORCE
forward<Args>(args)...) {}
193class __future_base::async_state_common :
public __future_base::state_base {
195 _NEFORCE thread thread;
196 _NEFORCE once_flag once_flag;
198 ~async_state_common()
override =
default;
200 void complete_async()
override { join(); }
212template <
typename Func,
typename Res>
213class __future_base::async_state_impl final :
public __future_base::async_state_common {
215 using PtrType = __future_base::Ptr<basic_result<Res>>;
217 PtrType result_storage;
222 state_base::set_result(__future_base::create_task_setter(result_storage, function));
224 if (
static_cast<bool>(result_storage)) {
225 state_base::break_promise(_NEFORCE
move(result_storage));
232 template <
typename... Args>
233 explicit async_state_impl(Args&&... args) :
234 result_storage(new basic_result<Res>()),
235 function(_NEFORCE
forward<Args>(args)...) {
236 thread = _NEFORCE thread{&async_state_impl::run,
this};
239 ~async_state_impl()
override {
240 if (thread.joinable()) {
253NEFORCE_END_NAMESPACE__
packaged_task(Func &&function)
构造函数
packaged_task & operator=(const packaged_task &)=delete
禁止拷贝赋值
packaged_task(const packaged_task &)=delete
禁止拷贝构造
future< Res > get_future()
获取关联的future对象
packaged_task(packaged_task &&other) noexcept
移动构造函数
bool valid() const noexcept
检查任务是否有效
void make_ready_at_thread_exit(Args... args)
在线程退出时标记任务完成
packaged_task() noexcept
默认构造函数
void swap(packaged_task &other) noexcept
交换两个packaged_task对象
packaged_task & operator=(packaged_task &&other) noexcept
移动赋值运算符
void operator()(Args... args)
执行任务
NEFORCE_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
void call_once(once_flag &flag, Callable &&func, Args &&... args)
单次调用函数
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
void swap()=delete
删除无参数的swap重载