NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
promise.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ASYNC_PROMISE_HPP__
2#define NEFORCE_CORE_ASYNC_PROMISE_HPP__
3
10
12NEFORCE_BEGIN_NAMESPACE__
13
19
25
36template <typename Res>
37class promise {
38 static_assert(!is_array_v<Res>, "result type must not be an array");
39 static_assert(!is_function_v<Res>, "result type must not be a function");
40 static_assert(is_destructible_v<Res>, "result type must be destructible");
41
42public:
43 using state_type = inner::__future_base::state_base;
44 using result_type = inner::__future_base::basic_result<Res>;
45 using ptr_type = inner::__future_base::Ptr<result_type>;
46
47private:
48 shared_ptr<state_type> future_ptr;
49 ptr_type storage;
50
51 template <typename T, typename U>
52 friend struct inner::__future_base::state_base::setter;
53
59 NEFORCE_NODISCARD state_type& state() const {
60 inner::__future_base::state_base::check(future_ptr);
61 return *future_ptr;
62 }
63
64public:
71 future_ptr(_NEFORCE make_shared<state_type>()),
72 storage(new result_type()) {}
73
78 promise(promise&& other) noexcept :
79 future_ptr(_NEFORCE move(other.future_ptr)),
80 storage(_NEFORCE move(other.storage)) {}
81
87 promise& operator=(promise&& other) noexcept {
88 promise(_NEFORCE move(other)).swap(*this);
89 return *this;
90 }
91
92 promise(const promise&) = delete;
93 promise& operator=(const promise&) = delete;
94
101 if (static_cast<bool>(future_ptr) && !future_ptr.unique()) {
102 future_ptr->break_promise(_NEFORCE move(storage));
103 }
104 }
105
110 void swap(promise& other) noexcept {
111 future_ptr.swap(other.future_ptr);
112 storage.swap(other.storage);
113 }
114
120 future<Res> get_future() { return future<Res>(future_ptr); }
121
127 void set_value(Res&& value) { state().set_result(state_type::create_setter(this, _NEFORCE forward<Res>(value))); }
128
134 void set_exception(exception_ptr exception) { state().set_result(state_type::create_setter(exception, this)); }
135
142 void set_value_at_thread_exit(Res&& value) {
143 state().set_delayed_result(state_type::create_setter(this, _NEFORCE forward<Res>(value)), future_ptr);
144 }
145
152 state().set_delayed_result(state_type::create_setter(exception, this), future_ptr);
153 }
154};
155
160template <typename Res>
161class promise<Res&> {
162public:
163 using state_type = inner::__future_base::state_base;
164 using result_type = inner::__future_base::basic_result<Res&>;
165 using ptr_type = inner::__future_base::Ptr<result_type>;
166
167private:
168 shared_ptr<state_type> future_ptr;
169 ptr_type storage;
170
171 template <typename T, typename U>
172 friend struct inner::__future_base::state_base::setter;
173
174 NEFORCE_NODISCARD state_type& state() const {
175 inner::__future_base::state_base::check(future_ptr);
176 return *future_ptr;
177 }
178
179public:
184 future_ptr(_NEFORCE make_shared<state_type>()),
185 storage(new result_type()) {}
186
190 promise(promise&& other) noexcept :
191 future_ptr(_NEFORCE move(other.future_ptr)),
192 storage(_NEFORCE move(other.storage)) {}
193
197 promise& operator=(promise&& other) noexcept {
198 promise(_NEFORCE move(other)).swap(*this);
199 return *this;
200 }
201
202 promise(const promise&) = delete;
203 promise& operator=(const promise&) = delete;
204
209 if (static_cast<bool>(future_ptr) && !future_ptr.unique()) {
210 future_ptr->break_promise(_NEFORCE move(storage));
211 }
212 }
213
217 void swap(promise& other) noexcept {
218 future_ptr.swap(other.future_ptr);
219 storage.swap(other.storage);
220 }
221
226 future<Res&> get_future() { return future<Res&>(future_ptr); }
227
233 void set_value(Res& value) { state().set_result(state_type::create_setter(this, value)); }
234
240 void set_exception(exception_ptr exception) { state().set_result(state_type::create_setter(exception, this)); }
241
247 void set_value_at_thread_exit(Res& value) {
248 state().set_delayed_result(state_type::create_setter(this, value), future_ptr);
249 }
250
257 state().set_delayed_result(state_type::create_setter(exception, this), future_ptr);
258 }
259};
260
264template <>
265class promise<void> {
266public:
267 using state_type = inner::__future_base::state_base;
268 using result_type = inner::__future_base::basic_result<void>;
269 using ptr_type = inner::__future_base::Ptr<result_type>;
270
271private:
272 shared_ptr<state_type> future_ptr;
273 ptr_type storage;
274
275 template <typename T, typename U>
276 friend struct inner::__future_base::state_base::setter;
277
278 NEFORCE_NODISCARD state_type& state() const {
279 inner::__future_base::state_base::check(future_ptr);
280 return *future_ptr;
281 }
282
283public:
288 future_ptr(_NEFORCE make_shared<state_type>()),
289 storage(new result_type()) {}
290
294 promise(promise&& other) noexcept :
295 future_ptr(_NEFORCE move(other.future_ptr)),
296 storage(_NEFORCE move(other.storage)) {}
297
301 promise& operator=(promise&& other) noexcept {
302 promise(_NEFORCE move(other)).swap(*this);
303 return *this;
304 }
305
306 promise(const promise&) = delete;
307 promise& operator=(const promise&) = delete;
308
313 if (static_cast<bool>(future_ptr) && !future_ptr.unique()) {
314 future_ptr->break_promise(_NEFORCE move(storage));
315 }
316 }
317
321 void swap(promise& other) noexcept {
322 future_ptr.swap(other.future_ptr);
323 storage.swap(other.storage);
324 }
325
330 NEFORCE_NODISCARD future<void> get_future() const { return future<void>(future_ptr); }
331
336 void set_value() { state().set_result(state_type::create_setter(this)); }
337
343 void set_exception(exception_ptr exception) { state().set_result(state_type::create_setter(exception, this)); }
344
349 void set_value_at_thread_exit() { state().set_delayed_result(state_type::create_setter(this), future_ptr); }
350
357 state().set_delayed_result(state_type::create_setter(exception, this), future_ptr);
358 }
359};
360
362NEFORCE_BEGIN_INNER__
363
371template <typename PtrT, typename Func, typename>
372struct __future_base::task_setter {
373 PtrT* result_ptr;
374 Func* function_ptr;
375
381 PtrT operator()() const noexcept {
382 try {
383 (*result_ptr)->set((*function_ptr)());
384 } catch (...) {
385 (*result_ptr)->error_ptr = _NEFORCE current_exception();
386 }
387 return _NEFORCE move(*result_ptr);
388 }
389};
390
396template <typename PtrT, typename Func>
397struct __future_base::task_setter<PtrT, Func, void> {
398 PtrT* result_ptr;
399 Func* function_ptr;
400
401 PtrT operator()() const noexcept {
402 try {
403 (*function_ptr)();
404 } catch (...) {
405 (*result_ptr)->error_ptr = current_exception();
406 }
407 return _NEFORCE move(*result_ptr);
408 }
409};
410
418template <typename Res, typename... Args>
419class __future_base::task_state_base<Res(Args...)> : public __future_base::state_base {
420public:
421 using result_type = Res;
422 using PtrType = __future_base::Ptr<basic_result<Res>>;
423
424 PtrType result_storage;
425
431 template <typename Alloc>
432 task_state_base(const Alloc& alloc) :
433 result_storage(allocate_result<Res>(alloc)) {}
434
440 virtual void run(Args&&... args) = 0;
441
448 virtual void run_delayed(Args&&... args, weak_ptr<state_base> self) = 0;
449
455 virtual shared_ptr<task_state_base> reset() = 0;
456};
457
467template <typename Func, typename Alloc, typename Res, typename... Args>
468class __future_base::task_state<Func, Alloc, Res(Args...)> final : public __future_base::task_state_base<Res(Args...)> {
469public:
476 template <typename Func2>
477 task_state(Func2&& func, const Alloc& alloc) :
478 task_state_base<Res(Args...)>(alloc),
479 impl(_NEFORCE forward<Func2>(func), alloc) {}
480
481private:
482 void run(Args&&... args) override {
483 auto bound_func = [&]() -> Res {
484 return _NEFORCE invoke_r<Res>(impl.function_ptr, _NEFORCE forward<Args>(args)...);
485 };
486 state_base::set_result(__future_base::create_task_setter(this->result_storage, bound_func));
487 }
488
489 void run_delayed(Args&&... args, weak_ptr<state_base> self) override {
490 auto bound_function = [&]() -> Res {
491 return _NEFORCE invoke_r<Res>(impl.function_ptr, _NEFORCE forward<Args>(args)...);
492 };
493 state_base::set_delayed_result(__future_base::create_task_setter(this->result_storage, bound_function),
494 _NEFORCE move(self));
495 }
496
497 shared_ptr<task_state_base<Res(Args...)>> reset() override;
498
504 struct Impl : Alloc {
505 Func function_ptr;
506
507 template <typename Func2>
508 Impl(Func2&& func, const Alloc& alloc) :
509 Alloc(alloc),
510 function_ptr(_NEFORCE forward<Func2>(func)) {}
511 } impl;
512};
513
523template <typename Sign, typename Func, typename Alloc = _NEFORCE allocator<int>>
524static shared_ptr<__future_base::task_state_base<Sign>> create_task_state(Func&& func, const Alloc& alloc = Alloc()) {
525 using State = __future_base::task_state<decay_t<Func>, Alloc, Sign>;
526 return _NEFORCE allocate_shared<State>(alloc, _NEFORCE forward<Func>(func), alloc);
527}
528
535template <typename Func, typename Alloc, typename Res, typename... Args>
536shared_ptr<__future_base::task_state_base<Res(Args...)>> __future_base::task_state<Func, Alloc, Res(Args...)>::reset() {
537 return inner::create_task_state<Res(Args...)>(_NEFORCE move(impl.function_ptr), static_cast<Alloc&>(impl));
538}
539
540NEFORCE_END_INNER__
542 // Async
544 // AsyncComponents
546
547NEFORCE_END_NAMESPACE__
548#endif // NEFORCE_CORE_ASYNC_PROMISE_HPP__
独占future类模板
promise()
默认构造函数
void set_value_at_thread_exit(Res &value)
在线程退出时设置结果引用
promise & operator=(promise &&other) noexcept
移动赋值运算符
promise(promise &&other) noexcept
移动构造函数
promise(const promise &)=delete
禁止拷贝构造
future< Res & > get_future()
获取关联的future对象
inner::__future_base::Ptr< result_type > ptr_type
结果指针类型
void set_exception(exception_ptr exception)
设置异常
inner::__future_base::basic_result< Res & > result_type
结果类型
void swap(promise &other) noexcept
交换两个promise对象
void set_value(Res &value)
设置结果引用
void set_exception_at_thread_exit(exception_ptr exception)
在线程退出时设置异常
~promise()
析构函数
inner::__future_base::state_base state_type
状态类型
promise & operator=(const promise &)=delete
禁止拷贝赋值
promise & operator=(const promise &)=delete
禁止拷贝赋值
promise & operator=(promise &&other) noexcept
移动赋值运算符
promise(promise &&other) noexcept
移动构造函数
void set_value()
设置void结果
void set_exception_at_thread_exit(exception_ptr exception)
在线程退出时设置异常
NEFORCE_NODISCARD future< void > get_future() const
获取关联的future对象
promise(const promise &)=delete
禁止拷贝构造
inner::__future_base::basic_result< void > result_type
结果类型
void set_value_at_thread_exit()
在线程退出时设置void结果
inner::__future_base::state_base state_type
状态类型
promise()
默认构造函数
void set_exception(exception_ptr exception)
设置异常
void swap(promise &other) noexcept
交换两个promise对象
~promise()
析构函数
inner::__future_base::Ptr< result_type > ptr_type
结果指针类型
promise & operator=(promise &&other) noexcept
移动赋值运算符
inner::__future_base::Ptr< result_type > ptr_type
结果指针类型
void set_value(Res &&value)
设置结果值
~promise()
析构函数
void swap(promise &other) noexcept
交换两个promise对象
promise & operator=(const promise &)=delete
禁止拷贝赋值
inner::__future_base::basic_result< Res > result_type
结果类型
promise()
默认构造函数
promise(promise &&other) noexcept
移动构造函数
inner::__future_base::state_base state_type
状态类型
future< Res > get_future()
获取关联的future对象
promise(const promise &)=delete
禁止拷贝构造
void set_exception(exception_ptr exception)
设置异常
void set_value_at_thread_exit(Res &&value)
在线程退出时设置结果值
void set_exception_at_thread_exit(exception_ptr exception)
在线程退出时设置异常
共享智能指针类模板
异步结果消费者
NEFORCE_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
NEFORCE_INLINE17 constexpr bool is_array_v
is_array的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_function_v
is_function的便捷变量模板
exception_ptr NEFORCE_API current_exception() noexcept
获取当前异常
NEFORCE_CONSTEXPR14 enable_if_t< is_invocable_r< Res, Callable, Args... >::value, Res > invoke_r(Callable &&f, Args &&... args) noexcept(is_nothrow_invocable< Callable, Args... >::value)
带返回类型检查的统一调用接口
enable_if_t<!is_unbounded_array_v< T > &&is_constructible_v< T, Args... >, shared_ptr< T > > make_shared(Args &&... args)
融合分配创建共享指针
enable_if_t<!is_array_v< T > &&is_constructible_v< T, Args... >, shared_ptr< T > > allocate_shared(Alloc &alloc, Args &&... args)
使用分配器创建共享指针
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
NEFORCE_INLINE17 constexpr bool is_destructible_v
is_destructible的便捷变量模板
异常基类