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