diff options
Diffstat (limited to 'include/utility')
| -rw-r--r-- | include/utility | 98 |
1 files changed, 90 insertions, 8 deletions
diff --git a/include/utility b/include/utility index 54cfc8bc1592..c9f5785b3d4e 100644 --- a/include/utility +++ b/include/utility @@ -52,6 +52,9 @@ template <class T> >::type move_if_noexcept(T& x) noexcept; // constexpr in C++14 +template <class T> constexpr add_const<T>_t& as_const(T& t) noexcept; // C++17 +template <class T> void as_const(const T&&) = delete; // C++17 + template <class T> typename add_rvalue_reference<T>::type declval() noexcept; template <class T1, class T2> @@ -110,22 +113,41 @@ template<size_t I, class T1, class T2> get(pair<T1, T2>&) noexcept; // constexpr in C++14 template<size_t I, class T1, class T2> - const typename const tuple_element<I, pair<T1, T2> >::type& + const typename tuple_element<I, pair<T1, T2> >::type& get(const pair<T1, T2>&) noexcept; // constexpr in C++14 template<size_t I, class T1, class T2> typename tuple_element<I, pair<T1, T2> >::type&& get(pair<T1, T2>&&) noexcept; // constexpr in C++14 +template<size_t I, class T1, class T2> + const typename tuple_element<I, pair<T1, T2> >::type&& + get(const pair<T1, T2>&&) noexcept; // constexpr in C++14 + template<class T1, class T2> constexpr T1& get(pair<T1, T2>&) noexcept; // C++14 -template<size_t I, class T1, class T2> - constexpr T1 const& get(pair<T1, T2> const &) noexcept; // C++14 +template<class T1, class T2> + constexpr const T1& get(const pair<T1, T2>&) noexcept; // C++14 -template<size_t I, class T1, class T2> +template<class T1, class T2> constexpr T1&& get(pair<T1, T2>&&) noexcept; // C++14 +template<class T1, class T2> + constexpr const T1&& get(const pair<T1, T2>&&) noexcept; // C++14 + +template<class T1, class T2> + constexpr T1& get(pair<T2, T1>&) noexcept; // C++14 + +template<class T1, class T2> + constexpr const T1& get(const pair<T2, T1>&) noexcept; // C++14 + +template<class T1, class T2> + constexpr T1&& get(pair<T2, T1>&&) noexcept; // C++14 + +template<class T1, class T2> + constexpr const T1&& get(const pair<T2, T1>&&) noexcept; // C++14 + // C++14 template<class T, T... I> @@ -242,6 +264,11 @@ move_if_noexcept(_Tp& __x) _NOEXCEPT return _VSTD::move(__x); } +#if _LIBCPP_STD_VER > 14 +template <class _Tp> constexpr add_const_t<_Tp>& as_const(_Tp& __t) noexcept { return __t; } +template <class _Tp> void as_const(const _Tp&&) = delete; +#endif + struct _LIBCPP_TYPE_VIS_ONLY piecewise_construct_t { }; #if defined(_LIBCPP_HAS_NO_CONSTEXPR) || defined(_LIBCPP_BUILDING_UTILITY) extern const piecewise_construct_t piecewise_construct;// = piecewise_construct_t(); @@ -261,6 +288,12 @@ struct _LIBCPP_TYPE_VIS_ONLY pair // pair(const pair&) = default; // pair(pair&&) = default; +#ifndef _LIBCPP_HAS_NO_DEFAULT_FUNCTION_TEMPLATE_ARGS + template <bool _Dummy = true, class = typename enable_if< + __dependent_type<is_default_constructible<_T1>, _Dummy>::value && + __dependent_type<is_default_constructible<_T2>, _Dummy>::value + >::type> +#endif _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR pair() : first(), second() {} _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 @@ -388,8 +421,9 @@ struct _LIBCPP_TYPE_VIS_ONLY pair swap(pair& __p) _NOEXCEPT_(__is_nothrow_swappable<first_type>::value && __is_nothrow_swappable<second_type>::value) { - _VSTD::iter_swap(&first, &__p.first); - _VSTD::iter_swap(&second, &__p.second); + using _VSTD::swap; + swap(first, __p.first); + swap(second, __p.second); } private: @@ -551,6 +585,12 @@ struct __get_pair<0> _T1&& get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T1>(__p.first);} + template <class _T1, class _T2> + static + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 + const _T1&& + get(const pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<const _T1>(__p.first);} + #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES }; @@ -577,6 +617,12 @@ struct __get_pair<1> _T2&& get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T2>(__p.second);} + template <class _T1, class _T2> + static + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 + const _T2&& + get(const pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<const _T2>(__p.second);} + #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES }; @@ -606,6 +652,14 @@ get(pair<_T1, _T2>&& __p) _NOEXCEPT return __get_pair<_Ip>::get(_VSTD::move(__p)); } +template <size_t _Ip, class _T1, class _T2> +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +const typename tuple_element<_Ip, pair<_T1, _T2> >::type&& +get(const pair<_T1, _T2>&& __p) _NOEXCEPT +{ + return __get_pair<_Ip>::get(_VSTD::move(__p)); +} + #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES #if _LIBCPP_STD_VER > 11 @@ -632,6 +686,13 @@ constexpr _T1 && get(pair<_T1, _T2>&& __p) _NOEXCEPT template <class _T1, class _T2> inline _LIBCPP_INLINE_VISIBILITY +constexpr _T1 const && get(pair<_T1, _T2> const&& __p) _NOEXCEPT +{ + return __get_pair<0>::get(_VSTD::move(__p)); +} + +template <class _T1, class _T2> +inline _LIBCPP_INLINE_VISIBILITY constexpr _T1 & get(pair<_T2, _T1>& __p) _NOEXCEPT { return __get_pair<1>::get(__p); @@ -651,6 +712,13 @@ constexpr _T1 && get(pair<_T2, _T1>&& __p) _NOEXCEPT return __get_pair<1>::get(_VSTD::move(__p)); } +template <class _T1, class _T2> +inline _LIBCPP_INLINE_VISIBILITY +constexpr _T1 const && get(pair<_T2, _T1> const&& __p) _NOEXCEPT +{ + return __get_pair<1>::get(_VSTD::move(__p)); +} + #endif #if _LIBCPP_STD_VER > 11 @@ -671,6 +739,16 @@ struct _LIBCPP_TYPE_VIS_ONLY integer_sequence template<size_t... _Ip> using index_sequence = integer_sequence<size_t, _Ip...>; +#if __has_builtin(__make_integer_seq) && !defined(_LIBCPP_TESTING_FALLBACK_MAKE_INTEGER_SEQUENCE) + +template <class _Tp, _Tp _Ep> +struct __make_integer_sequence +{ + typedef __make_integer_seq<integer_sequence, _Tp, _Ep> type; +}; + +#else + namespace __detail { template<typename _Tp, size_t ..._Extra> struct __repeat; @@ -724,10 +802,14 @@ struct __make_integer_sequence { static_assert(is_integral<_Tp>::value, "std::make_integer_sequence can only be instantiated with an integral type" ); - static_assert(0 <= _Ep, "std::make_integer_sequence input shall not be negative"); - typedef __make_integer_sequence_unchecked<_Tp, _Ep> type; + static_assert(0 <= _Ep, "std::make_integer_sequence must have a non-negative sequence length"); + // Workaround GCC bug by preventing bad installations when 0 <= _Ep + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68929 + typedef __make_integer_sequence_unchecked<_Tp, 0 <= _Ep ? _Ep : 0> type; }; +#endif + template<class _Tp, _Tp _Np> using make_integer_sequence = typename __make_integer_sequence<_Tp, _Np>::type; |
