diff options
Diffstat (limited to 'libstdc++-v3/include/std/future')
-rw-r--r-- | libstdc++-v3/include/std/future | 59 |
1 files changed, 30 insertions, 29 deletions
diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future index 80b7b06a45f..830494f1904 100644 --- a/libstdc++-v3/include/std/future +++ b/libstdc++-v3/include/std/future @@ -462,7 +462,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Used by std::promise to copy construct the result. typename promise<_Res>::_Ptr_type operator()() const { - _State_baseV2::_S_check(_M_promise->_M_future); _M_promise->_M_storage->_M_set(*_M_arg); return std::move(_M_promise->_M_storage); } @@ -477,7 +476,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Used by std::promise to move construct the result. typename promise<_Res>::_Ptr_type operator()() const { - _State_baseV2::_S_check(_M_promise->_M_future); _M_promise->_M_storage->_M_set(std::move(*_M_arg)); return std::move(_M_promise->_M_storage); } @@ -485,6 +483,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Res* _M_arg; }; + // set void + template<typename _Res> + struct _Setter<_Res, void> + { + static_assert(is_void<_Res>::value, "Only used for promise<void>"); + + typename promise<_Res>::_Ptr_type operator()() const + { return std::move(_M_promise->_M_storage); } + + promise<_Res>* _M_promise; + }; + struct __exception_ptr_tag { }; // set exceptions @@ -494,7 +504,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Used by std::promise to store an exception as the result. typename promise<_Res>::_Ptr_type operator()() const { - _State_baseV2::_S_check(_M_promise->_M_future); _M_promise->_M_storage->_M_error = *_M_ex; return std::move(_M_promise->_M_storage); } @@ -507,6 +516,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION static _Setter<_Res, _Arg&&> __setter(promise<_Res>* __prom, _Arg&& __arg) { + _S_check(__prom->_M_future); return _Setter<_Res, _Arg&&>{ __prom, std::__addressof(__arg) }; } @@ -514,9 +524,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION static _Setter<_Res, __exception_ptr_tag> __setter(exception_ptr& __ex, promise<_Res>* __prom) { + _S_check(__prom->_M_future); return _Setter<_Res, __exception_ptr_tag>{ __prom, &__ex }; } + template<typename _Res> + static _Setter<_Res, void> + __setter(promise<_Res>* __prom) + { + _S_check(__prom->_M_future); + return _Setter<_Res, void>{ __prom }; + } + template<typename _Tp> static void _S_check(const shared_ptr<_Tp>& __p) @@ -1014,6 +1033,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION typedef __future_base::_Result<_Res> _Res_type; typedef __future_base::_Ptr<_Res_type> _Ptr_type; template<typename, typename> friend class _State::_Setter; + friend _State; shared_ptr<_State> _M_future; _Ptr_type _M_storage; @@ -1124,6 +1144,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION typedef __future_base::_Result<_Res&> _Res_type; typedef __future_base::_Ptr<_Res_type> _Ptr_type; template<typename, typename> friend class _State::_Setter; + friend _State; shared_ptr<_State> _M_future; _Ptr_type _M_storage; @@ -1213,6 +1234,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION typedef __future_base::_Result<void> _Res_type; typedef __future_base::_Ptr<_Res_type> _Ptr_type; template<typename, typename> friend class _State::_Setter; + friend _State; shared_ptr<_State> _M_future; _Ptr_type _M_storage; @@ -1273,14 +1295,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return future<void>(_M_future); } // Setting the result - void set_value(); + void + set_value() + { _M_future->_M_set_result(_State::__setter(this)); } void set_exception(exception_ptr __p) { _M_future->_M_set_result(_State::__setter(__p, this)); } void - set_value_at_thread_exit(); + set_value_at_thread_exit() + { _M_future->_M_set_delayed_result(_State::__setter(this), _M_future); } void set_exception_at_thread_exit(exception_ptr __p) @@ -1290,30 +1315,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } }; - // set void - template<> - struct __future_base::_State_base::_Setter<void, void> - { - promise<void>::_Ptr_type operator()() const - { - _State_base::_S_check(_M_promise->_M_future); - return std::move(_M_promise->_M_storage); - } - - promise<void>* _M_promise; - }; - - inline void - promise<void>::set_value() - { _M_future->_M_set_result(_State::_Setter<void, void>{ this }); } - - inline void - promise<void>::set_value_at_thread_exit() - { - _M_future->_M_set_delayed_result(_State::_Setter<void, void>{this}, - _M_future); - } - template<typename _Ptr_type, typename _Fn, typename _Res> struct __future_base::_Task_setter { |