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...)>;
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 NEFORCE_NODISCARD
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 NEFORCE_NODISCARD
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;
199 ~async_state_common()
override =
default;
202 void complete_async()
override { join(); }
214template <
typename Func,
typename Res>
215class __future_base::async_state_impl final :
public __future_base::async_state_common {
217 using PtrType = __future_base::Ptr<basic_result<Res>>;
219 PtrType result_storage;
224 state_base::set_result(__future_base::create_task_setter(result_storage, function));
226 if (
static_cast<bool>(result_storage)) {
227 state_base::break_promise(_NEFORCE
move(result_storage));
234 template <
typename... Args>
235 explicit async_state_impl(Args&&... args) :
236 result_storage(new basic_result<Res>()),
237 function(_NEFORCE
forward<Args>(args)...) {
238 thread = _NEFORCE thread{&async_state_impl::run,
this};
241 ~async_state_impl()
override {
242 if (thread.joinable()) {
255NEFORCE_END_NAMESPACE__
packaged_task() noexcept=default
默认构造函数
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)
在线程退出时标记任务完成
void swap(packaged_task &other) noexcept
交换两个packaged_task对象
packaged_task & operator=(packaged_task &&other) noexcept
移动赋值运算符
void operator()(Args... args)
执行任务
constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
void call_once(once_flag &flag, Callable &&func, Args &&... args)
单次调用函数
typename remove_cvref< T >::type remove_cvref_t
remove_cvref的便捷别名
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
void swap()=delete
删除无参数的swap重载
constexpr bool is_same_v
is_same的便捷变量模板
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名