1*58b9f456SAndroid Build Coastguard Worker// -*- C++ -*- 2*58b9f456SAndroid Build Coastguard Worker//===-------------------------- utility -----------------------------------===// 3*58b9f456SAndroid Build Coastguard Worker// 4*58b9f456SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 5*58b9f456SAndroid Build Coastguard Worker// 6*58b9f456SAndroid Build Coastguard Worker// This file is dual licensed under the MIT and the University of Illinois Open 7*58b9f456SAndroid Build Coastguard Worker// Source Licenses. See LICENSE.TXT for details. 8*58b9f456SAndroid Build Coastguard Worker// 9*58b9f456SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 10*58b9f456SAndroid Build Coastguard Worker 11*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_UTILITY 12*58b9f456SAndroid Build Coastguard Worker#define _LIBCPP_UTILITY 13*58b9f456SAndroid Build Coastguard Worker 14*58b9f456SAndroid Build Coastguard Worker/* 15*58b9f456SAndroid Build Coastguard Worker utility synopsis 16*58b9f456SAndroid Build Coastguard Worker 17*58b9f456SAndroid Build Coastguard Worker#include <initializer_list> 18*58b9f456SAndroid Build Coastguard Worker 19*58b9f456SAndroid Build Coastguard Workernamespace std 20*58b9f456SAndroid Build Coastguard Worker{ 21*58b9f456SAndroid Build Coastguard Worker 22*58b9f456SAndroid Build Coastguard Workertemplate <class T> 23*58b9f456SAndroid Build Coastguard Worker void 24*58b9f456SAndroid Build Coastguard Worker swap(T& a, T& b); 25*58b9f456SAndroid Build Coastguard Worker 26*58b9f456SAndroid Build Coastguard Workernamespace rel_ops 27*58b9f456SAndroid Build Coastguard Worker{ 28*58b9f456SAndroid Build Coastguard Worker template<class T> bool operator!=(const T&, const T&); 29*58b9f456SAndroid Build Coastguard Worker template<class T> bool operator> (const T&, const T&); 30*58b9f456SAndroid Build Coastguard Worker template<class T> bool operator<=(const T&, const T&); 31*58b9f456SAndroid Build Coastguard Worker template<class T> bool operator>=(const T&, const T&); 32*58b9f456SAndroid Build Coastguard Worker} 33*58b9f456SAndroid Build Coastguard Worker 34*58b9f456SAndroid Build Coastguard Workertemplate<class T> 35*58b9f456SAndroid Build Coastguard Workervoid 36*58b9f456SAndroid Build Coastguard Workerswap(T& a, T& b) noexcept(is_nothrow_move_constructible<T>::value && 37*58b9f456SAndroid Build Coastguard Worker is_nothrow_move_assignable<T>::value); 38*58b9f456SAndroid Build Coastguard Worker 39*58b9f456SAndroid Build Coastguard Workertemplate <class T, size_t N> 40*58b9f456SAndroid Build Coastguard Workervoid 41*58b9f456SAndroid Build Coastguard Workerswap(T (&a)[N], T (&b)[N]) noexcept(noexcept(swap(*a, *b))); 42*58b9f456SAndroid Build Coastguard Worker 43*58b9f456SAndroid Build Coastguard Workertemplate <class T> T&& forward(typename remove_reference<T>::type& t) noexcept; // constexpr in C++14 44*58b9f456SAndroid Build Coastguard Workertemplate <class T> T&& forward(typename remove_reference<T>::type&& t) noexcept; // constexpr in C++14 45*58b9f456SAndroid Build Coastguard Worker 46*58b9f456SAndroid Build Coastguard Workertemplate <class T> typename remove_reference<T>::type&& move(T&&) noexcept; // constexpr in C++14 47*58b9f456SAndroid Build Coastguard Worker 48*58b9f456SAndroid Build Coastguard Workertemplate <class T> 49*58b9f456SAndroid Build Coastguard Worker typename conditional 50*58b9f456SAndroid Build Coastguard Worker < 51*58b9f456SAndroid Build Coastguard Worker !is_nothrow_move_constructible<T>::value && is_copy_constructible<T>::value, 52*58b9f456SAndroid Build Coastguard Worker const T&, 53*58b9f456SAndroid Build Coastguard Worker T&& 54*58b9f456SAndroid Build Coastguard Worker >::type 55*58b9f456SAndroid Build Coastguard Worker move_if_noexcept(T& x) noexcept; // constexpr in C++14 56*58b9f456SAndroid Build Coastguard Worker 57*58b9f456SAndroid Build Coastguard Workertemplate <class T> constexpr add_const_t<T>& as_const(T& t) noexcept; // C++17 58*58b9f456SAndroid Build Coastguard Workertemplate <class T> void as_const(const T&&) = delete; // C++17 59*58b9f456SAndroid Build Coastguard Worker 60*58b9f456SAndroid Build Coastguard Workertemplate <class T> typename add_rvalue_reference<T>::type declval() noexcept; 61*58b9f456SAndroid Build Coastguard Worker 62*58b9f456SAndroid Build Coastguard Workertemplate <class T1, class T2> 63*58b9f456SAndroid Build Coastguard Workerstruct pair 64*58b9f456SAndroid Build Coastguard Worker{ 65*58b9f456SAndroid Build Coastguard Worker typedef T1 first_type; 66*58b9f456SAndroid Build Coastguard Worker typedef T2 second_type; 67*58b9f456SAndroid Build Coastguard Worker 68*58b9f456SAndroid Build Coastguard Worker T1 first; 69*58b9f456SAndroid Build Coastguard Worker T2 second; 70*58b9f456SAndroid Build Coastguard Worker 71*58b9f456SAndroid Build Coastguard Worker pair(const pair&) = default; 72*58b9f456SAndroid Build Coastguard Worker pair(pair&&) = default; 73*58b9f456SAndroid Build Coastguard Worker constexpr pair(); 74*58b9f456SAndroid Build Coastguard Worker pair(const T1& x, const T2& y); // constexpr in C++14 75*58b9f456SAndroid Build Coastguard Worker template <class U, class V> pair(U&& x, V&& y); // constexpr in C++14 76*58b9f456SAndroid Build Coastguard Worker template <class U, class V> pair(const pair<U, V>& p); // constexpr in C++14 77*58b9f456SAndroid Build Coastguard Worker template <class U, class V> pair(pair<U, V>&& p); // constexpr in C++14 78*58b9f456SAndroid Build Coastguard Worker template <class... Args1, class... Args2> 79*58b9f456SAndroid Build Coastguard Worker pair(piecewise_construct_t, tuple<Args1...> first_args, 80*58b9f456SAndroid Build Coastguard Worker tuple<Args2...> second_args); 81*58b9f456SAndroid Build Coastguard Worker 82*58b9f456SAndroid Build Coastguard Worker template <class U, class V> pair& operator=(const pair<U, V>& p); 83*58b9f456SAndroid Build Coastguard Worker pair& operator=(pair&& p) noexcept(is_nothrow_move_assignable<T1>::value && 84*58b9f456SAndroid Build Coastguard Worker is_nothrow_move_assignable<T2>::value); 85*58b9f456SAndroid Build Coastguard Worker template <class U, class V> pair& operator=(pair<U, V>&& p); 86*58b9f456SAndroid Build Coastguard Worker 87*58b9f456SAndroid Build Coastguard Worker void swap(pair& p) noexcept(is_nothrow_swappable_v<T1> && 88*58b9f456SAndroid Build Coastguard Worker is_nothrow_swappable_v<T2>); 89*58b9f456SAndroid Build Coastguard Worker}; 90*58b9f456SAndroid Build Coastguard Worker 91*58b9f456SAndroid Build Coastguard Workertemplate <class T1, class T2> bool operator==(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 92*58b9f456SAndroid Build Coastguard Workertemplate <class T1, class T2> bool operator!=(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 93*58b9f456SAndroid Build Coastguard Workertemplate <class T1, class T2> bool operator< (const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 94*58b9f456SAndroid Build Coastguard Workertemplate <class T1, class T2> bool operator> (const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 95*58b9f456SAndroid Build Coastguard Workertemplate <class T1, class T2> bool operator>=(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 96*58b9f456SAndroid Build Coastguard Workertemplate <class T1, class T2> bool operator<=(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 97*58b9f456SAndroid Build Coastguard Worker 98*58b9f456SAndroid Build Coastguard Workertemplate <class T1, class T2> pair<V1, V2> make_pair(T1&&, T2&&); // constexpr in C++14 99*58b9f456SAndroid Build Coastguard Workertemplate <class T1, class T2> 100*58b9f456SAndroid Build Coastguard Workervoid 101*58b9f456SAndroid Build Coastguard Workerswap(pair<T1, T2>& x, pair<T1, T2>& y) noexcept(noexcept(x.swap(y))); 102*58b9f456SAndroid Build Coastguard Worker 103*58b9f456SAndroid Build Coastguard Workerstruct piecewise_construct_t { }; 104*58b9f456SAndroid Build Coastguard Workerinline constexpr piecewise_construct_t piecewise_construct = piecewise_construct_t(); 105*58b9f456SAndroid Build Coastguard Worker 106*58b9f456SAndroid Build Coastguard Workertemplate <class T> struct tuple_size; 107*58b9f456SAndroid Build Coastguard Workertemplate <size_t I, class T> class tuple_element; 108*58b9f456SAndroid Build Coastguard Worker 109*58b9f456SAndroid Build Coastguard Workertemplate <class T1, class T2> struct tuple_size<pair<T1, T2> >; 110*58b9f456SAndroid Build Coastguard Workertemplate <class T1, class T2> struct tuple_element<0, pair<T1, T2> >; 111*58b9f456SAndroid Build Coastguard Workertemplate <class T1, class T2> struct tuple_element<1, pair<T1, T2> >; 112*58b9f456SAndroid Build Coastguard Worker 113*58b9f456SAndroid Build Coastguard Workertemplate<size_t I, class T1, class T2> 114*58b9f456SAndroid Build Coastguard Worker typename tuple_element<I, pair<T1, T2> >::type& 115*58b9f456SAndroid Build Coastguard Worker get(pair<T1, T2>&) noexcept; // constexpr in C++14 116*58b9f456SAndroid Build Coastguard Worker 117*58b9f456SAndroid Build Coastguard Workertemplate<size_t I, class T1, class T2> 118*58b9f456SAndroid Build Coastguard Worker const typename tuple_element<I, pair<T1, T2> >::type& 119*58b9f456SAndroid Build Coastguard Worker get(const pair<T1, T2>&) noexcept; // constexpr in C++14 120*58b9f456SAndroid Build Coastguard Worker 121*58b9f456SAndroid Build Coastguard Workertemplate<size_t I, class T1, class T2> 122*58b9f456SAndroid Build Coastguard Worker typename tuple_element<I, pair<T1, T2> >::type&& 123*58b9f456SAndroid Build Coastguard Worker get(pair<T1, T2>&&) noexcept; // constexpr in C++14 124*58b9f456SAndroid Build Coastguard Worker 125*58b9f456SAndroid Build Coastguard Workertemplate<size_t I, class T1, class T2> 126*58b9f456SAndroid Build Coastguard Worker const typename tuple_element<I, pair<T1, T2> >::type&& 127*58b9f456SAndroid Build Coastguard Worker get(const pair<T1, T2>&&) noexcept; // constexpr in C++14 128*58b9f456SAndroid Build Coastguard Worker 129*58b9f456SAndroid Build Coastguard Workertemplate<class T1, class T2> 130*58b9f456SAndroid Build Coastguard Worker constexpr T1& get(pair<T1, T2>&) noexcept; // C++14 131*58b9f456SAndroid Build Coastguard Worker 132*58b9f456SAndroid Build Coastguard Workertemplate<class T1, class T2> 133*58b9f456SAndroid Build Coastguard Worker constexpr const T1& get(const pair<T1, T2>&) noexcept; // C++14 134*58b9f456SAndroid Build Coastguard Worker 135*58b9f456SAndroid Build Coastguard Workertemplate<class T1, class T2> 136*58b9f456SAndroid Build Coastguard Worker constexpr T1&& get(pair<T1, T2>&&) noexcept; // C++14 137*58b9f456SAndroid Build Coastguard Worker 138*58b9f456SAndroid Build Coastguard Workertemplate<class T1, class T2> 139*58b9f456SAndroid Build Coastguard Worker constexpr const T1&& get(const pair<T1, T2>&&) noexcept; // C++14 140*58b9f456SAndroid Build Coastguard Worker 141*58b9f456SAndroid Build Coastguard Workertemplate<class T1, class T2> 142*58b9f456SAndroid Build Coastguard Worker constexpr T1& get(pair<T2, T1>&) noexcept; // C++14 143*58b9f456SAndroid Build Coastguard Worker 144*58b9f456SAndroid Build Coastguard Workertemplate<class T1, class T2> 145*58b9f456SAndroid Build Coastguard Worker constexpr const T1& get(const pair<T2, T1>&) noexcept; // C++14 146*58b9f456SAndroid Build Coastguard Worker 147*58b9f456SAndroid Build Coastguard Workertemplate<class T1, class T2> 148*58b9f456SAndroid Build Coastguard Worker constexpr T1&& get(pair<T2, T1>&&) noexcept; // C++14 149*58b9f456SAndroid Build Coastguard Worker 150*58b9f456SAndroid Build Coastguard Workertemplate<class T1, class T2> 151*58b9f456SAndroid Build Coastguard Worker constexpr const T1&& get(const pair<T2, T1>&&) noexcept; // C++14 152*58b9f456SAndroid Build Coastguard Worker 153*58b9f456SAndroid Build Coastguard Worker// C++14 154*58b9f456SAndroid Build Coastguard Worker 155*58b9f456SAndroid Build Coastguard Workertemplate<class T, T... I> 156*58b9f456SAndroid Build Coastguard Workerstruct integer_sequence 157*58b9f456SAndroid Build Coastguard Worker{ 158*58b9f456SAndroid Build Coastguard Worker typedef T value_type; 159*58b9f456SAndroid Build Coastguard Worker 160*58b9f456SAndroid Build Coastguard Worker static constexpr size_t size() noexcept; 161*58b9f456SAndroid Build Coastguard Worker}; 162*58b9f456SAndroid Build Coastguard Worker 163*58b9f456SAndroid Build Coastguard Workertemplate<size_t... I> 164*58b9f456SAndroid Build Coastguard Worker using index_sequence = integer_sequence<size_t, I...>; 165*58b9f456SAndroid Build Coastguard Worker 166*58b9f456SAndroid Build Coastguard Workertemplate<class T, T N> 167*58b9f456SAndroid Build Coastguard Worker using make_integer_sequence = integer_sequence<T, 0, 1, ..., N-1>; 168*58b9f456SAndroid Build Coastguard Workertemplate<size_t N> 169*58b9f456SAndroid Build Coastguard Worker using make_index_sequence = make_integer_sequence<size_t, N>; 170*58b9f456SAndroid Build Coastguard Worker 171*58b9f456SAndroid Build Coastguard Workertemplate<class... T> 172*58b9f456SAndroid Build Coastguard Worker using index_sequence_for = make_index_sequence<sizeof...(T)>; 173*58b9f456SAndroid Build Coastguard Worker 174*58b9f456SAndroid Build Coastguard Workertemplate<class T, class U=T> 175*58b9f456SAndroid Build Coastguard Worker T exchange(T& obj, U&& new_value); 176*58b9f456SAndroid Build Coastguard Worker 177*58b9f456SAndroid Build Coastguard Worker// 20.2.7, in-place construction // C++17 178*58b9f456SAndroid Build Coastguard Workerstruct in_place_t { 179*58b9f456SAndroid Build Coastguard Worker explicit in_place_t() = default; 180*58b9f456SAndroid Build Coastguard Worker}; 181*58b9f456SAndroid Build Coastguard Workerinline constexpr in_place_t in_place{}; 182*58b9f456SAndroid Build Coastguard Workertemplate <class T> 183*58b9f456SAndroid Build Coastguard Worker struct in_place_type_t { 184*58b9f456SAndroid Build Coastguard Worker explicit in_place_type_t() = default; 185*58b9f456SAndroid Build Coastguard Worker }; 186*58b9f456SAndroid Build Coastguard Workertemplate <class T> 187*58b9f456SAndroid Build Coastguard Worker inline constexpr in_place_type_t<T> in_place_type{}; 188*58b9f456SAndroid Build Coastguard Workertemplate <size_t I> 189*58b9f456SAndroid Build Coastguard Worker struct in_place_index_t { 190*58b9f456SAndroid Build Coastguard Worker explicit in_place_index_t() = default; 191*58b9f456SAndroid Build Coastguard Worker }; 192*58b9f456SAndroid Build Coastguard Workertemplate <size_t I> 193*58b9f456SAndroid Build Coastguard Worker inline constexpr in_place_index_t<I> in_place_index{}; 194*58b9f456SAndroid Build Coastguard Worker 195*58b9f456SAndroid Build Coastguard Worker} // std 196*58b9f456SAndroid Build Coastguard Worker 197*58b9f456SAndroid Build Coastguard Worker*/ 198*58b9f456SAndroid Build Coastguard Worker 199*58b9f456SAndroid Build Coastguard Worker#include <__config> 200*58b9f456SAndroid Build Coastguard Worker#include <__tuple> 201*58b9f456SAndroid Build Coastguard Worker#include <type_traits> 202*58b9f456SAndroid Build Coastguard Worker#include <initializer_list> 203*58b9f456SAndroid Build Coastguard Worker#include <cstddef> 204*58b9f456SAndroid Build Coastguard Worker#include <cstring> 205*58b9f456SAndroid Build Coastguard Worker#include <cstdint> 206*58b9f456SAndroid Build Coastguard Worker#include <version> 207*58b9f456SAndroid Build Coastguard Worker#include <__debug> 208*58b9f456SAndroid Build Coastguard Worker 209*58b9f456SAndroid Build Coastguard Worker#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 210*58b9f456SAndroid Build Coastguard Worker#pragma GCC system_header 211*58b9f456SAndroid Build Coastguard Worker#endif 212*58b9f456SAndroid Build Coastguard Worker 213*58b9f456SAndroid Build Coastguard Worker_LIBCPP_BEGIN_NAMESPACE_STD 214*58b9f456SAndroid Build Coastguard Worker 215*58b9f456SAndroid Build Coastguard Workernamespace rel_ops 216*58b9f456SAndroid Build Coastguard Worker{ 217*58b9f456SAndroid Build Coastguard Worker 218*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 219*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 220*58b9f456SAndroid Build Coastguard Workerbool 221*58b9f456SAndroid Build Coastguard Workeroperator!=(const _Tp& __x, const _Tp& __y) 222*58b9f456SAndroid Build Coastguard Worker{ 223*58b9f456SAndroid Build Coastguard Worker return !(__x == __y); 224*58b9f456SAndroid Build Coastguard Worker} 225*58b9f456SAndroid Build Coastguard Worker 226*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 227*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 228*58b9f456SAndroid Build Coastguard Workerbool 229*58b9f456SAndroid Build Coastguard Workeroperator> (const _Tp& __x, const _Tp& __y) 230*58b9f456SAndroid Build Coastguard Worker{ 231*58b9f456SAndroid Build Coastguard Worker return __y < __x; 232*58b9f456SAndroid Build Coastguard Worker} 233*58b9f456SAndroid Build Coastguard Worker 234*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 235*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 236*58b9f456SAndroid Build Coastguard Workerbool 237*58b9f456SAndroid Build Coastguard Workeroperator<=(const _Tp& __x, const _Tp& __y) 238*58b9f456SAndroid Build Coastguard Worker{ 239*58b9f456SAndroid Build Coastguard Worker return !(__y < __x); 240*58b9f456SAndroid Build Coastguard Worker} 241*58b9f456SAndroid Build Coastguard Worker 242*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 243*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 244*58b9f456SAndroid Build Coastguard Workerbool 245*58b9f456SAndroid Build Coastguard Workeroperator>=(const _Tp& __x, const _Tp& __y) 246*58b9f456SAndroid Build Coastguard Worker{ 247*58b9f456SAndroid Build Coastguard Worker return !(__x < __y); 248*58b9f456SAndroid Build Coastguard Worker} 249*58b9f456SAndroid Build Coastguard Worker 250*58b9f456SAndroid Build Coastguard Worker} // rel_ops 251*58b9f456SAndroid Build Coastguard Worker 252*58b9f456SAndroid Build Coastguard Worker// swap_ranges 253*58b9f456SAndroid Build Coastguard Worker 254*58b9f456SAndroid Build Coastguard Worker 255*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator1, class _ForwardIterator2> 256*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 257*58b9f456SAndroid Build Coastguard Worker_ForwardIterator2 258*58b9f456SAndroid Build Coastguard Workerswap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2) 259*58b9f456SAndroid Build Coastguard Worker{ 260*58b9f456SAndroid Build Coastguard Worker for(; __first1 != __last1; ++__first1, (void) ++__first2) 261*58b9f456SAndroid Build Coastguard Worker swap(*__first1, *__first2); 262*58b9f456SAndroid Build Coastguard Worker return __first2; 263*58b9f456SAndroid Build Coastguard Worker} 264*58b9f456SAndroid Build Coastguard Worker 265*58b9f456SAndroid Build Coastguard Worker// forward declared in <type_traits> 266*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp, size_t _Np> 267*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 268*58b9f456SAndroid Build Coastguard Workertypename enable_if< 269*58b9f456SAndroid Build Coastguard Worker __is_swappable<_Tp>::value 270*58b9f456SAndroid Build Coastguard Worker>::type 271*58b9f456SAndroid Build Coastguard Workerswap(_Tp (&__a)[_Np], _Tp (&__b)[_Np]) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) 272*58b9f456SAndroid Build Coastguard Worker{ 273*58b9f456SAndroid Build Coastguard Worker _VSTD::swap_ranges(__a, __a + _Np, __b); 274*58b9f456SAndroid Build Coastguard Worker} 275*58b9f456SAndroid Build Coastguard Worker 276*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 277*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 278*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG 279*58b9f456SAndroid Build Coastguard Workertypename conditional 280*58b9f456SAndroid Build Coastguard Worker< 281*58b9f456SAndroid Build Coastguard Worker !is_nothrow_move_constructible<_Tp>::value && is_copy_constructible<_Tp>::value, 282*58b9f456SAndroid Build Coastguard Worker const _Tp&, 283*58b9f456SAndroid Build Coastguard Worker _Tp&& 284*58b9f456SAndroid Build Coastguard Worker>::type 285*58b9f456SAndroid Build Coastguard Worker#else // _LIBCPP_CXX03_LANG 286*58b9f456SAndroid Build Coastguard Workerconst _Tp& 287*58b9f456SAndroid Build Coastguard Worker#endif 288*58b9f456SAndroid Build Coastguard Workermove_if_noexcept(_Tp& __x) _NOEXCEPT 289*58b9f456SAndroid Build Coastguard Worker{ 290*58b9f456SAndroid Build Coastguard Worker return _VSTD::move(__x); 291*58b9f456SAndroid Build Coastguard Worker} 292*58b9f456SAndroid Build Coastguard Worker 293*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 14 294*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> constexpr add_const_t<_Tp>& as_const(_Tp& __t) noexcept { return __t; } 295*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> void as_const(const _Tp&&) = delete; 296*58b9f456SAndroid Build Coastguard Worker#endif 297*58b9f456SAndroid Build Coastguard Worker 298*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS piecewise_construct_t { }; 299*58b9f456SAndroid Build Coastguard Worker#if defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY) 300*58b9f456SAndroid Build Coastguard Workerextern _LIBCPP_EXPORTED_FROM_ABI const piecewise_construct_t piecewise_construct;// = piecewise_construct_t(); 301*58b9f456SAndroid Build Coastguard Worker#else 302*58b9f456SAndroid Build Coastguard Worker/* _LIBCPP_INLINE_VAR */ constexpr piecewise_construct_t piecewise_construct = piecewise_construct_t(); 303*58b9f456SAndroid Build Coastguard Worker#endif 304*58b9f456SAndroid Build Coastguard Worker 305*58b9f456SAndroid Build Coastguard Worker#if defined(_LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR) 306*58b9f456SAndroid Build Coastguard Workerstruct __non_trivially_copyable_base { 307*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 308*58b9f456SAndroid Build Coastguard Worker __non_trivially_copyable_base() _NOEXCEPT {} 309*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 310*58b9f456SAndroid Build Coastguard Worker __non_trivially_copyable_base(__non_trivially_copyable_base const&) _NOEXCEPT {} 311*58b9f456SAndroid Build Coastguard Worker}; 312*58b9f456SAndroid Build Coastguard Worker#endif 313*58b9f456SAndroid Build Coastguard Worker 314*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 315*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS pair 316*58b9f456SAndroid Build Coastguard Worker#if defined(_LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR) 317*58b9f456SAndroid Build Coastguard Worker: private __non_trivially_copyable_base 318*58b9f456SAndroid Build Coastguard Worker#endif 319*58b9f456SAndroid Build Coastguard Worker{ 320*58b9f456SAndroid Build Coastguard Worker typedef _T1 first_type; 321*58b9f456SAndroid Build Coastguard Worker typedef _T2 second_type; 322*58b9f456SAndroid Build Coastguard Worker 323*58b9f456SAndroid Build Coastguard Worker _T1 first; 324*58b9f456SAndroid Build Coastguard Worker _T2 second; 325*58b9f456SAndroid Build Coastguard Worker 326*58b9f456SAndroid Build Coastguard Worker#if !defined(_LIBCPP_CXX03_LANG) 327*58b9f456SAndroid Build Coastguard Worker pair(pair const&) = default; 328*58b9f456SAndroid Build Coastguard Worker pair(pair&&) = default; 329*58b9f456SAndroid Build Coastguard Worker#else 330*58b9f456SAndroid Build Coastguard Worker // Use the implicitly declared copy constructor in C++03 331*58b9f456SAndroid Build Coastguard Worker#endif 332*58b9f456SAndroid Build Coastguard Worker 333*58b9f456SAndroid Build Coastguard Worker#ifdef _LIBCPP_CXX03_LANG 334*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 335*58b9f456SAndroid Build Coastguard Worker pair() : first(), second() {} 336*58b9f456SAndroid Build Coastguard Worker 337*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 338*58b9f456SAndroid Build Coastguard Worker pair(_T1 const& __t1, _T2 const& __t2) : first(__t1), second(__t2) {} 339*58b9f456SAndroid Build Coastguard Worker 340*58b9f456SAndroid Build Coastguard Worker template <class _U1, class _U2> 341*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 342*58b9f456SAndroid Build Coastguard Worker pair(const pair<_U1, _U2>& __p) : first(__p.first), second(__p.second) {} 343*58b9f456SAndroid Build Coastguard Worker 344*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 345*58b9f456SAndroid Build Coastguard Worker pair& operator=(pair const& __p) { 346*58b9f456SAndroid Build Coastguard Worker first = __p.first; 347*58b9f456SAndroid Build Coastguard Worker second = __p.second; 348*58b9f456SAndroid Build Coastguard Worker return *this; 349*58b9f456SAndroid Build Coastguard Worker } 350*58b9f456SAndroid Build Coastguard Worker#else 351*58b9f456SAndroid Build Coastguard Worker template <bool _Val> 352*58b9f456SAndroid Build Coastguard Worker using _EnableB = typename enable_if<_Val, bool>::type; 353*58b9f456SAndroid Build Coastguard Worker 354*58b9f456SAndroid Build Coastguard Worker struct _CheckArgs { 355*58b9f456SAndroid Build Coastguard Worker template <class _U1, class _U2> 356*58b9f456SAndroid Build Coastguard Worker static constexpr bool __enable_default() { 357*58b9f456SAndroid Build Coastguard Worker return is_default_constructible<_U1>::value 358*58b9f456SAndroid Build Coastguard Worker && is_default_constructible<_U2>::value; 359*58b9f456SAndroid Build Coastguard Worker } 360*58b9f456SAndroid Build Coastguard Worker 361*58b9f456SAndroid Build Coastguard Worker template <class _U1, class _U2> 362*58b9f456SAndroid Build Coastguard Worker static constexpr bool __enable_explicit() { 363*58b9f456SAndroid Build Coastguard Worker return is_constructible<first_type, _U1>::value 364*58b9f456SAndroid Build Coastguard Worker && is_constructible<second_type, _U2>::value 365*58b9f456SAndroid Build Coastguard Worker && (!is_convertible<_U1, first_type>::value 366*58b9f456SAndroid Build Coastguard Worker || !is_convertible<_U2, second_type>::value); 367*58b9f456SAndroid Build Coastguard Worker } 368*58b9f456SAndroid Build Coastguard Worker 369*58b9f456SAndroid Build Coastguard Worker template <class _U1, class _U2> 370*58b9f456SAndroid Build Coastguard Worker static constexpr bool __enable_implicit() { 371*58b9f456SAndroid Build Coastguard Worker return is_constructible<first_type, _U1>::value 372*58b9f456SAndroid Build Coastguard Worker && is_constructible<second_type, _U2>::value 373*58b9f456SAndroid Build Coastguard Worker && is_convertible<_U1, first_type>::value 374*58b9f456SAndroid Build Coastguard Worker && is_convertible<_U2, second_type>::value; 375*58b9f456SAndroid Build Coastguard Worker } 376*58b9f456SAndroid Build Coastguard Worker }; 377*58b9f456SAndroid Build Coastguard Worker 378*58b9f456SAndroid Build Coastguard Worker template <bool _MaybeEnable> 379*58b9f456SAndroid Build Coastguard Worker using _CheckArgsDep = typename conditional< 380*58b9f456SAndroid Build Coastguard Worker _MaybeEnable, _CheckArgs, __check_tuple_constructor_fail>::type; 381*58b9f456SAndroid Build Coastguard Worker 382*58b9f456SAndroid Build Coastguard Worker struct _CheckTupleLikeConstructor { 383*58b9f456SAndroid Build Coastguard Worker template <class _Tuple> 384*58b9f456SAndroid Build Coastguard Worker static constexpr bool __enable_implicit() { 385*58b9f456SAndroid Build Coastguard Worker return __tuple_convertible<_Tuple, pair>::value; 386*58b9f456SAndroid Build Coastguard Worker } 387*58b9f456SAndroid Build Coastguard Worker 388*58b9f456SAndroid Build Coastguard Worker template <class _Tuple> 389*58b9f456SAndroid Build Coastguard Worker static constexpr bool __enable_explicit() { 390*58b9f456SAndroid Build Coastguard Worker return __tuple_constructible<_Tuple, pair>::value 391*58b9f456SAndroid Build Coastguard Worker && !__tuple_convertible<_Tuple, pair>::value; 392*58b9f456SAndroid Build Coastguard Worker } 393*58b9f456SAndroid Build Coastguard Worker 394*58b9f456SAndroid Build Coastguard Worker template <class _Tuple> 395*58b9f456SAndroid Build Coastguard Worker static constexpr bool __enable_assign() { 396*58b9f456SAndroid Build Coastguard Worker return __tuple_assignable<_Tuple, pair>::value; 397*58b9f456SAndroid Build Coastguard Worker } 398*58b9f456SAndroid Build Coastguard Worker }; 399*58b9f456SAndroid Build Coastguard Worker 400*58b9f456SAndroid Build Coastguard Worker template <class _Tuple> 401*58b9f456SAndroid Build Coastguard Worker using _CheckTLC = typename conditional< 402*58b9f456SAndroid Build Coastguard Worker __tuple_like_with_size<_Tuple, 2>::value 403*58b9f456SAndroid Build Coastguard Worker && !is_same<typename decay<_Tuple>::type, pair>::value, 404*58b9f456SAndroid Build Coastguard Worker _CheckTupleLikeConstructor, 405*58b9f456SAndroid Build Coastguard Worker __check_tuple_constructor_fail 406*58b9f456SAndroid Build Coastguard Worker >::type; 407*58b9f456SAndroid Build Coastguard Worker 408*58b9f456SAndroid Build Coastguard Worker template<bool _Dummy = true, _EnableB< 409*58b9f456SAndroid Build Coastguard Worker _CheckArgsDep<_Dummy>::template __enable_default<_T1, _T2>() 410*58b9f456SAndroid Build Coastguard Worker > = false> 411*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 412*58b9f456SAndroid Build Coastguard Worker pair() _NOEXCEPT_(is_nothrow_default_constructible<first_type>::value && 413*58b9f456SAndroid Build Coastguard Worker is_nothrow_default_constructible<second_type>::value) 414*58b9f456SAndroid Build Coastguard Worker : first(), second() {} 415*58b9f456SAndroid Build Coastguard Worker 416*58b9f456SAndroid Build Coastguard Worker template <bool _Dummy = true, _EnableB< 417*58b9f456SAndroid Build Coastguard Worker _CheckArgsDep<_Dummy>::template __enable_explicit<_T1 const&, _T2 const&>() 418*58b9f456SAndroid Build Coastguard Worker > = false> 419*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 420*58b9f456SAndroid Build Coastguard Worker explicit pair(_T1 const& __t1, _T2 const& __t2) 421*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(is_nothrow_copy_constructible<first_type>::value && 422*58b9f456SAndroid Build Coastguard Worker is_nothrow_copy_constructible<second_type>::value) 423*58b9f456SAndroid Build Coastguard Worker : first(__t1), second(__t2) {} 424*58b9f456SAndroid Build Coastguard Worker 425*58b9f456SAndroid Build Coastguard Worker template<bool _Dummy = true, _EnableB< 426*58b9f456SAndroid Build Coastguard Worker _CheckArgsDep<_Dummy>::template __enable_implicit<_T1 const&, _T2 const&>() 427*58b9f456SAndroid Build Coastguard Worker > = false> 428*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 429*58b9f456SAndroid Build Coastguard Worker pair(_T1 const& __t1, _T2 const& __t2) 430*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(is_nothrow_copy_constructible<first_type>::value && 431*58b9f456SAndroid Build Coastguard Worker is_nothrow_copy_constructible<second_type>::value) 432*58b9f456SAndroid Build Coastguard Worker : first(__t1), second(__t2) {} 433*58b9f456SAndroid Build Coastguard Worker 434*58b9f456SAndroid Build Coastguard Worker template<class _U1, class _U2, _EnableB< 435*58b9f456SAndroid Build Coastguard Worker _CheckArgs::template __enable_explicit<_U1, _U2>() 436*58b9f456SAndroid Build Coastguard Worker > = false> 437*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 438*58b9f456SAndroid Build Coastguard Worker explicit pair(_U1&& __u1, _U2&& __u2) 439*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_((is_nothrow_constructible<first_type, _U1>::value && 440*58b9f456SAndroid Build Coastguard Worker is_nothrow_constructible<second_type, _U2>::value)) 441*58b9f456SAndroid Build Coastguard Worker : first(_VSTD::forward<_U1>(__u1)), second(_VSTD::forward<_U2>(__u2)) {} 442*58b9f456SAndroid Build Coastguard Worker 443*58b9f456SAndroid Build Coastguard Worker template<class _U1, class _U2, _EnableB< 444*58b9f456SAndroid Build Coastguard Worker _CheckArgs::template __enable_implicit<_U1, _U2>() 445*58b9f456SAndroid Build Coastguard Worker > = false> 446*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 447*58b9f456SAndroid Build Coastguard Worker pair(_U1&& __u1, _U2&& __u2) 448*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_((is_nothrow_constructible<first_type, _U1>::value && 449*58b9f456SAndroid Build Coastguard Worker is_nothrow_constructible<second_type, _U2>::value)) 450*58b9f456SAndroid Build Coastguard Worker : first(_VSTD::forward<_U1>(__u1)), second(_VSTD::forward<_U2>(__u2)) {} 451*58b9f456SAndroid Build Coastguard Worker 452*58b9f456SAndroid Build Coastguard Worker template<class _U1, class _U2, _EnableB< 453*58b9f456SAndroid Build Coastguard Worker _CheckArgs::template __enable_explicit<_U1 const&, _U2 const&>() 454*58b9f456SAndroid Build Coastguard Worker > = false> 455*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 456*58b9f456SAndroid Build Coastguard Worker explicit pair(pair<_U1, _U2> const& __p) 457*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_((is_nothrow_constructible<first_type, _U1 const&>::value && 458*58b9f456SAndroid Build Coastguard Worker is_nothrow_constructible<second_type, _U2 const&>::value)) 459*58b9f456SAndroid Build Coastguard Worker : first(__p.first), second(__p.second) {} 460*58b9f456SAndroid Build Coastguard Worker 461*58b9f456SAndroid Build Coastguard Worker template<class _U1, class _U2, _EnableB< 462*58b9f456SAndroid Build Coastguard Worker _CheckArgs::template __enable_implicit<_U1 const&, _U2 const&>() 463*58b9f456SAndroid Build Coastguard Worker > = false> 464*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 465*58b9f456SAndroid Build Coastguard Worker pair(pair<_U1, _U2> const& __p) 466*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_((is_nothrow_constructible<first_type, _U1 const&>::value && 467*58b9f456SAndroid Build Coastguard Worker is_nothrow_constructible<second_type, _U2 const&>::value)) 468*58b9f456SAndroid Build Coastguard Worker : first(__p.first), second(__p.second) {} 469*58b9f456SAndroid Build Coastguard Worker 470*58b9f456SAndroid Build Coastguard Worker template<class _U1, class _U2, _EnableB< 471*58b9f456SAndroid Build Coastguard Worker _CheckArgs::template __enable_explicit<_U1, _U2>() 472*58b9f456SAndroid Build Coastguard Worker > = false> 473*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 474*58b9f456SAndroid Build Coastguard Worker explicit pair(pair<_U1, _U2>&&__p) 475*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_((is_nothrow_constructible<first_type, _U1&&>::value && 476*58b9f456SAndroid Build Coastguard Worker is_nothrow_constructible<second_type, _U2&&>::value)) 477*58b9f456SAndroid Build Coastguard Worker : first(_VSTD::forward<_U1>(__p.first)), second(_VSTD::forward<_U2>(__p.second)) {} 478*58b9f456SAndroid Build Coastguard Worker 479*58b9f456SAndroid Build Coastguard Worker template<class _U1, class _U2, _EnableB< 480*58b9f456SAndroid Build Coastguard Worker _CheckArgs::template __enable_implicit<_U1, _U2>() 481*58b9f456SAndroid Build Coastguard Worker > = false> 482*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 483*58b9f456SAndroid Build Coastguard Worker pair(pair<_U1, _U2>&& __p) 484*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_((is_nothrow_constructible<first_type, _U1&&>::value && 485*58b9f456SAndroid Build Coastguard Worker is_nothrow_constructible<second_type, _U2&&>::value)) 486*58b9f456SAndroid Build Coastguard Worker : first(_VSTD::forward<_U1>(__p.first)), second(_VSTD::forward<_U2>(__p.second)) {} 487*58b9f456SAndroid Build Coastguard Worker 488*58b9f456SAndroid Build Coastguard Worker template<class _Tuple, _EnableB< 489*58b9f456SAndroid Build Coastguard Worker _CheckTLC<_Tuple>::template __enable_explicit<_Tuple>() 490*58b9f456SAndroid Build Coastguard Worker > = false> 491*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 492*58b9f456SAndroid Build Coastguard Worker explicit pair(_Tuple&& __p) 493*58b9f456SAndroid Build Coastguard Worker : first(_VSTD::get<0>(_VSTD::forward<_Tuple>(__p))), 494*58b9f456SAndroid Build Coastguard Worker second(_VSTD::get<1>(_VSTD::forward<_Tuple>(__p))) {} 495*58b9f456SAndroid Build Coastguard Worker 496*58b9f456SAndroid Build Coastguard Worker template<class _Tuple, _EnableB< 497*58b9f456SAndroid Build Coastguard Worker _CheckTLC<_Tuple>::template __enable_implicit<_Tuple>() 498*58b9f456SAndroid Build Coastguard Worker > = false> 499*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 500*58b9f456SAndroid Build Coastguard Worker pair(_Tuple&& __p) 501*58b9f456SAndroid Build Coastguard Worker : first(_VSTD::get<0>(_VSTD::forward<_Tuple>(__p))), 502*58b9f456SAndroid Build Coastguard Worker second(_VSTD::get<1>(_VSTD::forward<_Tuple>(__p))) {} 503*58b9f456SAndroid Build Coastguard Worker 504*58b9f456SAndroid Build Coastguard Worker template <class... _Args1, class... _Args2> 505*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 506*58b9f456SAndroid Build Coastguard Worker pair(piecewise_construct_t __pc, 507*58b9f456SAndroid Build Coastguard Worker tuple<_Args1...> __first_args, tuple<_Args2...> __second_args) 508*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_((is_nothrow_constructible<first_type, _Args1...>::value && 509*58b9f456SAndroid Build Coastguard Worker is_nothrow_constructible<second_type, _Args2...>::value)) 510*58b9f456SAndroid Build Coastguard Worker : pair(__pc, __first_args, __second_args, 511*58b9f456SAndroid Build Coastguard Worker typename __make_tuple_indices<sizeof...(_Args1)>::type(), 512*58b9f456SAndroid Build Coastguard Worker typename __make_tuple_indices<sizeof...(_Args2) >::type()) {} 513*58b9f456SAndroid Build Coastguard Worker 514*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 515*58b9f456SAndroid Build Coastguard Worker pair& operator=(typename conditional< 516*58b9f456SAndroid Build Coastguard Worker is_copy_assignable<first_type>::value && 517*58b9f456SAndroid Build Coastguard Worker is_copy_assignable<second_type>::value, 518*58b9f456SAndroid Build Coastguard Worker pair, __nat>::type const& __p) 519*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(is_nothrow_copy_assignable<first_type>::value && 520*58b9f456SAndroid Build Coastguard Worker is_nothrow_copy_assignable<second_type>::value) 521*58b9f456SAndroid Build Coastguard Worker { 522*58b9f456SAndroid Build Coastguard Worker first = __p.first; 523*58b9f456SAndroid Build Coastguard Worker second = __p.second; 524*58b9f456SAndroid Build Coastguard Worker return *this; 525*58b9f456SAndroid Build Coastguard Worker } 526*58b9f456SAndroid Build Coastguard Worker 527*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 528*58b9f456SAndroid Build Coastguard Worker pair& operator=(typename conditional< 529*58b9f456SAndroid Build Coastguard Worker is_move_assignable<first_type>::value && 530*58b9f456SAndroid Build Coastguard Worker is_move_assignable<second_type>::value, 531*58b9f456SAndroid Build Coastguard Worker pair, __nat>::type&& __p) 532*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_(is_nothrow_move_assignable<first_type>::value && 533*58b9f456SAndroid Build Coastguard Worker is_nothrow_move_assignable<second_type>::value) 534*58b9f456SAndroid Build Coastguard Worker { 535*58b9f456SAndroid Build Coastguard Worker first = _VSTD::forward<first_type>(__p.first); 536*58b9f456SAndroid Build Coastguard Worker second = _VSTD::forward<second_type>(__p.second); 537*58b9f456SAndroid Build Coastguard Worker return *this; 538*58b9f456SAndroid Build Coastguard Worker } 539*58b9f456SAndroid Build Coastguard Worker 540*58b9f456SAndroid Build Coastguard Worker template <class _Tuple, _EnableB< 541*58b9f456SAndroid Build Coastguard Worker _CheckTLC<_Tuple>::template __enable_assign<_Tuple>() 542*58b9f456SAndroid Build Coastguard Worker > = false> 543*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 544*58b9f456SAndroid Build Coastguard Worker pair& operator=(_Tuple&& __p) { 545*58b9f456SAndroid Build Coastguard Worker first = _VSTD::get<0>(_VSTD::forward<_Tuple>(__p)); 546*58b9f456SAndroid Build Coastguard Worker second = _VSTD::get<1>(_VSTD::forward<_Tuple>(__p)); 547*58b9f456SAndroid Build Coastguard Worker return *this; 548*58b9f456SAndroid Build Coastguard Worker } 549*58b9f456SAndroid Build Coastguard Worker#endif 550*58b9f456SAndroid Build Coastguard Worker 551*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 552*58b9f456SAndroid Build Coastguard Worker void 553*58b9f456SAndroid Build Coastguard Worker swap(pair& __p) _NOEXCEPT_(__is_nothrow_swappable<first_type>::value && 554*58b9f456SAndroid Build Coastguard Worker __is_nothrow_swappable<second_type>::value) 555*58b9f456SAndroid Build Coastguard Worker { 556*58b9f456SAndroid Build Coastguard Worker using _VSTD::swap; 557*58b9f456SAndroid Build Coastguard Worker swap(first, __p.first); 558*58b9f456SAndroid Build Coastguard Worker swap(second, __p.second); 559*58b9f456SAndroid Build Coastguard Worker } 560*58b9f456SAndroid Build Coastguard Workerprivate: 561*58b9f456SAndroid Build Coastguard Worker 562*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG 563*58b9f456SAndroid Build Coastguard Worker template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 564*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 565*58b9f456SAndroid Build Coastguard Worker pair(piecewise_construct_t, 566*58b9f456SAndroid Build Coastguard Worker tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args, 567*58b9f456SAndroid Build Coastguard Worker __tuple_indices<_I1...>, __tuple_indices<_I2...>); 568*58b9f456SAndroid Build Coastguard Worker#endif 569*58b9f456SAndroid Build Coastguard Worker}; 570*58b9f456SAndroid Build Coastguard Worker 571*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES 572*58b9f456SAndroid Build Coastguard Workertemplate<class _T1, class _T2> 573*58b9f456SAndroid Build Coastguard Workerpair(_T1, _T2) -> pair<_T1, _T2>; 574*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_HAS_NO_DEDUCTION_GUIDES 575*58b9f456SAndroid Build Coastguard Worker 576*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 577*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 578*58b9f456SAndroid Build Coastguard Workerbool 579*58b9f456SAndroid Build Coastguard Workeroperator==(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 580*58b9f456SAndroid Build Coastguard Worker{ 581*58b9f456SAndroid Build Coastguard Worker return __x.first == __y.first && __x.second == __y.second; 582*58b9f456SAndroid Build Coastguard Worker} 583*58b9f456SAndroid Build Coastguard Worker 584*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 585*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 586*58b9f456SAndroid Build Coastguard Workerbool 587*58b9f456SAndroid Build Coastguard Workeroperator!=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 588*58b9f456SAndroid Build Coastguard Worker{ 589*58b9f456SAndroid Build Coastguard Worker return !(__x == __y); 590*58b9f456SAndroid Build Coastguard Worker} 591*58b9f456SAndroid Build Coastguard Worker 592*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 593*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 594*58b9f456SAndroid Build Coastguard Workerbool 595*58b9f456SAndroid Build Coastguard Workeroperator< (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 596*58b9f456SAndroid Build Coastguard Worker{ 597*58b9f456SAndroid Build Coastguard Worker return __x.first < __y.first || (!(__y.first < __x.first) && __x.second < __y.second); 598*58b9f456SAndroid Build Coastguard Worker} 599*58b9f456SAndroid Build Coastguard Worker 600*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 601*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 602*58b9f456SAndroid Build Coastguard Workerbool 603*58b9f456SAndroid Build Coastguard Workeroperator> (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 604*58b9f456SAndroid Build Coastguard Worker{ 605*58b9f456SAndroid Build Coastguard Worker return __y < __x; 606*58b9f456SAndroid Build Coastguard Worker} 607*58b9f456SAndroid Build Coastguard Worker 608*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 609*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 610*58b9f456SAndroid Build Coastguard Workerbool 611*58b9f456SAndroid Build Coastguard Workeroperator>=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 612*58b9f456SAndroid Build Coastguard Worker{ 613*58b9f456SAndroid Build Coastguard Worker return !(__x < __y); 614*58b9f456SAndroid Build Coastguard Worker} 615*58b9f456SAndroid Build Coastguard Worker 616*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 617*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 618*58b9f456SAndroid Build Coastguard Workerbool 619*58b9f456SAndroid Build Coastguard Workeroperator<=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 620*58b9f456SAndroid Build Coastguard Worker{ 621*58b9f456SAndroid Build Coastguard Worker return !(__y < __x); 622*58b9f456SAndroid Build Coastguard Worker} 623*58b9f456SAndroid Build Coastguard Worker 624*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 625*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 626*58b9f456SAndroid Build Coastguard Workertypename enable_if 627*58b9f456SAndroid Build Coastguard Worker< 628*58b9f456SAndroid Build Coastguard Worker __is_swappable<_T1>::value && 629*58b9f456SAndroid Build Coastguard Worker __is_swappable<_T2>::value, 630*58b9f456SAndroid Build Coastguard Worker void 631*58b9f456SAndroid Build Coastguard Worker>::type 632*58b9f456SAndroid Build Coastguard Workerswap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y) 633*58b9f456SAndroid Build Coastguard Worker _NOEXCEPT_((__is_nothrow_swappable<_T1>::value && 634*58b9f456SAndroid Build Coastguard Worker __is_nothrow_swappable<_T2>::value)) 635*58b9f456SAndroid Build Coastguard Worker{ 636*58b9f456SAndroid Build Coastguard Worker __x.swap(__y); 637*58b9f456SAndroid Build Coastguard Worker} 638*58b9f456SAndroid Build Coastguard Worker 639*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 640*58b9f456SAndroid Build Coastguard Workerstruct __unwrap_reference { typedef _Tp type; }; 641*58b9f456SAndroid Build Coastguard Worker 642*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 643*58b9f456SAndroid Build Coastguard Workerstruct __unwrap_reference<reference_wrapper<_Tp> > { typedef _Tp& type; }; 644*58b9f456SAndroid Build Coastguard Worker 645*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 17 646*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 647*58b9f456SAndroid Build Coastguard Workerstruct unwrap_reference : __unwrap_reference<_Tp> { }; 648*58b9f456SAndroid Build Coastguard Worker 649*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 650*58b9f456SAndroid Build Coastguard Workerstruct unwrap_ref_decay : unwrap_reference<typename decay<_Tp>::type> { }; 651*58b9f456SAndroid Build Coastguard Worker#endif // > C++17 652*58b9f456SAndroid Build Coastguard Worker 653*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 654*58b9f456SAndroid Build Coastguard Workerstruct __unwrap_ref_decay 655*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 17 656*58b9f456SAndroid Build Coastguard Worker : unwrap_ref_decay<_Tp> 657*58b9f456SAndroid Build Coastguard Worker#else 658*58b9f456SAndroid Build Coastguard Worker : __unwrap_reference<typename decay<_Tp>::type> 659*58b9f456SAndroid Build Coastguard Worker#endif 660*58b9f456SAndroid Build Coastguard Worker{ }; 661*58b9f456SAndroid Build Coastguard Worker 662*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG 663*58b9f456SAndroid Build Coastguard Worker 664*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 665*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 666*58b9f456SAndroid Build Coastguard Workerpair<typename __unwrap_ref_decay<_T1>::type, typename __unwrap_ref_decay<_T2>::type> 667*58b9f456SAndroid Build Coastguard Workermake_pair(_T1&& __t1, _T2&& __t2) 668*58b9f456SAndroid Build Coastguard Worker{ 669*58b9f456SAndroid Build Coastguard Worker return pair<typename __unwrap_ref_decay<_T1>::type, typename __unwrap_ref_decay<_T2>::type> 670*58b9f456SAndroid Build Coastguard Worker (_VSTD::forward<_T1>(__t1), _VSTD::forward<_T2>(__t2)); 671*58b9f456SAndroid Build Coastguard Worker} 672*58b9f456SAndroid Build Coastguard Worker 673*58b9f456SAndroid Build Coastguard Worker#else // _LIBCPP_CXX03_LANG 674*58b9f456SAndroid Build Coastguard Worker 675*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 676*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 677*58b9f456SAndroid Build Coastguard Workerpair<_T1,_T2> 678*58b9f456SAndroid Build Coastguard Workermake_pair(_T1 __x, _T2 __y) 679*58b9f456SAndroid Build Coastguard Worker{ 680*58b9f456SAndroid Build Coastguard Worker return pair<_T1, _T2>(__x, __y); 681*58b9f456SAndroid Build Coastguard Worker} 682*58b9f456SAndroid Build Coastguard Worker 683*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_CXX03_LANG 684*58b9f456SAndroid Build Coastguard Worker 685*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 686*58b9f456SAndroid Build Coastguard Worker struct _LIBCPP_TEMPLATE_VIS tuple_size<pair<_T1, _T2> > 687*58b9f456SAndroid Build Coastguard Worker : public integral_constant<size_t, 2> {}; 688*58b9f456SAndroid Build Coastguard Worker 689*58b9f456SAndroid Build Coastguard Workertemplate <size_t _Ip, class _T1, class _T2> 690*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, pair<_T1, _T2> > 691*58b9f456SAndroid Build Coastguard Worker{ 692*58b9f456SAndroid Build Coastguard Worker static_assert(_Ip < 2, "Index out of bounds in std::tuple_element<std::pair<T1, T2>>"); 693*58b9f456SAndroid Build Coastguard Worker}; 694*58b9f456SAndroid Build Coastguard Worker 695*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 696*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS tuple_element<0, pair<_T1, _T2> > 697*58b9f456SAndroid Build Coastguard Worker{ 698*58b9f456SAndroid Build Coastguard Workerpublic: 699*58b9f456SAndroid Build Coastguard Worker typedef _T1 type; 700*58b9f456SAndroid Build Coastguard Worker}; 701*58b9f456SAndroid Build Coastguard Worker 702*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 703*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS tuple_element<1, pair<_T1, _T2> > 704*58b9f456SAndroid Build Coastguard Worker{ 705*58b9f456SAndroid Build Coastguard Workerpublic: 706*58b9f456SAndroid Build Coastguard Worker typedef _T2 type; 707*58b9f456SAndroid Build Coastguard Worker}; 708*58b9f456SAndroid Build Coastguard Worker 709*58b9f456SAndroid Build Coastguard Workertemplate <size_t _Ip> struct __get_pair; 710*58b9f456SAndroid Build Coastguard Worker 711*58b9f456SAndroid Build Coastguard Workertemplate <> 712*58b9f456SAndroid Build Coastguard Workerstruct __get_pair<0> 713*58b9f456SAndroid Build Coastguard Worker{ 714*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 715*58b9f456SAndroid Build Coastguard Worker static 716*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 717*58b9f456SAndroid Build Coastguard Worker _T1& 718*58b9f456SAndroid Build Coastguard Worker get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;} 719*58b9f456SAndroid Build Coastguard Worker 720*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 721*58b9f456SAndroid Build Coastguard Worker static 722*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 723*58b9f456SAndroid Build Coastguard Worker const _T1& 724*58b9f456SAndroid Build Coastguard Worker get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;} 725*58b9f456SAndroid Build Coastguard Worker 726*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG 727*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 728*58b9f456SAndroid Build Coastguard Worker static 729*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 730*58b9f456SAndroid Build Coastguard Worker _T1&& 731*58b9f456SAndroid Build Coastguard Worker get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T1>(__p.first);} 732*58b9f456SAndroid Build Coastguard Worker 733*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 734*58b9f456SAndroid Build Coastguard Worker static 735*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 736*58b9f456SAndroid Build Coastguard Worker const _T1&& 737*58b9f456SAndroid Build Coastguard Worker get(const pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<const _T1>(__p.first);} 738*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_CXX03_LANG 739*58b9f456SAndroid Build Coastguard Worker}; 740*58b9f456SAndroid Build Coastguard Worker 741*58b9f456SAndroid Build Coastguard Workertemplate <> 742*58b9f456SAndroid Build Coastguard Workerstruct __get_pair<1> 743*58b9f456SAndroid Build Coastguard Worker{ 744*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 745*58b9f456SAndroid Build Coastguard Worker static 746*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 747*58b9f456SAndroid Build Coastguard Worker _T2& 748*58b9f456SAndroid Build Coastguard Worker get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;} 749*58b9f456SAndroid Build Coastguard Worker 750*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 751*58b9f456SAndroid Build Coastguard Worker static 752*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 753*58b9f456SAndroid Build Coastguard Worker const _T2& 754*58b9f456SAndroid Build Coastguard Worker get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;} 755*58b9f456SAndroid Build Coastguard Worker 756*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG 757*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 758*58b9f456SAndroid Build Coastguard Worker static 759*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 760*58b9f456SAndroid Build Coastguard Worker _T2&& 761*58b9f456SAndroid Build Coastguard Worker get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T2>(__p.second);} 762*58b9f456SAndroid Build Coastguard Worker 763*58b9f456SAndroid Build Coastguard Worker template <class _T1, class _T2> 764*58b9f456SAndroid Build Coastguard Worker static 765*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 766*58b9f456SAndroid Build Coastguard Worker const _T2&& 767*58b9f456SAndroid Build Coastguard Worker get(const pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<const _T2>(__p.second);} 768*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_CXX03_LANG 769*58b9f456SAndroid Build Coastguard Worker}; 770*58b9f456SAndroid Build Coastguard Worker 771*58b9f456SAndroid Build Coastguard Workertemplate <size_t _Ip, class _T1, class _T2> 772*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 773*58b9f456SAndroid Build Coastguard Workertypename tuple_element<_Ip, pair<_T1, _T2> >::type& 774*58b9f456SAndroid Build Coastguard Workerget(pair<_T1, _T2>& __p) _NOEXCEPT 775*58b9f456SAndroid Build Coastguard Worker{ 776*58b9f456SAndroid Build Coastguard Worker return __get_pair<_Ip>::get(__p); 777*58b9f456SAndroid Build Coastguard Worker} 778*58b9f456SAndroid Build Coastguard Worker 779*58b9f456SAndroid Build Coastguard Workertemplate <size_t _Ip, class _T1, class _T2> 780*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 781*58b9f456SAndroid Build Coastguard Workerconst typename tuple_element<_Ip, pair<_T1, _T2> >::type& 782*58b9f456SAndroid Build Coastguard Workerget(const pair<_T1, _T2>& __p) _NOEXCEPT 783*58b9f456SAndroid Build Coastguard Worker{ 784*58b9f456SAndroid Build Coastguard Worker return __get_pair<_Ip>::get(__p); 785*58b9f456SAndroid Build Coastguard Worker} 786*58b9f456SAndroid Build Coastguard Worker 787*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG 788*58b9f456SAndroid Build Coastguard Workertemplate <size_t _Ip, class _T1, class _T2> 789*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 790*58b9f456SAndroid Build Coastguard Workertypename tuple_element<_Ip, pair<_T1, _T2> >::type&& 791*58b9f456SAndroid Build Coastguard Workerget(pair<_T1, _T2>&& __p) _NOEXCEPT 792*58b9f456SAndroid Build Coastguard Worker{ 793*58b9f456SAndroid Build Coastguard Worker return __get_pair<_Ip>::get(_VSTD::move(__p)); 794*58b9f456SAndroid Build Coastguard Worker} 795*58b9f456SAndroid Build Coastguard Worker 796*58b9f456SAndroid Build Coastguard Workertemplate <size_t _Ip, class _T1, class _T2> 797*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 798*58b9f456SAndroid Build Coastguard Workerconst typename tuple_element<_Ip, pair<_T1, _T2> >::type&& 799*58b9f456SAndroid Build Coastguard Workerget(const pair<_T1, _T2>&& __p) _NOEXCEPT 800*58b9f456SAndroid Build Coastguard Worker{ 801*58b9f456SAndroid Build Coastguard Worker return __get_pair<_Ip>::get(_VSTD::move(__p)); 802*58b9f456SAndroid Build Coastguard Worker} 803*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_CXX03_LANG 804*58b9f456SAndroid Build Coastguard Worker 805*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 806*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 807*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 808*58b9f456SAndroid Build Coastguard Workerconstexpr _T1 & get(pair<_T1, _T2>& __p) _NOEXCEPT 809*58b9f456SAndroid Build Coastguard Worker{ 810*58b9f456SAndroid Build Coastguard Worker return __get_pair<0>::get(__p); 811*58b9f456SAndroid Build Coastguard Worker} 812*58b9f456SAndroid Build Coastguard Worker 813*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 814*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 815*58b9f456SAndroid Build Coastguard Workerconstexpr _T1 const & get(pair<_T1, _T2> const& __p) _NOEXCEPT 816*58b9f456SAndroid Build Coastguard Worker{ 817*58b9f456SAndroid Build Coastguard Worker return __get_pair<0>::get(__p); 818*58b9f456SAndroid Build Coastguard Worker} 819*58b9f456SAndroid Build Coastguard Worker 820*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 821*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 822*58b9f456SAndroid Build Coastguard Workerconstexpr _T1 && get(pair<_T1, _T2>&& __p) _NOEXCEPT 823*58b9f456SAndroid Build Coastguard Worker{ 824*58b9f456SAndroid Build Coastguard Worker return __get_pair<0>::get(_VSTD::move(__p)); 825*58b9f456SAndroid Build Coastguard Worker} 826*58b9f456SAndroid Build Coastguard Worker 827*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 828*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 829*58b9f456SAndroid Build Coastguard Workerconstexpr _T1 const && get(pair<_T1, _T2> const&& __p) _NOEXCEPT 830*58b9f456SAndroid Build Coastguard Worker{ 831*58b9f456SAndroid Build Coastguard Worker return __get_pair<0>::get(_VSTD::move(__p)); 832*58b9f456SAndroid Build Coastguard Worker} 833*58b9f456SAndroid Build Coastguard Worker 834*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 835*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 836*58b9f456SAndroid Build Coastguard Workerconstexpr _T1 & get(pair<_T2, _T1>& __p) _NOEXCEPT 837*58b9f456SAndroid Build Coastguard Worker{ 838*58b9f456SAndroid Build Coastguard Worker return __get_pair<1>::get(__p); 839*58b9f456SAndroid Build Coastguard Worker} 840*58b9f456SAndroid Build Coastguard Worker 841*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 842*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 843*58b9f456SAndroid Build Coastguard Workerconstexpr _T1 const & get(pair<_T2, _T1> const& __p) _NOEXCEPT 844*58b9f456SAndroid Build Coastguard Worker{ 845*58b9f456SAndroid Build Coastguard Worker return __get_pair<1>::get(__p); 846*58b9f456SAndroid Build Coastguard Worker} 847*58b9f456SAndroid Build Coastguard Worker 848*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 849*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 850*58b9f456SAndroid Build Coastguard Workerconstexpr _T1 && get(pair<_T2, _T1>&& __p) _NOEXCEPT 851*58b9f456SAndroid Build Coastguard Worker{ 852*58b9f456SAndroid Build Coastguard Worker return __get_pair<1>::get(_VSTD::move(__p)); 853*58b9f456SAndroid Build Coastguard Worker} 854*58b9f456SAndroid Build Coastguard Worker 855*58b9f456SAndroid Build Coastguard Workertemplate <class _T1, class _T2> 856*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 857*58b9f456SAndroid Build Coastguard Workerconstexpr _T1 const && get(pair<_T2, _T1> const&& __p) _NOEXCEPT 858*58b9f456SAndroid Build Coastguard Worker{ 859*58b9f456SAndroid Build Coastguard Worker return __get_pair<1>::get(_VSTD::move(__p)); 860*58b9f456SAndroid Build Coastguard Worker} 861*58b9f456SAndroid Build Coastguard Worker 862*58b9f456SAndroid Build Coastguard Worker#endif 863*58b9f456SAndroid Build Coastguard Worker 864*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 865*58b9f456SAndroid Build Coastguard Worker 866*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp, _Tp... _Ip> 867*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS integer_sequence 868*58b9f456SAndroid Build Coastguard Worker{ 869*58b9f456SAndroid Build Coastguard Worker typedef _Tp value_type; 870*58b9f456SAndroid Build Coastguard Worker static_assert( is_integral<_Tp>::value, 871*58b9f456SAndroid Build Coastguard Worker "std::integer_sequence can only be instantiated with an integral type" ); 872*58b9f456SAndroid Build Coastguard Worker static 873*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 874*58b9f456SAndroid Build Coastguard Worker constexpr 875*58b9f456SAndroid Build Coastguard Worker size_t 876*58b9f456SAndroid Build Coastguard Worker size() noexcept { return sizeof...(_Ip); } 877*58b9f456SAndroid Build Coastguard Worker}; 878*58b9f456SAndroid Build Coastguard Worker 879*58b9f456SAndroid Build Coastguard Workertemplate<size_t... _Ip> 880*58b9f456SAndroid Build Coastguard Worker using index_sequence = integer_sequence<size_t, _Ip...>; 881*58b9f456SAndroid Build Coastguard Worker 882*58b9f456SAndroid Build Coastguard Worker#if __has_builtin(__make_integer_seq) && !defined(_LIBCPP_TESTING_FALLBACK_MAKE_INTEGER_SEQUENCE) 883*58b9f456SAndroid Build Coastguard Worker 884*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, _Tp _Ep> 885*58b9f456SAndroid Build Coastguard Workerusing __make_integer_sequence = __make_integer_seq<integer_sequence, _Tp, _Ep>; 886*58b9f456SAndroid Build Coastguard Worker 887*58b9f456SAndroid Build Coastguard Worker#else 888*58b9f456SAndroid Build Coastguard Worker 889*58b9f456SAndroid Build Coastguard Workertemplate<typename _Tp, _Tp _Np> using __make_integer_sequence_unchecked = 890*58b9f456SAndroid Build Coastguard Worker typename __detail::__make<_Np>::type::template __convert<integer_sequence, _Tp>; 891*58b9f456SAndroid Build Coastguard Worker 892*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, _Tp _Ep> 893*58b9f456SAndroid Build Coastguard Workerstruct __make_integer_sequence_checked 894*58b9f456SAndroid Build Coastguard Worker{ 895*58b9f456SAndroid Build Coastguard Worker static_assert(is_integral<_Tp>::value, 896*58b9f456SAndroid Build Coastguard Worker "std::make_integer_sequence can only be instantiated with an integral type" ); 897*58b9f456SAndroid Build Coastguard Worker static_assert(0 <= _Ep, "std::make_integer_sequence must have a non-negative sequence length"); 898*58b9f456SAndroid Build Coastguard Worker // Workaround GCC bug by preventing bad installations when 0 <= _Ep 899*58b9f456SAndroid Build Coastguard Worker // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68929 900*58b9f456SAndroid Build Coastguard Worker typedef __make_integer_sequence_unchecked<_Tp, 0 <= _Ep ? _Ep : 0> type; 901*58b9f456SAndroid Build Coastguard Worker}; 902*58b9f456SAndroid Build Coastguard Worker 903*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, _Tp _Ep> 904*58b9f456SAndroid Build Coastguard Workerusing __make_integer_sequence = typename __make_integer_sequence_checked<_Tp, _Ep>::type; 905*58b9f456SAndroid Build Coastguard Worker 906*58b9f456SAndroid Build Coastguard Worker#endif 907*58b9f456SAndroid Build Coastguard Worker 908*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp, _Tp _Np> 909*58b9f456SAndroid Build Coastguard Worker using make_integer_sequence = __make_integer_sequence<_Tp, _Np>; 910*58b9f456SAndroid Build Coastguard Worker 911*58b9f456SAndroid Build Coastguard Workertemplate<size_t _Np> 912*58b9f456SAndroid Build Coastguard Worker using make_index_sequence = make_integer_sequence<size_t, _Np>; 913*58b9f456SAndroid Build Coastguard Worker 914*58b9f456SAndroid Build Coastguard Workertemplate<class... _Tp> 915*58b9f456SAndroid Build Coastguard Worker using index_sequence_for = make_index_sequence<sizeof...(_Tp)>; 916*58b9f456SAndroid Build Coastguard Worker 917*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_STD_VER > 11 918*58b9f456SAndroid Build Coastguard Worker 919*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 920*58b9f456SAndroid Build Coastguard Workertemplate<class _T1, class _T2 = _T1> 921*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 922*58b9f456SAndroid Build Coastguard Worker_T1 exchange(_T1& __obj, _T2 && __new_value) 923*58b9f456SAndroid Build Coastguard Worker{ 924*58b9f456SAndroid Build Coastguard Worker _T1 __old_value = _VSTD::move(__obj); 925*58b9f456SAndroid Build Coastguard Worker __obj = _VSTD::forward<_T2>(__new_value); 926*58b9f456SAndroid Build Coastguard Worker return __old_value; 927*58b9f456SAndroid Build Coastguard Worker} 928*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_STD_VER > 11 929*58b9f456SAndroid Build Coastguard Worker 930*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 14 931*58b9f456SAndroid Build Coastguard Worker 932*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TYPE_VIS in_place_t { 933*58b9f456SAndroid Build Coastguard Worker explicit in_place_t() = default; 934*58b9f456SAndroid Build Coastguard Worker}; 935*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VAR constexpr in_place_t in_place{}; 936*58b9f456SAndroid Build Coastguard Worker 937*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 938*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS in_place_type_t { 939*58b9f456SAndroid Build Coastguard Worker explicit in_place_type_t() = default; 940*58b9f456SAndroid Build Coastguard Worker}; 941*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 942*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VAR constexpr in_place_type_t<_Tp> in_place_type{}; 943*58b9f456SAndroid Build Coastguard Worker 944*58b9f456SAndroid Build Coastguard Workertemplate <size_t _Idx> 945*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TYPE_VIS in_place_index_t { 946*58b9f456SAndroid Build Coastguard Worker explicit in_place_index_t() = default; 947*58b9f456SAndroid Build Coastguard Worker}; 948*58b9f456SAndroid Build Coastguard Workertemplate <size_t _Idx> 949*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VAR constexpr in_place_index_t<_Idx> in_place_index{}; 950*58b9f456SAndroid Build Coastguard Worker 951*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> struct __is_inplace_type_imp : false_type {}; 952*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> struct __is_inplace_type_imp<in_place_type_t<_Tp>> : true_type {}; 953*58b9f456SAndroid Build Coastguard Worker 954*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 955*58b9f456SAndroid Build Coastguard Workerusing __is_inplace_type = __is_inplace_type_imp<__uncvref_t<_Tp>>; 956*58b9f456SAndroid Build Coastguard Worker 957*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> struct __is_inplace_index_imp : false_type {}; 958*58b9f456SAndroid Build Coastguard Workertemplate <size_t _Idx> struct __is_inplace_index_imp<in_place_index_t<_Idx>> : true_type {}; 959*58b9f456SAndroid Build Coastguard Worker 960*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 961*58b9f456SAndroid Build Coastguard Workerusing __is_inplace_index = __is_inplace_index_imp<__uncvref_t<_Tp>>; 962*58b9f456SAndroid Build Coastguard Worker 963*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_STD_VER > 14 964*58b9f456SAndroid Build Coastguard Worker 965*58b9f456SAndroid Build Coastguard Workertemplate <class _Arg, class _Result> 966*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS unary_function 967*58b9f456SAndroid Build Coastguard Worker{ 968*58b9f456SAndroid Build Coastguard Worker typedef _Arg argument_type; 969*58b9f456SAndroid Build Coastguard Worker typedef _Result result_type; 970*58b9f456SAndroid Build Coastguard Worker}; 971*58b9f456SAndroid Build Coastguard Worker 972*58b9f456SAndroid Build Coastguard Workertemplate <class _Size> 973*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 974*58b9f456SAndroid Build Coastguard Worker_Size 975*58b9f456SAndroid Build Coastguard Worker__loadword(const void* __p) 976*58b9f456SAndroid Build Coastguard Worker{ 977*58b9f456SAndroid Build Coastguard Worker _Size __r; 978*58b9f456SAndroid Build Coastguard Worker std::memcpy(&__r, __p, sizeof(__r)); 979*58b9f456SAndroid Build Coastguard Worker return __r; 980*58b9f456SAndroid Build Coastguard Worker} 981*58b9f456SAndroid Build Coastguard Worker 982*58b9f456SAndroid Build Coastguard Worker// We use murmur2 when size_t is 32 bits, and cityhash64 when size_t 983*58b9f456SAndroid Build Coastguard Worker// is 64 bits. This is because cityhash64 uses 64bit x 64bit 984*58b9f456SAndroid Build Coastguard Worker// multiplication, which can be very slow on 32-bit systems. 985*58b9f456SAndroid Build Coastguard Workertemplate <class _Size, size_t = sizeof(_Size)*__CHAR_BIT__> 986*58b9f456SAndroid Build Coastguard Workerstruct __murmur2_or_cityhash; 987*58b9f456SAndroid Build Coastguard Worker 988*58b9f456SAndroid Build Coastguard Workertemplate <class _Size> 989*58b9f456SAndroid Build Coastguard Workerstruct __murmur2_or_cityhash<_Size, 32> 990*58b9f456SAndroid Build Coastguard Worker{ 991*58b9f456SAndroid Build Coastguard Worker inline _Size operator()(const void* __key, _Size __len) 992*58b9f456SAndroid Build Coastguard Worker _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK; 993*58b9f456SAndroid Build Coastguard Worker}; 994*58b9f456SAndroid Build Coastguard Worker 995*58b9f456SAndroid Build Coastguard Worker// murmur2 996*58b9f456SAndroid Build Coastguard Workertemplate <class _Size> 997*58b9f456SAndroid Build Coastguard Worker_Size 998*58b9f456SAndroid Build Coastguard Worker__murmur2_or_cityhash<_Size, 32>::operator()(const void* __key, _Size __len) 999*58b9f456SAndroid Build Coastguard Worker{ 1000*58b9f456SAndroid Build Coastguard Worker const _Size __m = 0x5bd1e995; 1001*58b9f456SAndroid Build Coastguard Worker const _Size __r = 24; 1002*58b9f456SAndroid Build Coastguard Worker _Size __h = __len; 1003*58b9f456SAndroid Build Coastguard Worker const unsigned char* __data = static_cast<const unsigned char*>(__key); 1004*58b9f456SAndroid Build Coastguard Worker for (; __len >= 4; __data += 4, __len -= 4) 1005*58b9f456SAndroid Build Coastguard Worker { 1006*58b9f456SAndroid Build Coastguard Worker _Size __k = __loadword<_Size>(__data); 1007*58b9f456SAndroid Build Coastguard Worker __k *= __m; 1008*58b9f456SAndroid Build Coastguard Worker __k ^= __k >> __r; 1009*58b9f456SAndroid Build Coastguard Worker __k *= __m; 1010*58b9f456SAndroid Build Coastguard Worker __h *= __m; 1011*58b9f456SAndroid Build Coastguard Worker __h ^= __k; 1012*58b9f456SAndroid Build Coastguard Worker } 1013*58b9f456SAndroid Build Coastguard Worker switch (__len) 1014*58b9f456SAndroid Build Coastguard Worker { 1015*58b9f456SAndroid Build Coastguard Worker case 3: 1016*58b9f456SAndroid Build Coastguard Worker __h ^= __data[2] << 16; 1017*58b9f456SAndroid Build Coastguard Worker _LIBCPP_FALLTHROUGH(); 1018*58b9f456SAndroid Build Coastguard Worker case 2: 1019*58b9f456SAndroid Build Coastguard Worker __h ^= __data[1] << 8; 1020*58b9f456SAndroid Build Coastguard Worker _LIBCPP_FALLTHROUGH(); 1021*58b9f456SAndroid Build Coastguard Worker case 1: 1022*58b9f456SAndroid Build Coastguard Worker __h ^= __data[0]; 1023*58b9f456SAndroid Build Coastguard Worker __h *= __m; 1024*58b9f456SAndroid Build Coastguard Worker } 1025*58b9f456SAndroid Build Coastguard Worker __h ^= __h >> 13; 1026*58b9f456SAndroid Build Coastguard Worker __h *= __m; 1027*58b9f456SAndroid Build Coastguard Worker __h ^= __h >> 15; 1028*58b9f456SAndroid Build Coastguard Worker return __h; 1029*58b9f456SAndroid Build Coastguard Worker} 1030*58b9f456SAndroid Build Coastguard Worker 1031*58b9f456SAndroid Build Coastguard Workertemplate <class _Size> 1032*58b9f456SAndroid Build Coastguard Workerstruct __murmur2_or_cityhash<_Size, 64> 1033*58b9f456SAndroid Build Coastguard Worker{ 1034*58b9f456SAndroid Build Coastguard Worker inline _Size operator()(const void* __key, _Size __len) _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK; 1035*58b9f456SAndroid Build Coastguard Worker 1036*58b9f456SAndroid Build Coastguard Worker private: 1037*58b9f456SAndroid Build Coastguard Worker // Some primes between 2^63 and 2^64. 1038*58b9f456SAndroid Build Coastguard Worker static const _Size __k0 = 0xc3a5c85c97cb3127ULL; 1039*58b9f456SAndroid Build Coastguard Worker static const _Size __k1 = 0xb492b66fbe98f273ULL; 1040*58b9f456SAndroid Build Coastguard Worker static const _Size __k2 = 0x9ae16a3b2f90404fULL; 1041*58b9f456SAndroid Build Coastguard Worker static const _Size __k3 = 0xc949d7c7509e6557ULL; 1042*58b9f456SAndroid Build Coastguard Worker 1043*58b9f456SAndroid Build Coastguard Worker static _Size __rotate(_Size __val, int __shift) { 1044*58b9f456SAndroid Build Coastguard Worker return __shift == 0 ? __val : ((__val >> __shift) | (__val << (64 - __shift))); 1045*58b9f456SAndroid Build Coastguard Worker } 1046*58b9f456SAndroid Build Coastguard Worker 1047*58b9f456SAndroid Build Coastguard Worker static _Size __rotate_by_at_least_1(_Size __val, int __shift) { 1048*58b9f456SAndroid Build Coastguard Worker return (__val >> __shift) | (__val << (64 - __shift)); 1049*58b9f456SAndroid Build Coastguard Worker } 1050*58b9f456SAndroid Build Coastguard Worker 1051*58b9f456SAndroid Build Coastguard Worker static _Size __shift_mix(_Size __val) { 1052*58b9f456SAndroid Build Coastguard Worker return __val ^ (__val >> 47); 1053*58b9f456SAndroid Build Coastguard Worker } 1054*58b9f456SAndroid Build Coastguard Worker 1055*58b9f456SAndroid Build Coastguard Worker static _Size __hash_len_16(_Size __u, _Size __v) 1056*58b9f456SAndroid Build Coastguard Worker _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK 1057*58b9f456SAndroid Build Coastguard Worker { 1058*58b9f456SAndroid Build Coastguard Worker const _Size __mul = 0x9ddfea08eb382d69ULL; 1059*58b9f456SAndroid Build Coastguard Worker _Size __a = (__u ^ __v) * __mul; 1060*58b9f456SAndroid Build Coastguard Worker __a ^= (__a >> 47); 1061*58b9f456SAndroid Build Coastguard Worker _Size __b = (__v ^ __a) * __mul; 1062*58b9f456SAndroid Build Coastguard Worker __b ^= (__b >> 47); 1063*58b9f456SAndroid Build Coastguard Worker __b *= __mul; 1064*58b9f456SAndroid Build Coastguard Worker return __b; 1065*58b9f456SAndroid Build Coastguard Worker } 1066*58b9f456SAndroid Build Coastguard Worker 1067*58b9f456SAndroid Build Coastguard Worker static _Size __hash_len_0_to_16(const char* __s, _Size __len) 1068*58b9f456SAndroid Build Coastguard Worker _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK 1069*58b9f456SAndroid Build Coastguard Worker { 1070*58b9f456SAndroid Build Coastguard Worker if (__len > 8) { 1071*58b9f456SAndroid Build Coastguard Worker const _Size __a = __loadword<_Size>(__s); 1072*58b9f456SAndroid Build Coastguard Worker const _Size __b = __loadword<_Size>(__s + __len - 8); 1073*58b9f456SAndroid Build Coastguard Worker return __hash_len_16(__a, __rotate_by_at_least_1(__b + __len, __len)) ^ __b; 1074*58b9f456SAndroid Build Coastguard Worker } 1075*58b9f456SAndroid Build Coastguard Worker if (__len >= 4) { 1076*58b9f456SAndroid Build Coastguard Worker const uint32_t __a = __loadword<uint32_t>(__s); 1077*58b9f456SAndroid Build Coastguard Worker const uint32_t __b = __loadword<uint32_t>(__s + __len - 4); 1078*58b9f456SAndroid Build Coastguard Worker return __hash_len_16(__len + (__a << 3), __b); 1079*58b9f456SAndroid Build Coastguard Worker } 1080*58b9f456SAndroid Build Coastguard Worker if (__len > 0) { 1081*58b9f456SAndroid Build Coastguard Worker const unsigned char __a = __s[0]; 1082*58b9f456SAndroid Build Coastguard Worker const unsigned char __b = __s[__len >> 1]; 1083*58b9f456SAndroid Build Coastguard Worker const unsigned char __c = __s[__len - 1]; 1084*58b9f456SAndroid Build Coastguard Worker const uint32_t __y = static_cast<uint32_t>(__a) + 1085*58b9f456SAndroid Build Coastguard Worker (static_cast<uint32_t>(__b) << 8); 1086*58b9f456SAndroid Build Coastguard Worker const uint32_t __z = __len + (static_cast<uint32_t>(__c) << 2); 1087*58b9f456SAndroid Build Coastguard Worker return __shift_mix(__y * __k2 ^ __z * __k3) * __k2; 1088*58b9f456SAndroid Build Coastguard Worker } 1089*58b9f456SAndroid Build Coastguard Worker return __k2; 1090*58b9f456SAndroid Build Coastguard Worker } 1091*58b9f456SAndroid Build Coastguard Worker 1092*58b9f456SAndroid Build Coastguard Worker static _Size __hash_len_17_to_32(const char *__s, _Size __len) 1093*58b9f456SAndroid Build Coastguard Worker _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK 1094*58b9f456SAndroid Build Coastguard Worker { 1095*58b9f456SAndroid Build Coastguard Worker const _Size __a = __loadword<_Size>(__s) * __k1; 1096*58b9f456SAndroid Build Coastguard Worker const _Size __b = __loadword<_Size>(__s + 8); 1097*58b9f456SAndroid Build Coastguard Worker const _Size __c = __loadword<_Size>(__s + __len - 8) * __k2; 1098*58b9f456SAndroid Build Coastguard Worker const _Size __d = __loadword<_Size>(__s + __len - 16) * __k0; 1099*58b9f456SAndroid Build Coastguard Worker return __hash_len_16(__rotate(__a - __b, 43) + __rotate(__c, 30) + __d, 1100*58b9f456SAndroid Build Coastguard Worker __a + __rotate(__b ^ __k3, 20) - __c + __len); 1101*58b9f456SAndroid Build Coastguard Worker } 1102*58b9f456SAndroid Build Coastguard Worker 1103*58b9f456SAndroid Build Coastguard Worker // Return a 16-byte hash for 48 bytes. Quick and dirty. 1104*58b9f456SAndroid Build Coastguard Worker // Callers do best to use "random-looking" values for a and b. 1105*58b9f456SAndroid Build Coastguard Worker static pair<_Size, _Size> __weak_hash_len_32_with_seeds( 1106*58b9f456SAndroid Build Coastguard Worker _Size __w, _Size __x, _Size __y, _Size __z, _Size __a, _Size __b) 1107*58b9f456SAndroid Build Coastguard Worker _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK 1108*58b9f456SAndroid Build Coastguard Worker { 1109*58b9f456SAndroid Build Coastguard Worker __a += __w; 1110*58b9f456SAndroid Build Coastguard Worker __b = __rotate(__b + __a + __z, 21); 1111*58b9f456SAndroid Build Coastguard Worker const _Size __c = __a; 1112*58b9f456SAndroid Build Coastguard Worker __a += __x; 1113*58b9f456SAndroid Build Coastguard Worker __a += __y; 1114*58b9f456SAndroid Build Coastguard Worker __b += __rotate(__a, 44); 1115*58b9f456SAndroid Build Coastguard Worker return pair<_Size, _Size>(__a + __z, __b + __c); 1116*58b9f456SAndroid Build Coastguard Worker } 1117*58b9f456SAndroid Build Coastguard Worker 1118*58b9f456SAndroid Build Coastguard Worker // Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty. 1119*58b9f456SAndroid Build Coastguard Worker static pair<_Size, _Size> __weak_hash_len_32_with_seeds( 1120*58b9f456SAndroid Build Coastguard Worker const char* __s, _Size __a, _Size __b) 1121*58b9f456SAndroid Build Coastguard Worker _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK 1122*58b9f456SAndroid Build Coastguard Worker { 1123*58b9f456SAndroid Build Coastguard Worker return __weak_hash_len_32_with_seeds(__loadword<_Size>(__s), 1124*58b9f456SAndroid Build Coastguard Worker __loadword<_Size>(__s + 8), 1125*58b9f456SAndroid Build Coastguard Worker __loadword<_Size>(__s + 16), 1126*58b9f456SAndroid Build Coastguard Worker __loadword<_Size>(__s + 24), 1127*58b9f456SAndroid Build Coastguard Worker __a, 1128*58b9f456SAndroid Build Coastguard Worker __b); 1129*58b9f456SAndroid Build Coastguard Worker } 1130*58b9f456SAndroid Build Coastguard Worker 1131*58b9f456SAndroid Build Coastguard Worker // Return an 8-byte hash for 33 to 64 bytes. 1132*58b9f456SAndroid Build Coastguard Worker static _Size __hash_len_33_to_64(const char *__s, size_t __len) 1133*58b9f456SAndroid Build Coastguard Worker _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK 1134*58b9f456SAndroid Build Coastguard Worker { 1135*58b9f456SAndroid Build Coastguard Worker _Size __z = __loadword<_Size>(__s + 24); 1136*58b9f456SAndroid Build Coastguard Worker _Size __a = __loadword<_Size>(__s) + 1137*58b9f456SAndroid Build Coastguard Worker (__len + __loadword<_Size>(__s + __len - 16)) * __k0; 1138*58b9f456SAndroid Build Coastguard Worker _Size __b = __rotate(__a + __z, 52); 1139*58b9f456SAndroid Build Coastguard Worker _Size __c = __rotate(__a, 37); 1140*58b9f456SAndroid Build Coastguard Worker __a += __loadword<_Size>(__s + 8); 1141*58b9f456SAndroid Build Coastguard Worker __c += __rotate(__a, 7); 1142*58b9f456SAndroid Build Coastguard Worker __a += __loadword<_Size>(__s + 16); 1143*58b9f456SAndroid Build Coastguard Worker _Size __vf = __a + __z; 1144*58b9f456SAndroid Build Coastguard Worker _Size __vs = __b + __rotate(__a, 31) + __c; 1145*58b9f456SAndroid Build Coastguard Worker __a = __loadword<_Size>(__s + 16) + __loadword<_Size>(__s + __len - 32); 1146*58b9f456SAndroid Build Coastguard Worker __z += __loadword<_Size>(__s + __len - 8); 1147*58b9f456SAndroid Build Coastguard Worker __b = __rotate(__a + __z, 52); 1148*58b9f456SAndroid Build Coastguard Worker __c = __rotate(__a, 37); 1149*58b9f456SAndroid Build Coastguard Worker __a += __loadword<_Size>(__s + __len - 24); 1150*58b9f456SAndroid Build Coastguard Worker __c += __rotate(__a, 7); 1151*58b9f456SAndroid Build Coastguard Worker __a += __loadword<_Size>(__s + __len - 16); 1152*58b9f456SAndroid Build Coastguard Worker _Size __wf = __a + __z; 1153*58b9f456SAndroid Build Coastguard Worker _Size __ws = __b + __rotate(__a, 31) + __c; 1154*58b9f456SAndroid Build Coastguard Worker _Size __r = __shift_mix((__vf + __ws) * __k2 + (__wf + __vs) * __k0); 1155*58b9f456SAndroid Build Coastguard Worker return __shift_mix(__r * __k0 + __vs) * __k2; 1156*58b9f456SAndroid Build Coastguard Worker } 1157*58b9f456SAndroid Build Coastguard Worker}; 1158*58b9f456SAndroid Build Coastguard Worker 1159*58b9f456SAndroid Build Coastguard Worker// cityhash64 1160*58b9f456SAndroid Build Coastguard Workertemplate <class _Size> 1161*58b9f456SAndroid Build Coastguard Worker_Size 1162*58b9f456SAndroid Build Coastguard Worker__murmur2_or_cityhash<_Size, 64>::operator()(const void* __key, _Size __len) 1163*58b9f456SAndroid Build Coastguard Worker{ 1164*58b9f456SAndroid Build Coastguard Worker const char* __s = static_cast<const char*>(__key); 1165*58b9f456SAndroid Build Coastguard Worker if (__len <= 32) { 1166*58b9f456SAndroid Build Coastguard Worker if (__len <= 16) { 1167*58b9f456SAndroid Build Coastguard Worker return __hash_len_0_to_16(__s, __len); 1168*58b9f456SAndroid Build Coastguard Worker } else { 1169*58b9f456SAndroid Build Coastguard Worker return __hash_len_17_to_32(__s, __len); 1170*58b9f456SAndroid Build Coastguard Worker } 1171*58b9f456SAndroid Build Coastguard Worker } else if (__len <= 64) { 1172*58b9f456SAndroid Build Coastguard Worker return __hash_len_33_to_64(__s, __len); 1173*58b9f456SAndroid Build Coastguard Worker } 1174*58b9f456SAndroid Build Coastguard Worker 1175*58b9f456SAndroid Build Coastguard Worker // For strings over 64 bytes we hash the end first, and then as we 1176*58b9f456SAndroid Build Coastguard Worker // loop we keep 56 bytes of state: v, w, x, y, and z. 1177*58b9f456SAndroid Build Coastguard Worker _Size __x = __loadword<_Size>(__s + __len - 40); 1178*58b9f456SAndroid Build Coastguard Worker _Size __y = __loadword<_Size>(__s + __len - 16) + 1179*58b9f456SAndroid Build Coastguard Worker __loadword<_Size>(__s + __len - 56); 1180*58b9f456SAndroid Build Coastguard Worker _Size __z = __hash_len_16(__loadword<_Size>(__s + __len - 48) + __len, 1181*58b9f456SAndroid Build Coastguard Worker __loadword<_Size>(__s + __len - 24)); 1182*58b9f456SAndroid Build Coastguard Worker pair<_Size, _Size> __v = __weak_hash_len_32_with_seeds(__s + __len - 64, __len, __z); 1183*58b9f456SAndroid Build Coastguard Worker pair<_Size, _Size> __w = __weak_hash_len_32_with_seeds(__s + __len - 32, __y + __k1, __x); 1184*58b9f456SAndroid Build Coastguard Worker __x = __x * __k1 + __loadword<_Size>(__s); 1185*58b9f456SAndroid Build Coastguard Worker 1186*58b9f456SAndroid Build Coastguard Worker // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks. 1187*58b9f456SAndroid Build Coastguard Worker __len = (__len - 1) & ~static_cast<_Size>(63); 1188*58b9f456SAndroid Build Coastguard Worker do { 1189*58b9f456SAndroid Build Coastguard Worker __x = __rotate(__x + __y + __v.first + __loadword<_Size>(__s + 8), 37) * __k1; 1190*58b9f456SAndroid Build Coastguard Worker __y = __rotate(__y + __v.second + __loadword<_Size>(__s + 48), 42) * __k1; 1191*58b9f456SAndroid Build Coastguard Worker __x ^= __w.second; 1192*58b9f456SAndroid Build Coastguard Worker __y += __v.first + __loadword<_Size>(__s + 40); 1193*58b9f456SAndroid Build Coastguard Worker __z = __rotate(__z + __w.first, 33) * __k1; 1194*58b9f456SAndroid Build Coastguard Worker __v = __weak_hash_len_32_with_seeds(__s, __v.second * __k1, __x + __w.first); 1195*58b9f456SAndroid Build Coastguard Worker __w = __weak_hash_len_32_with_seeds(__s + 32, __z + __w.second, 1196*58b9f456SAndroid Build Coastguard Worker __y + __loadword<_Size>(__s + 16)); 1197*58b9f456SAndroid Build Coastguard Worker std::swap(__z, __x); 1198*58b9f456SAndroid Build Coastguard Worker __s += 64; 1199*58b9f456SAndroid Build Coastguard Worker __len -= 64; 1200*58b9f456SAndroid Build Coastguard Worker } while (__len != 0); 1201*58b9f456SAndroid Build Coastguard Worker return __hash_len_16( 1202*58b9f456SAndroid Build Coastguard Worker __hash_len_16(__v.first, __w.first) + __shift_mix(__y) * __k1 + __z, 1203*58b9f456SAndroid Build Coastguard Worker __hash_len_16(__v.second, __w.second) + __x); 1204*58b9f456SAndroid Build Coastguard Worker} 1205*58b9f456SAndroid Build Coastguard Worker 1206*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, size_t = sizeof(_Tp) / sizeof(size_t)> 1207*58b9f456SAndroid Build Coastguard Workerstruct __scalar_hash; 1208*58b9f456SAndroid Build Coastguard Worker 1209*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 1210*58b9f456SAndroid Build Coastguard Workerstruct __scalar_hash<_Tp, 0> 1211*58b9f456SAndroid Build Coastguard Worker : public unary_function<_Tp, size_t> 1212*58b9f456SAndroid Build Coastguard Worker{ 1213*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1214*58b9f456SAndroid Build Coastguard Worker size_t operator()(_Tp __v) const _NOEXCEPT 1215*58b9f456SAndroid Build Coastguard Worker { 1216*58b9f456SAndroid Build Coastguard Worker union 1217*58b9f456SAndroid Build Coastguard Worker { 1218*58b9f456SAndroid Build Coastguard Worker _Tp __t; 1219*58b9f456SAndroid Build Coastguard Worker size_t __a; 1220*58b9f456SAndroid Build Coastguard Worker } __u; 1221*58b9f456SAndroid Build Coastguard Worker __u.__a = 0; 1222*58b9f456SAndroid Build Coastguard Worker __u.__t = __v; 1223*58b9f456SAndroid Build Coastguard Worker return __u.__a; 1224*58b9f456SAndroid Build Coastguard Worker } 1225*58b9f456SAndroid Build Coastguard Worker}; 1226*58b9f456SAndroid Build Coastguard Worker 1227*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 1228*58b9f456SAndroid Build Coastguard Workerstruct __scalar_hash<_Tp, 1> 1229*58b9f456SAndroid Build Coastguard Worker : public unary_function<_Tp, size_t> 1230*58b9f456SAndroid Build Coastguard Worker{ 1231*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1232*58b9f456SAndroid Build Coastguard Worker size_t operator()(_Tp __v) const _NOEXCEPT 1233*58b9f456SAndroid Build Coastguard Worker { 1234*58b9f456SAndroid Build Coastguard Worker union 1235*58b9f456SAndroid Build Coastguard Worker { 1236*58b9f456SAndroid Build Coastguard Worker _Tp __t; 1237*58b9f456SAndroid Build Coastguard Worker size_t __a; 1238*58b9f456SAndroid Build Coastguard Worker } __u; 1239*58b9f456SAndroid Build Coastguard Worker __u.__t = __v; 1240*58b9f456SAndroid Build Coastguard Worker return __u.__a; 1241*58b9f456SAndroid Build Coastguard Worker } 1242*58b9f456SAndroid Build Coastguard Worker}; 1243*58b9f456SAndroid Build Coastguard Worker 1244*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 1245*58b9f456SAndroid Build Coastguard Workerstruct __scalar_hash<_Tp, 2> 1246*58b9f456SAndroid Build Coastguard Worker : public unary_function<_Tp, size_t> 1247*58b9f456SAndroid Build Coastguard Worker{ 1248*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1249*58b9f456SAndroid Build Coastguard Worker size_t operator()(_Tp __v) const _NOEXCEPT 1250*58b9f456SAndroid Build Coastguard Worker { 1251*58b9f456SAndroid Build Coastguard Worker union 1252*58b9f456SAndroid Build Coastguard Worker { 1253*58b9f456SAndroid Build Coastguard Worker _Tp __t; 1254*58b9f456SAndroid Build Coastguard Worker struct 1255*58b9f456SAndroid Build Coastguard Worker { 1256*58b9f456SAndroid Build Coastguard Worker size_t __a; 1257*58b9f456SAndroid Build Coastguard Worker size_t __b; 1258*58b9f456SAndroid Build Coastguard Worker } __s; 1259*58b9f456SAndroid Build Coastguard Worker } __u; 1260*58b9f456SAndroid Build Coastguard Worker __u.__t = __v; 1261*58b9f456SAndroid Build Coastguard Worker return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); 1262*58b9f456SAndroid Build Coastguard Worker } 1263*58b9f456SAndroid Build Coastguard Worker}; 1264*58b9f456SAndroid Build Coastguard Worker 1265*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 1266*58b9f456SAndroid Build Coastguard Workerstruct __scalar_hash<_Tp, 3> 1267*58b9f456SAndroid Build Coastguard Worker : public unary_function<_Tp, size_t> 1268*58b9f456SAndroid Build Coastguard Worker{ 1269*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1270*58b9f456SAndroid Build Coastguard Worker size_t operator()(_Tp __v) const _NOEXCEPT 1271*58b9f456SAndroid Build Coastguard Worker { 1272*58b9f456SAndroid Build Coastguard Worker union 1273*58b9f456SAndroid Build Coastguard Worker { 1274*58b9f456SAndroid Build Coastguard Worker _Tp __t; 1275*58b9f456SAndroid Build Coastguard Worker struct 1276*58b9f456SAndroid Build Coastguard Worker { 1277*58b9f456SAndroid Build Coastguard Worker size_t __a; 1278*58b9f456SAndroid Build Coastguard Worker size_t __b; 1279*58b9f456SAndroid Build Coastguard Worker size_t __c; 1280*58b9f456SAndroid Build Coastguard Worker } __s; 1281*58b9f456SAndroid Build Coastguard Worker } __u; 1282*58b9f456SAndroid Build Coastguard Worker __u.__t = __v; 1283*58b9f456SAndroid Build Coastguard Worker return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); 1284*58b9f456SAndroid Build Coastguard Worker } 1285*58b9f456SAndroid Build Coastguard Worker}; 1286*58b9f456SAndroid Build Coastguard Worker 1287*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 1288*58b9f456SAndroid Build Coastguard Workerstruct __scalar_hash<_Tp, 4> 1289*58b9f456SAndroid Build Coastguard Worker : public unary_function<_Tp, size_t> 1290*58b9f456SAndroid Build Coastguard Worker{ 1291*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1292*58b9f456SAndroid Build Coastguard Worker size_t operator()(_Tp __v) const _NOEXCEPT 1293*58b9f456SAndroid Build Coastguard Worker { 1294*58b9f456SAndroid Build Coastguard Worker union 1295*58b9f456SAndroid Build Coastguard Worker { 1296*58b9f456SAndroid Build Coastguard Worker _Tp __t; 1297*58b9f456SAndroid Build Coastguard Worker struct 1298*58b9f456SAndroid Build Coastguard Worker { 1299*58b9f456SAndroid Build Coastguard Worker size_t __a; 1300*58b9f456SAndroid Build Coastguard Worker size_t __b; 1301*58b9f456SAndroid Build Coastguard Worker size_t __c; 1302*58b9f456SAndroid Build Coastguard Worker size_t __d; 1303*58b9f456SAndroid Build Coastguard Worker } __s; 1304*58b9f456SAndroid Build Coastguard Worker } __u; 1305*58b9f456SAndroid Build Coastguard Worker __u.__t = __v; 1306*58b9f456SAndroid Build Coastguard Worker return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); 1307*58b9f456SAndroid Build Coastguard Worker } 1308*58b9f456SAndroid Build Coastguard Worker}; 1309*58b9f456SAndroid Build Coastguard Worker 1310*58b9f456SAndroid Build Coastguard Workerstruct _PairT { 1311*58b9f456SAndroid Build Coastguard Worker size_t first; 1312*58b9f456SAndroid Build Coastguard Worker size_t second; 1313*58b9f456SAndroid Build Coastguard Worker}; 1314*58b9f456SAndroid Build Coastguard Worker 1315*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY 1316*58b9f456SAndroid Build Coastguard Workerinline size_t __hash_combine(size_t __lhs, size_t __rhs) _NOEXCEPT { 1317*58b9f456SAndroid Build Coastguard Worker typedef __scalar_hash<_PairT> _HashT; 1318*58b9f456SAndroid Build Coastguard Worker const _PairT __p = {__lhs, __rhs}; 1319*58b9f456SAndroid Build Coastguard Worker return _HashT()(__p); 1320*58b9f456SAndroid Build Coastguard Worker} 1321*58b9f456SAndroid Build Coastguard Worker 1322*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1323*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<_Tp*> 1324*58b9f456SAndroid Build Coastguard Worker : public unary_function<_Tp*, size_t> 1325*58b9f456SAndroid Build Coastguard Worker{ 1326*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1327*58b9f456SAndroid Build Coastguard Worker size_t operator()(_Tp* __v) const _NOEXCEPT 1328*58b9f456SAndroid Build Coastguard Worker { 1329*58b9f456SAndroid Build Coastguard Worker union 1330*58b9f456SAndroid Build Coastguard Worker { 1331*58b9f456SAndroid Build Coastguard Worker _Tp* __t; 1332*58b9f456SAndroid Build Coastguard Worker size_t __a; 1333*58b9f456SAndroid Build Coastguard Worker } __u; 1334*58b9f456SAndroid Build Coastguard Worker __u.__t = __v; 1335*58b9f456SAndroid Build Coastguard Worker return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); 1336*58b9f456SAndroid Build Coastguard Worker } 1337*58b9f456SAndroid Build Coastguard Worker}; 1338*58b9f456SAndroid Build Coastguard Worker 1339*58b9f456SAndroid Build Coastguard Worker 1340*58b9f456SAndroid Build Coastguard Workertemplate <> 1341*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<bool> 1342*58b9f456SAndroid Build Coastguard Worker : public unary_function<bool, size_t> 1343*58b9f456SAndroid Build Coastguard Worker{ 1344*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1345*58b9f456SAndroid Build Coastguard Worker size_t operator()(bool __v) const _NOEXCEPT {return static_cast<size_t>(__v);} 1346*58b9f456SAndroid Build Coastguard Worker}; 1347*58b9f456SAndroid Build Coastguard Worker 1348*58b9f456SAndroid Build Coastguard Workertemplate <> 1349*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<char> 1350*58b9f456SAndroid Build Coastguard Worker : public unary_function<char, size_t> 1351*58b9f456SAndroid Build Coastguard Worker{ 1352*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1353*58b9f456SAndroid Build Coastguard Worker size_t operator()(char __v) const _NOEXCEPT {return static_cast<size_t>(__v);} 1354*58b9f456SAndroid Build Coastguard Worker}; 1355*58b9f456SAndroid Build Coastguard Worker 1356*58b9f456SAndroid Build Coastguard Workertemplate <> 1357*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<signed char> 1358*58b9f456SAndroid Build Coastguard Worker : public unary_function<signed char, size_t> 1359*58b9f456SAndroid Build Coastguard Worker{ 1360*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1361*58b9f456SAndroid Build Coastguard Worker size_t operator()(signed char __v) const _NOEXCEPT {return static_cast<size_t>(__v);} 1362*58b9f456SAndroid Build Coastguard Worker}; 1363*58b9f456SAndroid Build Coastguard Worker 1364*58b9f456SAndroid Build Coastguard Workertemplate <> 1365*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<unsigned char> 1366*58b9f456SAndroid Build Coastguard Worker : public unary_function<unsigned char, size_t> 1367*58b9f456SAndroid Build Coastguard Worker{ 1368*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1369*58b9f456SAndroid Build Coastguard Worker size_t operator()(unsigned char __v) const _NOEXCEPT {return static_cast<size_t>(__v);} 1370*58b9f456SAndroid Build Coastguard Worker}; 1371*58b9f456SAndroid Build Coastguard Worker 1372*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS 1373*58b9f456SAndroid Build Coastguard Worker 1374*58b9f456SAndroid Build Coastguard Workertemplate <> 1375*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<char16_t> 1376*58b9f456SAndroid Build Coastguard Worker : public unary_function<char16_t, size_t> 1377*58b9f456SAndroid Build Coastguard Worker{ 1378*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1379*58b9f456SAndroid Build Coastguard Worker size_t operator()(char16_t __v) const _NOEXCEPT {return static_cast<size_t>(__v);} 1380*58b9f456SAndroid Build Coastguard Worker}; 1381*58b9f456SAndroid Build Coastguard Worker 1382*58b9f456SAndroid Build Coastguard Workertemplate <> 1383*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<char32_t> 1384*58b9f456SAndroid Build Coastguard Worker : public unary_function<char32_t, size_t> 1385*58b9f456SAndroid Build Coastguard Worker{ 1386*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1387*58b9f456SAndroid Build Coastguard Worker size_t operator()(char32_t __v) const _NOEXCEPT {return static_cast<size_t>(__v);} 1388*58b9f456SAndroid Build Coastguard Worker}; 1389*58b9f456SAndroid Build Coastguard Worker 1390*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_HAS_NO_UNICODE_CHARS 1391*58b9f456SAndroid Build Coastguard Worker 1392*58b9f456SAndroid Build Coastguard Workertemplate <> 1393*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<wchar_t> 1394*58b9f456SAndroid Build Coastguard Worker : public unary_function<wchar_t, size_t> 1395*58b9f456SAndroid Build Coastguard Worker{ 1396*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1397*58b9f456SAndroid Build Coastguard Worker size_t operator()(wchar_t __v) const _NOEXCEPT {return static_cast<size_t>(__v);} 1398*58b9f456SAndroid Build Coastguard Worker}; 1399*58b9f456SAndroid Build Coastguard Worker 1400*58b9f456SAndroid Build Coastguard Workertemplate <> 1401*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<short> 1402*58b9f456SAndroid Build Coastguard Worker : public unary_function<short, size_t> 1403*58b9f456SAndroid Build Coastguard Worker{ 1404*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1405*58b9f456SAndroid Build Coastguard Worker size_t operator()(short __v) const _NOEXCEPT {return static_cast<size_t>(__v);} 1406*58b9f456SAndroid Build Coastguard Worker}; 1407*58b9f456SAndroid Build Coastguard Worker 1408*58b9f456SAndroid Build Coastguard Workertemplate <> 1409*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<unsigned short> 1410*58b9f456SAndroid Build Coastguard Worker : public unary_function<unsigned short, size_t> 1411*58b9f456SAndroid Build Coastguard Worker{ 1412*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1413*58b9f456SAndroid Build Coastguard Worker size_t operator()(unsigned short __v) const _NOEXCEPT {return static_cast<size_t>(__v);} 1414*58b9f456SAndroid Build Coastguard Worker}; 1415*58b9f456SAndroid Build Coastguard Worker 1416*58b9f456SAndroid Build Coastguard Workertemplate <> 1417*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<int> 1418*58b9f456SAndroid Build Coastguard Worker : public unary_function<int, size_t> 1419*58b9f456SAndroid Build Coastguard Worker{ 1420*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1421*58b9f456SAndroid Build Coastguard Worker size_t operator()(int __v) const _NOEXCEPT {return static_cast<size_t>(__v);} 1422*58b9f456SAndroid Build Coastguard Worker}; 1423*58b9f456SAndroid Build Coastguard Worker 1424*58b9f456SAndroid Build Coastguard Workertemplate <> 1425*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<unsigned int> 1426*58b9f456SAndroid Build Coastguard Worker : public unary_function<unsigned int, size_t> 1427*58b9f456SAndroid Build Coastguard Worker{ 1428*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1429*58b9f456SAndroid Build Coastguard Worker size_t operator()(unsigned int __v) const _NOEXCEPT {return static_cast<size_t>(__v);} 1430*58b9f456SAndroid Build Coastguard Worker}; 1431*58b9f456SAndroid Build Coastguard Worker 1432*58b9f456SAndroid Build Coastguard Workertemplate <> 1433*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<long> 1434*58b9f456SAndroid Build Coastguard Worker : public unary_function<long, size_t> 1435*58b9f456SAndroid Build Coastguard Worker{ 1436*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1437*58b9f456SAndroid Build Coastguard Worker size_t operator()(long __v) const _NOEXCEPT {return static_cast<size_t>(__v);} 1438*58b9f456SAndroid Build Coastguard Worker}; 1439*58b9f456SAndroid Build Coastguard Worker 1440*58b9f456SAndroid Build Coastguard Workertemplate <> 1441*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<unsigned long> 1442*58b9f456SAndroid Build Coastguard Worker : public unary_function<unsigned long, size_t> 1443*58b9f456SAndroid Build Coastguard Worker{ 1444*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1445*58b9f456SAndroid Build Coastguard Worker size_t operator()(unsigned long __v) const _NOEXCEPT {return static_cast<size_t>(__v);} 1446*58b9f456SAndroid Build Coastguard Worker}; 1447*58b9f456SAndroid Build Coastguard Worker 1448*58b9f456SAndroid Build Coastguard Workertemplate <> 1449*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<long long> 1450*58b9f456SAndroid Build Coastguard Worker : public __scalar_hash<long long> 1451*58b9f456SAndroid Build Coastguard Worker{ 1452*58b9f456SAndroid Build Coastguard Worker}; 1453*58b9f456SAndroid Build Coastguard Worker 1454*58b9f456SAndroid Build Coastguard Workertemplate <> 1455*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<unsigned long long> 1456*58b9f456SAndroid Build Coastguard Worker : public __scalar_hash<unsigned long long> 1457*58b9f456SAndroid Build Coastguard Worker{ 1458*58b9f456SAndroid Build Coastguard Worker}; 1459*58b9f456SAndroid Build Coastguard Worker 1460*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_HAS_NO_INT128 1461*58b9f456SAndroid Build Coastguard Worker 1462*58b9f456SAndroid Build Coastguard Workertemplate <> 1463*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<__int128_t> 1464*58b9f456SAndroid Build Coastguard Worker : public __scalar_hash<__int128_t> 1465*58b9f456SAndroid Build Coastguard Worker{ 1466*58b9f456SAndroid Build Coastguard Worker}; 1467*58b9f456SAndroid Build Coastguard Worker 1468*58b9f456SAndroid Build Coastguard Workertemplate <> 1469*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<__uint128_t> 1470*58b9f456SAndroid Build Coastguard Worker : public __scalar_hash<__uint128_t> 1471*58b9f456SAndroid Build Coastguard Worker{ 1472*58b9f456SAndroid Build Coastguard Worker}; 1473*58b9f456SAndroid Build Coastguard Worker 1474*58b9f456SAndroid Build Coastguard Worker#endif 1475*58b9f456SAndroid Build Coastguard Worker 1476*58b9f456SAndroid Build Coastguard Workertemplate <> 1477*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<float> 1478*58b9f456SAndroid Build Coastguard Worker : public __scalar_hash<float> 1479*58b9f456SAndroid Build Coastguard Worker{ 1480*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1481*58b9f456SAndroid Build Coastguard Worker size_t operator()(float __v) const _NOEXCEPT 1482*58b9f456SAndroid Build Coastguard Worker { 1483*58b9f456SAndroid Build Coastguard Worker // -0.0 and 0.0 should return same hash 1484*58b9f456SAndroid Build Coastguard Worker if (__v == 0.0) 1485*58b9f456SAndroid Build Coastguard Worker return 0; 1486*58b9f456SAndroid Build Coastguard Worker return __scalar_hash<float>::operator()(__v); 1487*58b9f456SAndroid Build Coastguard Worker } 1488*58b9f456SAndroid Build Coastguard Worker}; 1489*58b9f456SAndroid Build Coastguard Worker 1490*58b9f456SAndroid Build Coastguard Workertemplate <> 1491*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<double> 1492*58b9f456SAndroid Build Coastguard Worker : public __scalar_hash<double> 1493*58b9f456SAndroid Build Coastguard Worker{ 1494*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1495*58b9f456SAndroid Build Coastguard Worker size_t operator()(double __v) const _NOEXCEPT 1496*58b9f456SAndroid Build Coastguard Worker { 1497*58b9f456SAndroid Build Coastguard Worker // -0.0 and 0.0 should return same hash 1498*58b9f456SAndroid Build Coastguard Worker if (__v == 0.0) 1499*58b9f456SAndroid Build Coastguard Worker return 0; 1500*58b9f456SAndroid Build Coastguard Worker return __scalar_hash<double>::operator()(__v); 1501*58b9f456SAndroid Build Coastguard Worker } 1502*58b9f456SAndroid Build Coastguard Worker}; 1503*58b9f456SAndroid Build Coastguard Worker 1504*58b9f456SAndroid Build Coastguard Workertemplate <> 1505*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<long double> 1506*58b9f456SAndroid Build Coastguard Worker : public __scalar_hash<long double> 1507*58b9f456SAndroid Build Coastguard Worker{ 1508*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1509*58b9f456SAndroid Build Coastguard Worker size_t operator()(long double __v) const _NOEXCEPT 1510*58b9f456SAndroid Build Coastguard Worker { 1511*58b9f456SAndroid Build Coastguard Worker // -0.0 and 0.0 should return same hash 1512*58b9f456SAndroid Build Coastguard Worker if (__v == 0.0) 1513*58b9f456SAndroid Build Coastguard Worker return 0; 1514*58b9f456SAndroid Build Coastguard Worker#if defined(__i386__) 1515*58b9f456SAndroid Build Coastguard Worker // Zero out padding bits 1516*58b9f456SAndroid Build Coastguard Worker union 1517*58b9f456SAndroid Build Coastguard Worker { 1518*58b9f456SAndroid Build Coastguard Worker long double __t; 1519*58b9f456SAndroid Build Coastguard Worker struct 1520*58b9f456SAndroid Build Coastguard Worker { 1521*58b9f456SAndroid Build Coastguard Worker size_t __a; 1522*58b9f456SAndroid Build Coastguard Worker size_t __b; 1523*58b9f456SAndroid Build Coastguard Worker size_t __c; 1524*58b9f456SAndroid Build Coastguard Worker size_t __d; 1525*58b9f456SAndroid Build Coastguard Worker } __s; 1526*58b9f456SAndroid Build Coastguard Worker } __u; 1527*58b9f456SAndroid Build Coastguard Worker __u.__s.__a = 0; 1528*58b9f456SAndroid Build Coastguard Worker __u.__s.__b = 0; 1529*58b9f456SAndroid Build Coastguard Worker __u.__s.__c = 0; 1530*58b9f456SAndroid Build Coastguard Worker __u.__s.__d = 0; 1531*58b9f456SAndroid Build Coastguard Worker __u.__t = __v; 1532*58b9f456SAndroid Build Coastguard Worker return __u.__s.__a ^ __u.__s.__b ^ __u.__s.__c ^ __u.__s.__d; 1533*58b9f456SAndroid Build Coastguard Worker#elif defined(__x86_64__) 1534*58b9f456SAndroid Build Coastguard Worker // Zero out padding bits 1535*58b9f456SAndroid Build Coastguard Worker union 1536*58b9f456SAndroid Build Coastguard Worker { 1537*58b9f456SAndroid Build Coastguard Worker long double __t; 1538*58b9f456SAndroid Build Coastguard Worker struct 1539*58b9f456SAndroid Build Coastguard Worker { 1540*58b9f456SAndroid Build Coastguard Worker size_t __a; 1541*58b9f456SAndroid Build Coastguard Worker size_t __b; 1542*58b9f456SAndroid Build Coastguard Worker } __s; 1543*58b9f456SAndroid Build Coastguard Worker } __u; 1544*58b9f456SAndroid Build Coastguard Worker __u.__s.__a = 0; 1545*58b9f456SAndroid Build Coastguard Worker __u.__s.__b = 0; 1546*58b9f456SAndroid Build Coastguard Worker __u.__t = __v; 1547*58b9f456SAndroid Build Coastguard Worker return __u.__s.__a ^ __u.__s.__b; 1548*58b9f456SAndroid Build Coastguard Worker#else 1549*58b9f456SAndroid Build Coastguard Worker return __scalar_hash<long double>::operator()(__v); 1550*58b9f456SAndroid Build Coastguard Worker#endif 1551*58b9f456SAndroid Build Coastguard Worker } 1552*58b9f456SAndroid Build Coastguard Worker}; 1553*58b9f456SAndroid Build Coastguard Worker 1554*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 1555*58b9f456SAndroid Build Coastguard Worker 1556*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, bool = is_enum<_Tp>::value> 1557*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS __enum_hash 1558*58b9f456SAndroid Build Coastguard Worker : public unary_function<_Tp, size_t> 1559*58b9f456SAndroid Build Coastguard Worker{ 1560*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1561*58b9f456SAndroid Build Coastguard Worker size_t operator()(_Tp __v) const _NOEXCEPT 1562*58b9f456SAndroid Build Coastguard Worker { 1563*58b9f456SAndroid Build Coastguard Worker typedef typename underlying_type<_Tp>::type type; 1564*58b9f456SAndroid Build Coastguard Worker return hash<type>{}(static_cast<type>(__v)); 1565*58b9f456SAndroid Build Coastguard Worker } 1566*58b9f456SAndroid Build Coastguard Worker}; 1567*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 1568*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS __enum_hash<_Tp, false> { 1569*58b9f456SAndroid Build Coastguard Worker __enum_hash() = delete; 1570*58b9f456SAndroid Build Coastguard Worker __enum_hash(__enum_hash const&) = delete; 1571*58b9f456SAndroid Build Coastguard Worker __enum_hash& operator=(__enum_hash const&) = delete; 1572*58b9f456SAndroid Build Coastguard Worker}; 1573*58b9f456SAndroid Build Coastguard Worker 1574*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 1575*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash : public __enum_hash<_Tp> 1576*58b9f456SAndroid Build Coastguard Worker{ 1577*58b9f456SAndroid Build Coastguard Worker}; 1578*58b9f456SAndroid Build Coastguard Worker#endif 1579*58b9f456SAndroid Build Coastguard Worker 1580*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 14 1581*58b9f456SAndroid Build Coastguard Worker 1582*58b9f456SAndroid Build Coastguard Workertemplate <> 1583*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<nullptr_t> 1584*58b9f456SAndroid Build Coastguard Worker : public unary_function<nullptr_t, size_t> 1585*58b9f456SAndroid Build Coastguard Worker{ 1586*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 1587*58b9f456SAndroid Build Coastguard Worker size_t operator()(nullptr_t) const _NOEXCEPT { 1588*58b9f456SAndroid Build Coastguard Worker return 662607004ull; 1589*58b9f456SAndroid Build Coastguard Worker } 1590*58b9f456SAndroid Build Coastguard Worker}; 1591*58b9f456SAndroid Build Coastguard Worker#endif 1592*58b9f456SAndroid Build Coastguard Worker 1593*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG 1594*58b9f456SAndroid Build Coastguard Workertemplate <class _Key, class _Hash> 1595*58b9f456SAndroid Build Coastguard Workerusing __check_hash_requirements = integral_constant<bool, 1596*58b9f456SAndroid Build Coastguard Worker is_copy_constructible<_Hash>::value && 1597*58b9f456SAndroid Build Coastguard Worker is_move_constructible<_Hash>::value && 1598*58b9f456SAndroid Build Coastguard Worker __invokable_r<size_t, _Hash, _Key const&>::value 1599*58b9f456SAndroid Build Coastguard Worker>; 1600*58b9f456SAndroid Build Coastguard Worker 1601*58b9f456SAndroid Build Coastguard Workertemplate <class _Key, class _Hash = std::hash<_Key> > 1602*58b9f456SAndroid Build Coastguard Workerusing __has_enabled_hash = integral_constant<bool, 1603*58b9f456SAndroid Build Coastguard Worker __check_hash_requirements<_Key, _Hash>::value && 1604*58b9f456SAndroid Build Coastguard Worker is_default_constructible<_Hash>::value 1605*58b9f456SAndroid Build Coastguard Worker>; 1606*58b9f456SAndroid Build Coastguard Worker 1607*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 14 1608*58b9f456SAndroid Build Coastguard Workertemplate <class _Type, class> 1609*58b9f456SAndroid Build Coastguard Workerusing __enable_hash_helper_imp = _Type; 1610*58b9f456SAndroid Build Coastguard Worker 1611*58b9f456SAndroid Build Coastguard Workertemplate <class _Type, class ..._Keys> 1612*58b9f456SAndroid Build Coastguard Workerusing __enable_hash_helper = __enable_hash_helper_imp<_Type, 1613*58b9f456SAndroid Build Coastguard Worker typename enable_if<__all<__has_enabled_hash<_Keys>::value...>::value>::type 1614*58b9f456SAndroid Build Coastguard Worker>; 1615*58b9f456SAndroid Build Coastguard Worker#else 1616*58b9f456SAndroid Build Coastguard Workertemplate <class _Type, class ...> 1617*58b9f456SAndroid Build Coastguard Workerusing __enable_hash_helper = _Type; 1618*58b9f456SAndroid Build Coastguard Worker#endif 1619*58b9f456SAndroid Build Coastguard Worker 1620*58b9f456SAndroid Build Coastguard Worker#endif // !_LIBCPP_CXX03_LANG 1621*58b9f456SAndroid Build Coastguard Worker 1622*58b9f456SAndroid Build Coastguard Worker_LIBCPP_END_NAMESPACE_STD 1623*58b9f456SAndroid Build Coastguard Worker 1624*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_UTILITY 1625