diff options
Diffstat (limited to 'libstdc++-v3/include/std')
-rw-r--r-- | libstdc++-v3/include/std/atomic | 101 | ||||
-rw-r--r-- | libstdc++-v3/include/std/complex | 11 | ||||
-rw-r--r-- | libstdc++-v3/include/std/future | 53 | ||||
-rw-r--r-- | libstdc++-v3/include/std/mutex | 6 |
4 files changed, 128 insertions, 43 deletions
diff --git a/libstdc++-v3/include/std/atomic b/libstdc++-v3/include/std/atomic index b3fa7d8120b..70f613f5c50 100644 --- a/libstdc++-v3/include/std/atomic +++ b/libstdc++-v3/include/std/atomic @@ -39,8 +39,6 @@ #endif #include <bits/atomic_base.h> -#include <bits/atomic_0.h> -#include <bits/atomic_2.h> namespace std _GLIBCXX_VISIBILITY(default) { @@ -167,69 +165,116 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr atomic(_Tp __i) noexcept : _M_i(__i) { } - operator _Tp() const noexcept; + operator _Tp() const noexcept + { return load(); } - operator _Tp() const volatile noexcept; + operator _Tp() const volatile noexcept + { return load(); } _Tp - operator=(_Tp __i) noexcept { store(__i); return __i; } + operator=(_Tp __i) noexcept + { store(__i); return __i; } _Tp - operator=(_Tp __i) volatile noexcept { store(__i); return __i; } + operator=(_Tp __i) volatile noexcept + { store(__i); return __i; } bool - is_lock_free() const noexcept; + is_lock_free() const noexcept + { return __atomic_is_lock_free(sizeof(_M_i), &_M_i); } bool - is_lock_free() const volatile noexcept; + is_lock_free() const volatile noexcept + { return __atomic_is_lock_free(sizeof(_M_i), &_M_i); } void - store(_Tp, memory_order = memory_order_seq_cst) noexcept; + store(_Tp __i, memory_order _m = memory_order_seq_cst) noexcept + { __atomic_store(&_M_i, &__i, _m); } void - store(_Tp, memory_order = memory_order_seq_cst) volatile noexcept; + store(_Tp __i, memory_order _m = memory_order_seq_cst) volatile noexcept + { __atomic_store(&_M_i, &__i, _m); } _Tp - load(memory_order = memory_order_seq_cst) const noexcept; + load(memory_order _m = memory_order_seq_cst) const noexcept + { + _Tp tmp; + __atomic_load(&_M_i, &tmp, _m); + return tmp; + } _Tp - load(memory_order = memory_order_seq_cst) const volatile noexcept; + load(memory_order _m = memory_order_seq_cst) const volatile noexcept + { + _Tp tmp; + __atomic_load(&_M_i, &tmp, _m); + return tmp; + } _Tp - exchange(_Tp __i, memory_order = memory_order_seq_cst) noexcept; + exchange(_Tp __i, memory_order _m = memory_order_seq_cst) noexcept + { + _Tp tmp; + __atomic_exchange(&_M_i, &__i, &tmp, _m); + return tmp; + } _Tp - exchange(_Tp __i, memory_order = memory_order_seq_cst) volatile noexcept; + exchange(_Tp __i, + memory_order _m = memory_order_seq_cst) volatile noexcept + { + _Tp tmp; + __atomic_exchange(&_M_i, &__i, &tmp, _m); + return tmp; + } bool - compare_exchange_weak(_Tp&, _Tp, memory_order, memory_order) noexcept; + compare_exchange_weak(_Tp& __e, _Tp __i, memory_order __s, + memory_order __f) noexcept + { + return __atomic_compare_exchange(&_M_i, &__e, &__i, true, __s, __f); + } bool - compare_exchange_weak(_Tp&, _Tp, memory_order, - memory_order) volatile noexcept; + compare_exchange_weak(_Tp& __e, _Tp __i, memory_order __s, + memory_order __f) volatile noexcept + { + return __atomic_compare_exchange(&_M_i, &__e, &__i, true, __s, __f); + } bool - compare_exchange_weak(_Tp&, _Tp, - memory_order = memory_order_seq_cst) noexcept; + compare_exchange_weak(_Tp& __e, _Tp __i, + memory_order __m = memory_order_seq_cst) noexcept + { return compare_exchange_weak(__e, __i, __m, __m); } bool - compare_exchange_weak(_Tp&, _Tp, - memory_order = memory_order_seq_cst) volatile noexcept; + compare_exchange_weak(_Tp& __e, _Tp __i, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return compare_exchange_weak(__e, __i, __m, __m); } bool - compare_exchange_strong(_Tp&, _Tp, memory_order, memory_order) noexcept; + compare_exchange_strong(_Tp& __e, _Tp __i, memory_order __s, + memory_order __f) noexcept + { + return __atomic_compare_exchange(&_M_i, &__e, &__i, false, __s, __f); + } bool - compare_exchange_strong(_Tp&, _Tp, memory_order, - memory_order) volatile noexcept; + compare_exchange_strong(_Tp& __e, _Tp __i, memory_order __s, + memory_order __f) volatile noexcept + { + return __atomic_compare_exchange(&_M_i, &__e, &__i, false, __s, __f); + } bool - compare_exchange_strong(_Tp&, _Tp, - memory_order = memory_order_seq_cst) noexcept; + compare_exchange_strong(_Tp& __e, _Tp __i, + memory_order __m = memory_order_seq_cst) noexcept + { return compare_exchange_strong(__e, __i, __m, __m); } bool - compare_exchange_strong(_Tp&, _Tp, - memory_order = memory_order_seq_cst) volatile noexcept; + compare_exchange_strong(_Tp& __e, _Tp __i, + memory_order __m = memory_order_seq_cst) volatile noexcept + { return compare_exchange_strong(__e, __i, __m, __m); } }; diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex index 3c41b483cd2..d7423433803 100644 --- a/libstdc++-v3/include/std/complex +++ b/libstdc++-v3/include/std/complex @@ -1686,14 +1686,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION std::complex<_Tp> __complex_acosh(const std::complex<_Tp>& __z) { - std::complex<_Tp> __t((__z.real() - __z.imag()) - * (__z.real() + __z.imag()) - _Tp(1.0), - _Tp(2.0) * __z.real() * __z.imag()); - __t = std::sqrt(__t); - if (__z.real() < _Tp()) - __t = -__t; - - return std::log(__t + __z); + // Kahan's formula. + return _Tp(2.0) * std::log(std::sqrt(_Tp(0.5) * (__z + _Tp(1.0))) + + std::sqrt(_Tp(0.5) * (__z - _Tp(1.0)))); } #if _GLIBCXX_USE_C99_COMPLEX_TR1 diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future index 497b964833f..cc8779b40b3 100644 --- a/libstdc++-v3/include/std/future +++ b/libstdc++-v3/include/std/future @@ -955,6 +955,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_storage(__future_base::_S_allocate_result<_Res>(__a)) { } + template<typename _Allocator> + promise(allocator_arg_t, const _Allocator&, promise&& __rhs) + : _M_future(std::move(__rhs._M_future)), + _M_storage(std::move(__rhs._M_storage)) + { } + promise(const promise&) = delete; ~promise() @@ -1047,6 +1053,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_storage(__future_base::_S_allocate_result<_Res&>(__a)) { } + template<typename _Allocator> + promise(allocator_arg_t, const _Allocator&, promise&& __rhs) + : _M_future(std::move(__rhs._M_future)), + _M_storage(std::move(__rhs._M_storage)) + { } + promise(const promise&) = delete; ~promise() @@ -1122,6 +1134,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_storage(__future_base::_S_allocate_result<void>(__a)) { } + template<typename _Allocator> + promise(allocator_arg_t, const _Allocator&, promise&& __rhs) + : _M_future(std::move(__rhs._M_future)), + _M_storage(std::move(__rhs._M_storage)) + { } + promise(const promise&) = delete; ~promise() @@ -1270,6 +1288,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return std::forward<_Tp>(__t); } }; + template<typename _Task, typename _Fn, bool + = is_same<_Task, typename remove_reference<_Fn>::type>::value> + struct __is_same_pkgdtask + { typedef void __type; }; + + template<typename _Task, typename _Fn> + struct __is_same_pkgdtask<_Task, _Fn, true> + { }; + /// packaged_task template<typename _Res, typename... _ArgTypes> class packaged_task<_Res(_ArgTypes...)> @@ -1281,13 +1308,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Construction and destruction packaged_task() noexcept { } - template<typename _Fn> + template<typename _Allocator> + explicit + packaged_task(allocator_arg_t, const _Allocator& __a) noexcept + { } + + template<typename _Fn, typename = typename + __is_same_pkgdtask<packaged_task, _Fn>::__type> explicit packaged_task(_Fn&& __fn) : _M_state(std::make_shared<_State_type>(std::forward<_Fn>(__fn))) { } - template<typename _Fn, typename _Allocator> + template<typename _Fn, typename _Allocator, typename = typename + __is_same_pkgdtask<packaged_task, _Fn>::__type> explicit packaged_task(allocator_arg_t, const _Allocator& __a, _Fn&& __fn) : _M_state(std::allocate_shared<_State_type>(__a, @@ -1301,13 +1335,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } // No copy - packaged_task(packaged_task&) = delete; - packaged_task& operator=(packaged_task&) = delete; + packaged_task(const packaged_task&) = delete; + packaged_task& operator=(const packaged_task&) = delete; + + template<typename _Allocator> + explicit + packaged_task(allocator_arg_t, const _Allocator&, + const packaged_task&) = delete; // Move support packaged_task(packaged_task&& __other) noexcept { this->swap(__other); } + template<typename _Allocator> + explicit + packaged_task(allocator_arg_t, const _Allocator&, + packaged_task&& __other) noexcept + { this->swap(__other); } + packaged_task& operator=(packaged_task&& __other) noexcept { packaged_task(std::move(__other)).swap(*this); diff --git a/libstdc++-v3/include/std/mutex b/libstdc++-v3/include/std/mutex index 4d154ff6f0c..bc2675b2b68 100644 --- a/libstdc++-v3/include/std/mutex +++ b/libstdc++-v3/include/std/mutex @@ -760,11 +760,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { private: typedef __gthread_once_t __native_type; - __native_type _M_once; + __native_type _M_once = __GTHREAD_ONCE_INIT; public: /// Constructor - constexpr once_flag() noexcept : _M_once(__GTHREAD_ONCE_INIT) { } + constexpr once_flag() noexcept = default; /// Deleted copy constructor once_flag(const once_flag&) = delete; @@ -796,7 +796,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __get_once_mutex(); #endif - extern "C" void __once_proxy(); + extern "C" void __once_proxy(void); /// call_once template<typename _Callable, typename... _Args> |