1#ifndef MSTL_CORE_ASYNC_PACKAGED_TASK_HPP__
2#define MSTL_CORE_ASYNC_PACKAGED_TASK_HPP__
29template <
typename Res,
typename... Args>
31 using StateType =
_INNER __future_base::task_state_base<Res(Args...)>;
51 template <
typename Func,
typename = enable_if_t<!is_same_v<packaged_task, remove_cvref_t<Func>>>>
62 if (
static_cast<bool>(state_ptr) && !state_ptr.unique()) {
63 state_ptr->break_promise(
_MSTL move(state_ptr->result_storage));
93 state_ptr.swap(other.state_ptr);
101 return static_cast<bool>(state_ptr);
120 void operator ()(Args... args) {
121 _INNER __future_base::state_base::check(state_ptr);
134 _INNER __future_base::state_base::check(state_ptr);
146 _INNER __future_base::state_base::check(state_ptr);
148 temp.state_ptr = state_ptr;
149 state_ptr = state_ptr->reset();
153#ifdef MSTL_SUPPORT_DEDUCTION_GUIDES__
154template <
typename Res,
typename... Args>
155packaged_task(Res(*)(Args...)) -> packaged_task<Res(Args...)>;
157template <
typename Func,
typename Sign =
typename
158 _INNER __function_guide_helper<
decltype(&Func::operator ())>::type>
159packaged_task(Func) -> packaged_task<Sign>;
173template <
typename BoundFunc,
typename Res>
174class __future_base::deferred_state final
175 :
public __future_base::state_base {
177 using PtrType = __future_base::Ptr<basic_result<Res>>;
179 PtrType result_storage;
182 void complete_async()
override {
183 state_base::set_result(create_task_setter(result_storage,
function),
true);
186 bool is_deferred_future()
const override {
191 template <
typename... Args>
192 explicit deferred_state(Args&&... args)
193 : result_storage(new basic_result<Res>()),
203class __future_base::async_state_common
204 :
public __future_base::state_base {
207 _MSTL once_flag once_flag;
209 ~async_state_common()
override =
default;
211 void complete_async()
override {
227template <
typename Func,
typename Res>
228class __future_base::async_state_impl final
229 :
public __future_base::async_state_common {
231 using PtrType = __future_base::Ptr<basic_result<Res>>;
233 PtrType result_storage;
238 state_base::set_result(__future_base::create_task_setter(result_storage, function));
240 if (
static_cast<bool>(result_storage)) {
241 state_base::break_promise(
_MSTL move(result_storage));
248 template <
typename... Args>
249 explicit async_state_impl(Args&&... args)
250 : result_storage(new basic_result<Res>()),
252 thread =
_MSTL thread{&async_state_impl::run,
this};
255 ~async_state_impl()
override {
256 if (thread.joinable()) {
packaged_task(Func &&function)
构造函数
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对象
MSTL_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
void call_once(once_flag &flag, Callable &&func, Args &&... args)
单次调用函数
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_INNER__
结束inner命名空间
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_BEGIN_INNER__
开始inner命名空间
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result)
移动范围元素
void swap()=delete
删除无参数的swap重载