diff options
Diffstat (limited to 'libcxx/include/__utility/pair.h')
| -rw-r--r-- | libcxx/include/__utility/pair.h | 250 | 
1 files changed, 173 insertions, 77 deletions
| diff --git a/libcxx/include/__utility/pair.h b/libcxx/include/__utility/pair.h index 97635c2e61b5..8151674bcc55 100644 --- a/libcxx/include/__utility/pair.h +++ b/libcxx/include/__utility/pair.h @@ -13,12 +13,35 @@  #include <__compare/synth_three_way.h>  #include <__config>  #include <__functional/unwrap_ref.h> -#include <__tuple> +#include <__fwd/get.h> +#include <__fwd/tuple.h> +#include <__tuple_dir/sfinae_helpers.h> +#include <__tuple_dir/tuple_element.h> +#include <__tuple_dir/tuple_indices.h> +#include <__tuple_dir/tuple_size.h> +#include <__type_traits/common_reference.h> +#include <__type_traits/common_type.h> +#include <__type_traits/conditional.h> +#include <__type_traits/is_assignable.h> +#include <__type_traits/is_constructible.h> +#include <__type_traits/is_convertible.h> +#include <__type_traits/is_copy_assignable.h> +#include <__type_traits/is_default_constructible.h> +#include <__type_traits/is_implicitly_default_constructible.h> +#include <__type_traits/is_move_assignable.h> +#include <__type_traits/is_nothrow_assignable.h> +#include <__type_traits/is_nothrow_constructible.h> +#include <__type_traits/is_nothrow_copy_assignable.h> +#include <__type_traits/is_nothrow_copy_constructible.h> +#include <__type_traits/is_nothrow_default_constructible.h> +#include <__type_traits/is_nothrow_move_assignable.h> +#include <__type_traits/is_same.h> +#include <__type_traits/is_swappable.h> +#include <__type_traits/nat.h>  #include <__utility/forward.h>  #include <__utility/move.h>  #include <__utility/piecewise_construct.h>  #include <cstddef> -#include <type_traits>  #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)  #  pragma GCC system_header @@ -31,7 +54,7 @@ template <class, class>  struct __non_trivially_copyable_base {    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY    __non_trivially_copyable_base() _NOEXCEPT {} -  _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY +  _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY    __non_trivially_copyable_base(__non_trivially_copyable_base const&) _NOEXCEPT {}  };  #endif @@ -48,12 +71,8 @@ struct _LIBCPP_TEMPLATE_VIS pair      _T1 first;      _T2 second; -#if !defined(_LIBCPP_CXX03_LANG)      pair(pair const&) = default;      pair(pair&&) = default; -#else -  // Use the implicitly declared copy constructor in C++03 -#endif  #ifdef _LIBCPP_CXX03_LANG      _LIBCPP_INLINE_VISIBILITY @@ -88,20 +107,26 @@ struct _LIBCPP_TEMPLATE_VIS pair        }        template <class _U1, class _U2> -      static constexpr bool __enable_explicit() { +      static constexpr bool __is_pair_constructible() {            return is_constructible<first_type, _U1>::value -              && is_constructible<second_type, _U2>::value -              && (!is_convertible<_U1, first_type>::value -                  || !is_convertible<_U2, second_type>::value); +              && is_constructible<second_type, _U2>::value;        }        template <class _U1, class _U2> -      static constexpr bool __enable_implicit() { -          return is_constructible<first_type, _U1>::value -              && is_constructible<second_type, _U2>::value -              && is_convertible<_U1, first_type>::value +      static constexpr bool __is_implicit() { +          return is_convertible<_U1, first_type>::value                && is_convertible<_U2, second_type>::value;        } + +      template <class _U1, class _U2> +      static constexpr bool __enable_explicit() { +          return __is_pair_constructible<_U1, _U2>() && !__is_implicit<_U1, _U2>(); +      } + +      template <class _U1, class _U2> +      static constexpr bool __enable_implicit() { +          return __is_pair_constructible<_U1, _U2>() && __is_implicit<_U1, _U2>(); +      }      };      template <bool _MaybeEnable> @@ -127,12 +152,12 @@ struct _LIBCPP_TEMPLATE_VIS pair      };      template <class _Tuple> -    using _CheckTLC _LIBCPP_NODEBUG = typename conditional< +    using _CheckTLC _LIBCPP_NODEBUG = __conditional_t<          __tuple_like_with_size<_Tuple, 2>::value              && !is_same<typename decay<_Tuple>::type, pair>::value,          _CheckTupleLikeConstructor,          __check_tuple_constructor_fail -    >::type; +    >;      template<bool _Dummy = true, typename enable_if<              _CheckArgsDep<_Dummy>::__enable_explicit_default() @@ -153,7 +178,7 @@ struct _LIBCPP_TEMPLATE_VIS pair      template <bool _Dummy = true, typename enable_if<               _CheckArgsDep<_Dummy>::template __enable_explicit<_T1 const&, _T2 const&>()      >::type* = nullptr> -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      explicit pair(_T1 const& __t1, _T2 const& __t2)          _NOEXCEPT_(is_nothrow_copy_constructible<first_type>::value &&                     is_nothrow_copy_constructible<second_type>::value) @@ -162,7 +187,7 @@ struct _LIBCPP_TEMPLATE_VIS pair      template<bool _Dummy = true, typename enable_if<              _CheckArgsDep<_Dummy>::template __enable_implicit<_T1 const&, _T2 const&>()      >::type* = nullptr> -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      pair(_T1 const& __t1, _T2 const& __t2)          _NOEXCEPT_(is_nothrow_copy_constructible<first_type>::value &&                     is_nothrow_copy_constructible<second_type>::value) @@ -176,7 +201,7 @@ struct _LIBCPP_TEMPLATE_VIS pair  #endif          typename enable_if<_CheckArgs::template __enable_explicit<_U1, _U2>()>::type* = nullptr      > -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      explicit pair(_U1&& __u1, _U2&& __u2)          _NOEXCEPT_((is_nothrow_constructible<first_type, _U1>::value &&                      is_nothrow_constructible<second_type, _U2>::value)) @@ -190,16 +215,27 @@ struct _LIBCPP_TEMPLATE_VIS pair  #endif          typename enable_if<_CheckArgs::template __enable_implicit<_U1, _U2>()>::type* = nullptr      > -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      pair(_U1&& __u1, _U2&& __u2)          _NOEXCEPT_((is_nothrow_constructible<first_type, _U1>::value &&                      is_nothrow_constructible<second_type, _U2>::value))          : first(_VSTD::forward<_U1>(__u1)), second(_VSTD::forward<_U2>(__u2)) {} +#if _LIBCPP_STD_VER > 20 +    template<class _U1, class _U2, __enable_if_t< +            _CheckArgs::template __is_pair_constructible<_U1&, _U2&>() +    >* = nullptr> +    _LIBCPP_HIDE_FROM_ABI constexpr +    explicit(!_CheckArgs::template __is_implicit<_U1&, _U2&>()) pair(pair<_U1, _U2>& __p) +        noexcept((is_nothrow_constructible<first_type, _U1&>::value && +                  is_nothrow_constructible<second_type, _U2&>::value)) +        : first(__p.first), second(__p.second) {} +#endif +      template<class _U1, class _U2, typename enable_if<              _CheckArgs::template __enable_explicit<_U1 const&, _U2 const&>()      >::type* = nullptr> -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      explicit pair(pair<_U1, _U2> const& __p)          _NOEXCEPT_((is_nothrow_constructible<first_type, _U1 const&>::value &&                      is_nothrow_constructible<second_type, _U2 const&>::value)) @@ -208,7 +244,7 @@ struct _LIBCPP_TEMPLATE_VIS pair      template<class _U1, class _U2, typename enable_if<              _CheckArgs::template __enable_implicit<_U1 const&, _U2 const&>()      >::type* = nullptr> -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      pair(pair<_U1, _U2> const& __p)          _NOEXCEPT_((is_nothrow_constructible<first_type, _U1 const&>::value &&                      is_nothrow_constructible<second_type, _U2 const&>::value)) @@ -217,7 +253,7 @@ struct _LIBCPP_TEMPLATE_VIS pair      template<class _U1, class _U2, typename enable_if<              _CheckArgs::template __enable_explicit<_U1, _U2>()      >::type* = nullptr> -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      explicit pair(pair<_U1, _U2>&&__p)          _NOEXCEPT_((is_nothrow_constructible<first_type, _U1&&>::value &&                      is_nothrow_constructible<second_type, _U2&&>::value)) @@ -226,16 +262,28 @@ struct _LIBCPP_TEMPLATE_VIS pair      template<class _U1, class _U2, typename enable_if<              _CheckArgs::template __enable_implicit<_U1, _U2>()      >::type* = nullptr> -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      pair(pair<_U1, _U2>&& __p)          _NOEXCEPT_((is_nothrow_constructible<first_type, _U1&&>::value &&                      is_nothrow_constructible<second_type, _U2&&>::value))          : first(_VSTD::forward<_U1>(__p.first)), second(_VSTD::forward<_U2>(__p.second)) {} +#if _LIBCPP_STD_VER > 20 +    template<class _U1, class _U2, __enable_if_t< +            _CheckArgs::template __is_pair_constructible<const _U1&&, const _U2&&>() +    >* = nullptr> +    _LIBCPP_HIDE_FROM_ABI constexpr +    explicit(!_CheckArgs::template __is_implicit<const _U1&&, const _U2&&>()) +    pair(const pair<_U1, _U2>&& __p) +        noexcept(is_nothrow_constructible<first_type, const _U1&&>::value && +                 is_nothrow_constructible<second_type, const _U2&&>::value) +        : first(std::move(__p.first)), second(std::move(__p.second)) {} +#endif +      template<class _Tuple, typename enable_if<              _CheckTLC<_Tuple>::template __enable_explicit<_Tuple>()      >::type* = nullptr> -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      explicit pair(_Tuple&& __p)          : first(_VSTD::get<0>(_VSTD::forward<_Tuple>(__p))),            second(_VSTD::get<1>(_VSTD::forward<_Tuple>(__p))) {} @@ -243,13 +291,13 @@ struct _LIBCPP_TEMPLATE_VIS pair      template<class _Tuple, typename enable_if<              _CheckTLC<_Tuple>::template __enable_implicit<_Tuple>()      >::type* = nullptr> -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      pair(_Tuple&& __p)          : first(_VSTD::get<0>(_VSTD::forward<_Tuple>(__p))),            second(_VSTD::get<1>(_VSTD::forward<_Tuple>(__p))) {}      template <class... _Args1, class... _Args2> -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20      pair(piecewise_construct_t __pc,           tuple<_Args1...> __first_args, tuple<_Args2...> __second_args)          _NOEXCEPT_((is_nothrow_constructible<first_type, _Args1...>::value && @@ -258,11 +306,11 @@ struct _LIBCPP_TEMPLATE_VIS pair                  typename __make_tuple_indices<sizeof...(_Args1)>::type(),                  typename __make_tuple_indices<sizeof...(_Args2) >::type()) {} -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -    pair& operator=(typename conditional< +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +    pair& operator=(__conditional_t<                          is_copy_assignable<first_type>::value &&                          is_copy_assignable<second_type>::value, -                    pair, __nat>::type const& __p) +                    pair, __nat> const& __p)          _NOEXCEPT_(is_nothrow_copy_assignable<first_type>::value &&                     is_nothrow_copy_assignable<second_type>::value)      { @@ -271,11 +319,11 @@ struct _LIBCPP_TEMPLATE_VIS pair          return *this;      } -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -    pair& operator=(typename conditional< +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +    pair& operator=(__conditional_t<                          is_move_assignable<first_type>::value &&                          is_move_assignable<second_type>::value, -                    pair, __nat>::type&& __p) +                    pair, __nat>&& __p)          _NOEXCEPT_(is_nothrow_move_assignable<first_type>::value &&                     is_nothrow_move_assignable<second_type>::value)      { @@ -284,10 +332,54 @@ struct _LIBCPP_TEMPLATE_VIS pair          return *this;      } +#if _LIBCPP_STD_VER > 20 +    _LIBCPP_HIDE_FROM_ABI constexpr +    const pair& operator=(pair const& __p) const +      noexcept(is_nothrow_copy_assignable_v<const first_type> && +               is_nothrow_copy_assignable_v<const second_type>) +      requires(is_copy_assignable_v<const first_type> && +               is_copy_assignable_v<const second_type>) { +        first = __p.first; +        second = __p.second; +        return *this; +    } + +    _LIBCPP_HIDE_FROM_ABI constexpr +    const pair& operator=(pair&& __p) const +      noexcept(is_nothrow_assignable_v<const first_type&, first_type> && +               is_nothrow_assignable_v<const second_type&, second_type>) +      requires(is_assignable_v<const first_type&, first_type> && +               is_assignable_v<const second_type&, second_type>) { +        first = std::forward<first_type>(__p.first); +        second = std::forward<second_type>(__p.second); +        return *this; +    } + +    template<class _U1, class _U2> +    _LIBCPP_HIDE_FROM_ABI constexpr +    const pair& operator=(const pair<_U1, _U2>& __p) const +      requires(is_assignable_v<const first_type&, const _U1&> && +               is_assignable_v<const second_type&, const _U2&>) { +        first = __p.first; +        second = __p.second; +        return *this; +    } + +    template<class _U1, class _U2> +    _LIBCPP_HIDE_FROM_ABI constexpr +    const pair& operator=(pair<_U1, _U2>&& __p) const +      requires(is_assignable_v<const first_type&, _U1> && +               is_assignable_v<const second_type&, _U2>) { +        first = std::forward<_U1>(__p.first); +        second = std::forward<_U2>(__p.second); +        return *this; +    } +#endif // _LIBCPP_STD_VER > 20 +      template <class _Tuple, typename enable_if<              _CheckTLC<_Tuple>::template __enable_assign<_Tuple>()       >::type* = nullptr> -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20      pair& operator=(_Tuple&& __p) {          first = _VSTD::get<0>(_VSTD::forward<_Tuple>(__p));          second = _VSTD::get<1>(_VSTD::forward<_Tuple>(__p)); @@ -295,7 +387,7 @@ struct _LIBCPP_TEMPLATE_VIS pair      }  #endif -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20      void      swap(pair& __p) _NOEXCEPT_(__is_nothrow_swappable<first_type>::value &&                                 __is_nothrow_swappable<second_type>::value) @@ -304,11 +396,23 @@ struct _LIBCPP_TEMPLATE_VIS pair          swap(first,  __p.first);          swap(second, __p.second);      } + +#if _LIBCPP_STD_VER > 20 +    _LIBCPP_HIDE_FROM_ABI constexpr +    void swap(const pair& __p) const +        noexcept(__is_nothrow_swappable<const first_type>::value && +                 __is_nothrow_swappable<const second_type>::value) +    { +        using std::swap; +        swap(first,  __p.first); +        swap(second, __p.second); +    } +#endif  private:  #ifndef _LIBCPP_CXX03_LANG      template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20      pair(piecewise_construct_t,           tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args,           __tuple_indices<_I1...>, __tuple_indices<_I2...>); @@ -323,7 +427,7 @@ pair(_T1, _T2) -> pair<_T1, _T2>;  // [pairs.spec], specialized algorithms  template <class _T1, class _T2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14  bool  operator==(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)  { @@ -348,7 +452,7 @@ operator<=>(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)  #else // _LIBCPP_STD_VER > 17  template <class _T1, class _T2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14  bool  operator!=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)  { @@ -356,7 +460,7 @@ operator!=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)  }  template <class _T1, class _T2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14  bool  operator< (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)  { @@ -364,7 +468,7 @@ operator< (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)  }  template <class _T1, class _T2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14  bool  operator> (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)  { @@ -372,7 +476,7 @@ operator> (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)  }  template <class _T1, class _T2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14  bool  operator>=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)  { @@ -380,7 +484,7 @@ operator>=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)  }  template <class _T1, class _T2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14  bool  operator<=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)  { @@ -406,7 +510,7 @@ struct common_type<pair<_T1, _T2>, pair<_U1, _U2>> {  #endif // _LIBCPP_STD_VER > 20  template <class _T1, class _T2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20  typename enable_if  <      __is_swappable<_T1>::value && @@ -420,10 +524,20 @@ swap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y)      __x.swap(__y);  } -#ifndef _LIBCPP_CXX03_LANG +#if _LIBCPP_STD_VER > 20 +template <class _T1, class _T2> +  requires (__is_swappable<const _T1>::value && +            __is_swappable<const _T2>::value) +_LIBCPP_HIDE_FROM_ABI constexpr +void swap(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) +    noexcept(noexcept(__x.swap(__y))) +{ +    __x.swap(__y); +} +#endif  template <class _T1, class _T2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14  pair<typename __unwrap_ref_decay<_T1>::type, typename __unwrap_ref_decay<_T2>::type>  make_pair(_T1&& __t1, _T2&& __t2)  { @@ -431,18 +545,6 @@ make_pair(_T1&& __t1, _T2&& __t2)                 (_VSTD::forward<_T1>(__t1), _VSTD::forward<_T2>(__t2));  } -#else  // _LIBCPP_CXX03_LANG - -template <class _T1, class _T2> -inline _LIBCPP_INLINE_VISIBILITY -pair<_T1,_T2> -make_pair(_T1 __x, _T2 __y) -{ -    return pair<_T1, _T2>(__x, __y); -} - -#endif // _LIBCPP_CXX03_LANG -  template <class _T1, class _T2>    struct _LIBCPP_TEMPLATE_VIS tuple_size<pair<_T1, _T2> >      : public integral_constant<size_t, 2> {}; @@ -472,29 +574,27 @@ struct __get_pair<0>  {      template <class _T1, class _T2>      static -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      _T1&      get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;}      template <class _T1, class _T2>      static -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      const _T1&      get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;} -#ifndef _LIBCPP_CXX03_LANG      template <class _T1, class _T2>      static -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      _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 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      const _T1&&      get(const pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<const _T1>(__p.first);} -#endif // _LIBCPP_CXX03_LANG  };  template <> @@ -502,33 +602,31 @@ struct __get_pair<1>  {      template <class _T1, class _T2>      static -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      _T2&      get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;}      template <class _T1, class _T2>      static -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      const _T2&      get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;} -#ifndef _LIBCPP_CXX03_LANG      template <class _T1, class _T2>      static -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      _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 +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14      const _T2&&      get(const pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<const _T2>(__p.second);} -#endif // _LIBCPP_CXX03_LANG  };  template <size_t _Ip, class _T1, class _T2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14  typename tuple_element<_Ip, pair<_T1, _T2> >::type&  get(pair<_T1, _T2>& __p) _NOEXCEPT  { @@ -536,16 +634,15 @@ get(pair<_T1, _T2>& __p) _NOEXCEPT  }  template <size_t _Ip, class _T1, class _T2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14  const typename tuple_element<_Ip, pair<_T1, _T2> >::type&  get(const pair<_T1, _T2>& __p) _NOEXCEPT  {      return __get_pair<_Ip>::get(__p);  } -#ifndef _LIBCPP_CXX03_LANG  template <size_t _Ip, class _T1, class _T2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14  typename tuple_element<_Ip, pair<_T1, _T2> >::type&&  get(pair<_T1, _T2>&& __p) _NOEXCEPT  { @@ -553,13 +650,12 @@ get(pair<_T1, _T2>&& __p) _NOEXCEPT  }  template <size_t _Ip, class _T1, class _T2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14  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_CXX03_LANG  #if _LIBCPP_STD_VER > 11  template <class _T1, class _T2> @@ -618,7 +714,7 @@ constexpr _T1 const && get(pair<_T2, _T1> const&& __p) _NOEXCEPT      return __get_pair<1>::get(_VSTD::move(__p));  } -#endif +#endif // _LIBCPP_STD_VER > 11  _LIBCPP_END_NAMESPACE_STD | 
