NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
packaged_task.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ASYNC_PACKAGED_TASK_HPP__
2#define NEFORCE_CORE_ASYNC_PACKAGED_TASK_HPP__
3
11
14NEFORCE_BEGIN_NAMESPACE__
15
21
27
35template <typename Res, typename... Args>
36class packaged_task<Res(Args...)> {
37 using StateType = inner::__future_base::task_state_base<Res(Args...)>;
38
39 shared_ptr<StateType> state_ptr;
40
41public:
47 packaged_task() noexcept = default;
48
57 template <typename Func, typename = enable_if_t<!is_same_v<packaged_task, remove_cvref_t<Func>>>>
58 explicit packaged_task(Func&& function) :
59 state_ptr(inner::create_task_state<Res(Args...)>(_NEFORCE forward<Func>(function))) {}
60
67 if (static_cast<bool>(state_ptr) && !state_ptr.unique()) {
68 state_ptr->break_promise(_NEFORCE move(state_ptr->result_storage));
69 }
70 }
71
72 packaged_task(const packaged_task&) = delete;
74
79 packaged_task(packaged_task&& other) noexcept { this->swap(other); }
80
87 packaged_task(_NEFORCE move(other)).swap(*this);
88 return *this;
89 }
90
95 void swap(packaged_task& other) noexcept { state_ptr.swap(other.state_ptr); }
96
101 NEFORCE_NODISCARD bool valid() const noexcept { return static_cast<bool>(state_ptr); }
102
108 future<Res> get_future() { return future<Res>(state_ptr); }
109
117 void operator()(Args... args) {
118 inner::__future_base::state_base::check(state_ptr);
119 state_ptr->run(_NEFORCE forward<Args>(args)...);
120 }
121
130 void make_ready_at_thread_exit(Args... args) {
131 inner::__future_base::state_base::check(state_ptr);
132 state_ptr->run_delayed(_NEFORCE forward<Args>(args)..., state_ptr);
133 }
134
142 void reset() {
143 inner::__future_base::state_base::check(state_ptr);
144 packaged_task temp;
145 temp.state_ptr = state_ptr;
146 state_ptr = state_ptr->reset();
147 }
148};
149
150#ifdef NEFORCE_STANDARD_17
151template <typename Res, typename... Args>
152packaged_task(Res (*)(Args...)) -> packaged_task<Res(Args...)>;
153
154template <typename Func, typename Sign = typename inner::__function_guide_helper<decltype(&Func::operator())>::type>
155packaged_task(Func) -> packaged_task<Sign>;
156#endif
157
158
160NEFORCE_BEGIN_INNER__
161
169template <typename BoundFunc, typename Res>
170class __future_base::deferred_state final : public __future_base::state_base {
171private:
172 using PtrType = __future_base::Ptr<basic_result<Res>>;
173
174 PtrType result_storage;
175 BoundFunc function;
176
177 void complete_async() override { state_base::set_result(create_task_setter(result_storage, function), true); }
178
179 NEFORCE_NODISCARD bool is_deferred_future() const override { return true; }
180
181public:
182 template <typename... Args>
183 explicit deferred_state(Args&&... args) :
184 result_storage(new basic_result<Res>()),
185 function(_NEFORCE forward<Args>(args)...) {}
186};
187
193class __future_base::async_state_common : public __future_base::state_base {
194protected:
195 _NEFORCE thread thread;
196 once_flag flag;
197
198public:
199 ~async_state_common() override = default;
200
201protected:
202 void complete_async() override { join(); }
203
204 void join() { _NEFORCE call_once(flag, &_NEFORCE thread::join, &thread); }
205};
206
214template <typename Func, typename Res>
215class __future_base::async_state_impl final : public __future_base::async_state_common {
216private:
217 using PtrType = __future_base::Ptr<basic_result<Res>>;
218
219 PtrType result_storage;
220 Func function;
221
222 void run() {
223 try {
224 state_base::set_result(__future_base::create_task_setter(result_storage, function));
225 } catch (...) {
226 if (static_cast<bool>(result_storage)) {
227 state_base::break_promise(_NEFORCE move(result_storage));
228 }
229 throw;
230 }
231 }
232
233public:
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};
239 }
240
241 ~async_state_impl() override {
242 if (thread.joinable()) {
243 thread.join();
244 }
245 }
246};
247
248NEFORCE_END_INNER__
250 // Async
252 // AsyncComponents
254
255NEFORCE_END_NAMESPACE__
256#endif // NEFORCE_CORE_ASYNC_PACKAGED_TASK_HPP__
函数包装器主模板声明
独占future类模板
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)
执行任务
共享智能指针类模板
void join()
等待线程结束
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的便捷别名
异步结果生产者
线程管理类