summaryrefslogtreecommitdiffstats
path: root/lib/libcxx/include
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libcxx/include')
-rw-r--r--lib/libcxx/include/CMakeLists.txt273
-rw-r--r--lib/libcxx/include/__bit_reference1281
-rw-r--r--lib/libcxx/include/__bsd_locale_defaults.h37
-rw-r--r--lib/libcxx/include/__bsd_locale_fallbacks.h140
-rw-r--r--lib/libcxx/include/__config1457
-rw-r--r--lib/libcxx/include/__config_site.in35
-rw-r--r--lib/libcxx/include/__debug302
-rw-r--r--lib/libcxx/include/__errc218
-rw-r--r--lib/libcxx/include/__functional_031592
-rw-r--r--lib/libcxx/include/__functional_base653
-rw-r--r--lib/libcxx/include/__functional_base_03224
-rw-r--r--lib/libcxx/include/__hash_table2913
-rw-r--r--lib/libcxx/include/__libcpp_version1
-rw-r--r--lib/libcxx/include/__locale1523
-rw-r--r--lib/libcxx/include/__mutex_base440
-rw-r--r--lib/libcxx/include/__node_handle210
-rw-r--r--lib/libcxx/include/__nullptr62
-rw-r--r--lib/libcxx/include/__split_buffer637
-rw-r--r--lib/libcxx/include/__sso_allocator77
-rw-r--r--lib/libcxx/include/__std_stream362
-rw-r--r--lib/libcxx/include/__string974
-rw-r--r--lib/libcxx/include/__threading_support402
-rw-r--r--lib/libcxx/include/__tree2879
-rw-r--r--lib/libcxx/include/__tuple556
-rw-r--r--lib/libcxx/include/__undef_macros34
-rw-r--r--lib/libcxx/include/algorithm5710
-rw-r--r--lib/libcxx/include/any672
-rw-r--r--lib/libcxx/include/array486
-rw-r--r--lib/libcxx/include/atomic1888
-rw-r--r--lib/libcxx/include/bit158
-rw-r--r--lib/libcxx/include/bitset1110
-rw-r--r--lib/libcxx/include/cassert25
-rw-r--r--lib/libcxx/include/ccomplex29
-rw-r--r--lib/libcxx/include/cctype121
-rw-r--r--lib/libcxx/include/cerrno33
-rw-r--r--lib/libcxx/include/cfenv82
-rw-r--r--lib/libcxx/include/cfloat80
-rw-r--r--lib/libcxx/include/charconv617
-rw-r--r--lib/libcxx/include/chrono2865
-rw-r--r--lib/libcxx/include/cinttypes258
-rw-r--r--lib/libcxx/include/ciso64625
-rw-r--r--lib/libcxx/include/climits48
-rw-r--r--lib/libcxx/include/clocale55
-rw-r--r--lib/libcxx/include/cmath612
-rw-r--r--lib/libcxx/include/codecvt550
-rw-r--r--lib/libcxx/include/compare679
-rw-r--r--lib/libcxx/include/complex1496
-rw-r--r--lib/libcxx/include/complex.h37
-rw-r--r--lib/libcxx/include/condition_variable269
-rw-r--r--lib/libcxx/include/csetjmp48
-rw-r--r--lib/libcxx/include/csignal58
-rw-r--r--lib/libcxx/include/cstdarg48
-rw-r--r--lib/libcxx/include/cstdbool32
-rw-r--r--lib/libcxx/include/cstddef114
-rw-r--r--lib/libcxx/include/cstdint191
-rw-r--r--lib/libcxx/include/cstdio172
-rw-r--r--lib/libcxx/include/cstdlib164
-rw-r--r--lib/libcxx/include/cstring97
-rw-r--r--lib/libcxx/include/ctgmath29
-rw-r--r--lib/libcxx/include/ctime82
-rw-r--r--lib/libcxx/include/ctype.h60
-rw-r--r--lib/libcxx/include/cwchar193
-rw-r--r--lib/libcxx/include/cwctype87
-rw-r--r--lib/libcxx/include/deque2953
-rw-r--r--lib/libcxx/include/errno.h398
-rw-r--r--lib/libcxx/include/exception338
-rw-r--r--lib/libcxx/include/experimental/__config74
-rw-r--r--lib/libcxx/include/experimental/__memory90
-rw-r--r--lib/libcxx/include/experimental/algorithm60
-rw-r--r--lib/libcxx/include/experimental/any21
-rw-r--r--lib/libcxx/include/experimental/chrono21
-rw-r--r--lib/libcxx/include/experimental/coroutine336
-rw-r--r--lib/libcxx/include/experimental/deque47
-rw-r--r--lib/libcxx/include/experimental/filesystem257
-rw-r--r--lib/libcxx/include/experimental/forward_list47
-rw-r--r--lib/libcxx/include/experimental/functional462
-rw-r--r--lib/libcxx/include/experimental/iterator114
-rw-r--r--lib/libcxx/include/experimental/list47
-rw-r--r--lib/libcxx/include/experimental/map57
-rw-r--r--lib/libcxx/include/experimental/memory_resource427
-rw-r--r--lib/libcxx/include/experimental/numeric21
-rw-r--r--lib/libcxx/include/experimental/optional21
-rw-r--r--lib/libcxx/include/experimental/propagate_const579
-rw-r--r--lib/libcxx/include/experimental/ratio21
-rw-r--r--lib/libcxx/include/experimental/regex62
-rw-r--r--lib/libcxx/include/experimental/set57
-rw-r--r--lib/libcxx/include/experimental/simd1570
-rw-r--r--lib/libcxx/include/experimental/string62
-rw-r--r--lib/libcxx/include/experimental/string_view21
-rw-r--r--lib/libcxx/include/experimental/system_error21
-rw-r--r--lib/libcxx/include/experimental/tuple21
-rw-r--r--lib/libcxx/include/experimental/type_traits155
-rw-r--r--lib/libcxx/include/experimental/unordered_map65
-rw-r--r--lib/libcxx/include/experimental/unordered_set59
-rw-r--r--lib/libcxx/include/experimental/utility47
-rw-r--r--lib/libcxx/include/experimental/vector47
-rw-r--r--lib/libcxx/include/ext/__hash135
-rw-r--r--lib/libcxx/include/ext/hash_map984
-rw-r--r--lib/libcxx/include/ext/hash_set663
-rw-r--r--lib/libcxx/include/filesystem2637
-rw-r--r--lib/libcxx/include/float.h94
-rw-r--r--lib/libcxx/include/forward_list1768
-rw-r--r--lib/libcxx/include/fstream1765
-rw-r--r--lib/libcxx/include/functional2970
-rw-r--r--lib/libcxx/include/future2613
-rw-r--r--lib/libcxx/include/initializer_list118
-rw-r--r--lib/libcxx/include/inttypes.h258
-rw-r--r--lib/libcxx/include/iomanip671
-rw-r--r--lib/libcxx/include/ios1048
-rw-r--r--lib/libcxx/include/iosfwd221
-rw-r--r--lib/libcxx/include/iostream64
-rw-r--r--lib/libcxx/include/istream1518
-rw-r--r--lib/libcxx/include/iterator1903
-rw-r--r--lib/libcxx/include/limits819
-rw-r--r--lib/libcxx/include/limits.h65
-rw-r--r--lib/libcxx/include/list2474
-rw-r--r--lib/libcxx/include/locale4360
-rw-r--r--lib/libcxx/include/locale.h45
-rw-r--r--lib/libcxx/include/map2178
-rw-r--r--lib/libcxx/include/math.h1531
-rw-r--r--lib/libcxx/include/memory5676
-rw-r--r--lib/libcxx/include/module.modulemap605
-rw-r--r--lib/libcxx/include/mutex703
-rw-r--r--lib/libcxx/include/new358
-rw-r--r--lib/libcxx/include/numeric527
-rw-r--r--lib/libcxx/include/optional1414
-rw-r--r--lib/libcxx/include/ostream1103
-rw-r--r--lib/libcxx/include/queue804
-rw-r--r--lib/libcxx/include/random6744
-rw-r--r--lib/libcxx/include/ratio533
-rw-r--r--lib/libcxx/include/regex6619
-rw-r--r--lib/libcxx/include/scoped_allocator684
-rw-r--r--lib/libcxx/include/set1417
-rw-r--r--lib/libcxx/include/setjmp.h45
-rw-r--r--lib/libcxx/include/shared_mutex509
-rw-r--r--lib/libcxx/include/span564
-rw-r--r--lib/libcxx/include/sstream986
-rw-r--r--lib/libcxx/include/stack322
-rw-r--r--lib/libcxx/include/stdbool.h39
-rw-r--r--lib/libcxx/include/stddef.h63
-rw-r--r--lib/libcxx/include/stdexcept278
-rw-r--r--lib/libcxx/include/stdint.h121
-rw-r--r--lib/libcxx/include/stdio.h122
-rw-r--r--lib/libcxx/include/stdlib.h126
-rw-r--r--lib/libcxx/include/streambuf501
-rw-r--r--lib/libcxx/include/string4380
-rw-r--r--lib/libcxx/include/string.h110
-rw-r--r--lib/libcxx/include/string_view834
-rw-r--r--lib/libcxx/include/strstream400
-rw-r--r--lib/libcxx/include/support/android/locale_bionic.h68
-rw-r--r--lib/libcxx/include/support/fuchsia/xlocale.h23
-rw-r--r--lib/libcxx/include/support/ibm/limits.h99
-rw-r--r--lib/libcxx/include/support/ibm/locale_mgmt_aix.h85
-rw-r--r--lib/libcxx/include/support/ibm/support.h54
-rw-r--r--lib/libcxx/include/support/ibm/xlocale.h271
-rw-r--r--lib/libcxx/include/support/musl/xlocale.h58
-rw-r--r--lib/libcxx/include/support/newlib/xlocale.h30
-rw-r--r--lib/libcxx/include/support/solaris/floatingpoint.h14
-rw-r--r--lib/libcxx/include/support/solaris/wchar.h47
-rw-r--r--lib/libcxx/include/support/solaris/xlocale.h77
-rw-r--r--lib/libcxx/include/support/win32/limits_msvc_win32.h72
-rw-r--r--lib/libcxx/include/support/win32/locale_win32.h199
-rw-r--r--lib/libcxx/include/support/xlocale/__nop_locale_mgmt.h52
-rw-r--r--lib/libcxx/include/support/xlocale/__posix_l_fallback.h165
-rw-r--r--lib/libcxx/include/support/xlocale/__strtonum_fallback.h67
-rw-r--r--lib/libcxx/include/support/xlocale/xlocale.h0
-rw-r--r--lib/libcxx/include/system_error487
-rw-r--r--lib/libcxx/include/tgmath.h37
-rw-r--r--lib/libcxx/include/thread484
-rw-r--r--lib/libcxx/include/tuple1395
-rw-r--r--lib/libcxx/include/type_traits4863
-rw-r--r--lib/libcxx/include/typeindex103
-rw-r--r--lib/libcxx/include/typeinfo236
-rw-r--r--lib/libcxx/include/unordered_map2300
-rw-r--r--lib/libcxx/include/unordered_set1555
-rw-r--r--lib/libcxx/include/utility1625
-rw-r--r--lib/libcxx/include/valarray4930
-rw-r--r--lib/libcxx/include/variant1616
-rw-r--r--lib/libcxx/include/vector3432
-rw-r--r--lib/libcxx/include/version232
-rw-r--r--lib/libcxx/include/wchar.h182
-rw-r--r--lib/libcxx/include/wctype.h79
182 files changed, 0 insertions, 137566 deletions
diff --git a/lib/libcxx/include/CMakeLists.txt b/lib/libcxx/include/CMakeLists.txt
deleted file mode 100644
index 73f7cfc4d8e..00000000000
--- a/lib/libcxx/include/CMakeLists.txt
+++ /dev/null
@@ -1,273 +0,0 @@
-set(files
- __bit_reference
- __bsd_locale_defaults.h
- __bsd_locale_fallbacks.h
- __errc
- __debug
- __functional_03
- __functional_base
- __functional_base_03
- __hash_table
- __libcpp_version
- __locale
- __mutex_base
- __node_handle
- __nullptr
- __split_buffer
- __sso_allocator
- __std_stream
- __string
- __threading_support
- __tree
- __tuple
- __undef_macros
- algorithm
- any
- array
- atomic
- bit
- bitset
- cassert
- ccomplex
- cctype
- cerrno
- cfenv
- cfloat
- charconv
- chrono
- cinttypes
- ciso646
- climits
- clocale
- cmath
- codecvt
- compare
- complex
- complex.h
- condition_variable
- csetjmp
- csignal
- cstdarg
- cstdbool
- cstddef
- cstdint
- cstdio
- cstdlib
- cstring
- ctgmath
- ctime
- ctype.h
- cwchar
- cwctype
- deque
- errno.h
- exception
- experimental/__config
- experimental/__memory
- experimental/algorithm
- experimental/any
- experimental/chrono
- experimental/coroutine
- experimental/deque
- experimental/filesystem
- experimental/forward_list
- experimental/functional
- experimental/iterator
- experimental/list
- experimental/map
- experimental/memory_resource
- experimental/numeric
- experimental/optional
- experimental/propagate_const
- experimental/ratio
- experimental/regex
- experimental/set
- experimental/simd
- experimental/string
- experimental/string_view
- experimental/system_error
- experimental/tuple
- experimental/type_traits
- experimental/unordered_map
- experimental/unordered_set
- experimental/utility
- experimental/vector
- ext/__hash
- ext/hash_map
- ext/hash_set
- filesystem
- float.h
- forward_list
- fstream
- functional
- future
- initializer_list
- inttypes.h
- iomanip
- ios
- iosfwd
- iostream
- istream
- iterator
- limits
- limits.h
- list
- locale
- locale.h
- map
- math.h
- memory
- module.modulemap
- mutex
- new
- numeric
- optional
- ostream
- queue
- random
- ratio
- regex
- scoped_allocator
- set
- setjmp.h
- shared_mutex
- span
- sstream
- stack
- stdbool.h
- stddef.h
- stdexcept
- stdint.h
- stdio.h
- stdlib.h
- streambuf
- string
- string.h
- string_view
- strstream
- system_error
- tgmath.h
- thread
- tuple
- type_traits
- typeindex
- typeinfo
- unordered_map
- unordered_set
- utility
- valarray
- variant
- vector
- version
- wchar.h
- wctype.h
- )
-
-if(LIBCXX_INSTALL_SUPPORT_HEADERS)
- set(files
- ${files}
- support/android/locale_bionic.h
- support/fuchsia/xlocale.h
- support/ibm/limits.h
- support/ibm/locale_mgmt_aix.h
- support/ibm/support.h
- support/ibm/xlocale.h
- support/musl/xlocale.h
- support/newlib/xlocale.h
- support/solaris/floatingpoint.h
- support/solaris/wchar.h
- support/solaris/xlocale.h
- support/win32/limits_msvc_win32.h
- support/win32/locale_win32.h
- support/xlocale/__nop_locale_mgmt.h
- support/xlocale/__posix_l_fallback.h
- support/xlocale/__strtonum_fallback.h
- support/xlocale/xlocale.h
- )
-endif()
-
-if (LIBCXX_NEEDS_SITE_CONFIG)
- # Generate a custom __config header. The new header is created
- # by prepending __config_site to the current __config header.
- add_custom_command(OUTPUT ${LIBCXX_BINARY_DIR}/__generated_config
- COMMAND ${PYTHON_EXECUTABLE} ${LIBCXX_SOURCE_DIR}/utils/cat_files.py
- ${LIBCXX_BINARY_DIR}/__config_site
- ${LIBCXX_SOURCE_DIR}/include/__config
- -o ${LIBCXX_BINARY_DIR}/__generated_config
- DEPENDS ${LIBCXX_SOURCE_DIR}/include/__config
- ${LIBCXX_BINARY_DIR}/__config_site
- )
- # Add a target that executes the generation commands.
- add_custom_target(cxx-generated-config ALL
- DEPENDS ${LIBCXX_BINARY_DIR}/__generated_config)
- set(generated_config_deps cxx-generated-config)
-else()
- set(files
- ${files}
- __config
- )
-endif()
-
-if(NOT LIBCXX_USING_INSTALLED_LLVM AND LIBCXX_HEADER_DIR)
- set(output_dir ${LIBCXX_HEADER_DIR}/include/c++/v1)
-
- set(out_files)
- foreach(f ${files})
- set(src ${CMAKE_CURRENT_SOURCE_DIR}/${f})
- set(dst ${output_dir}/${f})
- add_custom_command(OUTPUT ${dst}
- DEPENDS ${src}
- COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
- COMMENT "Copying CXX header ${f}")
- list(APPEND out_files ${dst})
- endforeach()
-
- if (LIBCXX_NEEDS_SITE_CONFIG)
- # Copy the generated header as __config into build directory.
- set(src ${LIBCXX_BINARY_DIR}/__generated_config)
- set(dst ${output_dir}/__config)
- add_custom_command(OUTPUT ${dst}
- DEPENDS ${src} ${generated_config_deps}
- COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
- COMMENT "Copying CXX __config")
- list(APPEND out_files ${dst})
- endif()
-
- add_custom_target(cxx-headers ALL DEPENDS ${out_files} ${LIBCXX_CXX_ABI_HEADER_TARGET})
-else()
- add_custom_target(cxx-headers)
-endif()
-set_target_properties(cxx-headers PROPERTIES FOLDER "Misc")
-
-if (LIBCXX_INSTALL_HEADERS)
- foreach(file ${files})
- get_filename_component(dir ${file} DIRECTORY)
- install(FILES ${file}
- DESTINATION ${LIBCXX_INSTALL_HEADER_PREFIX}include/c++/v1/${dir}
- COMPONENT cxx-headers
- PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
- )
- endforeach()
-
- if (LIBCXX_NEEDS_SITE_CONFIG)
- # Install the generated header as __config.
- install(FILES ${LIBCXX_BINARY_DIR}/__generated_config
- DESTINATION ${LIBCXX_INSTALL_HEADER_PREFIX}include/c++/v1
- PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
- RENAME __config
- COMPONENT cxx-headers)
- endif()
-
- if (NOT CMAKE_CONFIGURATION_TYPES)
- add_custom_target(install-cxx-headers
- DEPENDS cxx-headers ${generated_config_deps}
- COMMAND "${CMAKE_COMMAND}"
- -DCMAKE_INSTALL_COMPONENT=cxx-headers
- -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
- # Stripping is a no-op for headers
- add_custom_target(install-cxx-headers-stripped DEPENDS install-cxx-headers)
-
- add_custom_target(install-libcxx-headers DEPENDS install-cxx-headers)
- add_custom_target(install-libcxx-headers-stripped DEPENDS install-cxx-headers-stripped)
- endif()
-endif()
diff --git a/lib/libcxx/include/__bit_reference b/lib/libcxx/include/__bit_reference
deleted file mode 100644
index c208af2b4d7..00000000000
--- a/lib/libcxx/include/__bit_reference
+++ /dev/null
@@ -1,1281 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP___BIT_REFERENCE
-#define _LIBCPP___BIT_REFERENCE
-
-#include <__config>
-#include <bit>
-#include <algorithm>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Cp, bool _IsConst, typename _Cp::__storage_type = 0> class __bit_iterator;
-template <class _Cp> class __bit_const_reference;
-
-template <class _Tp>
-struct __has_storage_type
-{
- static const bool value = false;
-};
-
-template <class _Cp, bool = __has_storage_type<_Cp>::value>
-class __bit_reference
-{
- typedef typename _Cp::__storage_type __storage_type;
- typedef typename _Cp::__storage_pointer __storage_pointer;
-
- __storage_pointer __seg_;
- __storage_type __mask_;
-
- friend typename _Cp::__self;
-
- friend class __bit_const_reference<_Cp>;
- friend class __bit_iterator<_Cp, false>;
-public:
- _LIBCPP_INLINE_VISIBILITY operator bool() const _NOEXCEPT
- {return static_cast<bool>(*__seg_ & __mask_);}
- _LIBCPP_INLINE_VISIBILITY bool operator ~() const _NOEXCEPT
- {return !static_cast<bool>(*this);}
-
- _LIBCPP_INLINE_VISIBILITY
- __bit_reference& operator=(bool __x) _NOEXCEPT
- {
- if (__x)
- *__seg_ |= __mask_;
- else
- *__seg_ &= ~__mask_;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __bit_reference& operator=(const __bit_reference& __x) _NOEXCEPT
- {return operator=(static_cast<bool>(__x));}
-
- _LIBCPP_INLINE_VISIBILITY void flip() _NOEXCEPT {*__seg_ ^= __mask_;}
- _LIBCPP_INLINE_VISIBILITY __bit_iterator<_Cp, false> operator&() const _NOEXCEPT
- {return __bit_iterator<_Cp, false>(__seg_, static_cast<unsigned>(__ctz(__mask_)));}
-private:
- _LIBCPP_INLINE_VISIBILITY
- __bit_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT
- : __seg_(__s), __mask_(__m) {}
-};
-
-template <class _Cp>
-class __bit_reference<_Cp, false>
-{
-};
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(__bit_reference<_Cp> __x, __bit_reference<_Cp> __y) _NOEXCEPT
-{
- bool __t = __x;
- __x = __y;
- __y = __t;
-}
-
-template <class _Cp, class _Dp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(__bit_reference<_Cp> __x, __bit_reference<_Dp> __y) _NOEXCEPT
-{
- bool __t = __x;
- __x = __y;
- __y = __t;
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(__bit_reference<_Cp> __x, bool& __y) _NOEXCEPT
-{
- bool __t = __x;
- __x = __y;
- __y = __t;
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(bool& __x, __bit_reference<_Cp> __y) _NOEXCEPT
-{
- bool __t = __x;
- __x = __y;
- __y = __t;
-}
-
-template <class _Cp>
-class __bit_const_reference
-{
- typedef typename _Cp::__storage_type __storage_type;
- typedef typename _Cp::__const_storage_pointer __storage_pointer;
-
- __storage_pointer __seg_;
- __storage_type __mask_;
-
- friend typename _Cp::__self;
- friend class __bit_iterator<_Cp, true>;
-public:
- _LIBCPP_INLINE_VISIBILITY
- __bit_const_reference(const __bit_reference<_Cp>& __x) _NOEXCEPT
- : __seg_(__x.__seg_), __mask_(__x.__mask_) {}
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR operator bool() const _NOEXCEPT
- {return static_cast<bool>(*__seg_ & __mask_);}
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator<_Cp, true> operator&() const _NOEXCEPT
- {return __bit_iterator<_Cp, true>(__seg_, static_cast<unsigned>(__ctz(__mask_)));}
-private:
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR
- __bit_const_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT
- : __seg_(__s), __mask_(__m) {}
-
- __bit_const_reference& operator=(const __bit_const_reference& __x);
-};
-
-// find
-
-template <class _Cp, bool _IsConst>
-__bit_iterator<_Cp, _IsConst>
-__find_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
-{
- typedef __bit_iterator<_Cp, _IsConst> _It;
- typedef typename _It::__storage_type __storage_type;
- static const int __bits_per_word = _It::__bits_per_word;
- // do first partial word
- if (__first.__ctz_ != 0)
- {
- __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
- __storage_type __dn = _VSTD::min(__clz_f, __n);
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- __storage_type __b = *__first.__seg_ & __m;
- if (__b)
- return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(__b)));
- if (__n == __dn)
- return __first + __n;
- __n -= __dn;
- ++__first.__seg_;
- }
- // do middle whole words
- for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
- if (*__first.__seg_)
- return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(*__first.__seg_)));
- // do last partial word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __storage_type __b = *__first.__seg_ & __m;
- if (__b)
- return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(__b)));
- }
- return _It(__first.__seg_, static_cast<unsigned>(__n));
-}
-
-template <class _Cp, bool _IsConst>
-__bit_iterator<_Cp, _IsConst>
-__find_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
-{
- typedef __bit_iterator<_Cp, _IsConst> _It;
- typedef typename _It::__storage_type __storage_type;
- const int __bits_per_word = _It::__bits_per_word;
- // do first partial word
- if (__first.__ctz_ != 0)
- {
- __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
- __storage_type __dn = _VSTD::min(__clz_f, __n);
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- __storage_type __b = ~*__first.__seg_ & __m;
- if (__b)
- return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(__b)));
- if (__n == __dn)
- return __first + __n;
- __n -= __dn;
- ++__first.__seg_;
- }
- // do middle whole words
- for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
- {
- __storage_type __b = ~*__first.__seg_;
- if (__b)
- return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(__b)));
- }
- // do last partial word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __storage_type __b = ~*__first.__seg_ & __m;
- if (__b)
- return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(__b)));
- }
- return _It(__first.__seg_, static_cast<unsigned>(__n));
-}
-
-template <class _Cp, bool _IsConst, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-__bit_iterator<_Cp, _IsConst>
-find(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, const _Tp& __value_)
-{
- if (static_cast<bool>(__value_))
- return __find_bool_true(__first, static_cast<typename _Cp::size_type>(__last - __first));
- return __find_bool_false(__first, static_cast<typename _Cp::size_type>(__last - __first));
-}
-
-// count
-
-template <class _Cp, bool _IsConst>
-typename __bit_iterator<_Cp, _IsConst>::difference_type
-__count_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
-{
- typedef __bit_iterator<_Cp, _IsConst> _It;
- typedef typename _It::__storage_type __storage_type;
- typedef typename _It::difference_type difference_type;
- const int __bits_per_word = _It::__bits_per_word;
- difference_type __r = 0;
- // do first partial word
- if (__first.__ctz_ != 0)
- {
- __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
- __storage_type __dn = _VSTD::min(__clz_f, __n);
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- __r = _VSTD::__popcount(*__first.__seg_ & __m);
- __n -= __dn;
- ++__first.__seg_;
- }
- // do middle whole words
- for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
- __r += _VSTD::__popcount(*__first.__seg_);
- // do last partial word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __r += _VSTD::__popcount(*__first.__seg_ & __m);
- }
- return __r;
-}
-
-template <class _Cp, bool _IsConst>
-typename __bit_iterator<_Cp, _IsConst>::difference_type
-__count_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
-{
- typedef __bit_iterator<_Cp, _IsConst> _It;
- typedef typename _It::__storage_type __storage_type;
- typedef typename _It::difference_type difference_type;
- const int __bits_per_word = _It::__bits_per_word;
- difference_type __r = 0;
- // do first partial word
- if (__first.__ctz_ != 0)
- {
- __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
- __storage_type __dn = _VSTD::min(__clz_f, __n);
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- __r = _VSTD::__popcount(~*__first.__seg_ & __m);
- __n -= __dn;
- ++__first.__seg_;
- }
- // do middle whole words
- for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
- __r += _VSTD::__popcount(~*__first.__seg_);
- // do last partial word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __r += _VSTD::__popcount(~*__first.__seg_ & __m);
- }
- return __r;
-}
-
-template <class _Cp, bool _IsConst, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __bit_iterator<_Cp, _IsConst>::difference_type
-count(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, const _Tp& __value_)
-{
- if (static_cast<bool>(__value_))
- return __count_bool_true(__first, static_cast<typename _Cp::size_type>(__last - __first));
- return __count_bool_false(__first, static_cast<typename _Cp::size_type>(__last - __first));
-}
-
-// fill_n
-
-template <class _Cp>
-void
-__fill_n_false(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n)
-{
- typedef __bit_iterator<_Cp, false> _It;
- typedef typename _It::__storage_type __storage_type;
- const int __bits_per_word = _It::__bits_per_word;
- // do first partial word
- if (__first.__ctz_ != 0)
- {
- __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
- __storage_type __dn = _VSTD::min(__clz_f, __n);
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- *__first.__seg_ &= ~__m;
- __n -= __dn;
- ++__first.__seg_;
- }
- // do middle whole words
- __storage_type __nw = __n / __bits_per_word;
- _VSTD::memset(_VSTD::__to_raw_pointer(__first.__seg_), 0, __nw * sizeof(__storage_type));
- __n -= __nw * __bits_per_word;
- // do last partial word
- if (__n > 0)
- {
- __first.__seg_ += __nw;
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- *__first.__seg_ &= ~__m;
- }
-}
-
-template <class _Cp>
-void
-__fill_n_true(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n)
-{
- typedef __bit_iterator<_Cp, false> _It;
- typedef typename _It::__storage_type __storage_type;
- const int __bits_per_word = _It::__bits_per_word;
- // do first partial word
- if (__first.__ctz_ != 0)
- {
- __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
- __storage_type __dn = _VSTD::min(__clz_f, __n);
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- *__first.__seg_ |= __m;
- __n -= __dn;
- ++__first.__seg_;
- }
- // do middle whole words
- __storage_type __nw = __n / __bits_per_word;
- _VSTD::memset(_VSTD::__to_raw_pointer(__first.__seg_), -1, __nw * sizeof(__storage_type));
- __n -= __nw * __bits_per_word;
- // do last partial word
- if (__n > 0)
- {
- __first.__seg_ += __nw;
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- *__first.__seg_ |= __m;
- }
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-fill_n(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n, bool __value_)
-{
- if (__n > 0)
- {
- if (__value_)
- __fill_n_true(__first, __n);
- else
- __fill_n_false(__first, __n);
- }
-}
-
-// fill
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-fill(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __last, bool __value_)
-{
- _VSTD::fill_n(__first, static_cast<typename _Cp::size_type>(__last - __first), __value_);
-}
-
-// copy
-
-template <class _Cp, bool _IsConst>
-__bit_iterator<_Cp, false>
-__copy_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
- __bit_iterator<_Cp, false> __result)
-{
- typedef __bit_iterator<_Cp, _IsConst> _In;
- typedef typename _In::difference_type difference_type;
- typedef typename _In::__storage_type __storage_type;
- const int __bits_per_word = _In::__bits_per_word;
- difference_type __n = __last - __first;
- if (__n > 0)
- {
- // do first word
- if (__first.__ctz_ != 0)
- {
- unsigned __clz = __bits_per_word - __first.__ctz_;
- difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n);
- __n -= __dn;
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
- __storage_type __b = *__first.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b;
- __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
- __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word);
- ++__first.__seg_;
- // __first.__ctz_ = 0;
- }
- // __first.__ctz_ == 0;
- // do middle words
- __storage_type __nw = __n / __bits_per_word;
- _VSTD::memmove(_VSTD::__to_raw_pointer(__result.__seg_),
- _VSTD::__to_raw_pointer(__first.__seg_),
- __nw * sizeof(__storage_type));
- __n -= __nw * __bits_per_word;
- __result.__seg_ += __nw;
- // do last word
- if (__n > 0)
- {
- __first.__seg_ += __nw;
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __storage_type __b = *__first.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b;
- __result.__ctz_ = static_cast<unsigned>(__n);
- }
- }
- return __result;
-}
-
-template <class _Cp, bool _IsConst>
-__bit_iterator<_Cp, false>
-__copy_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
- __bit_iterator<_Cp, false> __result)
-{
- typedef __bit_iterator<_Cp, _IsConst> _In;
- typedef typename _In::difference_type difference_type;
- typedef typename _In::__storage_type __storage_type;
- static const int __bits_per_word = _In::__bits_per_word;
- difference_type __n = __last - __first;
- if (__n > 0)
- {
- // do first word
- if (__first.__ctz_ != 0)
- {
- unsigned __clz_f = __bits_per_word - __first.__ctz_;
- difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n);
- __n -= __dn;
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- __storage_type __b = *__first.__seg_ & __m;
- unsigned __clz_r = __bits_per_word - __result.__ctz_;
- __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r);
- __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
- *__result.__seg_ &= ~__m;
- if (__result.__ctz_ > __first.__ctz_)
- *__result.__seg_ |= __b << (__result.__ctz_ - __first.__ctz_);
- else
- *__result.__seg_ |= __b >> (__first.__ctz_ - __result.__ctz_);
- __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word;
- __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_) % __bits_per_word);
- __dn -= __ddn;
- if (__dn > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __dn);
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b >> (__first.__ctz_ + __ddn);
- __result.__ctz_ = static_cast<unsigned>(__dn);
- }
- ++__first.__seg_;
- // __first.__ctz_ = 0;
- }
- // __first.__ctz_ == 0;
- // do middle words
- unsigned __clz_r = __bits_per_word - __result.__ctz_;
- __storage_type __m = ~__storage_type(0) << __result.__ctz_;
- for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_)
- {
- __storage_type __b = *__first.__seg_;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b << __result.__ctz_;
- ++__result.__seg_;
- *__result.__seg_ &= __m;
- *__result.__seg_ |= __b >> __clz_r;
- }
- // do last word
- if (__n > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __storage_type __b = *__first.__seg_ & __m;
- __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__clz_r));
- __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b << __result.__ctz_;
- __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
- __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word);
- __n -= __dn;
- if (__n > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __n);
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b >> __dn;
- __result.__ctz_ = static_cast<unsigned>(__n);
- }
- }
- }
- return __result;
-}
-
-template <class _Cp, bool _IsConst>
-inline _LIBCPP_INLINE_VISIBILITY
-__bit_iterator<_Cp, false>
-copy(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
-{
- if (__first.__ctz_ == __result.__ctz_)
- return __copy_aligned(__first, __last, __result);
- return __copy_unaligned(__first, __last, __result);
-}
-
-// copy_backward
-
-template <class _Cp, bool _IsConst>
-__bit_iterator<_Cp, false>
-__copy_backward_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
- __bit_iterator<_Cp, false> __result)
-{
- typedef __bit_iterator<_Cp, _IsConst> _In;
- typedef typename _In::difference_type difference_type;
- typedef typename _In::__storage_type __storage_type;
- const int __bits_per_word = _In::__bits_per_word;
- difference_type __n = __last - __first;
- if (__n > 0)
- {
- // do first word
- if (__last.__ctz_ != 0)
- {
- difference_type __dn = _VSTD::min(static_cast<difference_type>(__last.__ctz_), __n);
- __n -= __dn;
- unsigned __clz = __bits_per_word - __last.__ctz_;
- __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz);
- __storage_type __b = *__last.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b;
- __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) +
- __result.__ctz_) % __bits_per_word);
- // __last.__ctz_ = 0
- }
- // __last.__ctz_ == 0 || __n == 0
- // __result.__ctz_ == 0 || __n == 0
- // do middle words
- __storage_type __nw = __n / __bits_per_word;
- __result.__seg_ -= __nw;
- __last.__seg_ -= __nw;
- _VSTD::memmove(_VSTD::__to_raw_pointer(__result.__seg_),
- _VSTD::__to_raw_pointer(__last.__seg_),
- __nw * sizeof(__storage_type));
- __n -= __nw * __bits_per_word;
- // do last word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) << (__bits_per_word - __n);
- __storage_type __b = *--__last.__seg_ & __m;
- *--__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b;
- __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1));
- }
- }
- return __result;
-}
-
-template <class _Cp, bool _IsConst>
-__bit_iterator<_Cp, false>
-__copy_backward_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
- __bit_iterator<_Cp, false> __result)
-{
- typedef __bit_iterator<_Cp, _IsConst> _In;
- typedef typename _In::difference_type difference_type;
- typedef typename _In::__storage_type __storage_type;
- const int __bits_per_word = _In::__bits_per_word;
- difference_type __n = __last - __first;
- if (__n > 0)
- {
- // do first word
- if (__last.__ctz_ != 0)
- {
- difference_type __dn = _VSTD::min(static_cast<difference_type>(__last.__ctz_), __n);
- __n -= __dn;
- unsigned __clz_l = __bits_per_word - __last.__ctz_;
- __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_l);
- __storage_type __b = *__last.__seg_ & __m;
- unsigned __clz_r = __bits_per_word - __result.__ctz_;
- __storage_type __ddn = _VSTD::min(__dn, static_cast<difference_type>(__result.__ctz_));
- if (__ddn > 0)
- {
- __m = (~__storage_type(0) << (__result.__ctz_ - __ddn)) & (~__storage_type(0) >> __clz_r);
- *__result.__seg_ &= ~__m;
- if (__result.__ctz_ > __last.__ctz_)
- *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_);
- else
- *__result.__seg_ |= __b >> (__last.__ctz_ - __result.__ctz_);
- __result.__ctz_ = static_cast<unsigned>(((-__ddn & (__bits_per_word - 1)) +
- __result.__ctz_) % __bits_per_word);
- __dn -= __ddn;
- }
- if (__dn > 0)
- {
- // __result.__ctz_ == 0
- --__result.__seg_;
- __result.__ctz_ = static_cast<unsigned>(-__dn & (__bits_per_word - 1));
- __m = ~__storage_type(0) << __result.__ctz_;
- *__result.__seg_ &= ~__m;
- __last.__ctz_ -= __dn + __ddn;
- *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_);
- }
- // __last.__ctz_ = 0
- }
- // __last.__ctz_ == 0 || __n == 0
- // __result.__ctz_ != 0 || __n == 0
- // do middle words
- unsigned __clz_r = __bits_per_word - __result.__ctz_;
- __storage_type __m = ~__storage_type(0) >> __clz_r;
- for (; __n >= __bits_per_word; __n -= __bits_per_word)
- {
- __storage_type __b = *--__last.__seg_;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b >> __clz_r;
- *--__result.__seg_ &= __m;
- *__result.__seg_ |= __b << __result.__ctz_;
- }
- // do last word
- if (__n > 0)
- {
- __m = ~__storage_type(0) << (__bits_per_word - __n);
- __storage_type __b = *--__last.__seg_ & __m;
- __clz_r = __bits_per_word - __result.__ctz_;
- __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__result.__ctz_));
- __m = (~__storage_type(0) << (__result.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_r);
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b >> (__bits_per_word - __result.__ctz_);
- __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) +
- __result.__ctz_) % __bits_per_word);
- __n -= __dn;
- if (__n > 0)
- {
- // __result.__ctz_ == 0
- --__result.__seg_;
- __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1));
- __m = ~__storage_type(0) << __result.__ctz_;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b << (__result.__ctz_ - (__bits_per_word - __n - __dn));
- }
- }
- }
- return __result;
-}
-
-template <class _Cp, bool _IsConst>
-inline _LIBCPP_INLINE_VISIBILITY
-__bit_iterator<_Cp, false>
-copy_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
-{
- if (__last.__ctz_ == __result.__ctz_)
- return __copy_backward_aligned(__first, __last, __result);
- return __copy_backward_unaligned(__first, __last, __result);
-}
-
-// move
-
-template <class _Cp, bool _IsConst>
-inline _LIBCPP_INLINE_VISIBILITY
-__bit_iterator<_Cp, false>
-move(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
-{
- return _VSTD::copy(__first, __last, __result);
-}
-
-// move_backward
-
-template <class _Cp, bool _IsConst>
-inline _LIBCPP_INLINE_VISIBILITY
-__bit_iterator<_Cp, false>
-move_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
-{
- return _VSTD::copy_backward(__first, __last, __result);
-}
-
-// swap_ranges
-
-template <class __C1, class __C2>
-__bit_iterator<__C2, false>
-__swap_ranges_aligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last,
- __bit_iterator<__C2, false> __result)
-{
- typedef __bit_iterator<__C1, false> _I1;
- typedef typename _I1::difference_type difference_type;
- typedef typename _I1::__storage_type __storage_type;
- const int __bits_per_word = _I1::__bits_per_word;
- difference_type __n = __last - __first;
- if (__n > 0)
- {
- // do first word
- if (__first.__ctz_ != 0)
- {
- unsigned __clz = __bits_per_word - __first.__ctz_;
- difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n);
- __n -= __dn;
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
- __storage_type __b1 = *__first.__seg_ & __m;
- *__first.__seg_ &= ~__m;
- __storage_type __b2 = *__result.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b1;
- *__first.__seg_ |= __b2;
- __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
- __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word);
- ++__first.__seg_;
- // __first.__ctz_ = 0;
- }
- // __first.__ctz_ == 0;
- // do middle words
- for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_, ++__result.__seg_)
- swap(*__first.__seg_, *__result.__seg_);
- // do last word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __storage_type __b1 = *__first.__seg_ & __m;
- *__first.__seg_ &= ~__m;
- __storage_type __b2 = *__result.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b1;
- *__first.__seg_ |= __b2;
- __result.__ctz_ = static_cast<unsigned>(__n);
- }
- }
- return __result;
-}
-
-template <class __C1, class __C2>
-__bit_iterator<__C2, false>
-__swap_ranges_unaligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last,
- __bit_iterator<__C2, false> __result)
-{
- typedef __bit_iterator<__C1, false> _I1;
- typedef typename _I1::difference_type difference_type;
- typedef typename _I1::__storage_type __storage_type;
- const int __bits_per_word = _I1::__bits_per_word;
- difference_type __n = __last - __first;
- if (__n > 0)
- {
- // do first word
- if (__first.__ctz_ != 0)
- {
- unsigned __clz_f = __bits_per_word - __first.__ctz_;
- difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n);
- __n -= __dn;
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- __storage_type __b1 = *__first.__seg_ & __m;
- *__first.__seg_ &= ~__m;
- unsigned __clz_r = __bits_per_word - __result.__ctz_;
- __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r);
- __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
- __storage_type __b2 = *__result.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- if (__result.__ctz_ > __first.__ctz_)
- {
- unsigned __s = __result.__ctz_ - __first.__ctz_;
- *__result.__seg_ |= __b1 << __s;
- *__first.__seg_ |= __b2 >> __s;
- }
- else
- {
- unsigned __s = __first.__ctz_ - __result.__ctz_;
- *__result.__seg_ |= __b1 >> __s;
- *__first.__seg_ |= __b2 << __s;
- }
- __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word;
- __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_) % __bits_per_word);
- __dn -= __ddn;
- if (__dn > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __dn);
- __b2 = *__result.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- unsigned __s = __first.__ctz_ + __ddn;
- *__result.__seg_ |= __b1 >> __s;
- *__first.__seg_ |= __b2 << __s;
- __result.__ctz_ = static_cast<unsigned>(__dn);
- }
- ++__first.__seg_;
- // __first.__ctz_ = 0;
- }
- // __first.__ctz_ == 0;
- // do middle words
- __storage_type __m = ~__storage_type(0) << __result.__ctz_;
- unsigned __clz_r = __bits_per_word - __result.__ctz_;
- for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_)
- {
- __storage_type __b1 = *__first.__seg_;
- __storage_type __b2 = *__result.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b1 << __result.__ctz_;
- *__first.__seg_ = __b2 >> __result.__ctz_;
- ++__result.__seg_;
- __b2 = *__result.__seg_ & ~__m;
- *__result.__seg_ &= __m;
- *__result.__seg_ |= __b1 >> __clz_r;
- *__first.__seg_ |= __b2 << __clz_r;
- }
- // do last word
- if (__n > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __storage_type __b1 = *__first.__seg_ & __m;
- *__first.__seg_ &= ~__m;
- __storage_type __dn = _VSTD::min<__storage_type>(__n, __clz_r);
- __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
- __storage_type __b2 = *__result.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b1 << __result.__ctz_;
- *__first.__seg_ |= __b2 >> __result.__ctz_;
- __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
- __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word);
- __n -= __dn;
- if (__n > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __b2 = *__result.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b1 >> __dn;
- *__first.__seg_ |= __b2 << __dn;
- __result.__ctz_ = static_cast<unsigned>(__n);
- }
- }
- }
- return __result;
-}
-
-template <class __C1, class __C2>
-inline _LIBCPP_INLINE_VISIBILITY
-__bit_iterator<__C2, false>
-swap_ranges(__bit_iterator<__C1, false> __first1, __bit_iterator<__C1, false> __last1,
- __bit_iterator<__C2, false> __first2)
-{
- if (__first1.__ctz_ == __first2.__ctz_)
- return __swap_ranges_aligned(__first1, __last1, __first2);
- return __swap_ranges_unaligned(__first1, __last1, __first2);
-}
-
-// rotate
-
-template <class _Cp>
-struct __bit_array
-{
- typedef typename _Cp::difference_type difference_type;
- typedef typename _Cp::__storage_type __storage_type;
- typedef typename _Cp::__storage_pointer __storage_pointer;
- typedef typename _Cp::iterator iterator;
- static const unsigned __bits_per_word = _Cp::__bits_per_word;
- static const unsigned _Np = 4;
-
- difference_type __size_;
- __storage_type __word_[_Np];
-
- _LIBCPP_INLINE_VISIBILITY static difference_type capacity()
- {return static_cast<difference_type>(_Np * __bits_per_word);}
- _LIBCPP_INLINE_VISIBILITY explicit __bit_array(difference_type __s) : __size_(__s) {}
- _LIBCPP_INLINE_VISIBILITY iterator begin()
- {
- return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]), 0);
- }
- _LIBCPP_INLINE_VISIBILITY iterator end()
- {
- return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]) + __size_ / __bits_per_word,
- static_cast<unsigned>(__size_ % __bits_per_word));
- }
-};
-
-template <class _Cp>
-__bit_iterator<_Cp, false>
-rotate(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __middle, __bit_iterator<_Cp, false> __last)
-{
- typedef __bit_iterator<_Cp, false> _I1;
- typedef typename _I1::difference_type difference_type;
- difference_type __d1 = __middle - __first;
- difference_type __d2 = __last - __middle;
- _I1 __r = __first + __d2;
- while (__d1 != 0 && __d2 != 0)
- {
- if (__d1 <= __d2)
- {
- if (__d1 <= __bit_array<_Cp>::capacity())
- {
- __bit_array<_Cp> __b(__d1);
- _VSTD::copy(__first, __middle, __b.begin());
- _VSTD::copy(__b.begin(), __b.end(), _VSTD::copy(__middle, __last, __first));
- break;
- }
- else
- {
- __bit_iterator<_Cp, false> __mp = _VSTD::swap_ranges(__first, __middle, __middle);
- __first = __middle;
- __middle = __mp;
- __d2 -= __d1;
- }
- }
- else
- {
- if (__d2 <= __bit_array<_Cp>::capacity())
- {
- __bit_array<_Cp> __b(__d2);
- _VSTD::copy(__middle, __last, __b.begin());
- _VSTD::copy_backward(__b.begin(), __b.end(), _VSTD::copy_backward(__first, __middle, __last));
- break;
- }
- else
- {
- __bit_iterator<_Cp, false> __mp = __first + __d2;
- _VSTD::swap_ranges(__first, __mp, __middle);
- __first = __mp;
- __d1 -= __d2;
- }
- }
- }
- return __r;
-}
-
-// equal
-
-template <class _Cp, bool _IC1, bool _IC2>
-bool
-__equal_unaligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1,
- __bit_iterator<_Cp, _IC2> __first2)
-{
- typedef __bit_iterator<_Cp, _IC1> _It;
- typedef typename _It::difference_type difference_type;
- typedef typename _It::__storage_type __storage_type;
- static const int __bits_per_word = _It::__bits_per_word;
- difference_type __n = __last1 - __first1;
- if (__n > 0)
- {
- // do first word
- if (__first1.__ctz_ != 0)
- {
- unsigned __clz_f = __bits_per_word - __first1.__ctz_;
- difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n);
- __n -= __dn;
- __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- __storage_type __b = *__first1.__seg_ & __m;
- unsigned __clz_r = __bits_per_word - __first2.__ctz_;
- __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r);
- __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
- if (__first2.__ctz_ > __first1.__ctz_)
- {
- if ((*__first2.__seg_ & __m) != (__b << (__first2.__ctz_ - __first1.__ctz_)))
- return false;
- }
- else
- {
- if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ - __first2.__ctz_)))
- return false;
- }
- __first2.__seg_ += (__ddn + __first2.__ctz_) / __bits_per_word;
- __first2.__ctz_ = static_cast<unsigned>((__ddn + __first2.__ctz_) % __bits_per_word);
- __dn -= __ddn;
- if (__dn > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __dn);
- if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ + __ddn)))
- return false;
- __first2.__ctz_ = static_cast<unsigned>(__dn);
- }
- ++__first1.__seg_;
- // __first1.__ctz_ = 0;
- }
- // __first1.__ctz_ == 0;
- // do middle words
- unsigned __clz_r = __bits_per_word - __first2.__ctz_;
- __storage_type __m = ~__storage_type(0) << __first2.__ctz_;
- for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_)
- {
- __storage_type __b = *__first1.__seg_;
- if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_))
- return false;
- ++__first2.__seg_;
- if ((*__first2.__seg_ & ~__m) != (__b >> __clz_r))
- return false;
- }
- // do last word
- if (__n > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __storage_type __b = *__first1.__seg_ & __m;
- __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__clz_r));
- __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
- if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_))
- return false;
- __first2.__seg_ += (__dn + __first2.__ctz_) / __bits_per_word;
- __first2.__ctz_ = static_cast<unsigned>((__dn + __first2.__ctz_) % __bits_per_word);
- __n -= __dn;
- if (__n > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __n);
- if ((*__first2.__seg_ & __m) != (__b >> __dn))
- return false;
- }
- }
- }
- return true;
-}
-
-template <class _Cp, bool _IC1, bool _IC2>
-bool
-__equal_aligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1,
- __bit_iterator<_Cp, _IC2> __first2)
-{
- typedef __bit_iterator<_Cp, _IC1> _It;
- typedef typename _It::difference_type difference_type;
- typedef typename _It::__storage_type __storage_type;
- static const int __bits_per_word = _It::__bits_per_word;
- difference_type __n = __last1 - __first1;
- if (__n > 0)
- {
- // do first word
- if (__first1.__ctz_ != 0)
- {
- unsigned __clz = __bits_per_word - __first1.__ctz_;
- difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n);
- __n -= __dn;
- __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
- if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m))
- return false;
- ++__first2.__seg_;
- ++__first1.__seg_;
- // __first1.__ctz_ = 0;
- // __first2.__ctz_ = 0;
- }
- // __first1.__ctz_ == 0;
- // __first2.__ctz_ == 0;
- // do middle words
- for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_, ++__first2.__seg_)
- if (*__first2.__seg_ != *__first1.__seg_)
- return false;
- // do last word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m))
- return false;
- }
- }
- return true;
-}
-
-template <class _Cp, bool _IC1, bool _IC2>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-equal(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, __bit_iterator<_Cp, _IC2> __first2)
-{
- if (__first1.__ctz_ == __first2.__ctz_)
- return __equal_aligned(__first1, __last1, __first2);
- return __equal_unaligned(__first1, __last1, __first2);
-}
-
-template <class _Cp, bool _IsConst,
- typename _Cp::__storage_type>
-class __bit_iterator
-{
-public:
- typedef typename _Cp::difference_type difference_type;
- typedef bool value_type;
- typedef __bit_iterator pointer;
- typedef typename conditional<_IsConst, __bit_const_reference<_Cp>, __bit_reference<_Cp> >::type reference;
- typedef random_access_iterator_tag iterator_category;
-
-private:
- typedef typename _Cp::__storage_type __storage_type;
- typedef typename conditional<_IsConst, typename _Cp::__const_storage_pointer,
- typename _Cp::__storage_pointer>::type __storage_pointer;
- static const unsigned __bits_per_word = _Cp::__bits_per_word;
-
- __storage_pointer __seg_;
- unsigned __ctz_;
-
-public:
- _LIBCPP_INLINE_VISIBILITY __bit_iterator() _NOEXCEPT
-#if _LIBCPP_STD_VER > 11
- : __seg_(nullptr), __ctz_(0)
-#endif
- {}
-
- _LIBCPP_INLINE_VISIBILITY
- __bit_iterator(const __bit_iterator<_Cp, false>& __it) _NOEXCEPT
- : __seg_(__it.__seg_), __ctz_(__it.__ctz_) {}
-
- _LIBCPP_INLINE_VISIBILITY reference operator*() const _NOEXCEPT
- {return reference(__seg_, __storage_type(1) << __ctz_);}
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator++()
- {
- if (__ctz_ != __bits_per_word-1)
- ++__ctz_;
- else
- {
- __ctz_ = 0;
- ++__seg_;
- }
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator operator++(int)
- {
- __bit_iterator __tmp = *this;
- ++(*this);
- return __tmp;
- }
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator--()
- {
- if (__ctz_ != 0)
- --__ctz_;
- else
- {
- __ctz_ = __bits_per_word - 1;
- --__seg_;
- }
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator operator--(int)
- {
- __bit_iterator __tmp = *this;
- --(*this);
- return __tmp;
- }
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator+=(difference_type __n)
- {
- if (__n >= 0)
- __seg_ += (__n + __ctz_) / __bits_per_word;
- else
- __seg_ += static_cast<difference_type>(__n - __bits_per_word + __ctz_ + 1)
- / static_cast<difference_type>(__bits_per_word);
- __n &= (__bits_per_word - 1);
- __ctz_ = static_cast<unsigned>((__n + __ctz_) % __bits_per_word);
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator-=(difference_type __n)
- {
- return *this += -__n;
- }
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator operator+(difference_type __n) const
- {
- __bit_iterator __t(*this);
- __t += __n;
- return __t;
- }
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator operator-(difference_type __n) const
- {
- __bit_iterator __t(*this);
- __t -= __n;
- return __t;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- friend __bit_iterator operator+(difference_type __n, const __bit_iterator& __it) {return __it + __n;}
-
- _LIBCPP_INLINE_VISIBILITY
- friend difference_type operator-(const __bit_iterator& __x, const __bit_iterator& __y)
- {return (__x.__seg_ - __y.__seg_) * __bits_per_word + __x.__ctz_ - __y.__ctz_;}
-
- _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const {return *(*this + __n);}
-
- _LIBCPP_INLINE_VISIBILITY friend bool operator==(const __bit_iterator& __x, const __bit_iterator& __y)
- {return __x.__seg_ == __y.__seg_ && __x.__ctz_ == __y.__ctz_;}
-
- _LIBCPP_INLINE_VISIBILITY friend bool operator!=(const __bit_iterator& __x, const __bit_iterator& __y)
- {return !(__x == __y);}
-
- _LIBCPP_INLINE_VISIBILITY friend bool operator<(const __bit_iterator& __x, const __bit_iterator& __y)
- {return __x.__seg_ < __y.__seg_ || (__x.__seg_ == __y.__seg_ && __x.__ctz_ < __y.__ctz_);}
-
- _LIBCPP_INLINE_VISIBILITY friend bool operator>(const __bit_iterator& __x, const __bit_iterator& __y)
- {return __y < __x;}
-
- _LIBCPP_INLINE_VISIBILITY friend bool operator<=(const __bit_iterator& __x, const __bit_iterator& __y)
- {return !(__y < __x);}
-
- _LIBCPP_INLINE_VISIBILITY friend bool operator>=(const __bit_iterator& __x, const __bit_iterator& __y)
- {return !(__x < __y);}
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- __bit_iterator(__storage_pointer __s, unsigned __ctz) _NOEXCEPT
- : __seg_(__s), __ctz_(__ctz) {}
-
- friend typename _Cp::__self;
-
- friend class __bit_reference<_Cp>;
- friend class __bit_const_reference<_Cp>;
- friend class __bit_iterator<_Cp, true>;
- template <class _Dp> friend struct __bit_array;
- template <class _Dp> friend void __fill_n_false(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n);
- template <class _Dp> friend void __fill_n_true(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n);
- template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_aligned(__bit_iterator<_Dp, _IC> __first,
- __bit_iterator<_Dp, _IC> __last,
- __bit_iterator<_Dp, false> __result);
- template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_unaligned(__bit_iterator<_Dp, _IC> __first,
- __bit_iterator<_Dp, _IC> __last,
- __bit_iterator<_Dp, false> __result);
- template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> copy(__bit_iterator<_Dp, _IC> __first,
- __bit_iterator<_Dp, _IC> __last,
- __bit_iterator<_Dp, false> __result);
- template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_backward_aligned(__bit_iterator<_Dp, _IC> __first,
- __bit_iterator<_Dp, _IC> __last,
- __bit_iterator<_Dp, false> __result);
- template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_backward_unaligned(__bit_iterator<_Dp, _IC> __first,
- __bit_iterator<_Dp, _IC> __last,
- __bit_iterator<_Dp, false> __result);
- template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> copy_backward(__bit_iterator<_Dp, _IC> __first,
- __bit_iterator<_Dp, _IC> __last,
- __bit_iterator<_Dp, false> __result);
- template <class __C1, class __C2>friend __bit_iterator<__C2, false> __swap_ranges_aligned(__bit_iterator<__C1, false>,
- __bit_iterator<__C1, false>,
- __bit_iterator<__C2, false>);
- template <class __C1, class __C2>friend __bit_iterator<__C2, false> __swap_ranges_unaligned(__bit_iterator<__C1, false>,
- __bit_iterator<__C1, false>,
- __bit_iterator<__C2, false>);
- template <class __C1, class __C2>friend __bit_iterator<__C2, false> swap_ranges(__bit_iterator<__C1, false>,
- __bit_iterator<__C1, false>,
- __bit_iterator<__C2, false>);
- template <class _Dp> friend __bit_iterator<_Dp, false> rotate(__bit_iterator<_Dp, false>,
- __bit_iterator<_Dp, false>,
- __bit_iterator<_Dp, false>);
- template <class _Dp, bool _IC1, bool _IC2> friend bool __equal_aligned(__bit_iterator<_Dp, _IC1>,
- __bit_iterator<_Dp, _IC1>,
- __bit_iterator<_Dp, _IC2>);
- template <class _Dp, bool _IC1, bool _IC2> friend bool __equal_unaligned(__bit_iterator<_Dp, _IC1>,
- __bit_iterator<_Dp, _IC1>,
- __bit_iterator<_Dp, _IC2>);
- template <class _Dp, bool _IC1, bool _IC2> friend bool equal(__bit_iterator<_Dp, _IC1>,
- __bit_iterator<_Dp, _IC1>,
- __bit_iterator<_Dp, _IC2>);
- template <class _Dp, bool _IC> friend __bit_iterator<_Dp, _IC> __find_bool_true(__bit_iterator<_Dp, _IC>,
- typename _Dp::size_type);
- template <class _Dp, bool _IC> friend __bit_iterator<_Dp, _IC> __find_bool_false(__bit_iterator<_Dp, _IC>,
- typename _Dp::size_type);
- template <class _Dp, bool _IC> friend typename __bit_iterator<_Dp, _IC>::difference_type
- __count_bool_true(__bit_iterator<_Dp, _IC>, typename _Dp::size_type);
- template <class _Dp, bool _IC> friend typename __bit_iterator<_Dp, _IC>::difference_type
- __count_bool_false(__bit_iterator<_Dp, _IC>, typename _Dp::size_type);
-};
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP___BIT_REFERENCE
diff --git a/lib/libcxx/include/__bsd_locale_defaults.h b/lib/libcxx/include/__bsd_locale_defaults.h
deleted file mode 100644
index cbc407d1030..00000000000
--- a/lib/libcxx/include/__bsd_locale_defaults.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// -*- C++ -*-
-//===---------------------- __bsd_locale_defaults.h -----------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-// The BSDs have lots of *_l functions. We don't want to define those symbols
-// on other platforms though, for fear of conflicts with user code. So here,
-// we will define the mapping from an internal macro to the real BSD symbol.
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_BSD_LOCALE_DEFAULTS_H
-#define _LIBCPP_BSD_LOCALE_DEFAULTS_H
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#define __libcpp_mb_cur_max_l(loc) MB_CUR_MAX_L(loc)
-#define __libcpp_btowc_l(ch, loc) btowc_l(ch, loc)
-#define __libcpp_wctob_l(wch, loc) wctob_l(wch, loc)
-#define __libcpp_wcsnrtombs_l(dst, src, nwc, len, ps, loc) wcsnrtombs_l(dst, src, nwc, len, ps, loc)
-#define __libcpp_wcrtomb_l(src, wc, ps, loc) wcrtomb_l(src, wc, ps, loc)
-#define __libcpp_mbsnrtowcs_l(dst, src, nms, len, ps, loc) mbsnrtowcs_l(dst, src, nms, len, ps, loc)
-#define __libcpp_mbrtowc_l(pwc, s, n, ps, l) mbrtowc_l(pwc, s, n, ps, l)
-#define __libcpp_mbtowc_l(pwc, pmb, max, l) mbtowc_l(pwc, pmb, max, l)
-#define __libcpp_mbrlen_l(s, n, ps, l) mbrlen_l(s, n, ps, l)
-#define __libcpp_localeconv_l(l) localeconv_l(l)
-#define __libcpp_mbsrtowcs_l(dest, src, len, ps, l) mbsrtowcs_l(dest, src, len, ps, l)
-#define __libcpp_snprintf_l(...) snprintf_l(__VA_ARGS__)
-#define __libcpp_asprintf_l(...) asprintf_l(__VA_ARGS__)
-#define __libcpp_sscanf_l(...) sscanf_l(__VA_ARGS__)
-
-#endif // _LIBCPP_BSD_LOCALE_DEFAULTS_H
diff --git a/lib/libcxx/include/__bsd_locale_fallbacks.h b/lib/libcxx/include/__bsd_locale_fallbacks.h
deleted file mode 100644
index 3097b01410d..00000000000
--- a/lib/libcxx/include/__bsd_locale_fallbacks.h
+++ /dev/null
@@ -1,140 +0,0 @@
-// -*- C++ -*-
-//===---------------------- __bsd_locale_fallbacks.h ----------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-// The BSDs have lots of *_l functions. This file provides reimplementations
-// of those functions for non-BSD platforms.
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_BSD_LOCALE_FALLBACKS_DEFAULTS_H
-#define _LIBCPP_BSD_LOCALE_FALLBACKS_DEFAULTS_H
-
-#include <stdlib.h>
-#include <stdarg.h>
-#include <memory>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-inline _LIBCPP_INLINE_VISIBILITY
-decltype(MB_CUR_MAX) __libcpp_mb_cur_max_l(locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return MB_CUR_MAX;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-wint_t __libcpp_btowc_l(int __c, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return btowc(__c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-int __libcpp_wctob_l(wint_t __c, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return wctob(__c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-size_t __libcpp_wcsnrtombs_l(char *__dest, const wchar_t **__src, size_t __nwc,
- size_t __len, mbstate_t *__ps, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return wcsnrtombs(__dest, __src, __nwc, __len, __ps);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-size_t __libcpp_wcrtomb_l(char *__s, wchar_t __wc, mbstate_t *__ps, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return wcrtomb(__s, __wc, __ps);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-size_t __libcpp_mbsnrtowcs_l(wchar_t * __dest, const char **__src, size_t __nms,
- size_t __len, mbstate_t *__ps, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return mbsnrtowcs(__dest, __src, __nms, __len, __ps);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-size_t __libcpp_mbrtowc_l(wchar_t *__pwc, const char *__s, size_t __n,
- mbstate_t *__ps, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return mbrtowc(__pwc, __s, __n, __ps);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-int __libcpp_mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return mbtowc(__pwc, __pmb, __max);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-size_t __libcpp_mbrlen_l(const char *__s, size_t __n, mbstate_t *__ps, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return mbrlen(__s, __n, __ps);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-lconv *__libcpp_localeconv_l(locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return localeconv();
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-size_t __libcpp_mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len,
- mbstate_t *__ps, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return mbsrtowcs(__dest, __src, __len, __ps);
-}
-
-inline
-int __libcpp_snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...) {
- va_list __va;
- va_start(__va, __format);
- __libcpp_locale_guard __current(__l);
- int __res = vsnprintf(__s, __n, __format, __va);
- va_end(__va);
- return __res;
-}
-
-inline
-int __libcpp_asprintf_l(char **__s, locale_t __l, const char *__format, ...) {
- va_list __va;
- va_start(__va, __format);
- __libcpp_locale_guard __current(__l);
- int __res = vasprintf(__s, __format, __va);
- va_end(__va);
- return __res;
-}
-
-inline
-int __libcpp_sscanf_l(const char *__s, locale_t __l, const char *__format, ...) {
- va_list __va;
- va_start(__va, __format);
- __libcpp_locale_guard __current(__l);
- int __res = vsscanf(__s, __format, __va);
- va_end(__va);
- return __res;
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_BSD_LOCALE_FALLBACKS_DEFAULTS_H
diff --git a/lib/libcxx/include/__config b/lib/libcxx/include/__config
deleted file mode 100644
index 7ec1d3de5d8..00000000000
--- a/lib/libcxx/include/__config
+++ /dev/null
@@ -1,1457 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- __config ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CONFIG
-#define _LIBCPP_CONFIG
-
-#if defined(_MSC_VER) && !defined(__clang__)
-# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-# define _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
-# endif
-#endif
-
-#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
-#pragma GCC system_header
-#endif
-
-#ifdef __cplusplus
-
-#ifdef __GNUC__
-# define _GNUC_VER (__GNUC__ * 100 + __GNUC_MINOR__)
-// The _GNUC_VER_NEW macro better represents the new GCC versioning scheme
-// introduced in GCC 5.0.
-# define _GNUC_VER_NEW (_GNUC_VER * 10 + __GNUC_PATCHLEVEL__)
-#else
-# define _GNUC_VER 0
-# define _GNUC_VER_NEW 0
-#endif
-
-#define _LIBCPP_VERSION 8000
-
-#ifndef _LIBCPP_ABI_VERSION
-# define _LIBCPP_ABI_VERSION 1
-#endif
-
-#ifndef _LIBCPP_STD_VER
-# if __cplusplus <= 201103L
-# define _LIBCPP_STD_VER 11
-# elif __cplusplus <= 201402L
-# define _LIBCPP_STD_VER 14
-# elif __cplusplus <= 201703L
-# define _LIBCPP_STD_VER 17
-# else
-# define _LIBCPP_STD_VER 18 // current year, or date of c++2a ratification
-# endif
-#endif // _LIBCPP_STD_VER
-
-#if defined(__ELF__)
-# define _LIBCPP_OBJECT_FORMAT_ELF 1
-#elif defined(__MACH__)
-# define _LIBCPP_OBJECT_FORMAT_MACHO 1
-#elif defined(_WIN32)
-# define _LIBCPP_OBJECT_FORMAT_COFF 1
-#elif defined(__wasm__)
-# define _LIBCPP_OBJECT_FORMAT_WASM 1
-#else
-# error Unknown object file format
-#endif
-
-#if defined(_LIBCPP_ABI_UNSTABLE) || _LIBCPP_ABI_VERSION >= 2
-// Change short string representation so that string data starts at offset 0,
-// improving its alignment in some cases.
-# define _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
-// Fix deque iterator type in order to support incomplete types.
-# define _LIBCPP_ABI_INCOMPLETE_TYPES_IN_DEQUE
-// Fix undefined behavior in how std::list stores its linked nodes.
-# define _LIBCPP_ABI_LIST_REMOVE_NODE_POINTER_UB
-// Fix undefined behavior in how __tree stores its end and parent nodes.
-# define _LIBCPP_ABI_TREE_REMOVE_NODE_POINTER_UB
-// Fix undefined behavior in how __hash_table stores its pointer types.
-# define _LIBCPP_ABI_FIX_UNORDERED_NODE_POINTER_UB
-# define _LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB
-# define _LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE
-// Don't use a nullptr_t simulation type in C++03 instead using C++11 nullptr
-// provided under the alternate keyword __nullptr, which changes the mangling
-// of nullptr_t. This option is ABI incompatible with GCC in C++03 mode.
-# define _LIBCPP_ABI_ALWAYS_USE_CXX11_NULLPTR
-// Define the `pointer_safety` enum as a C++11 strongly typed enumeration
-// instead of as a class simulating an enum. If this option is enabled
-// `pointer_safety` and `get_pointer_safety()` will no longer be available
-// in C++03.
-# define _LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE
-// Define a key function for `bad_function_call` in the library, to centralize
-// its vtable and typeinfo to libc++ rather than having all other libraries
-// using that class define their own copies.
-# define _LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION
-// Enable optimized version of __do_get_(un)signed which avoids redundant copies.
-# define _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET
-// Use the smallest possible integer type to represent the index of the variant.
-// Previously libc++ used "unsigned int" exclusivly.
-# define _LIBCPP_ABI_VARIANT_INDEX_TYPE_OPTIMIZATION
-// Unstable attempt to provide a more optimized std::function
-# define _LIBCPP_ABI_OPTIMIZED_FUNCTION
-#elif _LIBCPP_ABI_VERSION == 1
-# if !defined(_LIBCPP_OBJECT_FORMAT_COFF)
-// Enable compiling copies of now inline methods into the dylib to support
-// applications compiled against older libraries. This is unnecessary with
-// COFF dllexport semantics, since dllexport forces a non-inline definition
-// of inline functions to be emitted anyway. Our own non-inline copy would
-// conflict with the dllexport-emitted copy, so we disable it.
-# define _LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS
-# endif
-// Feature macros for disabling pre ABI v1 features. All of these options
-// are deprecated.
-# if defined(__FreeBSD__)
-# define _LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR
-# endif
-#endif
-
-#ifdef _LIBCPP_TRIVIAL_PAIR_COPY_CTOR
-#error "_LIBCPP_TRIVIAL_PAIR_COPY_CTOR" is no longer supported. \
- use _LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR instead
-#endif
-
-#define _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_X##_LIBCPP_Y
-#define _LIBCPP_CONCAT(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y)
-
-#ifndef _LIBCPP_ABI_NAMESPACE
-# define _LIBCPP_ABI_NAMESPACE _LIBCPP_CONCAT(__,_LIBCPP_ABI_VERSION)
-#endif
-
-#if __cplusplus < 201103L
-#define _LIBCPP_CXX03_LANG
-#endif
-
-#ifndef __has_attribute
-#define __has_attribute(__x) 0
-#endif
-
-#ifndef __has_builtin
-#define __has_builtin(__x) 0
-#endif
-
-#ifndef __has_extension
-#define __has_extension(__x) 0
-#endif
-
-#ifndef __has_feature
-#define __has_feature(__x) 0
-#endif
-
-#ifndef __has_cpp_attribute
-#define __has_cpp_attribute(__x) 0
-#endif
-
-// '__is_identifier' returns '0' if '__x' is a reserved identifier provided by
-// the compiler and '1' otherwise.
-#ifndef __is_identifier
-#define __is_identifier(__x) 1
-#endif
-
-#ifndef __has_declspec_attribute
-#define __has_declspec_attribute(__x) 0
-#endif
-
-#define __has_keyword(__x) !(__is_identifier(__x))
-
-#ifndef __has_include
-#define __has_include(...) 0
-#endif
-
-#if defined(__clang__)
-# define _LIBCPP_COMPILER_CLANG
-# ifndef __apple_build_version__
-# define _LIBCPP_CLANG_VER (__clang_major__ * 100 + __clang_minor__)
-# endif
-#elif defined(__GNUC__)
-# define _LIBCPP_COMPILER_GCC
-#elif defined(_MSC_VER)
-# define _LIBCPP_COMPILER_MSVC
-#elif defined(__IBMCPP__)
-# define _LIBCPP_COMPILER_IBM
-#endif
-
-#ifndef _LIBCPP_CLANG_VER
-#define _LIBCPP_CLANG_VER 0
-#endif
-
-// FIXME: ABI detection should be done via compiler builtin macros. This
-// is just a placeholder until Clang implements such macros. For now assume
-// that Windows compilers pretending to be MSVC++ target the Microsoft ABI,
-// and allow the user to explicitly specify the ABI to handle cases where this
-// heuristic falls short.
-#if defined(_LIBCPP_ABI_FORCE_ITANIUM) && defined(_LIBCPP_ABI_FORCE_MICROSOFT)
-# error "Only one of _LIBCPP_ABI_FORCE_ITANIUM and _LIBCPP_ABI_FORCE_MICROSOFT can be defined"
-#elif defined(_LIBCPP_ABI_FORCE_ITANIUM)
-# define _LIBCPP_ABI_ITANIUM
-#elif defined(_LIBCPP_ABI_FORCE_MICROSOFT)
-# define _LIBCPP_ABI_MICROSOFT
-#else
-# if defined(_WIN32) && defined(_MSC_VER)
-# define _LIBCPP_ABI_MICROSOFT
-# else
-# define _LIBCPP_ABI_ITANIUM
-# endif
-#endif
-
-// Need to detect which libc we're using if we're on Linux.
-#if defined(__linux__)
-# include <features.h>
-# if defined(__GLIBC_PREREQ)
-# define _LIBCPP_GLIBC_PREREQ(a, b) __GLIBC_PREREQ(a, b)
-# else
-# define _LIBCPP_GLIBC_PREREQ(a, b) 0
-# endif // defined(__GLIBC_PREREQ)
-#endif // defined(__linux__)
-
-#ifdef __LITTLE_ENDIAN__
-# if __LITTLE_ENDIAN__
-# define _LIBCPP_LITTLE_ENDIAN
-# endif // __LITTLE_ENDIAN__
-#endif // __LITTLE_ENDIAN__
-
-#ifdef __BIG_ENDIAN__
-# if __BIG_ENDIAN__
-# define _LIBCPP_BIG_ENDIAN
-# endif // __BIG_ENDIAN__
-#endif // __BIG_ENDIAN__
-
-#ifdef __BYTE_ORDER__
-# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
-# define _LIBCPP_LITTLE_ENDIAN
-# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
-# define _LIBCPP_BIG_ENDIAN
-# endif // __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
-#endif // __BYTE_ORDER__
-
-#ifdef __FreeBSD__
-# include <sys/endian.h>
-# if _BYTE_ORDER == _LITTLE_ENDIAN
-# define _LIBCPP_LITTLE_ENDIAN
-# else // _BYTE_ORDER == _LITTLE_ENDIAN
-# define _LIBCPP_BIG_ENDIAN
-# endif // _BYTE_ORDER == _LITTLE_ENDIAN
-# ifndef __LONG_LONG_SUPPORTED
-# define _LIBCPP_HAS_NO_LONG_LONG
-# endif // __LONG_LONG_SUPPORTED
-#endif // __FreeBSD__
-
-#ifdef __NetBSD__
-# include <sys/endian.h>
-# if _BYTE_ORDER == _LITTLE_ENDIAN
-# define _LIBCPP_LITTLE_ENDIAN
-# else // _BYTE_ORDER == _LITTLE_ENDIAN
-# define _LIBCPP_BIG_ENDIAN
-# endif // _BYTE_ORDER == _LITTLE_ENDIAN
-# define _LIBCPP_HAS_QUICK_EXIT
-#endif // __NetBSD__
-
-#ifdef __OpenBSD__
-# include <sys/_endian.h>
-# if _BYTE_ORDER == _LITTLE_ENDIAN
-# define _LIBCPP_LITTLE_ENDIAN
-# else // _BYTE_ORDER == _LITTLE_ENDIAN
-# define _LIBCPP_BIG_ENDIAN
-# endif // _BYTE_ORDER == _LITTLE_ENDIAN
-#endif // __OpenBSD__
-
-#if defined(_WIN32)
-# define _LIBCPP_WIN32API
-# define _LIBCPP_LITTLE_ENDIAN
-# define _LIBCPP_SHORT_WCHAR 1
-// Both MinGW and native MSVC provide a "MSVC"-like enviroment
-# define _LIBCPP_MSVCRT_LIKE
-// If mingw not explicitly detected, assume using MS C runtime only if
-// a MS compatibility version is specified.
-# if defined(_MSC_VER) && !defined(__MINGW32__)
-# define _LIBCPP_MSVCRT // Using Microsoft's C Runtime library
-# endif
-# if (defined(_M_AMD64) || defined(__x86_64__)) || (defined(_M_ARM) || defined(__arm__))
-# define _LIBCPP_HAS_BITSCAN64
-# endif
-# define _LIBCPP_HAS_OPEN_WITH_WCHAR
-# if defined(_LIBCPP_MSVCRT)
-# define _LIBCPP_HAS_QUICK_EXIT
-# endif
-
-// Some CRT APIs are unavailable to store apps
-# if defined(WINAPI_FAMILY)
-# include <winapifamily.h>
-# if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && \
- (!defined(WINAPI_PARTITION_SYSTEM) || \
- !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_SYSTEM))
-# define _LIBCPP_WINDOWS_STORE_APP
-# endif
-# endif
-#endif // defined(_WIN32)
-
-#ifdef __sun__
-# include <sys/isa_defs.h>
-# ifdef _LITTLE_ENDIAN
-# define _LIBCPP_LITTLE_ENDIAN
-# else
-# define _LIBCPP_BIG_ENDIAN
-# endif
-#endif // __sun__
-
-#if defined(__CloudABI__) || defined(__OpenBSD__)
- // Certain architectures provide arc4random(). Prefer using
- // arc4random() over /dev/{u,}random to make it possible to obtain
- // random data even when using sandboxing mechanisms such as chroots,
- // Capsicum, etc.
-# define _LIBCPP_USING_ARC4_RANDOM
-#elif defined(__Fuchsia__)
-# define _LIBCPP_USING_GETENTROPY
-#elif defined(__native_client__)
- // NaCl's sandbox (which PNaCl also runs in) doesn't allow filesystem access,
- // including accesses to the special files under /dev. C++11's
- // std::random_device is instead exposed through a NaCl syscall.
-# define _LIBCPP_USING_NACL_RANDOM
-#elif defined(_LIBCPP_WIN32API)
-# define _LIBCPP_USING_WIN32_RANDOM
-#else
-# define _LIBCPP_USING_DEV_RANDOM
-#endif
-
-#if !defined(_LIBCPP_LITTLE_ENDIAN) && !defined(_LIBCPP_BIG_ENDIAN)
-# include <endian.h>
-# if __BYTE_ORDER == __LITTLE_ENDIAN
-# define _LIBCPP_LITTLE_ENDIAN
-# elif __BYTE_ORDER == __BIG_ENDIAN
-# define _LIBCPP_BIG_ENDIAN
-# else // __BYTE_ORDER == __BIG_ENDIAN
-# error unable to determine endian
-# endif
-#endif // !defined(_LIBCPP_LITTLE_ENDIAN) && !defined(_LIBCPP_BIG_ENDIAN)
-
-#if __has_attribute(__no_sanitize__) && !defined(_LIBCPP_COMPILER_GCC)
-# define _LIBCPP_NO_CFI __attribute__((__no_sanitize__("cfi")))
-#else
-# define _LIBCPP_NO_CFI
-#endif
-
-#if __ISO_C_VISIBLE >= 2011 || __cplusplus >= 201103L
-# if defined(__FreeBSD__)
-# define _LIBCPP_HAS_QUICK_EXIT
-# define _LIBCPP_HAS_C11_FEATURES
-# elif defined(__OpenBSD__)
-# define _LIBCPP_HAS_TIMESPEC_GET
-# define _LIBCPP_HAS_C11_FEATURES
-# elif defined(__Fuchsia__)
-# define _LIBCPP_HAS_QUICK_EXIT
-# define _LIBCPP_HAS_TIMESPEC_GET
-# define _LIBCPP_HAS_C11_FEATURES
-# elif defined(__linux__)
-# if !defined(_LIBCPP_HAS_MUSL_LIBC)
-# if _LIBCPP_GLIBC_PREREQ(2, 15) || defined(__BIONIC__)
-# define _LIBCPP_HAS_QUICK_EXIT
-# endif
-# if _LIBCPP_GLIBC_PREREQ(2, 17)
-# define _LIBCPP_HAS_C11_FEATURES
-# define _LIBCPP_HAS_TIMESPEC_GET
-# endif
-# else // defined(_LIBCPP_HAS_MUSL_LIBC)
-# define _LIBCPP_HAS_QUICK_EXIT
-# define _LIBCPP_HAS_TIMESPEC_GET
-# define _LIBCPP_HAS_C11_FEATURES
-# endif
-# endif // __linux__
-#endif
-
-#ifndef _LIBCPP_CXX03_LANG
-# define _LIBCPP_ALIGNOF(_Tp) alignof(_Tp)
-#elif defined(_LIBCPP_COMPILER_CLANG)
-# define _LIBCPP_ALIGNOF(_Tp) _Alignof(_Tp)
-#else
-// This definition is potentially buggy, but it's only taken with GCC in C++03,
-// which we barely support anyway. See llvm.org/PR39713
-# define _LIBCPP_ALIGNOF(_Tp) __alignof(_Tp)
-#endif
-
-#define _LIBCPP_PREFERRED_ALIGNOF(_Tp) __alignof(_Tp)
-
-#if defined(_LIBCPP_COMPILER_CLANG)
-
-// _LIBCPP_ALTERNATE_STRING_LAYOUT is an old name for
-// _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT left here for backward compatibility.
-#if (defined(__APPLE__) && !defined(__i386__) && !defined(__x86_64__) && \
- (!defined(__arm__) || __ARM_ARCH_7K__ >= 2)) || \
- defined(_LIBCPP_ALTERNATE_STRING_LAYOUT)
-#define _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
-#endif
-
-#if __has_feature(cxx_alignas)
-# define _ALIGNAS_TYPE(x) alignas(x)
-# define _ALIGNAS(x) alignas(x)
-#else
-# define _ALIGNAS_TYPE(x) __attribute__((__aligned__(_LIBCPP_ALIGNOF(x))))
-# define _ALIGNAS(x) __attribute__((__aligned__(x)))
-#endif
-
-#if __cplusplus < 201103L
-typedef __char16_t char16_t;
-typedef __char32_t char32_t;
-#endif
-
-#if !(__has_feature(cxx_exceptions)) && !defined(_LIBCPP_NO_EXCEPTIONS)
-#define _LIBCPP_NO_EXCEPTIONS
-#endif
-
-#if !(__has_feature(cxx_rtti)) && !defined(_LIBCPP_NO_RTTI)
-#define _LIBCPP_NO_RTTI
-#endif
-
-#if !(__has_feature(cxx_strong_enums))
-#define _LIBCPP_HAS_NO_STRONG_ENUMS
-#endif
-
-#if !(__has_feature(cxx_decltype))
-#define _LIBCPP_HAS_NO_DECLTYPE
-#endif
-
-#if __has_feature(cxx_attributes)
-# define _LIBCPP_NORETURN [[noreturn]]
-#else
-# define _LIBCPP_NORETURN __attribute__ ((noreturn))
-#endif
-
-#if !(__has_feature(cxx_lambdas))
-#define _LIBCPP_HAS_NO_LAMBDAS
-#endif
-
-#if !(__has_feature(cxx_nullptr))
-# if (__has_extension(cxx_nullptr) || __has_keyword(__nullptr)) && defined(_LIBCPP_ABI_ALWAYS_USE_CXX11_NULLPTR)
-# define nullptr __nullptr
-# else
-# define _LIBCPP_HAS_NO_NULLPTR
-# endif
-#endif
-
-#if !(__has_feature(cxx_rvalue_references))
-#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
-#endif
-
-#if !(__has_feature(cxx_auto_type))
-#define _LIBCPP_HAS_NO_AUTO_TYPE
-#endif
-
-#if !(__has_feature(cxx_variadic_templates))
-#define _LIBCPP_HAS_NO_VARIADICS
-#endif
-
-#if !(__has_feature(cxx_generalized_initializers))
-#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
-#endif
-
-#if __has_feature(is_base_of)
-#define _LIBCPP_HAS_IS_BASE_OF
-#endif
-
-#if __has_feature(is_final)
-#define _LIBCPP_HAS_IS_FINAL
-#endif
-
-// Objective-C++ features (opt-in)
-#if __has_feature(objc_arc)
-#define _LIBCPP_HAS_OBJC_ARC
-#endif
-
-#if __has_feature(objc_arc_weak)
-#define _LIBCPP_HAS_OBJC_ARC_WEAK
-#endif
-
-#if !(__has_feature(cxx_constexpr))
-#define _LIBCPP_HAS_NO_CONSTEXPR
-#endif
-
-#if !(__has_feature(cxx_relaxed_constexpr))
-#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
-#endif
-
-#if !(__has_feature(cxx_variable_templates))
-#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
-#endif
-
-#if !(__has_feature(cxx_noexcept))
-#define _LIBCPP_HAS_NO_NOEXCEPT
-#endif
-
-#if __has_feature(underlying_type)
-#define _LIBCPP_UNDERLYING_TYPE(T) __underlying_type(T)
-#endif
-
-#if __has_feature(is_literal)
-#define _LIBCPP_IS_LITERAL(T) __is_literal(T)
-#endif
-
-#if !defined(_LIBCPP_HAS_NO_ASAN) && !__has_feature(address_sanitizer)
-#define _LIBCPP_HAS_NO_ASAN
-#endif
-
-// Allow for build-time disabling of unsigned integer sanitization
-#if !defined(_LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK) && __has_attribute(no_sanitize)
-#define _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK __attribute__((__no_sanitize__("unsigned-integer-overflow")))
-#endif
-
-#if __has_builtin(__builtin_launder)
-#define _LIBCPP_COMPILER_HAS_BUILTIN_LAUNDER
-#endif
-
-#if !__is_identifier(__has_unique_object_representations)
-#define _LIBCPP_HAS_UNIQUE_OBJECT_REPRESENTATIONS
-#endif
-
-#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__always_inline__))
-
-// No apple compilers support ""d and ""y at this time.
-#if _LIBCPP_CLANG_VER < 800 || defined(__apple_build_version__)
-#define _LIBCPP_HAS_NO_CXX20_CHRONO_LITERALS
-#endif
-
-#elif defined(_LIBCPP_COMPILER_GCC)
-
-#define _ALIGNAS(x) __attribute__((__aligned__(x)))
-#define _ALIGNAS_TYPE(x) __attribute__((__aligned__(_LIBCPP_ALIGNOF(x))))
-
-#define _LIBCPP_NORETURN __attribute__((noreturn))
-
-#if _GNUC_VER >= 407
-#define _LIBCPP_UNDERLYING_TYPE(T) __underlying_type(T)
-#define _LIBCPP_IS_LITERAL(T) __is_literal_type(T)
-#define _LIBCPP_HAS_IS_FINAL
-#endif
-
-#if defined(__GNUC__) && _GNUC_VER >= 403
-#define _LIBCPP_HAS_IS_BASE_OF
-#endif
-
-#if !__EXCEPTIONS && !defined(_LIBCPP_NO_EXCEPTIONS)
-#define _LIBCPP_NO_EXCEPTIONS
-#endif
-
-// constexpr was added to GCC in 4.6.
-#if _GNUC_VER < 406
-# define _LIBCPP_HAS_NO_CONSTEXPR
-// Can only use constexpr in c++11 mode.
-#elif !defined(__GXX_EXPERIMENTAL_CXX0X__) && __cplusplus < 201103L
-# define _LIBCPP_HAS_NO_CONSTEXPR
-#endif
-
-// Determine if GCC supports relaxed constexpr
-#if !defined(__cpp_constexpr) || __cpp_constexpr < 201304L
-#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
-#endif
-
-// GCC 5 will support variable templates
-#if !defined(__cpp_variable_templates) || __cpp_variable_templates < 201304L
-#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
-#endif
-
-#ifndef __GXX_EXPERIMENTAL_CXX0X__
-
-#define _LIBCPP_HAS_NO_DECLTYPE
-#define _LIBCPP_HAS_NO_NULLPTR
-#define _LIBCPP_HAS_NO_UNICODE_CHARS
-#define _LIBCPP_HAS_NO_VARIADICS
-#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
-#define _LIBCPP_HAS_NO_STRONG_ENUMS
-#define _LIBCPP_HAS_NO_NOEXCEPT
-
-#else // __GXX_EXPERIMENTAL_CXX0X__
-
-#if _GNUC_VER < 403
-#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
-#endif
-
-
-#if _GNUC_VER < 404
-#define _LIBCPP_HAS_NO_DECLTYPE
-#define _LIBCPP_HAS_NO_UNICODE_CHARS
-#define _LIBCPP_HAS_NO_VARIADICS
-#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
-#endif // _GNUC_VER < 404
-
-#if _GNUC_VER < 406
-#define _LIBCPP_HAS_NO_NOEXCEPT
-#define _LIBCPP_HAS_NO_NULLPTR
-#endif
-
-#endif // __GXX_EXPERIMENTAL_CXX0X__
-
-#if !defined(_LIBCPP_HAS_NO_ASAN) && !defined(__SANITIZE_ADDRESS__)
-#define _LIBCPP_HAS_NO_ASAN
-#endif
-
-#if _GNUC_VER >= 700
-#define _LIBCPP_COMPILER_HAS_BUILTIN_LAUNDER
-#endif
-
-#if _GNUC_VER >= 700
-#define _LIBCPP_HAS_UNIQUE_OBJECT_REPRESENTATIONS
-#endif
-
-#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__always_inline__))
-
-#elif defined(_LIBCPP_COMPILER_MSVC)
-
-#define _LIBCPP_TOSTRING2(x) #x
-#define _LIBCPP_TOSTRING(x) _LIBCPP_TOSTRING2(x)
-#define _LIBCPP_WARNING(x) __pragma(message(__FILE__ "(" _LIBCPP_TOSTRING(__LINE__) ") : warning note: " x))
-
-#if _MSC_VER < 1900
-#error "MSVC versions prior to Visual Studio 2015 are not supported"
-#endif
-
-#define _LIBCPP_HAS_IS_BASE_OF
-#define _LIBCPP_HAS_NO_CONSTEXPR
-#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
-#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
-#define _LIBCPP_HAS_NO_NOEXCEPT
-#define __alignof__ __alignof
-#define _LIBCPP_NORETURN __declspec(noreturn)
-#define _ALIGNAS(x) __declspec(align(x))
-#define _ALIGNAS_TYPE(x) alignas(x)
-#define _LIBCPP_HAS_NO_VARIADICS
-
-#define _LIBCPP_WEAK
-
-#define _LIBCPP_HAS_NO_ASAN
-
-#define _LIBCPP_ALWAYS_INLINE __forceinline
-
-#define _LIBCPP_HAS_NO_VECTOR_EXTENSION
-
-#elif defined(_LIBCPP_COMPILER_IBM)
-
-#define _ALIGNAS(x) __attribute__((__aligned__(x)))
-#define _ALIGNAS_TYPE(x) __attribute__((__aligned__(_LIBCPP_ALIGNOF(x))))
-#define _ATTRIBUTE(x) __attribute__((x))
-#define _LIBCPP_NORETURN __attribute__((noreturn))
-
-#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
-#define _LIBCPP_HAS_NO_NOEXCEPT
-#define _LIBCPP_HAS_NO_NULLPTR
-#define _LIBCPP_HAS_NO_UNICODE_CHARS
-#define _LIBCPP_HAS_IS_BASE_OF
-#define _LIBCPP_HAS_IS_FINAL
-#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
-
-#if defined(_AIX)
-#define __MULTILOCALE_API
-#endif
-
-#define _LIBCPP_HAS_NO_ASAN
-
-#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__always_inline__))
-
-#define _LIBCPP_HAS_NO_VECTOR_EXTENSION
-
-#endif // _LIBCPP_COMPILER_[CLANG|GCC|MSVC|IBM]
-
-#if defined(_LIBCPP_OBJECT_FORMAT_COFF)
-
-#ifdef _DLL
-# define _LIBCPP_CRT_FUNC __declspec(dllimport)
-#else
-# define _LIBCPP_CRT_FUNC
-#endif
-
-#if defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
-# define _LIBCPP_DLL_VIS
-# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
-# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
-# define _LIBCPP_OVERRIDABLE_FUNC_VIS
-# define _LIBCPP_EXPORTED_FROM_ABI
-#elif defined(_LIBCPP_BUILDING_LIBRARY)
-# define _LIBCPP_DLL_VIS __declspec(dllexport)
-# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
-# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS _LIBCPP_DLL_VIS
-# define _LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_DLL_VIS
-# define _LIBCPP_EXPORTED_FROM_ABI __declspec(dllexport)
-#else
-# define _LIBCPP_DLL_VIS __declspec(dllimport)
-# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_DLL_VIS
-# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
-# define _LIBCPP_OVERRIDABLE_FUNC_VIS
-# define _LIBCPP_EXPORTED_FROM_ABI __declspec(dllimport)
-#endif
-
-#define _LIBCPP_TYPE_VIS _LIBCPP_DLL_VIS
-#define _LIBCPP_FUNC_VIS _LIBCPP_DLL_VIS
-#define _LIBCPP_EXCEPTION_ABI _LIBCPP_DLL_VIS
-#define _LIBCPP_HIDDEN
-#define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
-#define _LIBCPP_TEMPLATE_VIS
-#define _LIBCPP_ENUM_VIS
-
-#endif // defined(_LIBCPP_OBJECT_FORMAT_COFF)
-
-#ifndef _LIBCPP_HIDDEN
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
-# define _LIBCPP_HIDDEN __attribute__ ((__visibility__("hidden")))
-# else
-# define _LIBCPP_HIDDEN
-# endif
-#endif
-
-#ifndef _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
-// The inline should be removed once PR32114 is resolved
-# define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS inline _LIBCPP_HIDDEN
-# else
-# define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
-# endif
-#endif
-
-#ifndef _LIBCPP_FUNC_VIS
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
-# define _LIBCPP_FUNC_VIS __attribute__ ((__visibility__("default")))
-# else
-# define _LIBCPP_FUNC_VIS
-# endif
-#endif
-
-#ifndef _LIBCPP_TYPE_VIS
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
-# define _LIBCPP_TYPE_VIS __attribute__ ((__visibility__("default")))
-# else
-# define _LIBCPP_TYPE_VIS
-# endif
-#endif
-
-#ifndef _LIBCPP_TEMPLATE_VIS
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
-# if __has_attribute(__type_visibility__)
-# define _LIBCPP_TEMPLATE_VIS __attribute__ ((__type_visibility__("default")))
-# else
-# define _LIBCPP_TEMPLATE_VIS __attribute__ ((__visibility__("default")))
-# endif
-# else
-# define _LIBCPP_TEMPLATE_VIS
-# endif
-#endif
-
-#ifndef _LIBCPP_EXPORTED_FROM_ABI
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
-# define _LIBCPP_EXPORTED_FROM_ABI __attribute__((__visibility__("default")))
-# else
-# define _LIBCPP_EXPORTED_FROM_ABI
-# endif
-#endif
-
-#ifndef _LIBCPP_OVERRIDABLE_FUNC_VIS
-#define _LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_FUNC_VIS
-#endif
-
-#ifndef _LIBCPP_EXCEPTION_ABI
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
-# define _LIBCPP_EXCEPTION_ABI __attribute__ ((__visibility__("default")))
-# else
-# define _LIBCPP_EXCEPTION_ABI
-# endif
-#endif
-
-#ifndef _LIBCPP_ENUM_VIS
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) && __has_attribute(__type_visibility__)
-# define _LIBCPP_ENUM_VIS __attribute__ ((__type_visibility__("default")))
-# else
-# define _LIBCPP_ENUM_VIS
-# endif
-#endif
-
-#ifndef _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) && __has_attribute(__type_visibility__)
-# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __attribute__ ((__visibility__("default")))
-# else
-# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
-# endif
-#endif
-
-#ifndef _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
-#define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
-#endif
-
-#if __has_attribute(internal_linkage)
-# define _LIBCPP_INTERNAL_LINKAGE __attribute__ ((internal_linkage))
-#else
-# define _LIBCPP_INTERNAL_LINKAGE _LIBCPP_ALWAYS_INLINE
-#endif
-
-#if __has_attribute(exclude_from_explicit_instantiation)
-# define _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION __attribute__ ((__exclude_from_explicit_instantiation__))
-#else
- // Try to approximate the effect of exclude_from_explicit_instantiation
- // (which is that entities are not assumed to be provided by explicit
- // template instantitations in the dylib) by always inlining those entities.
-# define _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION _LIBCPP_ALWAYS_INLINE
-#endif
-
-#ifndef _LIBCPP_HIDE_FROM_ABI_PER_TU
-# ifndef _LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT
-# define _LIBCPP_HIDE_FROM_ABI_PER_TU 0
-# else
-# define _LIBCPP_HIDE_FROM_ABI_PER_TU 1
-# endif
-#endif
-
-#ifndef _LIBCPP_HIDE_FROM_ABI
-# if _LIBCPP_HIDE_FROM_ABI_PER_TU
-# define _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDDEN _LIBCPP_INTERNAL_LINKAGE
-# else
-# define _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDDEN _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION
-# endif
-#endif
-
-#ifdef _LIBCPP_BUILDING_LIBRARY
-# if _LIBCPP_ABI_VERSION > 1
-# define _LIBCPP_HIDE_FROM_ABI_AFTER_V1 _LIBCPP_HIDE_FROM_ABI
-# else
-# define _LIBCPP_HIDE_FROM_ABI_AFTER_V1
-# endif
-#else
-# define _LIBCPP_HIDE_FROM_ABI_AFTER_V1 _LIBCPP_HIDE_FROM_ABI
-#endif
-
-// Just so we can migrate to the new macros gradually.
-#define _LIBCPP_INLINE_VISIBILITY _LIBCPP_HIDE_FROM_ABI
-
-// Inline namespaces are available in Clang/GCC/MSVC regardless of C++ dialect.
-#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std { inline namespace _LIBCPP_ABI_NAMESPACE {
-#define _LIBCPP_END_NAMESPACE_STD } }
-#define _VSTD std::_LIBCPP_ABI_NAMESPACE
-_LIBCPP_BEGIN_NAMESPACE_STD _LIBCPP_END_NAMESPACE_STD
-
-#if _LIBCPP_STD_VER >= 17
-#define _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM \
- _LIBCPP_BEGIN_NAMESPACE_STD inline namespace __fs { namespace filesystem {
-#else
-#define _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM \
- _LIBCPP_BEGIN_NAMESPACE_STD namespace __fs { namespace filesystem {
-#endif
-
-#define _LIBCPP_END_NAMESPACE_FILESYSTEM \
- _LIBCPP_END_NAMESPACE_STD } }
-
-#define _VSTD_FS _VSTD::__fs::filesystem
-
-#ifndef _LIBCPP_PREFERRED_OVERLOAD
-# if __has_attribute(__enable_if__)
-# define _LIBCPP_PREFERRED_OVERLOAD __attribute__ ((__enable_if__(true, "")))
-# endif
-#endif
-
-#ifndef _LIBCPP_HAS_NO_NOEXCEPT
-# define _NOEXCEPT noexcept
-# define _NOEXCEPT_(x) noexcept(x)
-#else
-# define _NOEXCEPT throw()
-# define _NOEXCEPT_(x)
-#endif
-
-#if defined(_LIBCPP_DEBUG_USE_EXCEPTIONS)
-# if !defined(_LIBCPP_DEBUG)
-# error cannot use _LIBCPP_DEBUG_USE_EXCEPTIONS unless _LIBCPP_DEBUG is defined
-# endif
-# ifdef _LIBCPP_HAS_NO_NOEXCEPT
-# define _NOEXCEPT_DEBUG
-# define _NOEXCEPT_DEBUG_(x)
-# else
-# define _NOEXCEPT_DEBUG noexcept(false)
-# define _NOEXCEPT_DEBUG_(x) noexcept(false)
-# endif
-#else
-# define _NOEXCEPT_DEBUG _NOEXCEPT
-# define _NOEXCEPT_DEBUG_(x) _NOEXCEPT_(x)
-#endif
-
-#ifdef _LIBCPP_HAS_NO_UNICODE_CHARS
-typedef unsigned short char16_t;
-typedef unsigned int char32_t;
-#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
-
-#ifndef __SIZEOF_INT128__
-#define _LIBCPP_HAS_NO_INT128
-#endif
-
-#ifdef _LIBCPP_CXX03_LANG
-# if __has_extension(c_static_assert)
-# define static_assert(__b, __m) _Static_assert(__b, __m)
-# else
-extern "C++" {
-template <bool> struct __static_assert_test;
-template <> struct __static_assert_test<true> {};
-template <unsigned> struct __static_assert_check {};
-}
-# define static_assert(__b, __m) \
- typedef __static_assert_check<sizeof(__static_assert_test<(__b)>)> \
- _LIBCPP_CONCAT(__t, __LINE__)
-# endif // __has_extension(c_static_assert)
-#endif // _LIBCPP_CXX03_LANG
-
-#ifdef _LIBCPP_HAS_NO_DECLTYPE
-// GCC 4.6 provides __decltype in all standard modes.
-# if __has_keyword(__decltype) || _LIBCPP_CLANG_VER >= 304 || _GNUC_VER >= 406
-# define decltype(__x) __decltype(__x)
-# else
-# define decltype(__x) __typeof__(__x)
-# endif
-#endif
-
-#ifdef _LIBCPP_HAS_NO_CONSTEXPR
-# define _LIBCPP_CONSTEXPR
-#else
-# define _LIBCPP_CONSTEXPR constexpr
-#endif
-
-#ifdef _LIBCPP_CXX03_LANG
-# define _LIBCPP_DEFAULT {}
-#else
-# define _LIBCPP_DEFAULT = default;
-#endif
-
-#ifdef _LIBCPP_CXX03_LANG
-# define _LIBCPP_EQUAL_DELETE
-#else
-# define _LIBCPP_EQUAL_DELETE = delete
-#endif
-
-#ifdef __GNUC__
-# define _NOALIAS __attribute__((__malloc__))
-#else
-# define _NOALIAS
-#endif
-
-#if __has_feature(cxx_explicit_conversions) || defined(__IBMCPP__) || \
- (!defined(_LIBCPP_CXX03_LANG) && defined(__GNUC__)) // All supported GCC versions
-# define _LIBCPP_EXPLICIT explicit
-#else
-# define _LIBCPP_EXPLICIT
-#endif
-
-#if !__has_builtin(__builtin_operator_new) || !__has_builtin(__builtin_operator_delete)
-#define _LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE
-#endif
-
-#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
-# define _LIBCPP_DECLARE_STRONG_ENUM(x) struct _LIBCPP_TYPE_VIS x { enum __lx
-# define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x) \
- __lx __v_; \
- _LIBCPP_INLINE_VISIBILITY x(__lx __v) : __v_(__v) {} \
- _LIBCPP_INLINE_VISIBILITY explicit x(int __v) : __v_(static_cast<__lx>(__v)) {} \
- _LIBCPP_INLINE_VISIBILITY operator int() const {return __v_;} \
- };
-#else // _LIBCPP_HAS_NO_STRONG_ENUMS
-# define _LIBCPP_DECLARE_STRONG_ENUM(x) enum class _LIBCPP_ENUM_VIS x
-# define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x)
-#endif // _LIBCPP_HAS_NO_STRONG_ENUMS
-
-#ifdef _LIBCPP_DEBUG
-# if _LIBCPP_DEBUG == 0
-# define _LIBCPP_DEBUG_LEVEL 1
-# elif _LIBCPP_DEBUG == 1
-# define _LIBCPP_DEBUG_LEVEL 2
-# else
-# error Supported values for _LIBCPP_DEBUG are 0 and 1
-# endif
-# if !defined(_LIBCPP_BUILDING_LIBRARY)
-# define _LIBCPP_EXTERN_TEMPLATE(...)
-# endif
-#endif
-
-#ifdef _LIBCPP_DISABLE_EXTERN_TEMPLATE
-#define _LIBCPP_EXTERN_TEMPLATE(...)
-#define _LIBCPP_EXTERN_TEMPLATE2(...)
-#endif
-
-#ifndef _LIBCPP_EXTERN_TEMPLATE
-#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
-#endif
-
-#ifndef _LIBCPP_EXTERN_TEMPLATE2
-#define _LIBCPP_EXTERN_TEMPLATE2(...) extern template __VA_ARGS__;
-#endif
-
-#if defined(__APPLE__) && defined(__LP64__) && !defined(__x86_64__)
-#define _LIBCPP_NONUNIQUE_RTTI_BIT (1ULL << 63)
-#endif
-
-#if defined(__APPLE__) || defined(__FreeBSD__) || defined(_LIBCPP_MSVCRT_LIKE) || \
- defined(__sun__) || defined(__NetBSD__) || defined(__CloudABI__)
-#define _LIBCPP_LOCALE__L_EXTENSIONS 1
-#endif
-
-#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
-// Most unix variants have catopen. These are the specific ones that don't.
-# if !defined(__BIONIC__) && !defined(_NEWLIB_VERSION)
-# define _LIBCPP_HAS_CATOPEN 1
-# endif
-#endif
-
-#ifdef __FreeBSD__
-#define _DECLARE_C99_LDBL_MATH 1
-#endif
-
-// If we are getting operator new from the MSVC CRT, then allocation overloads
-// for align_val_t were added in 19.12, aka VS 2017 version 15.3.
-#if defined(_LIBCPP_MSVCRT) && defined(_MSC_VER) && _MSC_VER < 1912
-# define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
-#elif defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_NO_VCRUNTIME)
-# define _LIBCPP_DEFER_NEW_TO_VCRUNTIME
-# if !defined(__cpp_aligned_new)
- // We're defering to Microsoft's STL to provide aligned new et al. We don't
- // have it unless the language feature test macro is defined.
-# define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
-# endif
-#endif
-
-#if defined(__APPLE__)
-# if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && \
- defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__)
-# define __MAC_OS_X_VERSION_MIN_REQUIRED __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
-# endif
-#endif // defined(__APPLE__)
-
-#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) && \
- (defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) || \
- (!defined(__cpp_aligned_new) || __cpp_aligned_new < 201606))
-# define _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
-#endif
-
-#if defined(__APPLE__) || defined(__FreeBSD__)
-#define _LIBCPP_HAS_DEFAULTRUNELOCALE
-#endif
-
-#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun__)
-#define _LIBCPP_WCTYPE_IS_MASK
-#endif
-
-#if _LIBCPP_STD_VER <= 17 || !defined(__cpp_char8_t)
-#define _LIBCPP_NO_HAS_CHAR8_T
-#endif
-
-// Deprecation macros.
-// Deprecations warnings are only enabled when _LIBCPP_ENABLE_DEPRECATION_WARNINGS is defined.
-#if defined(_LIBCPP_ENABLE_DEPRECATION_WARNINGS)
-# if __has_attribute(deprecated)
-# define _LIBCPP_DEPRECATED __attribute__ ((deprecated))
-# elif _LIBCPP_STD_VER > 11
-# define _LIBCPP_DEPRECATED [[deprecated]]
-# else
-# define _LIBCPP_DEPRECATED
-# endif
-#else
-# define _LIBCPP_DEPRECATED
-#endif
-
-#if !defined(_LIBCPP_CXX03_LANG)
-# define _LIBCPP_DEPRECATED_IN_CXX11 _LIBCPP_DEPRECATED
-#else
-# define _LIBCPP_DEPRECATED_IN_CXX11
-#endif
-
-#if _LIBCPP_STD_VER >= 14
-# define _LIBCPP_DEPRECATED_IN_CXX14 _LIBCPP_DEPRECATED
-#else
-# define _LIBCPP_DEPRECATED_IN_CXX14
-#endif
-
-#if _LIBCPP_STD_VER >= 17
-# define _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_DEPRECATED
-#else
-# define _LIBCPP_DEPRECATED_IN_CXX17
-#endif
-
-#if _LIBCPP_STD_VER <= 11
-# define _LIBCPP_EXPLICIT_AFTER_CXX11
-#else
-# define _LIBCPP_EXPLICIT_AFTER_CXX11 explicit
-#endif
-
-#if _LIBCPP_STD_VER > 11 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR)
-# define _LIBCPP_CONSTEXPR_AFTER_CXX11 constexpr
-#else
-# define _LIBCPP_CONSTEXPR_AFTER_CXX11
-#endif
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR)
-# define _LIBCPP_CONSTEXPR_AFTER_CXX14 constexpr
-#else
-# define _LIBCPP_CONSTEXPR_AFTER_CXX14
-#endif
-
-#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR)
-# define _LIBCPP_CONSTEXPR_AFTER_CXX17 constexpr
-#else
-# define _LIBCPP_CONSTEXPR_AFTER_CXX17
-#endif
-
-// The _LIBCPP_NODISCARD_ATTRIBUTE should only be used to define other
-// NODISCARD macros to the correct attribute.
-#if __has_cpp_attribute(nodiscard) || defined(_LIBCPP_COMPILER_MSVC)
-# define _LIBCPP_NODISCARD_ATTRIBUTE [[nodiscard]]
-#elif defined(_LIBCPP_COMPILER_CLANG) && !defined(_LIBCPP_CXX03_LANG)
-# define _LIBCPP_NODISCARD_ATTRIBUTE [[clang::warn_unused_result]]
-#else
-// We can't use GCC's [[gnu::warn_unused_result]] and
-// __attribute__((warn_unused_result)), because GCC does not silence them via
-// (void) cast.
-# define _LIBCPP_NODISCARD_ATTRIBUTE
-#endif
-
-// _LIBCPP_NODISCARD_EXT may be used to apply [[nodiscard]] to entities not
-// specified as such as an extension.
-#if defined(_LIBCPP_ENABLE_NODISCARD) && !defined(_LIBCPP_DISABLE_NODISCARD_EXT)
-# define _LIBCPP_NODISCARD_EXT _LIBCPP_NODISCARD_ATTRIBUTE
-#else
-# define _LIBCPP_NODISCARD_EXT
-#endif
-
-#if !defined(_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17) && \
- (_LIBCPP_STD_VER > 17 || defined(_LIBCPP_ENABLE_NODISCARD))
-# define _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_NODISCARD_ATTRIBUTE
-#else
-# define _LIBCPP_NODISCARD_AFTER_CXX17
-#endif
-
-#if _LIBCPP_STD_VER > 14 && defined(__cpp_inline_variables) && (__cpp_inline_variables >= 201606L)
-# define _LIBCPP_INLINE_VAR inline
-#else
-# define _LIBCPP_INLINE_VAR
-#endif
-
-#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-# define _LIBCPP_EXPLICIT_MOVE(x) _VSTD::move(x)
-#else
-# define _LIBCPP_EXPLICIT_MOVE(x) (x)
-#endif
-
-#ifndef _LIBCPP_CONSTEXPR_IF_NODEBUG
-#if defined(_LIBCPP_DEBUG) || defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR)
-#define _LIBCPP_CONSTEXPR_IF_NODEBUG
-#else
-#define _LIBCPP_CONSTEXPR_IF_NODEBUG constexpr
-#endif
-#endif
-
-#ifndef _LIBCPP_HAS_NO_ASAN
-_LIBCPP_FUNC_VIS extern "C" void __sanitizer_annotate_contiguous_container(
- const void *, const void *, const void *, const void *);
-#endif
-
-// Try to find out if RTTI is disabled.
-// g++ and cl.exe have RTTI on by default and define a macro when it is.
-// g++ only defines the macro in 4.3.2 and onwards.
-#if !defined(_LIBCPP_NO_RTTI)
-# if defined(__GNUC__) && \
- ((__GNUC__ >= 5) || \
- (__GNUC__ == 4 && (__GNUC_MINOR__ >= 3 || __GNUC_PATCHLEVEL__ >= 2))) && \
- !defined(__GXX_RTTI)
-# define _LIBCPP_NO_RTTI
-# elif defined(_LIBCPP_COMPILER_MSVC) && !defined(_CPPRTTI)
-# define _LIBCPP_NO_RTTI
-# endif
-#endif
-
-#ifndef _LIBCPP_WEAK
-#define _LIBCPP_WEAK __attribute__((__weak__))
-#endif
-
-// Thread API
-#if !defined(_LIBCPP_HAS_NO_THREADS) && \
- !defined(_LIBCPP_HAS_THREAD_API_PTHREAD) && \
- !defined(_LIBCPP_HAS_THREAD_API_WIN32) && \
- !defined(_LIBCPP_HAS_THREAD_API_EXTERNAL)
-# if defined(__FreeBSD__) || \
- defined(__Fuchsia__) || \
- defined(__NetBSD__) || \
- defined(__linux__) || \
- defined(__GNU__) || \
- defined(__APPLE__) || \
- defined(__CloudABI__) || \
- defined(__sun__) || \
- (defined(__MINGW32__) && __has_include(<pthread.h>)) || \
- defined(__OpenBSD__)
-# define _LIBCPP_HAS_THREAD_API_PTHREAD
-# elif defined(_LIBCPP_WIN32API)
-# define _LIBCPP_HAS_THREAD_API_WIN32
-# else
-# error "No thread API"
-# endif // _LIBCPP_HAS_THREAD_API
-#endif // _LIBCPP_HAS_NO_THREADS
-
-#if defined(_LIBCPP_HAS_NO_THREADS) && defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
-#error _LIBCPP_HAS_THREAD_API_PTHREAD may only be defined when \
- _LIBCPP_HAS_NO_THREADS is not defined.
-#endif
-
-#if defined(_LIBCPP_HAS_NO_THREADS) && defined(_LIBCPP_HAS_THREAD_API_EXTERNAL)
-#error _LIBCPP_HAS_THREAD_API_EXTERNAL may not be defined when \
- _LIBCPP_HAS_NO_THREADS is defined.
-#endif
-
-#if defined(_LIBCPP_HAS_NO_MONOTONIC_CLOCK) && !defined(_LIBCPP_HAS_NO_THREADS)
-#error _LIBCPP_HAS_NO_MONOTONIC_CLOCK may only be defined when \
- _LIBCPP_HAS_NO_THREADS is defined.
-#endif
-
-// Systems that use capability-based security (FreeBSD with Capsicum,
-// Nuxi CloudABI) may only provide local filesystem access (using *at()).
-// Functions like open(), rename(), unlink() and stat() should not be
-// used, as they attempt to access the global filesystem namespace.
-#ifdef __CloudABI__
-#define _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
-#endif
-
-// CloudABI is intended for running networked services. Processes do not
-// have standard input and output channels.
-#ifdef __CloudABI__
-#define _LIBCPP_HAS_NO_STDIN
-#define _LIBCPP_HAS_NO_STDOUT
-#endif
-
-#if defined(__BIONIC__) || defined(__CloudABI__) || \
- defined(__Fuchsia__) || defined(_LIBCPP_HAS_MUSL_LIBC) || \
- defined(__OpenBSD__)
-#define _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
-#endif
-
-// Thread-unsafe functions such as strtok() and localtime()
-// are not available.
-#ifdef __CloudABI__
-#define _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
-#endif
-
-#if __has_feature(cxx_atomic) || __has_extension(c_atomic) || __has_keyword(_Atomic)
-# define _LIBCPP_HAS_C_ATOMIC_IMP
-#elif _GNUC_VER > 407
-# define _LIBCPP_HAS_GCC_ATOMIC_IMP
-#endif
-
-#if (!defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_GCC_ATOMIC_IMP)) \
- || defined(_LIBCPP_HAS_NO_THREADS)
-#define _LIBCPP_HAS_NO_ATOMIC_HEADER
-#endif
-
-#ifndef _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
-#define _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
-#endif
-
-#if defined(_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS)
-# if defined(__clang__) && __has_attribute(acquire_capability)
-// Work around the attribute handling in clang. When both __declspec and
-// __attribute__ are present, the processing goes awry preventing the definition
-// of the types.
-# if !defined(_LIBCPP_OBJECT_FORMAT_COFF)
-# define _LIBCPP_HAS_THREAD_SAFETY_ANNOTATIONS
-# endif
-# endif
-#endif
-
-#if __has_attribute(require_constant_initialization)
-# define _LIBCPP_SAFE_STATIC __attribute__((__require_constant_initialization__))
-#else
-# define _LIBCPP_SAFE_STATIC
-#endif
-
-#if !__has_builtin(__builtin_addressof) && _GNUC_VER < 700
-#define _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF
-#endif
-
-#if !defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
-# if defined(_LIBCPP_MSVCRT) || defined(_NEWLIB_VERSION)
-# define _LIBCPP_HAS_NO_OFF_T_FUNCTIONS
-# endif
-#endif
-
-#if __has_attribute(diagnose_if) && !defined(_LIBCPP_DISABLE_ADDITIONAL_DIAGNOSTICS)
-# define _LIBCPP_DIAGNOSE_WARNING(...) \
- __attribute__((diagnose_if(__VA_ARGS__, "warning")))
-# define _LIBCPP_DIAGNOSE_ERROR(...) \
- __attribute__((diagnose_if(__VA_ARGS__, "error")))
-#else
-# define _LIBCPP_DIAGNOSE_WARNING(...)
-# define _LIBCPP_DIAGNOSE_ERROR(...)
-#endif
-
-// Use a function like macro to imply that it must be followed by a semicolon
-#if __cplusplus > 201402L && __has_cpp_attribute(fallthrough)
-# define _LIBCPP_FALLTHROUGH() [[fallthrough]]
-#elif __has_cpp_attribute(clang::fallthrough)
-# define _LIBCPP_FALLTHROUGH() [[clang::fallthrough]]
-#elif __has_attribute(fallthough) || _GNUC_VER >= 700
-# define _LIBCPP_FALLTHROUGH() __attribute__((__fallthrough__))
-#else
-# define _LIBCPP_FALLTHROUGH() ((void)0)
-#endif
-
-#if defined(_LIBCPP_ABI_MICROSOFT) && \
- (defined(_LIBCPP_COMPILER_MSVC) || __has_declspec_attribute(empty_bases))
-# define _LIBCPP_DECLSPEC_EMPTY_BASES __declspec(empty_bases)
-#else
-# define _LIBCPP_DECLSPEC_EMPTY_BASES
-#endif
-
-#if defined(_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES)
-#define _LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR
-#define _LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS
-#define _LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE
-#define _LIBCPP_ENABLE_CXX17_REMOVED_BINDERS
-#endif // _LIBCPP_ENABLE_CXX17_REMOVED_FEATURES
-
-#if !defined(__cpp_deduction_guides) || __cpp_deduction_guides < 201611
-#define _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-#endif
-
-#if !__has_keyword(__is_aggregate) && (_GNUC_VER_NEW < 7001)
-#define _LIBCPP_HAS_NO_IS_AGGREGATE
-#endif
-
-#if !defined(__cpp_coroutines) || __cpp_coroutines < 201703L
-#define _LIBCPP_HAS_NO_COROUTINES
-#endif
-
-// FIXME: Correct this macro when either (A) a feature test macro for the
-// spaceship operator is provided, or (B) a compiler provides a complete
-// implementation.
-#define _LIBCPP_HAS_NO_SPACESHIP_OPERATOR
-
-// Decide whether to use availability macros.
-#if !defined(_LIBCPP_BUILDING_LIBRARY) && \
- !defined(_LIBCPP_DISABLE_AVAILABILITY) && \
- __has_feature(attribute_availability_with_strict) && \
- __has_feature(attribute_availability_in_templates)
-# ifdef __APPLE__
-# define _LIBCPP_USE_AVAILABILITY_APPLE
-# endif
-#endif
-
-// Define availability macros.
-#if defined(_LIBCPP_USE_AVAILABILITY_APPLE)
-# define _LIBCPP_AVAILABILITY_SHARED_MUTEX \
- __attribute__((availability(macosx,strict,introduced=10.12))) \
- __attribute__((availability(ios,strict,introduced=10.0))) \
- __attribute__((availability(tvos,strict,introduced=10.0))) \
- __attribute__((availability(watchos,strict,introduced=3.0)))
-# define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS \
- __attribute__((availability(macosx,strict,introduced=10.14))) \
- __attribute__((availability(ios,strict,introduced=12.0))) \
- __attribute__((availability(tvos,strict,introduced=12.0))) \
- __attribute__((availability(watchos,strict,introduced=5.0)))
-# define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS \
- _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS
-# define _LIBCPP_AVAILABILITY_BAD_ANY_CAST \
- _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS
-# define _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS \
- __attribute__((availability(macosx,strict,introduced=10.12))) \
- __attribute__((availability(ios,strict,introduced=10.0))) \
- __attribute__((availability(tvos,strict,introduced=10.0))) \
- __attribute__((availability(watchos,strict,introduced=3.0)))
-# define _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE \
- __attribute__((availability(macosx,strict,introduced=10.12))) \
- __attribute__((availability(ios,strict,introduced=10.0))) \
- __attribute__((availability(tvos,strict,introduced=10.0))) \
- __attribute__((availability(watchos,strict,introduced=3.0)))
-# define _LIBCPP_AVAILABILITY_FUTURE_ERROR \
- __attribute__((availability(ios,strict,introduced=6.0)))
-# define _LIBCPP_AVAILABILITY_TYPEINFO_VTABLE \
- __attribute__((availability(macosx,strict,introduced=10.9))) \
- __attribute__((availability(ios,strict,introduced=7.0)))
-# define _LIBCPP_AVAILABILITY_LOCALE_CATEGORY \
- __attribute__((availability(macosx,strict,introduced=10.9))) \
- __attribute__((availability(ios,strict,introduced=7.0)))
-# define _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR \
- __attribute__((availability(macosx,strict,introduced=10.9))) \
- __attribute__((availability(ios,strict,introduced=7.0)))
-#else
-# define _LIBCPP_AVAILABILITY_SHARED_MUTEX
-# define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS
-# define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS
-# define _LIBCPP_AVAILABILITY_BAD_ANY_CAST
-# define _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS
-# define _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE
-# define _LIBCPP_AVAILABILITY_FUTURE_ERROR
-# define _LIBCPP_AVAILABILITY_TYPEINFO_VTABLE
-# define _LIBCPP_AVAILABILITY_LOCALE_CATEGORY
-# define _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
-#endif
-
-// Define availability that depends on _LIBCPP_NO_EXCEPTIONS.
-#ifdef _LIBCPP_NO_EXCEPTIONS
-# define _LIBCPP_AVAILABILITY_FUTURE
-# define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST
-# define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
-# define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
-#else
-# define _LIBCPP_AVAILABILITY_FUTURE _LIBCPP_AVAILABILITY_FUTURE_ERROR
-# define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST _LIBCPP_AVAILABILITY_BAD_ANY_CAST
-# define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS
-# define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS
-#endif
-
-// The stream API was dropped and re-added in the dylib shipped on macOS
-// and iOS. We can only assume the dylib to provide these definitions for
-// macosx >= 10.9 and ios >= 7.0. Otherwise, the definitions are available
-// from the headers, but not from the dylib. Explicit instantiation
-// declarations for streams exist conditionally to this; if we provide
-// an explicit instantiation declaration and we try to deploy to a dylib
-// that does not provide those symbols, we'll get a load-time error.
-#if !defined(_LIBCPP_BUILDING_LIBRARY) && \
- ((defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && \
- __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1090) || \
- (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && \
- __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 70000))
-# define _LIBCPP_DO_NOT_ASSUME_STREAMS_EXPLICIT_INSTANTIATION_IN_DYLIB
-#endif
-
-#if defined(_LIBCPP_COMPILER_IBM)
-#define _LIBCPP_HAS_NO_PRAGMA_PUSH_POP_MACRO
-#endif
-
-#if defined(_LIBCPP_HAS_NO_PRAGMA_PUSH_POP_MACRO)
-# define _LIBCPP_PUSH_MACROS
-# define _LIBCPP_POP_MACROS
-#else
- // Don't warn about macro conflicts when we can restore them at the
- // end of the header.
-# ifndef _LIBCPP_DISABLE_MACRO_CONFLICT_WARNINGS
-# define _LIBCPP_DISABLE_MACRO_CONFLICT_WARNINGS
-# endif
-# if defined(_LIBCPP_COMPILER_MSVC)
-# define _LIBCPP_PUSH_MACROS \
- __pragma(push_macro("min")) \
- __pragma(push_macro("max"))
-# define _LIBCPP_POP_MACROS \
- __pragma(pop_macro("min")) \
- __pragma(pop_macro("max"))
-# else
-# define _LIBCPP_PUSH_MACROS \
- _Pragma("push_macro(\"min\")") \
- _Pragma("push_macro(\"max\")")
-# define _LIBCPP_POP_MACROS \
- _Pragma("pop_macro(\"min\")") \
- _Pragma("pop_macro(\"max\")")
-# endif
-#endif // defined(_LIBCPP_HAS_NO_PRAGMA_PUSH_POP_MACRO)
-
-#ifndef _LIBCPP_NO_AUTO_LINK
-# if defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_BUILDING_LIBRARY)
-# if defined(_DLL)
-# pragma comment(lib, "c++.lib")
-# else
-# pragma comment(lib, "libc++.lib")
-# endif
-# endif // defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_BUILDING_LIBRARY)
-#endif // _LIBCPP_NO_AUTO_LINK
-
-#define _LIBCPP_UNUSED_VAR(x) ((void)(x))
-
-#endif // __cplusplus
-
-#endif // _LIBCPP_CONFIG
diff --git a/lib/libcxx/include/__config_site.in b/lib/libcxx/include/__config_site.in
deleted file mode 100644
index 580a6aa4c07..00000000000
--- a/lib/libcxx/include/__config_site.in
+++ /dev/null
@@ -1,35 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CONFIG_SITE
-#define _LIBCPP_CONFIG_SITE
-
-#cmakedefine _LIBCPP_ABI_VERSION @_LIBCPP_ABI_VERSION@
-#cmakedefine _LIBCPP_ABI_UNSTABLE
-#cmakedefine _LIBCPP_ABI_FORCE_ITANIUM
-#cmakedefine _LIBCPP_ABI_FORCE_MICROSOFT
-#cmakedefine _LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT
-#cmakedefine _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
-#cmakedefine _LIBCPP_HAS_NO_STDIN
-#cmakedefine _LIBCPP_HAS_NO_STDOUT
-#cmakedefine _LIBCPP_HAS_NO_THREADS
-#cmakedefine _LIBCPP_HAS_NO_MONOTONIC_CLOCK
-#cmakedefine _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
-#cmakedefine _LIBCPP_HAS_MUSL_LIBC
-#cmakedefine _LIBCPP_HAS_THREAD_API_PTHREAD
-#cmakedefine _LIBCPP_HAS_THREAD_API_EXTERNAL
-#cmakedefine _LIBCPP_HAS_THREAD_API_WIN32
-#cmakedefine _LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL
-#cmakedefine _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS
-#cmakedefine _LIBCPP_NO_VCRUNTIME
-#cmakedefine _LIBCPP_ABI_NAMESPACE @_LIBCPP_ABI_NAMESPACE@
-
-@_LIBCPP_ABI_DEFINES@
-
-#endif // _LIBCPP_CONFIG_SITE
diff --git a/lib/libcxx/include/__debug b/lib/libcxx/include/__debug
deleted file mode 100644
index a8788f68f8f..00000000000
--- a/lib/libcxx/include/__debug
+++ /dev/null
@@ -1,302 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- __debug ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_DEBUG_H
-#define _LIBCPP_DEBUG_H
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#if defined(_LIBCPP_HAS_NO_NULLPTR)
-# include <cstddef>
-#endif
-
-#if _LIBCPP_DEBUG_LEVEL >= 1 || defined(_LIBCPP_BUILDING_LIBRARY)
-# include <cstdlib>
-# include <cstdio>
-# include <cstddef>
-# include <exception>
-#endif
-
-#if _LIBCPP_DEBUG_LEVEL >= 1 && !defined(_LIBCPP_ASSERT)
-# define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : \
- _VSTD::__libcpp_debug_function(_VSTD::__libcpp_debug_info(__FILE__, __LINE__, #x, m)))
-#endif
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
-#ifndef _LIBCPP_DEBUG_ASSERT
-#define _LIBCPP_DEBUG_ASSERT(x, m) _LIBCPP_ASSERT(x, m)
-#endif
-#define _LIBCPP_DEBUG_MODE(...) __VA_ARGS__
-#endif
-
-#ifndef _LIBCPP_ASSERT
-# define _LIBCPP_ASSERT(x, m) ((void)0)
-#endif
-#ifndef _LIBCPP_DEBUG_ASSERT
-# define _LIBCPP_DEBUG_ASSERT(x, m) ((void)0)
-#endif
-#ifndef _LIBCPP_DEBUG_MODE
-#define _LIBCPP_DEBUG_MODE(...) ((void)0)
-#endif
-
-#if _LIBCPP_DEBUG_LEVEL < 1
-class _LIBCPP_EXCEPTION_ABI __libcpp_debug_exception;
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-struct _LIBCPP_TEMPLATE_VIS __libcpp_debug_info {
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- __libcpp_debug_info()
- : __file_(nullptr), __line_(-1), __pred_(nullptr), __msg_(nullptr) {}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- __libcpp_debug_info(const char* __f, int __l, const char* __p, const char* __m)
- : __file_(__f), __line_(__l), __pred_(__p), __msg_(__m) {}
- const char* __file_;
- int __line_;
- const char* __pred_;
- const char* __msg_;
-};
-
-/// __libcpp_debug_function_type - The type of the assertion failure handler.
-typedef void(*__libcpp_debug_function_type)(__libcpp_debug_info const&);
-
-/// __libcpp_debug_function - The handler function called when a _LIBCPP_ASSERT
-/// fails.
-extern _LIBCPP_EXPORTED_FROM_ABI __libcpp_debug_function_type __libcpp_debug_function;
-
-/// __libcpp_abort_debug_function - A debug handler that aborts when called.
-_LIBCPP_NORETURN _LIBCPP_FUNC_VIS
-void __libcpp_abort_debug_function(__libcpp_debug_info const&);
-
-/// __libcpp_throw_debug_function - A debug handler that throws
-/// an instance of __libcpp_debug_exception when called.
- _LIBCPP_NORETURN _LIBCPP_FUNC_VIS
-void __libcpp_throw_debug_function(__libcpp_debug_info const&);
-
-/// __libcpp_set_debug_function - Set the debug handler to the specified
-/// function.
-_LIBCPP_FUNC_VIS
-bool __libcpp_set_debug_function(__libcpp_debug_function_type __func);
-
-// Setup the throwing debug handler during dynamic initialization.
-#if _LIBCPP_DEBUG_LEVEL >= 1 && defined(_LIBCPP_DEBUG_USE_EXCEPTIONS)
-# if defined(_LIBCPP_NO_EXCEPTIONS)
-# error _LIBCPP_DEBUG_USE_EXCEPTIONS cannot be used when exceptions are disabled.
-# endif
-static bool __init_dummy = __libcpp_set_debug_function(__libcpp_throw_debug_function);
-#endif
-
-#if _LIBCPP_DEBUG_LEVEL >= 1 || defined(_LIBCPP_BUILDING_LIBRARY)
-class _LIBCPP_EXCEPTION_ABI __libcpp_debug_exception : public exception {
-public:
- __libcpp_debug_exception() _NOEXCEPT;
- explicit __libcpp_debug_exception(__libcpp_debug_info const& __i);
- __libcpp_debug_exception(__libcpp_debug_exception const&);
- ~__libcpp_debug_exception() _NOEXCEPT;
- const char* what() const _NOEXCEPT;
-private:
- struct __libcpp_debug_exception_imp;
- __libcpp_debug_exception_imp *__imp_;
-};
-#endif
-
-#if _LIBCPP_DEBUG_LEVEL >= 2 || defined(_LIBCPP_BUILDING_LIBRARY)
-
-struct _LIBCPP_TYPE_VIS __c_node;
-
-struct _LIBCPP_TYPE_VIS __i_node
-{
- void* __i_;
- __i_node* __next_;
- __c_node* __c_;
-
-#ifndef _LIBCPP_CXX03_LANG
- __i_node(const __i_node&) = delete;
- __i_node& operator=(const __i_node&) = delete;
-#else
-private:
- __i_node(const __i_node&);
- __i_node& operator=(const __i_node&);
-public:
-#endif
- _LIBCPP_INLINE_VISIBILITY
- __i_node(void* __i, __i_node* __next, __c_node* __c)
- : __i_(__i), __next_(__next), __c_(__c) {}
- ~__i_node();
-};
-
-struct _LIBCPP_TYPE_VIS __c_node
-{
- void* __c_;
- __c_node* __next_;
- __i_node** beg_;
- __i_node** end_;
- __i_node** cap_;
-
-#ifndef _LIBCPP_CXX03_LANG
- __c_node(const __c_node&) = delete;
- __c_node& operator=(const __c_node&) = delete;
-#else
-private:
- __c_node(const __c_node&);
- __c_node& operator=(const __c_node&);
-public:
-#endif
- _LIBCPP_INLINE_VISIBILITY
- __c_node(void* __c, __c_node* __next)
- : __c_(__c), __next_(__next), beg_(nullptr), end_(nullptr), cap_(nullptr) {}
- virtual ~__c_node();
-
- virtual bool __dereferenceable(const void*) const = 0;
- virtual bool __decrementable(const void*) const = 0;
- virtual bool __addable(const void*, ptrdiff_t) const = 0;
- virtual bool __subscriptable(const void*, ptrdiff_t) const = 0;
-
- void __add(__i_node* __i);
- _LIBCPP_HIDDEN void __remove(__i_node* __i);
-};
-
-template <class _Cont>
-struct _C_node
- : public __c_node
-{
- _C_node(void* __c, __c_node* __n)
- : __c_node(__c, __n) {}
-
- virtual bool __dereferenceable(const void*) const;
- virtual bool __decrementable(const void*) const;
- virtual bool __addable(const void*, ptrdiff_t) const;
- virtual bool __subscriptable(const void*, ptrdiff_t) const;
-};
-
-template <class _Cont>
-inline bool
-_C_node<_Cont>::__dereferenceable(const void* __i) const
-{
- typedef typename _Cont::const_iterator iterator;
- const iterator* __j = static_cast<const iterator*>(__i);
- _Cont* _Cp = static_cast<_Cont*>(__c_);
- return _Cp->__dereferenceable(__j);
-}
-
-template <class _Cont>
-inline bool
-_C_node<_Cont>::__decrementable(const void* __i) const
-{
- typedef typename _Cont::const_iterator iterator;
- const iterator* __j = static_cast<const iterator*>(__i);
- _Cont* _Cp = static_cast<_Cont*>(__c_);
- return _Cp->__decrementable(__j);
-}
-
-template <class _Cont>
-inline bool
-_C_node<_Cont>::__addable(const void* __i, ptrdiff_t __n) const
-{
- typedef typename _Cont::const_iterator iterator;
- const iterator* __j = static_cast<const iterator*>(__i);
- _Cont* _Cp = static_cast<_Cont*>(__c_);
- return _Cp->__addable(__j, __n);
-}
-
-template <class _Cont>
-inline bool
-_C_node<_Cont>::__subscriptable(const void* __i, ptrdiff_t __n) const
-{
- typedef typename _Cont::const_iterator iterator;
- const iterator* __j = static_cast<const iterator*>(__i);
- _Cont* _Cp = static_cast<_Cont*>(__c_);
- return _Cp->__subscriptable(__j, __n);
-}
-
-class _LIBCPP_TYPE_VIS __libcpp_db
-{
- __c_node** __cbeg_;
- __c_node** __cend_;
- size_t __csz_;
- __i_node** __ibeg_;
- __i_node** __iend_;
- size_t __isz_;
-
- __libcpp_db();
-public:
-#ifndef _LIBCPP_CXX03_LANG
- __libcpp_db(const __libcpp_db&) = delete;
- __libcpp_db& operator=(const __libcpp_db&) = delete;
-#else
-private:
- __libcpp_db(const __libcpp_db&);
- __libcpp_db& operator=(const __libcpp_db&);
-public:
-#endif
- ~__libcpp_db();
-
- class __db_c_iterator;
- class __db_c_const_iterator;
- class __db_i_iterator;
- class __db_i_const_iterator;
-
- __db_c_const_iterator __c_end() const;
- __db_i_const_iterator __i_end() const;
-
- template <class _Cont>
- _LIBCPP_INLINE_VISIBILITY
- void __insert_c(_Cont* __c)
- {
- __c_node* __n = __insert_c(static_cast<void*>(__c));
- ::new(__n) _C_node<_Cont>(__n->__c_, __n->__next_);
- }
-
- void __insert_i(void* __i);
- __c_node* __insert_c(void* __c);
- void __erase_c(void* __c);
-
- void __insert_ic(void* __i, const void* __c);
- void __iterator_copy(void* __i, const void* __i0);
- void __erase_i(void* __i);
-
- void* __find_c_from_i(void* __i) const;
- void __invalidate_all(void* __c);
- __c_node* __find_c_and_lock(void* __c) const;
- __c_node* __find_c(void* __c) const;
- void unlock() const;
-
- void swap(void* __c1, void* __c2);
-
-
- bool __dereferenceable(const void* __i) const;
- bool __decrementable(const void* __i) const;
- bool __addable(const void* __i, ptrdiff_t __n) const;
- bool __subscriptable(const void* __i, ptrdiff_t __n) const;
- bool __less_than_comparable(const void* __i, const void* __j) const;
-private:
- _LIBCPP_HIDDEN
- __i_node* __insert_iterator(void* __i);
- _LIBCPP_HIDDEN
- __i_node* __find_iterator(const void* __i) const;
-
- friend _LIBCPP_FUNC_VIS __libcpp_db* __get_db();
-};
-
-_LIBCPP_FUNC_VIS __libcpp_db* __get_db();
-_LIBCPP_FUNC_VIS const __libcpp_db* __get_const_db();
-
-
-#endif // _LIBCPP_DEBUG_LEVEL >= 2 || defined(_LIBCPP_BUILDING_LIBRARY)
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_DEBUG_H
-
diff --git a/lib/libcxx/include/__errc b/lib/libcxx/include/__errc
deleted file mode 100644
index d0f00b7f0be..00000000000
--- a/lib/libcxx/include/__errc
+++ /dev/null
@@ -1,218 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- __errc ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP___ERRC
-#define _LIBCPP___ERRC
-
-/*
- system_error synopsis
-
-namespace std
-{
-
-enum class errc
-{
- address_family_not_supported, // EAFNOSUPPORT
- address_in_use, // EADDRINUSE
- address_not_available, // EADDRNOTAVAIL
- already_connected, // EISCONN
- argument_list_too_long, // E2BIG
- argument_out_of_domain, // EDOM
- bad_address, // EFAULT
- bad_file_descriptor, // EBADF
- bad_message, // EBADMSG
- broken_pipe, // EPIPE
- connection_aborted, // ECONNABORTED
- connection_already_in_progress, // EALREADY
- connection_refused, // ECONNREFUSED
- connection_reset, // ECONNRESET
- cross_device_link, // EXDEV
- destination_address_required, // EDESTADDRREQ
- device_or_resource_busy, // EBUSY
- directory_not_empty, // ENOTEMPTY
- executable_format_error, // ENOEXEC
- file_exists, // EEXIST
- file_too_large, // EFBIG
- filename_too_long, // ENAMETOOLONG
- function_not_supported, // ENOSYS
- host_unreachable, // EHOSTUNREACH
- identifier_removed, // EIDRM
- illegal_byte_sequence, // EILSEQ
- inappropriate_io_control_operation, // ENOTTY
- interrupted, // EINTR
- invalid_argument, // EINVAL
- invalid_seek, // ESPIPE
- io_error, // EIO
- is_a_directory, // EISDIR
- message_size, // EMSGSIZE
- network_down, // ENETDOWN
- network_reset, // ENETRESET
- network_unreachable, // ENETUNREACH
- no_buffer_space, // ENOBUFS
- no_child_process, // ECHILD
- no_link, // ENOLINK
- no_lock_available, // ENOLCK
- no_message_available, // ENODATA
- no_message, // ENOMSG
- no_protocol_option, // ENOPROTOOPT
- no_space_on_device, // ENOSPC
- no_stream_resources, // ENOSR
- no_such_device_or_address, // ENXIO
- no_such_device, // ENODEV
- no_such_file_or_directory, // ENOENT
- no_such_process, // ESRCH
- not_a_directory, // ENOTDIR
- not_a_socket, // ENOTSOCK
- not_a_stream, // ENOSTR
- not_connected, // ENOTCONN
- not_enough_memory, // ENOMEM
- not_supported, // ENOTSUP
- operation_canceled, // ECANCELED
- operation_in_progress, // EINPROGRESS
- operation_not_permitted, // EPERM
- operation_not_supported, // EOPNOTSUPP
- operation_would_block, // EWOULDBLOCK
- owner_dead, // EOWNERDEAD
- permission_denied, // EACCES
- protocol_error, // EPROTO
- protocol_not_supported, // EPROTONOSUPPORT
- read_only_file_system, // EROFS
- resource_deadlock_would_occur, // EDEADLK
- resource_unavailable_try_again, // EAGAIN
- result_out_of_range, // ERANGE
- state_not_recoverable, // ENOTRECOVERABLE
- stream_timeout, // ETIME
- text_file_busy, // ETXTBSY
- timed_out, // ETIMEDOUT
- too_many_files_open_in_system, // ENFILE
- too_many_files_open, // EMFILE
- too_many_links, // EMLINK
- too_many_symbolic_link_levels, // ELOOP
- value_too_large, // EOVERFLOW
- wrong_protocol_type // EPROTOTYPE
-};
-
-*/
-
-#include <__config>
-#include <cerrno>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-// Some error codes are not present on all platforms, so we provide equivalents
-// for them:
-
-//enum class errc
-_LIBCPP_DECLARE_STRONG_ENUM(errc)
-{
- address_family_not_supported = EAFNOSUPPORT,
- address_in_use = EADDRINUSE,
- address_not_available = EADDRNOTAVAIL,
- already_connected = EISCONN,
- argument_list_too_long = E2BIG,
- argument_out_of_domain = EDOM,
- bad_address = EFAULT,
- bad_file_descriptor = EBADF,
- bad_message = EBADMSG,
- broken_pipe = EPIPE,
- connection_aborted = ECONNABORTED,
- connection_already_in_progress = EALREADY,
- connection_refused = ECONNREFUSED,
- connection_reset = ECONNRESET,
- cross_device_link = EXDEV,
- destination_address_required = EDESTADDRREQ,
- device_or_resource_busy = EBUSY,
- directory_not_empty = ENOTEMPTY,
- executable_format_error = ENOEXEC,
- file_exists = EEXIST,
- file_too_large = EFBIG,
- filename_too_long = ENAMETOOLONG,
- function_not_supported = ENOSYS,
- host_unreachable = EHOSTUNREACH,
- identifier_removed = EIDRM,
- illegal_byte_sequence = EILSEQ,
- inappropriate_io_control_operation = ENOTTY,
- interrupted = EINTR,
- invalid_argument = EINVAL,
- invalid_seek = ESPIPE,
- io_error = EIO,
- is_a_directory = EISDIR,
- message_size = EMSGSIZE,
- network_down = ENETDOWN,
- network_reset = ENETRESET,
- network_unreachable = ENETUNREACH,
- no_buffer_space = ENOBUFS,
- no_child_process = ECHILD,
- no_link = ENOLINK,
- no_lock_available = ENOLCK,
-#ifdef ENODATA
- no_message_available = ENODATA,
-#else
- no_message_available = ENOMSG,
-#endif
- no_message = ENOMSG,
- no_protocol_option = ENOPROTOOPT,
- no_space_on_device = ENOSPC,
-#ifdef ENOSR
- no_stream_resources = ENOSR,
-#else
- no_stream_resources = ENOMEM,
-#endif
- no_such_device_or_address = ENXIO,
- no_such_device = ENODEV,
- no_such_file_or_directory = ENOENT,
- no_such_process = ESRCH,
- not_a_directory = ENOTDIR,
- not_a_socket = ENOTSOCK,
-#ifdef ENOSTR
- not_a_stream = ENOSTR,
-#else
- not_a_stream = EINVAL,
-#endif
- not_connected = ENOTCONN,
- not_enough_memory = ENOMEM,
- not_supported = ENOTSUP,
- operation_canceled = ECANCELED,
- operation_in_progress = EINPROGRESS,
- operation_not_permitted = EPERM,
- operation_not_supported = EOPNOTSUPP,
- operation_would_block = EWOULDBLOCK,
- owner_dead = EOWNERDEAD,
- permission_denied = EACCES,
- protocol_error = EPROTO,
- protocol_not_supported = EPROTONOSUPPORT,
- read_only_file_system = EROFS,
- resource_deadlock_would_occur = EDEADLK,
- resource_unavailable_try_again = EAGAIN,
- result_out_of_range = ERANGE,
- state_not_recoverable = ENOTRECOVERABLE,
-#ifdef ETIME
- stream_timeout = ETIME,
-#else
- stream_timeout = ETIMEDOUT,
-#endif
- text_file_busy = ETXTBSY,
- timed_out = ETIMEDOUT,
- too_many_files_open_in_system = ENFILE,
- too_many_files_open = EMFILE,
- too_many_links = EMLINK,
- too_many_symbolic_link_levels = ELOOP,
- value_too_large = EOVERFLOW,
- wrong_protocol_type = EPROTOTYPE
-};
-_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(errc)
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP___ERRC
diff --git a/lib/libcxx/include/__functional_03 b/lib/libcxx/include/__functional_03
deleted file mode 100644
index 0a3bfbaa3d2..00000000000
--- a/lib/libcxx/include/__functional_03
+++ /dev/null
@@ -1,1592 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_FUNCTIONAL_03
-#define _LIBCPP_FUNCTIONAL_03
-
-// manual variadic expansion for <functional>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-namespace __function {
-
-template<class _Fp> class __base;
-
-template<class _Rp>
-class __base<_Rp()>
-{
- __base(const __base&);
- __base& operator=(const __base&);
-public:
- __base() {}
- virtual ~__base() {}
- virtual __base* __clone() const = 0;
- virtual void __clone(__base*) const = 0;
- virtual void destroy() = 0;
- virtual void destroy_deallocate() = 0;
- virtual _Rp operator()() = 0;
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const = 0;
- virtual const std::type_info& target_type() const = 0;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Rp, class _A0>
-class __base<_Rp(_A0)>
-{
- __base(const __base&);
- __base& operator=(const __base&);
-public:
- __base() {}
- virtual ~__base() {}
- virtual __base* __clone() const = 0;
- virtual void __clone(__base*) const = 0;
- virtual void destroy() = 0;
- virtual void destroy_deallocate() = 0;
- virtual _Rp operator()(_A0) = 0;
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const = 0;
- virtual const std::type_info& target_type() const = 0;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Rp, class _A0, class _A1>
-class __base<_Rp(_A0, _A1)>
-{
- __base(const __base&);
- __base& operator=(const __base&);
-public:
- __base() {}
- virtual ~__base() {}
- virtual __base* __clone() const = 0;
- virtual void __clone(__base*) const = 0;
- virtual void destroy() = 0;
- virtual void destroy_deallocate() = 0;
- virtual _Rp operator()(_A0, _A1) = 0;
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const = 0;
- virtual const std::type_info& target_type() const = 0;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Rp, class _A0, class _A1, class _A2>
-class __base<_Rp(_A0, _A1, _A2)>
-{
- __base(const __base&);
- __base& operator=(const __base&);
-public:
- __base() {}
- virtual ~__base() {}
- virtual __base* __clone() const = 0;
- virtual void __clone(__base*) const = 0;
- virtual void destroy() = 0;
- virtual void destroy_deallocate() = 0;
- virtual _Rp operator()(_A0, _A1, _A2) = 0;
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const = 0;
- virtual const std::type_info& target_type() const = 0;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _FD, class _Alloc, class _FB> class __func;
-
-template<class _Fp, class _Alloc, class _Rp>
-class __func<_Fp, _Alloc, _Rp()>
- : public __base<_Rp()>
-{
- __compressed_pair<_Fp, _Alloc> __f_;
-public:
- explicit __func(_Fp __f) : __f_(_VSTD::move(__f)) {}
- explicit __func(_Fp __f, _Alloc __a) : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
- virtual __base<_Rp()>* __clone() const;
- virtual void __clone(__base<_Rp()>*) const;
- virtual void destroy();
- virtual void destroy_deallocate();
- virtual _Rp operator()();
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const;
- virtual const std::type_info& target_type() const;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Fp, class _Alloc, class _Rp>
-__base<_Rp()>*
-__func<_Fp, _Alloc, _Rp()>::__clone() const
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
- return __hold.release();
-}
-
-template<class _Fp, class _Alloc, class _Rp>
-void
-__func<_Fp, _Alloc, _Rp()>::__clone(__base<_Rp()>* __p) const
-{
- ::new (__p) __func(__f_.first(), __f_.second());
-}
-
-template<class _Fp, class _Alloc, class _Rp>
-void
-__func<_Fp, _Alloc, _Rp()>::destroy()
-{
- __f_.~__compressed_pair<_Fp, _Alloc>();
-}
-
-template<class _Fp, class _Alloc, class _Rp>
-void
-__func<_Fp, _Alloc, _Rp()>::destroy_deallocate()
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- __f_.~__compressed_pair<_Fp, _Alloc>();
- __a.deallocate(this, 1);
-}
-
-template<class _Fp, class _Alloc, class _Rp>
-_Rp
-__func<_Fp, _Alloc, _Rp()>::operator()()
-{
- typedef __invoke_void_return_wrapper<_Rp> _Invoker;
- return _Invoker::__call(__f_.first());
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Fp, class _Alloc, class _Rp>
-const void*
-__func<_Fp, _Alloc, _Rp()>::target(const type_info& __ti) const
-{
- if (__ti == typeid(_Fp))
- return &__f_.first();
- return (const void*)0;
-}
-
-template<class _Fp, class _Alloc, class _Rp>
-const std::type_info&
-__func<_Fp, _Alloc, _Rp()>::target_type() const
-{
- return typeid(_Fp);
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-template<class _Fp, class _Alloc, class _Rp, class _A0>
-class __func<_Fp, _Alloc, _Rp(_A0)>
- : public __base<_Rp(_A0)>
-{
- __compressed_pair<_Fp, _Alloc> __f_;
-public:
- _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f)) {}
- _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a)
- : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
- virtual __base<_Rp(_A0)>* __clone() const;
- virtual void __clone(__base<_Rp(_A0)>*) const;
- virtual void destroy();
- virtual void destroy_deallocate();
- virtual _Rp operator()(_A0);
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const;
- virtual const std::type_info& target_type() const;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Fp, class _Alloc, class _Rp, class _A0>
-__base<_Rp(_A0)>*
-__func<_Fp, _Alloc, _Rp(_A0)>::__clone() const
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
- return __hold.release();
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0>
-void
-__func<_Fp, _Alloc, _Rp(_A0)>::__clone(__base<_Rp(_A0)>* __p) const
-{
- ::new (__p) __func(__f_.first(), __f_.second());
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0>
-void
-__func<_Fp, _Alloc, _Rp(_A0)>::destroy()
-{
- __f_.~__compressed_pair<_Fp, _Alloc>();
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0>
-void
-__func<_Fp, _Alloc, _Rp(_A0)>::destroy_deallocate()
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- __f_.~__compressed_pair<_Fp, _Alloc>();
- __a.deallocate(this, 1);
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0>
-_Rp
-__func<_Fp, _Alloc, _Rp(_A0)>::operator()(_A0 __a0)
-{
- typedef __invoke_void_return_wrapper<_Rp> _Invoker;
- return _Invoker::__call(__f_.first(), __a0);
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Fp, class _Alloc, class _Rp, class _A0>
-const void*
-__func<_Fp, _Alloc, _Rp(_A0)>::target(const type_info& __ti) const
-{
- if (__ti == typeid(_Fp))
- return &__f_.first();
- return (const void*)0;
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0>
-const std::type_info&
-__func<_Fp, _Alloc, _Rp(_A0)>::target_type() const
-{
- return typeid(_Fp);
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
-class __func<_Fp, _Alloc, _Rp(_A0, _A1)>
- : public __base<_Rp(_A0, _A1)>
-{
- __compressed_pair<_Fp, _Alloc> __f_;
-public:
- _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f)) {}
- _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a)
- : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
- virtual __base<_Rp(_A0, _A1)>* __clone() const;
- virtual void __clone(__base<_Rp(_A0, _A1)>*) const;
- virtual void destroy();
- virtual void destroy_deallocate();
- virtual _Rp operator()(_A0, _A1);
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const;
- virtual const std::type_info& target_type() const;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
-__base<_Rp(_A0, _A1)>*
-__func<_Fp, _Alloc, _Rp(_A0, _A1)>::__clone() const
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
- return __hold.release();
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
-void
-__func<_Fp, _Alloc, _Rp(_A0, _A1)>::__clone(__base<_Rp(_A0, _A1)>* __p) const
-{
- ::new (__p) __func(__f_.first(), __f_.second());
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
-void
-__func<_Fp, _Alloc, _Rp(_A0, _A1)>::destroy()
-{
- __f_.~__compressed_pair<_Fp, _Alloc>();
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
-void
-__func<_Fp, _Alloc, _Rp(_A0, _A1)>::destroy_deallocate()
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- __f_.~__compressed_pair<_Fp, _Alloc>();
- __a.deallocate(this, 1);
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
-_Rp
-__func<_Fp, _Alloc, _Rp(_A0, _A1)>::operator()(_A0 __a0, _A1 __a1)
-{
- typedef __invoke_void_return_wrapper<_Rp> _Invoker;
- return _Invoker::__call(__f_.first(), __a0, __a1);
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
-const void*
-__func<_Fp, _Alloc, _Rp(_A0, _A1)>::target(const type_info& __ti) const
-{
- if (__ti == typeid(_Fp))
- return &__f_.first();
- return (const void*)0;
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
-const std::type_info&
-__func<_Fp, _Alloc, _Rp(_A0, _A1)>::target_type() const
-{
- return typeid(_Fp);
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
-class __func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>
- : public __base<_Rp(_A0, _A1, _A2)>
-{
- __compressed_pair<_Fp, _Alloc> __f_;
-public:
- _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f)) {}
- _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a)
- : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
- virtual __base<_Rp(_A0, _A1, _A2)>* __clone() const;
- virtual void __clone(__base<_Rp(_A0, _A1, _A2)>*) const;
- virtual void destroy();
- virtual void destroy_deallocate();
- virtual _Rp operator()(_A0, _A1, _A2);
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const;
- virtual const std::type_info& target_type() const;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
-__base<_Rp(_A0, _A1, _A2)>*
-__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::__clone() const
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
- return __hold.release();
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
-void
-__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::__clone(__base<_Rp(_A0, _A1, _A2)>* __p) const
-{
- ::new (__p) __func(__f_.first(), __f_.second());
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
-void
-__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::destroy()
-{
- __f_.~__compressed_pair<_Fp, _Alloc>();
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
-void
-__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::destroy_deallocate()
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- __f_.~__compressed_pair<_Fp, _Alloc>();
- __a.deallocate(this, 1);
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
-_Rp
-__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::operator()(_A0 __a0, _A1 __a1, _A2 __a2)
-{
- typedef __invoke_void_return_wrapper<_Rp> _Invoker;
- return _Invoker::__call(__f_.first(), __a0, __a1, __a2);
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
-const void*
-__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::target(const type_info& __ti) const
-{
- if (__ti == typeid(_Fp))
- return &__f_.first();
- return (const void*)0;
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
-const std::type_info&
-__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::target_type() const
-{
- return typeid(_Fp);
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-} // __function
-
-template<class _Rp>
-class _LIBCPP_TEMPLATE_VIS function<_Rp()>
-{
- typedef __function::__base<_Rp()> __base;
- aligned_storage<3*sizeof(void*)>::type __buf_;
- __base* __f_;
-
-public:
- typedef _Rp result_type;
-
- // 20.7.16.2.1, construct/copy/destroy:
- _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {}
- _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
- function(const function&);
- template<class _Fp>
- function(_Fp,
- typename enable_if<!is_integral<_Fp>::value>::type* = 0);
-
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&) : __f_(0) {}
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {}
- template<class _Alloc>
- function(allocator_arg_t, const _Alloc&, const function&);
- template<class _Fp, class _Alloc>
- function(allocator_arg_t, const _Alloc& __a, _Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type* = 0);
-
- function& operator=(const function&);
- function& operator=(nullptr_t);
- template<class _Fp>
- typename enable_if
- <
- !is_integral<_Fp>::value,
- function&
- >::type
- operator=(_Fp);
-
- ~function();
-
- // 20.7.16.2.2, function modifiers:
- void swap(function&);
- template<class _Fp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- void assign(_Fp __f, const _Alloc& __a)
- {function(allocator_arg, __a, __f).swap(*this);}
-
- // 20.7.16.2.3, function capacity:
- _LIBCPP_INLINE_VISIBILITY operator bool() const {return __f_;}
-
-private:
- // deleted overloads close possible hole in the type system
- template<class _R2>
- bool operator==(const function<_R2()>&) const;// = delete;
- template<class _R2>
- bool operator!=(const function<_R2()>&) const;// = delete;
-public:
- // 20.7.16.2.4, function invocation:
- _Rp operator()() const;
-
-#ifndef _LIBCPP_NO_RTTI
- // 20.7.16.2.5, function target access:
- const std::type_info& target_type() const;
- template <typename _Tp> _Tp* target();
- template <typename _Tp> const _Tp* target() const;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Rp>
-function<_Rp()>::function(const function& __f)
-{
- if (__f.__f_ == 0)
- __f_ = 0;
- else if (__f.__f_ == (const __base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
-}
-
-template<class _Rp>
-template<class _Alloc>
-function<_Rp()>::function(allocator_arg_t, const _Alloc&, const function& __f)
-{
- if (__f.__f_ == 0)
- __f_ = 0;
- else if (__f.__f_ == (const __base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
-}
-
-template<class _Rp>
-template <class _Fp>
-function<_Rp()>::function(_Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type*)
- : __f_(0)
-{
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, allocator<_Fp>, _Rp()> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new (__f_) _FF(__f);
- }
- else
- {
- typedef allocator<_FF> _Ap;
- _Ap __a;
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (__hold.get()) _FF(__f, allocator<_Fp>(__a));
- __f_ = __hold.release();
- }
- }
-}
-
-template<class _Rp>
-template <class _Fp, class _Alloc>
-function<_Rp()>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type*)
- : __f_(0)
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, _Alloc, _Rp()> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new (__f_) _FF(__f, __a0);
- }
- else
- {
- typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
- _Ap __a(__a0);
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (__hold.get()) _FF(__f, _Alloc(__a));
- __f_ = __hold.release();
- }
- }
-}
-
-template<class _Rp>
-function<_Rp()>&
-function<_Rp()>::operator=(const function& __f)
-{
- if (__f)
- function(__f).swap(*this);
- else
- *this = nullptr;
- return *this;
-}
-
-template<class _Rp>
-function<_Rp()>&
-function<_Rp()>::operator=(nullptr_t)
-{
- __base* __t = __f_;
- __f_ = 0;
- if (__t == (__base*)&__buf_)
- __t->destroy();
- else if (__t)
- __t->destroy_deallocate();
- return *this;
-}
-
-template<class _Rp>
-template <class _Fp>
-typename enable_if
-<
- !is_integral<_Fp>::value,
- function<_Rp()>&
->::type
-function<_Rp()>::operator=(_Fp __f)
-{
- function(_VSTD::move(__f)).swap(*this);
- return *this;
-}
-
-template<class _Rp>
-function<_Rp()>::~function()
-{
- if (__f_ == (__base*)&__buf_)
- __f_->destroy();
- else if (__f_)
- __f_->destroy_deallocate();
-}
-
-template<class _Rp>
-void
-function<_Rp()>::swap(function& __f)
-{
- if (_VSTD::addressof(__f) == this)
- return;
- if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
- {
- typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
- __base* __t = (__base*)&__tempbuf;
- __f_->__clone(__t);
- __f_->destroy();
- __f_ = 0;
- __f.__f_->__clone((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = 0;
- __f_ = (__base*)&__buf_;
- __t->__clone((__base*)&__f.__buf_);
- __t->destroy();
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f_ == (__base*)&__buf_)
- {
- __f_->__clone((__base*)&__f.__buf_);
- __f_->destroy();
- __f_ = __f.__f_;
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f.__f_ == (__base*)&__f.__buf_)
- {
- __f.__f_->__clone((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = __f_;
- __f_ = (__base*)&__buf_;
- }
- else
- _VSTD::swap(__f_, __f.__f_);
-}
-
-template<class _Rp>
-_Rp
-function<_Rp()>::operator()() const
-{
- if (__f_ == 0)
- __throw_bad_function_call();
- return (*__f_)();
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Rp>
-const std::type_info&
-function<_Rp()>::target_type() const
-{
- if (__f_ == 0)
- return typeid(void);
- return __f_->target_type();
-}
-
-template<class _Rp>
-template <typename _Tp>
-_Tp*
-function<_Rp()>::target()
-{
- if (__f_ == 0)
- return (_Tp*)0;
- return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp)));
-}
-
-template<class _Rp>
-template <typename _Tp>
-const _Tp*
-function<_Rp()>::target() const
-{
- if (__f_ == 0)
- return (const _Tp*)0;
- return (const _Tp*)__f_->target(typeid(_Tp));
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-template<class _Rp, class _A0>
-class _LIBCPP_TEMPLATE_VIS function<_Rp(_A0)>
- : public unary_function<_A0, _Rp>
-{
- typedef __function::__base<_Rp(_A0)> __base;
- aligned_storage<3*sizeof(void*)>::type __buf_;
- __base* __f_;
-
-public:
- typedef _Rp result_type;
-
- // 20.7.16.2.1, construct/copy/destroy:
- _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {}
- _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
- function(const function&);
- template<class _Fp>
- function(_Fp,
- typename enable_if<!is_integral<_Fp>::value>::type* = 0);
-
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&) : __f_(0) {}
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {}
- template<class _Alloc>
- function(allocator_arg_t, const _Alloc&, const function&);
- template<class _Fp, class _Alloc>
- function(allocator_arg_t, const _Alloc& __a, _Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type* = 0);
-
- function& operator=(const function&);
- function& operator=(nullptr_t);
- template<class _Fp>
- typename enable_if
- <
- !is_integral<_Fp>::value,
- function&
- >::type
- operator=(_Fp);
-
- ~function();
-
- // 20.7.16.2.2, function modifiers:
- void swap(function&);
- template<class _Fp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- void assign(_Fp __f, const _Alloc& __a)
- {function(allocator_arg, __a, __f).swap(*this);}
-
- // 20.7.16.2.3, function capacity:
- _LIBCPP_INLINE_VISIBILITY operator bool() const {return __f_;}
-
-private:
- // deleted overloads close possible hole in the type system
- template<class _R2, class _B0>
- bool operator==(const function<_R2(_B0)>&) const;// = delete;
- template<class _R2, class _B0>
- bool operator!=(const function<_R2(_B0)>&) const;// = delete;
-public:
- // 20.7.16.2.4, function invocation:
- _Rp operator()(_A0) const;
-
-#ifndef _LIBCPP_NO_RTTI
- // 20.7.16.2.5, function target access:
- const std::type_info& target_type() const;
- template <typename _Tp> _Tp* target();
- template <typename _Tp> const _Tp* target() const;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Rp, class _A0>
-function<_Rp(_A0)>::function(const function& __f)
-{
- if (__f.__f_ == 0)
- __f_ = 0;
- else if (__f.__f_ == (const __base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
-}
-
-template<class _Rp, class _A0>
-template<class _Alloc>
-function<_Rp(_A0)>::function(allocator_arg_t, const _Alloc&, const function& __f)
-{
- if (__f.__f_ == 0)
- __f_ = 0;
- else if (__f.__f_ == (const __base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
-}
-
-template<class _Rp, class _A0>
-template <class _Fp>
-function<_Rp(_A0)>::function(_Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type*)
- : __f_(0)
-{
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0)> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new (__f_) _FF(__f);
- }
- else
- {
- typedef allocator<_FF> _Ap;
- _Ap __a;
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (__hold.get()) _FF(__f, allocator<_Fp>(__a));
- __f_ = __hold.release();
- }
- }
-}
-
-template<class _Rp, class _A0>
-template <class _Fp, class _Alloc>
-function<_Rp(_A0)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type*)
- : __f_(0)
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, _Alloc, _Rp(_A0)> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new (__f_) _FF(__f, __a0);
- }
- else
- {
- typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
- _Ap __a(__a0);
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (__hold.get()) _FF(__f, _Alloc(__a));
- __f_ = __hold.release();
- }
- }
-}
-
-template<class _Rp, class _A0>
-function<_Rp(_A0)>&
-function<_Rp(_A0)>::operator=(const function& __f)
-{
- if (__f)
- function(__f).swap(*this);
- else
- *this = nullptr;
- return *this;
-}
-
-template<class _Rp, class _A0>
-function<_Rp(_A0)>&
-function<_Rp(_A0)>::operator=(nullptr_t)
-{
- __base* __t = __f_;
- __f_ = 0;
- if (__t == (__base*)&__buf_)
- __t->destroy();
- else if (__t)
- __t->destroy_deallocate();
- return *this;
-}
-
-template<class _Rp, class _A0>
-template <class _Fp>
-typename enable_if
-<
- !is_integral<_Fp>::value,
- function<_Rp(_A0)>&
->::type
-function<_Rp(_A0)>::operator=(_Fp __f)
-{
- function(_VSTD::move(__f)).swap(*this);
- return *this;
-}
-
-template<class _Rp, class _A0>
-function<_Rp(_A0)>::~function()
-{
- if (__f_ == (__base*)&__buf_)
- __f_->destroy();
- else if (__f_)
- __f_->destroy_deallocate();
-}
-
-template<class _Rp, class _A0>
-void
-function<_Rp(_A0)>::swap(function& __f)
-{
- if (_VSTD::addressof(__f) == this)
- return;
- if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
- {
- typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
- __base* __t = (__base*)&__tempbuf;
- __f_->__clone(__t);
- __f_->destroy();
- __f_ = 0;
- __f.__f_->__clone((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = 0;
- __f_ = (__base*)&__buf_;
- __t->__clone((__base*)&__f.__buf_);
- __t->destroy();
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f_ == (__base*)&__buf_)
- {
- __f_->__clone((__base*)&__f.__buf_);
- __f_->destroy();
- __f_ = __f.__f_;
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f.__f_ == (__base*)&__f.__buf_)
- {
- __f.__f_->__clone((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = __f_;
- __f_ = (__base*)&__buf_;
- }
- else
- _VSTD::swap(__f_, __f.__f_);
-}
-
-template<class _Rp, class _A0>
-_Rp
-function<_Rp(_A0)>::operator()(_A0 __a0) const
-{
- if (__f_ == 0)
- __throw_bad_function_call();
- return (*__f_)(__a0);
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Rp, class _A0>
-const std::type_info&
-function<_Rp(_A0)>::target_type() const
-{
- if (__f_ == 0)
- return typeid(void);
- return __f_->target_type();
-}
-
-template<class _Rp, class _A0>
-template <typename _Tp>
-_Tp*
-function<_Rp(_A0)>::target()
-{
- if (__f_ == 0)
- return (_Tp*)0;
- return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp)));
-}
-
-template<class _Rp, class _A0>
-template <typename _Tp>
-const _Tp*
-function<_Rp(_A0)>::target() const
-{
- if (__f_ == 0)
- return (const _Tp*)0;
- return (const _Tp*)__f_->target(typeid(_Tp));
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-template<class _Rp, class _A0, class _A1>
-class _LIBCPP_TEMPLATE_VIS function<_Rp(_A0, _A1)>
- : public binary_function<_A0, _A1, _Rp>
-{
- typedef __function::__base<_Rp(_A0, _A1)> __base;
- aligned_storage<3*sizeof(void*)>::type __buf_;
- __base* __f_;
-
-public:
- typedef _Rp result_type;
-
- // 20.7.16.2.1, construct/copy/destroy:
- _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {}
- _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
- function(const function&);
- template<class _Fp>
- function(_Fp,
- typename enable_if<!is_integral<_Fp>::value>::type* = 0);
-
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&) : __f_(0) {}
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {}
- template<class _Alloc>
- function(allocator_arg_t, const _Alloc&, const function&);
- template<class _Fp, class _Alloc>
- function(allocator_arg_t, const _Alloc& __a, _Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type* = 0);
-
- function& operator=(const function&);
- function& operator=(nullptr_t);
- template<class _Fp>
- typename enable_if
- <
- !is_integral<_Fp>::value,
- function&
- >::type
- operator=(_Fp);
-
- ~function();
-
- // 20.7.16.2.2, function modifiers:
- void swap(function&);
- template<class _Fp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- void assign(_Fp __f, const _Alloc& __a)
- {function(allocator_arg, __a, __f).swap(*this);}
-
- // 20.7.16.2.3, function capacity:
- operator bool() const {return __f_;}
-
-private:
- // deleted overloads close possible hole in the type system
- template<class _R2, class _B0, class _B1>
- bool operator==(const function<_R2(_B0, _B1)>&) const;// = delete;
- template<class _R2, class _B0, class _B1>
- bool operator!=(const function<_R2(_B0, _B1)>&) const;// = delete;
-public:
- // 20.7.16.2.4, function invocation:
- _Rp operator()(_A0, _A1) const;
-
-#ifndef _LIBCPP_NO_RTTI
- // 20.7.16.2.5, function target access:
- const std::type_info& target_type() const;
- template <typename _Tp> _Tp* target();
- template <typename _Tp> const _Tp* target() const;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Rp, class _A0, class _A1>
-function<_Rp(_A0, _A1)>::function(const function& __f)
-{
- if (__f.__f_ == 0)
- __f_ = 0;
- else if (__f.__f_ == (const __base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
-}
-
-template<class _Rp, class _A0, class _A1>
-template<class _Alloc>
-function<_Rp(_A0, _A1)>::function(allocator_arg_t, const _Alloc&, const function& __f)
-{
- if (__f.__f_ == 0)
- __f_ = 0;
- else if (__f.__f_ == (const __base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
-}
-
-template<class _Rp, class _A0, class _A1>
-template <class _Fp>
-function<_Rp(_A0, _A1)>::function(_Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type*)
- : __f_(0)
-{
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0, _A1)> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new (__f_) _FF(__f);
- }
- else
- {
- typedef allocator<_FF> _Ap;
- _Ap __a;
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (__hold.get()) _FF(__f, allocator<_Fp>(__a));
- __f_ = __hold.release();
- }
- }
-}
-
-template<class _Rp, class _A0, class _A1>
-template <class _Fp, class _Alloc>
-function<_Rp(_A0, _A1)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type*)
- : __f_(0)
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, _Alloc, _Rp(_A0, _A1)> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new (__f_) _FF(__f, __a0);
- }
- else
- {
- typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
- _Ap __a(__a0);
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (__hold.get()) _FF(__f, _Alloc(__a));
- __f_ = __hold.release();
- }
- }
-}
-
-template<class _Rp, class _A0, class _A1>
-function<_Rp(_A0, _A1)>&
-function<_Rp(_A0, _A1)>::operator=(const function& __f)
-{
- if (__f)
- function(__f).swap(*this);
- else
- *this = nullptr;
- return *this;
-}
-
-template<class _Rp, class _A0, class _A1>
-function<_Rp(_A0, _A1)>&
-function<_Rp(_A0, _A1)>::operator=(nullptr_t)
-{
- __base* __t = __f_;
- __f_ = 0;
- if (__t == (__base*)&__buf_)
- __t->destroy();
- else if (__t)
- __t->destroy_deallocate();
- return *this;
-}
-
-template<class _Rp, class _A0, class _A1>
-template <class _Fp>
-typename enable_if
-<
- !is_integral<_Fp>::value,
- function<_Rp(_A0, _A1)>&
->::type
-function<_Rp(_A0, _A1)>::operator=(_Fp __f)
-{
- function(_VSTD::move(__f)).swap(*this);
- return *this;
-}
-
-template<class _Rp, class _A0, class _A1>
-function<_Rp(_A0, _A1)>::~function()
-{
- if (__f_ == (__base*)&__buf_)
- __f_->destroy();
- else if (__f_)
- __f_->destroy_deallocate();
-}
-
-template<class _Rp, class _A0, class _A1>
-void
-function<_Rp(_A0, _A1)>::swap(function& __f)
-{
- if (_VSTD::addressof(__f) == this)
- return;
- if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
- {
- typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
- __base* __t = (__base*)&__tempbuf;
- __f_->__clone(__t);
- __f_->destroy();
- __f_ = 0;
- __f.__f_->__clone((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = 0;
- __f_ = (__base*)&__buf_;
- __t->__clone((__base*)&__f.__buf_);
- __t->destroy();
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f_ == (__base*)&__buf_)
- {
- __f_->__clone((__base*)&__f.__buf_);
- __f_->destroy();
- __f_ = __f.__f_;
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f.__f_ == (__base*)&__f.__buf_)
- {
- __f.__f_->__clone((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = __f_;
- __f_ = (__base*)&__buf_;
- }
- else
- _VSTD::swap(__f_, __f.__f_);
-}
-
-template<class _Rp, class _A0, class _A1>
-_Rp
-function<_Rp(_A0, _A1)>::operator()(_A0 __a0, _A1 __a1) const
-{
- if (__f_ == 0)
- __throw_bad_function_call();
- return (*__f_)(__a0, __a1);
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Rp, class _A0, class _A1>
-const std::type_info&
-function<_Rp(_A0, _A1)>::target_type() const
-{
- if (__f_ == 0)
- return typeid(void);
- return __f_->target_type();
-}
-
-template<class _Rp, class _A0, class _A1>
-template <typename _Tp>
-_Tp*
-function<_Rp(_A0, _A1)>::target()
-{
- if (__f_ == 0)
- return (_Tp*)0;
- return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp)));
-}
-
-template<class _Rp, class _A0, class _A1>
-template <typename _Tp>
-const _Tp*
-function<_Rp(_A0, _A1)>::target() const
-{
- if (__f_ == 0)
- return (const _Tp*)0;
- return (const _Tp*)__f_->target(typeid(_Tp));
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-template<class _Rp, class _A0, class _A1, class _A2>
-class _LIBCPP_TEMPLATE_VIS function<_Rp(_A0, _A1, _A2)>
-{
- typedef __function::__base<_Rp(_A0, _A1, _A2)> __base;
- aligned_storage<3*sizeof(void*)>::type __buf_;
- __base* __f_;
-
-public:
- typedef _Rp result_type;
-
- // 20.7.16.2.1, construct/copy/destroy:
- _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {}
- _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
- function(const function&);
- template<class _Fp>
- function(_Fp,
- typename enable_if<!is_integral<_Fp>::value>::type* = 0);
-
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&) : __f_(0) {}
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {}
- template<class _Alloc>
- function(allocator_arg_t, const _Alloc&, const function&);
- template<class _Fp, class _Alloc>
- function(allocator_arg_t, const _Alloc& __a, _Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type* = 0);
-
- function& operator=(const function&);
- function& operator=(nullptr_t);
- template<class _Fp>
- typename enable_if
- <
- !is_integral<_Fp>::value,
- function&
- >::type
- operator=(_Fp);
-
- ~function();
-
- // 20.7.16.2.2, function modifiers:
- void swap(function&);
- template<class _Fp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- void assign(_Fp __f, const _Alloc& __a)
- {function(allocator_arg, __a, __f).swap(*this);}
-
- // 20.7.16.2.3, function capacity:
- _LIBCPP_INLINE_VISIBILITY operator bool() const {return __f_;}
-
-private:
- // deleted overloads close possible hole in the type system
- template<class _R2, class _B0, class _B1, class _B2>
- bool operator==(const function<_R2(_B0, _B1, _B2)>&) const;// = delete;
- template<class _R2, class _B0, class _B1, class _B2>
- bool operator!=(const function<_R2(_B0, _B1, _B2)>&) const;// = delete;
-public:
- // 20.7.16.2.4, function invocation:
- _Rp operator()(_A0, _A1, _A2) const;
-
-#ifndef _LIBCPP_NO_RTTI
- // 20.7.16.2.5, function target access:
- const std::type_info& target_type() const;
- template <typename _Tp> _Tp* target();
- template <typename _Tp> const _Tp* target() const;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Rp, class _A0, class _A1, class _A2>
-function<_Rp(_A0, _A1, _A2)>::function(const function& __f)
-{
- if (__f.__f_ == 0)
- __f_ = 0;
- else if (__f.__f_ == (const __base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-template<class _Alloc>
-function<_Rp(_A0, _A1, _A2)>::function(allocator_arg_t, const _Alloc&,
- const function& __f)
-{
- if (__f.__f_ == 0)
- __f_ = 0;
- else if (__f.__f_ == (const __base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-template <class _Fp>
-function<_Rp(_A0, _A1, _A2)>::function(_Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type*)
- : __f_(0)
-{
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0, _A1, _A2)> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new (__f_) _FF(__f);
- }
- else
- {
- typedef allocator<_FF> _Ap;
- _Ap __a;
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (__hold.get()) _FF(__f, allocator<_Fp>(__a));
- __f_ = __hold.release();
- }
- }
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-template <class _Fp, class _Alloc>
-function<_Rp(_A0, _A1, _A2)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type*)
- : __f_(0)
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new (__f_) _FF(__f, __a0);
- }
- else
- {
- typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
- _Ap __a(__a0);
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (__hold.get()) _FF(__f, _Alloc(__a));
- __f_ = __hold.release();
- }
- }
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-function<_Rp(_A0, _A1, _A2)>&
-function<_Rp(_A0, _A1, _A2)>::operator=(const function& __f)
-{
- if (__f)
- function(__f).swap(*this);
- else
- *this = nullptr;
- return *this;
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-function<_Rp(_A0, _A1, _A2)>&
-function<_Rp(_A0, _A1, _A2)>::operator=(nullptr_t)
-{
- __base* __t = __f_;
- __f_ = 0;
- if (__t == (__base*)&__buf_)
- __t->destroy();
- else if (__t)
- __t->destroy_deallocate();
- return *this;
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-template <class _Fp>
-typename enable_if
-<
- !is_integral<_Fp>::value,
- function<_Rp(_A0, _A1, _A2)>&
->::type
-function<_Rp(_A0, _A1, _A2)>::operator=(_Fp __f)
-{
- function(_VSTD::move(__f)).swap(*this);
- return *this;
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-function<_Rp(_A0, _A1, _A2)>::~function()
-{
- if (__f_ == (__base*)&__buf_)
- __f_->destroy();
- else if (__f_)
- __f_->destroy_deallocate();
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-void
-function<_Rp(_A0, _A1, _A2)>::swap(function& __f)
-{
- if (_VSTD::addressof(__f) == this)
- return;
- if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
- {
- typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
- __base* __t = (__base*)&__tempbuf;
- __f_->__clone(__t);
- __f_->destroy();
- __f_ = 0;
- __f.__f_->__clone((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = 0;
- __f_ = (__base*)&__buf_;
- __t->__clone((__base*)&__f.__buf_);
- __t->destroy();
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f_ == (__base*)&__buf_)
- {
- __f_->__clone((__base*)&__f.__buf_);
- __f_->destroy();
- __f_ = __f.__f_;
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f.__f_ == (__base*)&__f.__buf_)
- {
- __f.__f_->__clone((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = __f_;
- __f_ = (__base*)&__buf_;
- }
- else
- _VSTD::swap(__f_, __f.__f_);
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-_Rp
-function<_Rp(_A0, _A1, _A2)>::operator()(_A0 __a0, _A1 __a1, _A2 __a2) const
-{
- if (__f_ == 0)
- __throw_bad_function_call();
- return (*__f_)(__a0, __a1, __a2);
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Rp, class _A0, class _A1, class _A2>
-const std::type_info&
-function<_Rp(_A0, _A1, _A2)>::target_type() const
-{
- if (__f_ == 0)
- return typeid(void);
- return __f_->target_type();
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-template <typename _Tp>
-_Tp*
-function<_Rp(_A0, _A1, _A2)>::target()
-{
- if (__f_ == 0)
- return (_Tp*)0;
- return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp)));
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-template <typename _Tp>
-const _Tp*
-function<_Rp(_A0, _A1, _A2)>::target() const
-{
- if (__f_ == 0)
- return (const _Tp*)0;
- return (const _Tp*)__f_->target(typeid(_Tp));
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-template <class _Fp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const function<_Fp>& __f, nullptr_t) {return !__f;}
-
-template <class _Fp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(nullptr_t, const function<_Fp>& __f) {return !__f;}
-
-template <class _Fp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const function<_Fp>& __f, nullptr_t) {return (bool)__f;}
-
-template <class _Fp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(nullptr_t, const function<_Fp>& __f) {return (bool)__f;}
-
-template <class _Fp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(function<_Fp>& __x, function<_Fp>& __y)
-{return __x.swap(__y);}
-
-#endif // _LIBCPP_FUNCTIONAL_03
diff --git a/lib/libcxx/include/__functional_base b/lib/libcxx/include/__functional_base
deleted file mode 100644
index 032be99bf6a..00000000000
--- a/lib/libcxx/include/__functional_base
+++ /dev/null
@@ -1,653 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_FUNCTIONAL_BASE
-#define _LIBCPP_FUNCTIONAL_BASE
-
-#include <__config>
-#include <type_traits>
-#include <typeinfo>
-#include <exception>
-#include <new>
-#include <utility>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Arg1, class _Arg2, class _Result>
-struct _LIBCPP_TEMPLATE_VIS binary_function
-{
- typedef _Arg1 first_argument_type;
- typedef _Arg2 second_argument_type;
- typedef _Result result_type;
-};
-
-template <class _Tp>
-struct __has_result_type
-{
-private:
- struct __two {char __lx; char __lxx;};
- template <class _Up> static __two __test(...);
- template <class _Up> static char __test(typename _Up::result_type* = 0);
-public:
- static const bool value = sizeof(__test<_Tp>(0)) == 1;
-};
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS less : binary_function<_Tp, _Tp, bool>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return __x < __y;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS less<void>
-{
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
-};
-#endif
-
-// __weak_result_type
-
-template <class _Tp>
-struct __derives_from_unary_function
-{
-private:
- struct __two {char __lx; char __lxx;};
- static __two __test(...);
- template <class _Ap, class _Rp>
- static unary_function<_Ap, _Rp>
- __test(const volatile unary_function<_Ap, _Rp>*);
-public:
- static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value;
- typedef decltype(__test((_Tp*)0)) type;
-};
-
-template <class _Tp>
-struct __derives_from_binary_function
-{
-private:
- struct __two {char __lx; char __lxx;};
- static __two __test(...);
- template <class _A1, class _A2, class _Rp>
- static binary_function<_A1, _A2, _Rp>
- __test(const volatile binary_function<_A1, _A2, _Rp>*);
-public:
- static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value;
- typedef decltype(__test((_Tp*)0)) type;
-};
-
-template <class _Tp, bool = __derives_from_unary_function<_Tp>::value>
-struct __maybe_derive_from_unary_function // bool is true
- : public __derives_from_unary_function<_Tp>::type
-{
-};
-
-template <class _Tp>
-struct __maybe_derive_from_unary_function<_Tp, false>
-{
-};
-
-template <class _Tp, bool = __derives_from_binary_function<_Tp>::value>
-struct __maybe_derive_from_binary_function // bool is true
- : public __derives_from_binary_function<_Tp>::type
-{
-};
-
-template <class _Tp>
-struct __maybe_derive_from_binary_function<_Tp, false>
-{
-};
-
-template <class _Tp, bool = __has_result_type<_Tp>::value>
-struct __weak_result_type_imp // bool is true
- : public __maybe_derive_from_unary_function<_Tp>,
- public __maybe_derive_from_binary_function<_Tp>
-{
- typedef typename _Tp::result_type result_type;
-};
-
-template <class _Tp>
-struct __weak_result_type_imp<_Tp, false>
- : public __maybe_derive_from_unary_function<_Tp>,
- public __maybe_derive_from_binary_function<_Tp>
-{
-};
-
-template <class _Tp>
-struct __weak_result_type
- : public __weak_result_type_imp<_Tp>
-{
-};
-
-// 0 argument case
-
-template <class _Rp>
-struct __weak_result_type<_Rp ()>
-{
- typedef _Rp result_type;
-};
-
-template <class _Rp>
-struct __weak_result_type<_Rp (&)()>
-{
- typedef _Rp result_type;
-};
-
-template <class _Rp>
-struct __weak_result_type<_Rp (*)()>
-{
- typedef _Rp result_type;
-};
-
-// 1 argument case
-
-template <class _Rp, class _A1>
-struct __weak_result_type<_Rp (_A1)>
- : public unary_function<_A1, _Rp>
-{
-};
-
-template <class _Rp, class _A1>
-struct __weak_result_type<_Rp (&)(_A1)>
- : public unary_function<_A1, _Rp>
-{
-};
-
-template <class _Rp, class _A1>
-struct __weak_result_type<_Rp (*)(_A1)>
- : public unary_function<_A1, _Rp>
-{
-};
-
-template <class _Rp, class _Cp>
-struct __weak_result_type<_Rp (_Cp::*)()>
- : public unary_function<_Cp*, _Rp>
-{
-};
-
-template <class _Rp, class _Cp>
-struct __weak_result_type<_Rp (_Cp::*)() const>
- : public unary_function<const _Cp*, _Rp>
-{
-};
-
-template <class _Rp, class _Cp>
-struct __weak_result_type<_Rp (_Cp::*)() volatile>
- : public unary_function<volatile _Cp*, _Rp>
-{
-};
-
-template <class _Rp, class _Cp>
-struct __weak_result_type<_Rp (_Cp::*)() const volatile>
- : public unary_function<const volatile _Cp*, _Rp>
-{
-};
-
-// 2 argument case
-
-template <class _Rp, class _A1, class _A2>
-struct __weak_result_type<_Rp (_A1, _A2)>
- : public binary_function<_A1, _A2, _Rp>
-{
-};
-
-template <class _Rp, class _A1, class _A2>
-struct __weak_result_type<_Rp (*)(_A1, _A2)>
- : public binary_function<_A1, _A2, _Rp>
-{
-};
-
-template <class _Rp, class _A1, class _A2>
-struct __weak_result_type<_Rp (&)(_A1, _A2)>
- : public binary_function<_A1, _A2, _Rp>
-{
-};
-
-template <class _Rp, class _Cp, class _A1>
-struct __weak_result_type<_Rp (_Cp::*)(_A1)>
- : public binary_function<_Cp*, _A1, _Rp>
-{
-};
-
-template <class _Rp, class _Cp, class _A1>
-struct __weak_result_type<_Rp (_Cp::*)(_A1) const>
- : public binary_function<const _Cp*, _A1, _Rp>
-{
-};
-
-template <class _Rp, class _Cp, class _A1>
-struct __weak_result_type<_Rp (_Cp::*)(_A1) volatile>
- : public binary_function<volatile _Cp*, _A1, _Rp>
-{
-};
-
-template <class _Rp, class _Cp, class _A1>
-struct __weak_result_type<_Rp (_Cp::*)(_A1) const volatile>
- : public binary_function<const volatile _Cp*, _A1, _Rp>
-{
-};
-
-
-#ifndef _LIBCPP_CXX03_LANG
-// 3 or more arguments
-
-template <class _Rp, class _A1, class _A2, class _A3, class ..._A4>
-struct __weak_result_type<_Rp (_A1, _A2, _A3, _A4...)>
-{
- typedef _Rp result_type;
-};
-
-template <class _Rp, class _A1, class _A2, class _A3, class ..._A4>
-struct __weak_result_type<_Rp (&)(_A1, _A2, _A3, _A4...)>
-{
- typedef _Rp result_type;
-};
-
-template <class _Rp, class _A1, class _A2, class _A3, class ..._A4>
-struct __weak_result_type<_Rp (*)(_A1, _A2, _A3, _A4...)>
-{
- typedef _Rp result_type;
-};
-
-template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3>
-struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...)>
-{
- typedef _Rp result_type;
-};
-
-template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3>
-struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const>
-{
- typedef _Rp result_type;
-};
-
-template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3>
-struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) volatile>
-{
- typedef _Rp result_type;
-};
-
-template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3>
-struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const volatile>
-{
- typedef _Rp result_type;
-};
-
-template <class _Tp, class ..._Args>
-struct __invoke_return
-{
- typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_Args>()...)) type;
-};
-
-#else // defined(_LIBCPP_CXX03_LANG)
-
-#include <__functional_base_03>
-
-#endif // !defined(_LIBCPP_CXX03_LANG)
-
-
-template <class _Ret>
-struct __invoke_void_return_wrapper
-{
-#ifndef _LIBCPP_CXX03_LANG
- template <class ..._Args>
- static _Ret __call(_Args&&... __args) {
- return __invoke(_VSTD::forward<_Args>(__args)...);
- }
-#else
- template <class _Fn>
- static _Ret __call(_Fn __f) {
- return __invoke(__f);
- }
-
- template <class _Fn, class _A0>
- static _Ret __call(_Fn __f, _A0& __a0) {
- return __invoke(__f, __a0);
- }
-
- template <class _Fn, class _A0, class _A1>
- static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1) {
- return __invoke(__f, __a0, __a1);
- }
-
- template <class _Fn, class _A0, class _A1, class _A2>
- static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2){
- return __invoke(__f, __a0, __a1, __a2);
- }
-#endif
-};
-
-template <>
-struct __invoke_void_return_wrapper<void>
-{
-#ifndef _LIBCPP_CXX03_LANG
- template <class ..._Args>
- static void __call(_Args&&... __args) {
- __invoke(_VSTD::forward<_Args>(__args)...);
- }
-#else
- template <class _Fn>
- static void __call(_Fn __f) {
- __invoke(__f);
- }
-
- template <class _Fn, class _A0>
- static void __call(_Fn __f, _A0& __a0) {
- __invoke(__f, __a0);
- }
-
- template <class _Fn, class _A0, class _A1>
- static void __call(_Fn __f, _A0& __a0, _A1& __a1) {
- __invoke(__f, __a0, __a1);
- }
-
- template <class _Fn, class _A0, class _A1, class _A2>
- static void __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2) {
- __invoke(__f, __a0, __a1, __a2);
- }
-#endif
-};
-
-template <class _Tp>
-class _LIBCPP_TEMPLATE_VIS reference_wrapper
- : public __weak_result_type<_Tp>
-{
-public:
- // types
- typedef _Tp type;
-private:
- type* __f_;
-
-public:
- // construct/copy/destroy
- _LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) _NOEXCEPT
- : __f_(_VSTD::addressof(__f)) {}
-#ifndef _LIBCPP_CXX03_LANG
- private: reference_wrapper(type&&); public: // = delete; // do not bind to temps
-#endif
-
- // access
- _LIBCPP_INLINE_VISIBILITY operator type& () const _NOEXCEPT {return *__f_;}
- _LIBCPP_INLINE_VISIBILITY type& get() const _NOEXCEPT {return *__f_;}
-
-#ifndef _LIBCPP_CXX03_LANG
- // invoke
- template <class... _ArgTypes>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_of<type&, _ArgTypes...>::type
- operator() (_ArgTypes&&... __args) const {
- return __invoke(get(), _VSTD::forward<_ArgTypes>(__args)...);
- }
-#else
-
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return<type>::type
- operator() () const {
- return __invoke(get());
- }
-
- template <class _A0>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return0<type, _A0>::type
- operator() (_A0& __a0) const {
- return __invoke(get(), __a0);
- }
-
- template <class _A0>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return0<type, _A0 const>::type
- operator() (_A0 const& __a0) const {
- return __invoke(get(), __a0);
- }
-
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return1<type, _A0, _A1>::type
- operator() (_A0& __a0, _A1& __a1) const {
- return __invoke(get(), __a0, __a1);
- }
-
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return1<type, _A0 const, _A1>::type
- operator() (_A0 const& __a0, _A1& __a1) const {
- return __invoke(get(), __a0, __a1);
- }
-
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return1<type, _A0, _A1 const>::type
- operator() (_A0& __a0, _A1 const& __a1) const {
- return __invoke(get(), __a0, __a1);
- }
-
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return1<type, _A0 const, _A1 const>::type
- operator() (_A0 const& __a0, _A1 const& __a1) const {
- return __invoke(get(), __a0, __a1);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0, _A1, _A2>::type
- operator() (_A0& __a0, _A1& __a1, _A2& __a2) const {
- return __invoke(get(), __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0 const, _A1, _A2>::type
- operator() (_A0 const& __a0, _A1& __a1, _A2& __a2) const {
- return __invoke(get(), __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0, _A1 const, _A2>::type
- operator() (_A0& __a0, _A1 const& __a1, _A2& __a2) const {
- return __invoke(get(), __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0, _A1, _A2 const>::type
- operator() (_A0& __a0, _A1& __a1, _A2 const& __a2) const {
- return __invoke(get(), __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0 const, _A1 const, _A2>::type
- operator() (_A0 const& __a0, _A1 const& __a1, _A2& __a2) const {
- return __invoke(get(), __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0 const, _A1, _A2 const>::type
- operator() (_A0 const& __a0, _A1& __a1, _A2 const& __a2) const {
- return __invoke(get(), __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0, _A1 const, _A2 const>::type
- operator() (_A0& __a0, _A1 const& __a1, _A2 const& __a2) const {
- return __invoke(get(), __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0 const, _A1 const, _A2 const>::type
- operator() (_A0 const& __a0, _A1 const& __a1, _A2 const& __a2) const {
- return __invoke(get(), __a0, __a1, __a2);
- }
-#endif // _LIBCPP_CXX03_LANG
-};
-
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-reference_wrapper<_Tp>
-ref(_Tp& __t) _NOEXCEPT
-{
- return reference_wrapper<_Tp>(__t);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-reference_wrapper<_Tp>
-ref(reference_wrapper<_Tp> __t) _NOEXCEPT
-{
- return ref(__t.get());
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-reference_wrapper<const _Tp>
-cref(const _Tp& __t) _NOEXCEPT
-{
- return reference_wrapper<const _Tp>(__t);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-reference_wrapper<const _Tp>
-cref(reference_wrapper<_Tp> __t) _NOEXCEPT
-{
- return cref(__t.get());
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Tp> void ref(const _Tp&&) = delete;
-template <class _Tp> void cref(const _Tp&&) = delete;
-#endif
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp, class, class = void>
-struct __is_transparent : false_type {};
-
-template <class _Tp, class _Up>
-struct __is_transparent<_Tp, _Up,
- typename __void_t<typename _Tp::is_transparent>::type>
- : true_type {};
-#endif
-
-// allocator_arg_t
-
-struct _LIBCPP_TEMPLATE_VIS allocator_arg_t { };
-
-#if defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY)
-extern _LIBCPP_EXPORTED_FROM_ABI const allocator_arg_t allocator_arg;
-#else
-/* _LIBCPP_INLINE_VAR */ constexpr allocator_arg_t allocator_arg = allocator_arg_t();
-#endif
-
-// uses_allocator
-
-template <class _Tp>
-struct __has_allocator_type
-{
-private:
- struct __two {char __lx; char __lxx;};
- template <class _Up> static __two __test(...);
- template <class _Up> static char __test(typename _Up::allocator_type* = 0);
-public:
- static const bool value = sizeof(__test<_Tp>(0)) == 1;
-};
-
-template <class _Tp, class _Alloc, bool = __has_allocator_type<_Tp>::value>
-struct __uses_allocator
- : public integral_constant<bool,
- is_convertible<_Alloc, typename _Tp::allocator_type>::value>
-{
-};
-
-template <class _Tp, class _Alloc>
-struct __uses_allocator<_Tp, _Alloc, false>
- : public false_type
-{
-};
-
-template <class _Tp, class _Alloc>
-struct _LIBCPP_TEMPLATE_VIS uses_allocator
- : public __uses_allocator<_Tp, _Alloc>
-{
-};
-
-#if _LIBCPP_STD_VER > 14
-template <class _Tp, class _Alloc>
-_LIBCPP_INLINE_VAR constexpr size_t uses_allocator_v = uses_allocator<_Tp, _Alloc>::value;
-#endif
-
-#ifndef _LIBCPP_CXX03_LANG
-
-// allocator construction
-
-template <class _Tp, class _Alloc, class ..._Args>
-struct __uses_alloc_ctor_imp
-{
- typedef typename __uncvref<_Alloc>::type _RawAlloc;
- static const bool __ua = uses_allocator<_Tp, _RawAlloc>::value;
- static const bool __ic =
- is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value;
- static const int value = __ua ? 2 - __ic : 0;
-};
-
-template <class _Tp, class _Alloc, class ..._Args>
-struct __uses_alloc_ctor
- : integral_constant<int, __uses_alloc_ctor_imp<_Tp, _Alloc, _Args...>::value>
- {};
-
-template <class _Tp, class _Allocator, class... _Args>
-inline _LIBCPP_INLINE_VISIBILITY
-void __user_alloc_construct_impl (integral_constant<int, 0>, _Tp *__storage, const _Allocator &, _Args &&... __args )
-{
- new (__storage) _Tp (_VSTD::forward<_Args>(__args)...);
-}
-
-// FIXME: This should have a version which takes a non-const alloc.
-template <class _Tp, class _Allocator, class... _Args>
-inline _LIBCPP_INLINE_VISIBILITY
-void __user_alloc_construct_impl (integral_constant<int, 1>, _Tp *__storage, const _Allocator &__a, _Args &&... __args )
-{
- new (__storage) _Tp (allocator_arg, __a, _VSTD::forward<_Args>(__args)...);
-}
-
-// FIXME: This should have a version which takes a non-const alloc.
-template <class _Tp, class _Allocator, class... _Args>
-inline _LIBCPP_INLINE_VISIBILITY
-void __user_alloc_construct_impl (integral_constant<int, 2>, _Tp *__storage, const _Allocator &__a, _Args &&... __args )
-{
- new (__storage) _Tp (_VSTD::forward<_Args>(__args)..., __a);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_FUNCTIONAL_BASE
diff --git a/lib/libcxx/include/__functional_base_03 b/lib/libcxx/include/__functional_base_03
deleted file mode 100644
index 8407dcfa39c..00000000000
--- a/lib/libcxx/include/__functional_base_03
+++ /dev/null
@@ -1,224 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_FUNCTIONAL_BASE_03
-#define _LIBCPP_FUNCTIONAL_BASE_03
-
-// manual variadic expansion for <functional>
-
-// __invoke
-
-template <class _Ret, class _T1, bool _IsFunc, bool _IsBase>
-struct __enable_invoke_imp;
-
-template <class _Ret, class _T1>
-struct __enable_invoke_imp<_Ret, _T1, true, true> {
- typedef _Ret _Bullet1;
- typedef _Bullet1 type;
-};
-
-template <class _Ret, class _T1>
-struct __enable_invoke_imp<_Ret, _T1, true, false> {
- typedef _Ret _Bullet2;
- typedef _Bullet2 type;
-};
-
-template <class _Ret, class _T1>
-struct __enable_invoke_imp<_Ret, _T1, false, true> {
- typedef typename add_lvalue_reference<
- typename __apply_cv<_T1, _Ret>::type
- >::type _Bullet3;
- typedef _Bullet3 type;
-};
-
-template <class _Ret, class _T1>
-struct __enable_invoke_imp<_Ret, _T1, false, false> {
- typedef typename add_lvalue_reference<
- typename __apply_cv<decltype(*_VSTD::declval<_T1>()), _Ret>::type
- >::type _Bullet4;
- typedef _Bullet4 type;
-};
-
-template <class _Ret, class _T1>
-struct __enable_invoke_imp<_Ret, _T1*, false, false> {
- typedef typename add_lvalue_reference<
- typename __apply_cv<_T1, _Ret>::type
- >::type _Bullet4;
- typedef _Bullet4 type;
-};
-
-template <class _Fn, class _T1,
- class _Traits = __member_pointer_traits<_Fn>,
- class _Ret = typename _Traits::_ReturnType,
- class _Class = typename _Traits::_ClassType>
-struct __enable_invoke : __enable_invoke_imp<
- _Ret, _T1,
- is_member_function_pointer<_Fn>::value,
- is_base_of<_Class, typename remove_reference<_T1>::type>::value>
-{
-};
-
-__nat __invoke(__any, ...);
-
-// first bullet
-
-template <class _Fn, class _T1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet1
-__invoke(_Fn __f, _T1& __t1) {
- return (__t1.*__f)();
-}
-
-template <class _Fn, class _T1, class _A0>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet1
-__invoke(_Fn __f, _T1& __t1, _A0& __a0) {
- return (__t1.*__f)(__a0);
-}
-
-template <class _Fn, class _T1, class _A0, class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet1
-__invoke(_Fn __f, _T1& __t1, _A0& __a0, _A1& __a1) {
- return (__t1.*__f)(__a0, __a1);
-}
-
-template <class _Fn, class _T1, class _A0, class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet1
-__invoke(_Fn __f, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2) {
- return (__t1.*__f)(__a0, __a1, __a2);
-}
-
-template <class _Fn, class _T1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet2
-__invoke(_Fn __f, _T1& __t1) {
- return ((*__t1).*__f)();
-}
-
-template <class _Fn, class _T1, class _A0>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet2
-__invoke(_Fn __f, _T1& __t1, _A0& __a0) {
- return ((*__t1).*__f)(__a0);
-}
-
-template <class _Fn, class _T1, class _A0, class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet2
-__invoke(_Fn __f, _T1& __t1, _A0& __a0, _A1& __a1) {
- return ((*__t1).*__f)(__a0, __a1);
-}
-
-template <class _Fn, class _T1, class _A0, class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet2
-__invoke(_Fn __f, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2) {
- return ((*__t1).*__f)(__a0, __a1, __a2);
-}
-
-template <class _Fn, class _T1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet3
-__invoke(_Fn __f, _T1& __t1) {
- return __t1.*__f;
-}
-
-template <class _Fn, class _T1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet4
-__invoke(_Fn __f, _T1& __t1) {
- return (*__t1).*__f;
-}
-
-// fifth bullet
-
-template <class _Fp>
-inline _LIBCPP_INLINE_VISIBILITY
-decltype(_VSTD::declval<_Fp&>()())
-__invoke(_Fp& __f)
-{
- return __f();
-}
-
-template <class _Fp, class _A0>
-inline _LIBCPP_INLINE_VISIBILITY
-decltype(_VSTD::declval<_Fp&>()(_VSTD::declval<_A0&>()))
-__invoke(_Fp& __f, _A0& __a0)
-{
- return __f(__a0);
-}
-
-template <class _Fp, class _A0, class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-decltype(_VSTD::declval<_Fp&>()(_VSTD::declval<_A0&>(), _VSTD::declval<_A1&>()))
-__invoke(_Fp& __f, _A0& __a0, _A1& __a1)
-{
- return __f(__a0, __a1);
-}
-
-template <class _Fp, class _A0, class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-decltype(_VSTD::declval<_Fp&>()(_VSTD::declval<_A0&>(), _VSTD::declval<_A1&>(), _VSTD::declval<_A2&>()))
-__invoke(_Fp& __f, _A0& __a0, _A1& __a1, _A2& __a2)
-{
- return __f(__a0, __a1, __a2);
-}
-
-template <class _Fp, bool = __has_result_type<__weak_result_type<_Fp> >::value>
-struct __invoke_return
-{
- typedef typename __weak_result_type<_Fp>::result_type type;
-};
-
-template <class _Fp>
-struct __invoke_return<_Fp, false>
-{
- typedef decltype(__invoke(_VSTD::declval<_Fp&>())) type;
-};
-
-template <class _Tp, class _A0>
-struct __invoke_return0
-{
- typedef decltype(__invoke(_VSTD::declval<_Tp&>(), _VSTD::declval<_A0&>())) type;
-};
-
-template <class _Rp, class _Tp, class _A0>
-struct __invoke_return0<_Rp _Tp::*, _A0>
-{
- typedef typename __enable_invoke<_Rp _Tp::*, _A0>::type type;
-};
-
-template <class _Tp, class _A0, class _A1>
-struct __invoke_return1
-{
- typedef decltype(__invoke(_VSTD::declval<_Tp&>(), _VSTD::declval<_A0&>(),
- _VSTD::declval<_A1&>())) type;
-};
-
-template <class _Rp, class _Class, class _A0, class _A1>
-struct __invoke_return1<_Rp _Class::*, _A0, _A1> {
- typedef typename __enable_invoke<_Rp _Class::*, _A0>::type type;
-};
-
-template <class _Tp, class _A0, class _A1, class _A2>
-struct __invoke_return2
-{
- typedef decltype(__invoke(_VSTD::declval<_Tp&>(), _VSTD::declval<_A0&>(),
- _VSTD::declval<_A1&>(),
- _VSTD::declval<_A2&>())) type;
-};
-
-template <class _Ret, class _Class, class _A0, class _A1, class _A2>
-struct __invoke_return2<_Ret _Class::*, _A0, _A1, _A2> {
- typedef typename __enable_invoke<_Ret _Class::*, _A0>::type type;
-};
-#endif // _LIBCPP_FUNCTIONAL_BASE_03
diff --git a/lib/libcxx/include/__hash_table b/lib/libcxx/include/__hash_table
deleted file mode 100644
index 6f5b183105e..00000000000
--- a/lib/libcxx/include/__hash_table
+++ /dev/null
@@ -1,2913 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP__HASH_TABLE
-#define _LIBCPP__HASH_TABLE
-
-#include <__config>
-#include <initializer_list>
-#include <memory>
-#include <iterator>
-#include <algorithm>
-#include <cmath>
-#include <utility>
-#include <type_traits>
-
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Key, class _Tp>
-struct __hash_value_type;
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Tp>
-struct __is_hash_value_type_imp : false_type {};
-
-template <class _Key, class _Value>
-struct __is_hash_value_type_imp<__hash_value_type<_Key, _Value>> : true_type {};
-
-template <class ..._Args>
-struct __is_hash_value_type : false_type {};
-
-template <class _One>
-struct __is_hash_value_type<_One> : __is_hash_value_type_imp<typename __uncvref<_One>::type> {};
-#endif
-
-_LIBCPP_FUNC_VIS
-size_t __next_prime(size_t __n);
-
-template <class _NodePtr>
-struct __hash_node_base
-{
- typedef typename pointer_traits<_NodePtr>::element_type __node_type;
- typedef __hash_node_base __first_node;
- typedef typename __rebind_pointer<_NodePtr, __first_node>::type __node_base_pointer;
- typedef _NodePtr __node_pointer;
-
-#if defined(_LIBCPP_ABI_FIX_UNORDERED_NODE_POINTER_UB)
- typedef __node_base_pointer __next_pointer;
-#else
- typedef typename conditional<
- is_pointer<__node_pointer>::value,
- __node_base_pointer,
- __node_pointer>::type __next_pointer;
-#endif
-
- __next_pointer __next_;
-
- _LIBCPP_INLINE_VISIBILITY
- __next_pointer __ptr() _NOEXCEPT {
- return static_cast<__next_pointer>(
- pointer_traits<__node_base_pointer>::pointer_to(*this));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __node_pointer __upcast() _NOEXCEPT {
- return static_cast<__node_pointer>(
- pointer_traits<__node_base_pointer>::pointer_to(*this));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- size_t __hash() const _NOEXCEPT {
- return static_cast<__node_type const&>(*this).__hash_;
- }
-
- _LIBCPP_INLINE_VISIBILITY __hash_node_base() _NOEXCEPT : __next_(nullptr) {}
-};
-
-template <class _Tp, class _VoidPtr>
-struct __hash_node
- : public __hash_node_base
- <
- typename __rebind_pointer<_VoidPtr, __hash_node<_Tp, _VoidPtr> >::type
- >
-{
- typedef _Tp __node_value_type;
-
- size_t __hash_;
- __node_value_type __value_;
-};
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-__is_hash_power2(size_t __bc)
-{
- return __bc > 2 && !(__bc & (__bc - 1));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-size_t
-__constrain_hash(size_t __h, size_t __bc)
-{
- return !(__bc & (__bc - 1)) ? __h & (__bc - 1) :
- (__h < __bc ? __h : __h % __bc);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-size_t
-__next_hash_pow2(size_t __n)
-{
- return __n < 2 ? __n : (size_t(1) << (std::numeric_limits<size_t>::digits - __clz(__n-1)));
-}
-
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc> class __hash_table;
-
-template <class _NodePtr> class _LIBCPP_TEMPLATE_VIS __hash_iterator;
-template <class _ConstNodePtr> class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
-template <class _NodePtr> class _LIBCPP_TEMPLATE_VIS __hash_local_iterator;
-template <class _ConstNodePtr> class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
-template <class _HashIterator> class _LIBCPP_TEMPLATE_VIS __hash_map_iterator;
-template <class _HashIterator> class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
-
-template <class _Tp>
-struct __hash_key_value_types {
- static_assert(!is_reference<_Tp>::value && !is_const<_Tp>::value, "");
- typedef _Tp key_type;
- typedef _Tp __node_value_type;
- typedef _Tp __container_value_type;
- static const bool __is_map = false;
-
- _LIBCPP_INLINE_VISIBILITY
- static key_type const& __get_key(_Tp const& __v) {
- return __v;
- }
- _LIBCPP_INLINE_VISIBILITY
- static __container_value_type const& __get_value(__node_value_type const& __v) {
- return __v;
- }
- _LIBCPP_INLINE_VISIBILITY
- static __container_value_type* __get_ptr(__node_value_type& __n) {
- return _VSTD::addressof(__n);
- }
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- static __container_value_type&& __move(__node_value_type& __v) {
- return _VSTD::move(__v);
- }
-#endif
-};
-
-template <class _Key, class _Tp>
-struct __hash_key_value_types<__hash_value_type<_Key, _Tp> > {
- typedef _Key key_type;
- typedef _Tp mapped_type;
- typedef __hash_value_type<_Key, _Tp> __node_value_type;
- typedef pair<const _Key, _Tp> __container_value_type;
- typedef __container_value_type __map_value_type;
- static const bool __is_map = true;
-
- _LIBCPP_INLINE_VISIBILITY
- static key_type const& __get_key(__container_value_type const& __v) {
- return __v.first;
- }
-
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- static typename enable_if<__is_same_uncvref<_Up, __node_value_type>::value,
- __container_value_type const&>::type
- __get_value(_Up& __t) {
- return __t.__get_value();
- }
-
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- static typename enable_if<__is_same_uncvref<_Up, __container_value_type>::value,
- __container_value_type const&>::type
- __get_value(_Up& __t) {
- return __t;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- static __container_value_type* __get_ptr(__node_value_type& __n) {
- return _VSTD::addressof(__n.__get_value());
- }
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- static pair<key_type&&, mapped_type&&> __move(__node_value_type& __v) {
- return __v.__move();
- }
-#endif
-
-};
-
-template <class _Tp, class _AllocPtr, class _KVTypes = __hash_key_value_types<_Tp>,
- bool = _KVTypes::__is_map>
-struct __hash_map_pointer_types {};
-
-template <class _Tp, class _AllocPtr, class _KVTypes>
-struct __hash_map_pointer_types<_Tp, _AllocPtr, _KVTypes, true> {
- typedef typename _KVTypes::__map_value_type _Mv;
- typedef typename __rebind_pointer<_AllocPtr, _Mv>::type
- __map_value_type_pointer;
- typedef typename __rebind_pointer<_AllocPtr, const _Mv>::type
- __const_map_value_type_pointer;
-};
-
-template <class _NodePtr, class _NodeT = typename pointer_traits<_NodePtr>::element_type>
-struct __hash_node_types;
-
-template <class _NodePtr, class _Tp, class _VoidPtr>
-struct __hash_node_types<_NodePtr, __hash_node<_Tp, _VoidPtr> >
- : public __hash_key_value_types<_Tp>, __hash_map_pointer_types<_Tp, _VoidPtr>
-
-{
- typedef __hash_key_value_types<_Tp> __base;
-
-public:
- typedef ptrdiff_t difference_type;
- typedef size_t size_type;
-
- typedef typename __rebind_pointer<_NodePtr, void>::type __void_pointer;
-
- typedef typename pointer_traits<_NodePtr>::element_type __node_type;
- typedef _NodePtr __node_pointer;
-
- typedef __hash_node_base<__node_pointer> __node_base_type;
- typedef typename __rebind_pointer<_NodePtr, __node_base_type>::type
- __node_base_pointer;
-
- typedef typename __node_base_type::__next_pointer __next_pointer;
-
- typedef _Tp __node_value_type;
- typedef typename __rebind_pointer<_VoidPtr, __node_value_type>::type
- __node_value_type_pointer;
- typedef typename __rebind_pointer<_VoidPtr, const __node_value_type>::type
- __const_node_value_type_pointer;
-
-private:
- static_assert(!is_const<__node_type>::value,
- "_NodePtr should never be a pointer to const");
- static_assert((is_same<typename pointer_traits<_VoidPtr>::element_type, void>::value),
- "_VoidPtr does not point to unqualified void type");
- static_assert((is_same<typename __rebind_pointer<_VoidPtr, __node_type>::type,
- _NodePtr>::value), "_VoidPtr does not rebind to _NodePtr.");
-};
-
-template <class _HashIterator>
-struct __hash_node_types_from_iterator;
-template <class _NodePtr>
-struct __hash_node_types_from_iterator<__hash_iterator<_NodePtr> > : __hash_node_types<_NodePtr> {};
-template <class _NodePtr>
-struct __hash_node_types_from_iterator<__hash_const_iterator<_NodePtr> > : __hash_node_types<_NodePtr> {};
-template <class _NodePtr>
-struct __hash_node_types_from_iterator<__hash_local_iterator<_NodePtr> > : __hash_node_types<_NodePtr> {};
-template <class _NodePtr>
-struct __hash_node_types_from_iterator<__hash_const_local_iterator<_NodePtr> > : __hash_node_types<_NodePtr> {};
-
-
-template <class _NodeValueTp, class _VoidPtr>
-struct __make_hash_node_types {
- typedef __hash_node<_NodeValueTp, _VoidPtr> _NodeTp;
- typedef typename __rebind_pointer<_VoidPtr, _NodeTp>::type _NodePtr;
- typedef __hash_node_types<_NodePtr> type;
-};
-
-template <class _NodePtr>
-class _LIBCPP_TEMPLATE_VIS __hash_iterator
-{
- typedef __hash_node_types<_NodePtr> _NodeTypes;
- typedef _NodePtr __node_pointer;
- typedef typename _NodeTypes::__next_pointer __next_pointer;
-
- __next_pointer __node_;
-
-public:
- typedef forward_iterator_tag iterator_category;
- typedef typename _NodeTypes::__node_value_type value_type;
- typedef typename _NodeTypes::difference_type difference_type;
- typedef value_type& reference;
- typedef typename _NodeTypes::__node_value_type_pointer pointer;
-
- _LIBCPP_INLINE_VISIBILITY __hash_iterator() _NOEXCEPT : __node_(nullptr) {
- _LIBCPP_DEBUG_MODE(__get_db()->__insert_i(this));
- }
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_INLINE_VISIBILITY
- __hash_iterator(const __hash_iterator& __i)
- : __node_(__i.__node_)
- {
- __get_db()->__iterator_copy(this, &__i);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- ~__hash_iterator()
- {
- __get_db()->__erase_i(this);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_iterator& operator=(const __hash_iterator& __i)
- {
- if (this != &__i)
- {
- __get_db()->__iterator_copy(this, &__i);
- __node_ = __i.__node_;
- }
- return *this;
- }
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable unordered container iterator");
- return __node_->__upcast()->__value_;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable unordered container iterator");
- return pointer_traits<pointer>::pointer_to(__node_->__upcast()->__value_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_iterator& operator++() {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to increment non-incrementable unordered container iterator");
- __node_ = __node_->__next_;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_iterator operator++(int)
- {
- __hash_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __hash_iterator& __x, const __hash_iterator& __y)
- {
- return __x.__node_ == __y.__node_;
- }
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __hash_iterator& __x, const __hash_iterator& __y)
- {return !(__x == __y);}
-
-private:
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_INLINE_VISIBILITY
- __hash_iterator(__next_pointer __node, const void* __c) _NOEXCEPT
- : __node_(__node)
- {
- __get_db()->__insert_ic(this, __c);
- }
-#else
- _LIBCPP_INLINE_VISIBILITY
- __hash_iterator(__next_pointer __node) _NOEXCEPT
- : __node_(__node)
- {}
-#endif
- template <class, class, class, class> friend class __hash_table;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_iterator;
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
-};
-
-template <class _NodePtr>
-class _LIBCPP_TEMPLATE_VIS __hash_const_iterator
-{
- static_assert(!is_const<typename pointer_traits<_NodePtr>::element_type>::value, "");
- typedef __hash_node_types<_NodePtr> _NodeTypes;
- typedef _NodePtr __node_pointer;
- typedef typename _NodeTypes::__next_pointer __next_pointer;
-
- __next_pointer __node_;
-
-public:
- typedef __hash_iterator<_NodePtr> __non_const_iterator;
-
- typedef forward_iterator_tag iterator_category;
- typedef typename _NodeTypes::__node_value_type value_type;
- typedef typename _NodeTypes::difference_type difference_type;
- typedef const value_type& reference;
- typedef typename _NodeTypes::__const_node_value_type_pointer pointer;
-
-
- _LIBCPP_INLINE_VISIBILITY __hash_const_iterator() _NOEXCEPT : __node_(nullptr) {
- _LIBCPP_DEBUG_MODE(__get_db()->__insert_i(this));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator(const __non_const_iterator& __x) _NOEXCEPT
- : __node_(__x.__node_)
- {
- _LIBCPP_DEBUG_MODE(__get_db()->__iterator_copy(this, &__x));
- }
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator(const __hash_const_iterator& __i)
- : __node_(__i.__node_)
- {
- __get_db()->__iterator_copy(this, &__i);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- ~__hash_const_iterator()
- {
- __get_db()->__erase_i(this);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator& operator=(const __hash_const_iterator& __i)
- {
- if (this != &__i)
- {
- __get_db()->__iterator_copy(this, &__i);
- __node_ = __i.__node_;
- }
- return *this;
- }
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable unordered container const_iterator");
- return __node_->__upcast()->__value_;
- }
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable unordered container const_iterator");
- return pointer_traits<pointer>::pointer_to(__node_->__upcast()->__value_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator& operator++() {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to increment non-incrementable unordered container const_iterator");
- __node_ = __node_->__next_;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator operator++(int)
- {
- __hash_const_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __hash_const_iterator& __x, const __hash_const_iterator& __y)
- {
- return __x.__node_ == __y.__node_;
- }
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __hash_const_iterator& __x, const __hash_const_iterator& __y)
- {return !(__x == __y);}
-
-private:
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator(__next_pointer __node, const void* __c) _NOEXCEPT
- : __node_(__node)
- {
- __get_db()->__insert_ic(this, __c);
- }
-#else
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator(__next_pointer __node) _NOEXCEPT
- : __node_(__node)
- {}
-#endif
- template <class, class, class, class> friend class __hash_table;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
-};
-
-template <class _NodePtr>
-class _LIBCPP_TEMPLATE_VIS __hash_local_iterator
-{
- typedef __hash_node_types<_NodePtr> _NodeTypes;
- typedef _NodePtr __node_pointer;
- typedef typename _NodeTypes::__next_pointer __next_pointer;
-
- __next_pointer __node_;
- size_t __bucket_;
- size_t __bucket_count_;
-
-public:
- typedef forward_iterator_tag iterator_category;
- typedef typename _NodeTypes::__node_value_type value_type;
- typedef typename _NodeTypes::difference_type difference_type;
- typedef value_type& reference;
- typedef typename _NodeTypes::__node_value_type_pointer pointer;
-
- _LIBCPP_INLINE_VISIBILITY __hash_local_iterator() _NOEXCEPT : __node_(nullptr) {
- _LIBCPP_DEBUG_MODE(__get_db()->__insert_i(this));
- }
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_INLINE_VISIBILITY
- __hash_local_iterator(const __hash_local_iterator& __i)
- : __node_(__i.__node_),
- __bucket_(__i.__bucket_),
- __bucket_count_(__i.__bucket_count_)
- {
- __get_db()->__iterator_copy(this, &__i);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- ~__hash_local_iterator()
- {
- __get_db()->__erase_i(this);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_local_iterator& operator=(const __hash_local_iterator& __i)
- {
- if (this != &__i)
- {
- __get_db()->__iterator_copy(this, &__i);
- __node_ = __i.__node_;
- __bucket_ = __i.__bucket_;
- __bucket_count_ = __i.__bucket_count_;
- }
- return *this;
- }
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable unordered container local_iterator");
- return __node_->__upcast()->__value_;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable unordered container local_iterator");
- return pointer_traits<pointer>::pointer_to(__node_->__upcast()->__value_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_local_iterator& operator++() {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to increment non-incrementable unordered container local_iterator");
- __node_ = __node_->__next_;
- if (__node_ != nullptr && __constrain_hash(__node_->__hash(), __bucket_count_) != __bucket_)
- __node_ = nullptr;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_local_iterator operator++(int)
- {
- __hash_local_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __hash_local_iterator& __x, const __hash_local_iterator& __y)
- {
- return __x.__node_ == __y.__node_;
- }
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __hash_local_iterator& __x, const __hash_local_iterator& __y)
- {return !(__x == __y);}
-
-private:
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_INLINE_VISIBILITY
- __hash_local_iterator(__next_pointer __node, size_t __bucket,
- size_t __bucket_count, const void* __c) _NOEXCEPT
- : __node_(__node),
- __bucket_(__bucket),
- __bucket_count_(__bucket_count)
- {
- __get_db()->__insert_ic(this, __c);
- if (__node_ != nullptr)
- __node_ = __node_->__next_;
- }
-#else
- _LIBCPP_INLINE_VISIBILITY
- __hash_local_iterator(__next_pointer __node, size_t __bucket,
- size_t __bucket_count) _NOEXCEPT
- : __node_(__node),
- __bucket_(__bucket),
- __bucket_count_(__bucket_count)
- {
- if (__node_ != nullptr)
- __node_ = __node_->__next_;
- }
-#endif
- template <class, class, class, class> friend class __hash_table;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_iterator;
-};
-
-template <class _ConstNodePtr>
-class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator
-{
- typedef __hash_node_types<_ConstNodePtr> _NodeTypes;
- typedef _ConstNodePtr __node_pointer;
- typedef typename _NodeTypes::__next_pointer __next_pointer;
-
- __next_pointer __node_;
- size_t __bucket_;
- size_t __bucket_count_;
-
- typedef pointer_traits<__node_pointer> __pointer_traits;
- typedef typename __pointer_traits::element_type __node;
- typedef typename remove_const<__node>::type __non_const_node;
- typedef typename __rebind_pointer<__node_pointer, __non_const_node>::type
- __non_const_node_pointer;
-public:
- typedef __hash_local_iterator<__non_const_node_pointer>
- __non_const_iterator;
-
- typedef forward_iterator_tag iterator_category;
- typedef typename _NodeTypes::__node_value_type value_type;
- typedef typename _NodeTypes::difference_type difference_type;
- typedef const value_type& reference;
- typedef typename _NodeTypes::__const_node_value_type_pointer pointer;
-
-
- _LIBCPP_INLINE_VISIBILITY __hash_const_local_iterator() _NOEXCEPT : __node_(nullptr) {
- _LIBCPP_DEBUG_MODE(__get_db()->__insert_i(this));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator(const __non_const_iterator& __x) _NOEXCEPT
- : __node_(__x.__node_),
- __bucket_(__x.__bucket_),
- __bucket_count_(__x.__bucket_count_)
- {
- _LIBCPP_DEBUG_MODE(__get_db()->__iterator_copy(this, &__x));
- }
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator(const __hash_const_local_iterator& __i)
- : __node_(__i.__node_),
- __bucket_(__i.__bucket_),
- __bucket_count_(__i.__bucket_count_)
- {
- __get_db()->__iterator_copy(this, &__i);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- ~__hash_const_local_iterator()
- {
- __get_db()->__erase_i(this);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator& operator=(const __hash_const_local_iterator& __i)
- {
- if (this != &__i)
- {
- __get_db()->__iterator_copy(this, &__i);
- __node_ = __i.__node_;
- __bucket_ = __i.__bucket_;
- __bucket_count_ = __i.__bucket_count_;
- }
- return *this;
- }
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable unordered container const_local_iterator");
- return __node_->__upcast()->__value_;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable unordered container const_local_iterator");
- return pointer_traits<pointer>::pointer_to(__node_->__upcast()->__value_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator& operator++() {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to increment non-incrementable unordered container const_local_iterator");
- __node_ = __node_->__next_;
- if (__node_ != nullptr && __constrain_hash(__node_->__hash(), __bucket_count_) != __bucket_)
- __node_ = nullptr;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator operator++(int)
- {
- __hash_const_local_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __hash_const_local_iterator& __x, const __hash_const_local_iterator& __y)
- {
- return __x.__node_ == __y.__node_;
- }
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __hash_const_local_iterator& __x, const __hash_const_local_iterator& __y)
- {return !(__x == __y);}
-
-private:
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator(__next_pointer __node, size_t __bucket,
- size_t __bucket_count, const void* __c) _NOEXCEPT
- : __node_(__node),
- __bucket_(__bucket),
- __bucket_count_(__bucket_count)
- {
- __get_db()->__insert_ic(this, __c);
- if (__node_ != nullptr)
- __node_ = __node_->__next_;
- }
-#else
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator(__next_pointer __node, size_t __bucket,
- size_t __bucket_count) _NOEXCEPT
- : __node_(__node),
- __bucket_(__bucket),
- __bucket_count_(__bucket_count)
- {
- if (__node_ != nullptr)
- __node_ = __node_->__next_;
- }
-#endif
- template <class, class, class, class> friend class __hash_table;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
-};
-
-template <class _Alloc>
-class __bucket_list_deallocator
-{
- typedef _Alloc allocator_type;
- typedef allocator_traits<allocator_type> __alloc_traits;
- typedef typename __alloc_traits::size_type size_type;
-
- __compressed_pair<size_type, allocator_type> __data_;
-public:
- typedef typename __alloc_traits::pointer pointer;
-
- _LIBCPP_INLINE_VISIBILITY
- __bucket_list_deallocator()
- _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
- : __data_(0) {}
-
- _LIBCPP_INLINE_VISIBILITY
- __bucket_list_deallocator(const allocator_type& __a, size_type __size)
- _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
- : __data_(__size, __a) {}
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- __bucket_list_deallocator(__bucket_list_deallocator&& __x)
- _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
- : __data_(_VSTD::move(__x.__data_))
- {
- __x.size() = 0;
- }
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- size_type& size() _NOEXCEPT {return __data_.first();}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT {return __data_.first();}
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type& __alloc() _NOEXCEPT {return __data_.second();}
- _LIBCPP_INLINE_VISIBILITY
- const allocator_type& __alloc() const _NOEXCEPT {return __data_.second();}
-
- _LIBCPP_INLINE_VISIBILITY
- void operator()(pointer __p) _NOEXCEPT
- {
- __alloc_traits::deallocate(__alloc(), __p, size());
- }
-};
-
-template <class _Alloc> class __hash_map_node_destructor;
-
-template <class _Alloc>
-class __hash_node_destructor
-{
- typedef _Alloc allocator_type;
- typedef allocator_traits<allocator_type> __alloc_traits;
-
-public:
- typedef typename __alloc_traits::pointer pointer;
-private:
- typedef __hash_node_types<pointer> _NodeTypes;
-
- allocator_type& __na_;
-
- __hash_node_destructor& operator=(const __hash_node_destructor&);
-
-public:
- bool __value_constructed;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __hash_node_destructor(allocator_type& __na,
- bool __constructed = false) _NOEXCEPT
- : __na_(__na),
- __value_constructed(__constructed)
- {}
-
- _LIBCPP_INLINE_VISIBILITY
- void operator()(pointer __p) _NOEXCEPT
- {
- if (__value_constructed)
- __alloc_traits::destroy(__na_, _NodeTypes::__get_ptr(__p->__value_));
- if (__p)
- __alloc_traits::deallocate(__na_, __p, 1);
- }
-
- template <class> friend class __hash_map_node_destructor;
-};
-
-#if _LIBCPP_STD_VER > 14
-template <class _NodeType, class _Alloc>
-struct __generic_container_node_destructor;
-
-template <class _Tp, class _VoidPtr, class _Alloc>
-struct __generic_container_node_destructor<__hash_node<_Tp, _VoidPtr>, _Alloc>
- : __hash_node_destructor<_Alloc>
-{
- using __hash_node_destructor<_Alloc>::__hash_node_destructor;
-};
-#endif
-
-template <class _Key, class _Hash, class _Equal>
-struct __enforce_unordered_container_requirements {
-#ifndef _LIBCPP_CXX03_LANG
- static_assert(__check_hash_requirements<_Key, _Hash>::value,
- "the specified hash does not meet the Hash requirements");
- static_assert(is_copy_constructible<_Equal>::value,
- "the specified comparator is required to be copy constructible");
-#endif
- typedef int type;
-};
-
-template <class _Key, class _Hash, class _Equal>
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_DIAGNOSE_WARNING(!__invokable<_Equal const&, _Key const&, _Key const&>::value,
- "the specified comparator type does not provide a const call operator")
- _LIBCPP_DIAGNOSE_WARNING(!__invokable<_Hash const&, _Key const&>::value,
- "the specified hash functor does not provide a const call operator")
-#endif
-typename __enforce_unordered_container_requirements<_Key, _Hash, _Equal>::type
-__diagnose_unordered_container_requirements(int);
-
-// This dummy overload is used so that the compiler won't emit a spurious
-// "no matching function for call to __diagnose_unordered_xxx" diagnostic
-// when the overload above causes a hard error.
-template <class _Key, class _Hash, class _Equal>
-int __diagnose_unordered_container_requirements(void*);
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-class __hash_table
-{
-public:
- typedef _Tp value_type;
- typedef _Hash hasher;
- typedef _Equal key_equal;
- typedef _Alloc allocator_type;
-
-private:
- typedef allocator_traits<allocator_type> __alloc_traits;
- typedef typename
- __make_hash_node_types<value_type, typename __alloc_traits::void_pointer>::type
- _NodeTypes;
-public:
-
- typedef typename _NodeTypes::__node_value_type __node_value_type;
- typedef typename _NodeTypes::__container_value_type __container_value_type;
- typedef typename _NodeTypes::key_type key_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename __alloc_traits::pointer pointer;
- typedef typename __alloc_traits::const_pointer const_pointer;
-#ifndef _LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE
- typedef typename __alloc_traits::size_type size_type;
-#else
- typedef typename _NodeTypes::size_type size_type;
-#endif
- typedef typename _NodeTypes::difference_type difference_type;
-public:
- // Create __node
-
- typedef typename _NodeTypes::__node_type __node;
- typedef typename __rebind_alloc_helper<__alloc_traits, __node>::type __node_allocator;
- typedef allocator_traits<__node_allocator> __node_traits;
- typedef typename _NodeTypes::__void_pointer __void_pointer;
- typedef typename _NodeTypes::__node_pointer __node_pointer;
- typedef typename _NodeTypes::__node_pointer __node_const_pointer;
- typedef typename _NodeTypes::__node_base_type __first_node;
- typedef typename _NodeTypes::__node_base_pointer __node_base_pointer;
- typedef typename _NodeTypes::__next_pointer __next_pointer;
-
-private:
- // check for sane allocator pointer rebinding semantics. Rebinding the
- // allocator for a new pointer type should be exactly the same as rebinding
- // the pointer using 'pointer_traits'.
- static_assert((is_same<__node_pointer, typename __node_traits::pointer>::value),
- "Allocator does not rebind pointers in a sane manner.");
- typedef typename __rebind_alloc_helper<__node_traits, __first_node>::type
- __node_base_allocator;
- typedef allocator_traits<__node_base_allocator> __node_base_traits;
- static_assert((is_same<__node_base_pointer, typename __node_base_traits::pointer>::value),
- "Allocator does not rebind pointers in a sane manner.");
-
-private:
-
- typedef typename __rebind_alloc_helper<__node_traits, __next_pointer>::type __pointer_allocator;
- typedef __bucket_list_deallocator<__pointer_allocator> __bucket_list_deleter;
- typedef unique_ptr<__next_pointer[], __bucket_list_deleter> __bucket_list;
- typedef allocator_traits<__pointer_allocator> __pointer_alloc_traits;
- typedef typename __bucket_list_deleter::pointer __node_pointer_pointer;
-
- // --- Member data begin ---
- __bucket_list __bucket_list_;
- __compressed_pair<__first_node, __node_allocator> __p1_;
- __compressed_pair<size_type, hasher> __p2_;
- __compressed_pair<float, key_equal> __p3_;
- // --- Member data end ---
-
- _LIBCPP_INLINE_VISIBILITY
- size_type& size() _NOEXCEPT {return __p2_.first();}
-public:
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT {return __p2_.first();}
-
- _LIBCPP_INLINE_VISIBILITY
- hasher& hash_function() _NOEXCEPT {return __p2_.second();}
- _LIBCPP_INLINE_VISIBILITY
- const hasher& hash_function() const _NOEXCEPT {return __p2_.second();}
-
- _LIBCPP_INLINE_VISIBILITY
- float& max_load_factor() _NOEXCEPT {return __p3_.first();}
- _LIBCPP_INLINE_VISIBILITY
- float max_load_factor() const _NOEXCEPT {return __p3_.first();}
-
- _LIBCPP_INLINE_VISIBILITY
- key_equal& key_eq() _NOEXCEPT {return __p3_.second();}
- _LIBCPP_INLINE_VISIBILITY
- const key_equal& key_eq() const _NOEXCEPT {return __p3_.second();}
-
- _LIBCPP_INLINE_VISIBILITY
- __node_allocator& __node_alloc() _NOEXCEPT {return __p1_.second();}
- _LIBCPP_INLINE_VISIBILITY
- const __node_allocator& __node_alloc() const _NOEXCEPT
- {return __p1_.second();}
-
-public:
- typedef __hash_iterator<__node_pointer> iterator;
- typedef __hash_const_iterator<__node_pointer> const_iterator;
- typedef __hash_local_iterator<__node_pointer> local_iterator;
- typedef __hash_const_local_iterator<__node_pointer> const_local_iterator;
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_table()
- _NOEXCEPT_(
- is_nothrow_default_constructible<__bucket_list>::value &&
- is_nothrow_default_constructible<__first_node>::value &&
- is_nothrow_default_constructible<__node_allocator>::value &&
- is_nothrow_default_constructible<hasher>::value &&
- is_nothrow_default_constructible<key_equal>::value);
- _LIBCPP_INLINE_VISIBILITY
- __hash_table(const hasher& __hf, const key_equal& __eql);
- __hash_table(const hasher& __hf, const key_equal& __eql,
- const allocator_type& __a);
- explicit __hash_table(const allocator_type& __a);
- __hash_table(const __hash_table& __u);
- __hash_table(const __hash_table& __u, const allocator_type& __a);
-#ifndef _LIBCPP_CXX03_LANG
- __hash_table(__hash_table&& __u)
- _NOEXCEPT_(
- is_nothrow_move_constructible<__bucket_list>::value &&
- is_nothrow_move_constructible<__first_node>::value &&
- is_nothrow_move_constructible<__node_allocator>::value &&
- is_nothrow_move_constructible<hasher>::value &&
- is_nothrow_move_constructible<key_equal>::value);
- __hash_table(__hash_table&& __u, const allocator_type& __a);
-#endif // _LIBCPP_CXX03_LANG
- ~__hash_table();
-
- __hash_table& operator=(const __hash_table& __u);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- __hash_table& operator=(__hash_table&& __u)
- _NOEXCEPT_(
- __node_traits::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<__node_allocator>::value &&
- is_nothrow_move_assignable<hasher>::value &&
- is_nothrow_move_assignable<key_equal>::value);
-#endif
- template <class _InputIterator>
- void __assign_unique(_InputIterator __first, _InputIterator __last);
- template <class _InputIterator>
- void __assign_multi(_InputIterator __first, _InputIterator __last);
-
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const _NOEXCEPT
- {
- return std::min<size_type>(
- __node_traits::max_size(__node_alloc()),
- numeric_limits<difference_type >::max()
- );
- }
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- __next_pointer __node_insert_multi_prepare(size_t __cp_hash,
- value_type& __cp_val);
- _LIBCPP_INLINE_VISIBILITY
- void __node_insert_multi_perform(__node_pointer __cp,
- __next_pointer __pn) _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- __next_pointer __node_insert_unique_prepare(size_t __nd_hash,
- value_type& __nd_val);
- _LIBCPP_INLINE_VISIBILITY
- void __node_insert_unique_perform(__node_pointer __ptr) _NOEXCEPT;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __node_insert_unique(__node_pointer __nd);
- _LIBCPP_INLINE_VISIBILITY
- iterator __node_insert_multi(__node_pointer __nd);
- _LIBCPP_INLINE_VISIBILITY
- iterator __node_insert_multi(const_iterator __p,
- __node_pointer __nd);
-
-#ifndef _LIBCPP_CXX03_LANG
- template <class _Key, class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __emplace_unique_key_args(_Key const& __k, _Args&&... __args);
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __emplace_unique_impl(_Args&&... __args);
-
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __emplace_unique(_Pp&& __x) {
- return __emplace_unique_extract_key(_VSTD::forward<_Pp>(__x),
- __can_extract_key<_Pp, key_type>());
- }
-
- template <class _First, class _Second>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<
- __can_extract_map_key<_First, key_type, __container_value_type>::value,
- pair<iterator, bool>
- >::type __emplace_unique(_First&& __f, _Second&& __s) {
- return __emplace_unique_key_args(__f, _VSTD::forward<_First>(__f),
- _VSTD::forward<_Second>(__s));
- }
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __emplace_unique(_Args&&... __args) {
- return __emplace_unique_impl(_VSTD::forward<_Args>(__args)...);
- }
-
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool>
- __emplace_unique_extract_key(_Pp&& __x, __extract_key_fail_tag) {
- return __emplace_unique_impl(_VSTD::forward<_Pp>(__x));
- }
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool>
- __emplace_unique_extract_key(_Pp&& __x, __extract_key_self_tag) {
- return __emplace_unique_key_args(__x, _VSTD::forward<_Pp>(__x));
- }
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool>
- __emplace_unique_extract_key(_Pp&& __x, __extract_key_first_tag) {
- return __emplace_unique_key_args(__x.first, _VSTD::forward<_Pp>(__x));
- }
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator __emplace_multi(_Args&&... __args);
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator __emplace_hint_multi(const_iterator __p, _Args&&... __args);
-
-
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool>
- __insert_unique(__container_value_type&& __x) {
- return __emplace_unique_key_args(_NodeTypes::__get_key(__x), _VSTD::move(__x));
- }
-
- template <class _Pp, class = typename enable_if<
- !__is_same_uncvref<_Pp, __container_value_type>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __insert_unique(_Pp&& __x) {
- return __emplace_unique(_VSTD::forward<_Pp>(__x));
- }
-
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- iterator __insert_multi(_Pp&& __x) {
- return __emplace_multi(_VSTD::forward<_Pp>(__x));
- }
-
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- iterator __insert_multi(const_iterator __p, _Pp&& __x) {
- return __emplace_hint_multi(__p, _VSTD::forward<_Pp>(__x));
- }
-
-#else // !defined(_LIBCPP_CXX03_LANG)
- template <class _Key, class _Args>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __emplace_unique_key_args(_Key const&, _Args& __args);
-
- iterator __insert_multi(const __container_value_type& __x);
- iterator __insert_multi(const_iterator __p, const __container_value_type& __x);
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __insert_unique(const __container_value_type& __x) {
- return __emplace_unique_key_args(_NodeTypes::__get_key(__x), __x);
- }
-
-#if _LIBCPP_STD_VER > 14
- template <class _NodeHandle, class _InsertReturnType>
- _LIBCPP_INLINE_VISIBILITY
- _InsertReturnType __node_handle_insert_unique(_NodeHandle&& __nh);
- template <class _NodeHandle>
- _LIBCPP_INLINE_VISIBILITY
- iterator __node_handle_insert_unique(const_iterator __hint,
- _NodeHandle&& __nh);
- template <class _Table>
- _LIBCPP_INLINE_VISIBILITY
- void __node_handle_merge_unique(_Table& __source);
-
- template <class _NodeHandle>
- _LIBCPP_INLINE_VISIBILITY
- iterator __node_handle_insert_multi(_NodeHandle&& __nh);
- template <class _NodeHandle>
- _LIBCPP_INLINE_VISIBILITY
- iterator __node_handle_insert_multi(const_iterator __hint, _NodeHandle&& __nh);
- template <class _Table>
- _LIBCPP_INLINE_VISIBILITY
- void __node_handle_merge_multi(_Table& __source);
-
- template <class _NodeHandle>
- _LIBCPP_INLINE_VISIBILITY
- _NodeHandle __node_handle_extract(key_type const& __key);
- template <class _NodeHandle>
- _LIBCPP_INLINE_VISIBILITY
- _NodeHandle __node_handle_extract(const_iterator __it);
-#endif
-
- void clear() _NOEXCEPT;
- void rehash(size_type __n);
- _LIBCPP_INLINE_VISIBILITY void reserve(size_type __n)
- {rehash(static_cast<size_type>(ceil(__n / max_load_factor())));}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket_count() const _NOEXCEPT
- {
- return __bucket_list_.get_deleter().size();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT;
-
- template <class _Key>
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket(const _Key& __k) const
- {
- _LIBCPP_ASSERT(bucket_count() > 0,
- "unordered container::bucket(key) called when bucket_count() == 0");
- return __constrain_hash(hash_function()(__k), bucket_count());
- }
-
- template <class _Key>
- iterator find(const _Key& __x);
- template <class _Key>
- const_iterator find(const _Key& __x) const;
-
- typedef __hash_node_destructor<__node_allocator> _Dp;
- typedef unique_ptr<__node, _Dp> __node_holder;
-
- iterator erase(const_iterator __p);
- iterator erase(const_iterator __first, const_iterator __last);
- template <class _Key>
- size_type __erase_unique(const _Key& __k);
- template <class _Key>
- size_type __erase_multi(const _Key& __k);
- __node_holder remove(const_iterator __p) _NOEXCEPT;
-
- template <class _Key>
- _LIBCPP_INLINE_VISIBILITY
- size_type __count_unique(const _Key& __k) const;
- template <class _Key>
- size_type __count_multi(const _Key& __k) const;
-
- template <class _Key>
- pair<iterator, iterator>
- __equal_range_unique(const _Key& __k);
- template <class _Key>
- pair<const_iterator, const_iterator>
- __equal_range_unique(const _Key& __k) const;
-
- template <class _Key>
- pair<iterator, iterator>
- __equal_range_multi(const _Key& __k);
- template <class _Key>
- pair<const_iterator, const_iterator>
- __equal_range_multi(const _Key& __k) const;
-
- void swap(__hash_table& __u)
-#if _LIBCPP_STD_VER <= 11
- _NOEXCEPT_DEBUG_(
- __is_nothrow_swappable<hasher>::value && __is_nothrow_swappable<key_equal>::value
- && (!allocator_traits<__pointer_allocator>::propagate_on_container_swap::value
- || __is_nothrow_swappable<__pointer_allocator>::value)
- && (!__node_traits::propagate_on_container_swap::value
- || __is_nothrow_swappable<__node_allocator>::value)
- );
-#else
- _NOEXCEPT_DEBUG_(__is_nothrow_swappable<hasher>::value && __is_nothrow_swappable<key_equal>::value);
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- size_type max_bucket_count() const _NOEXCEPT
- {return max_size(); }
- size_type bucket_size(size_type __n) const;
- _LIBCPP_INLINE_VISIBILITY float load_factor() const _NOEXCEPT
- {
- size_type __bc = bucket_count();
- return __bc != 0 ? (float)size() / __bc : 0.f;
- }
- _LIBCPP_INLINE_VISIBILITY void max_load_factor(float __mlf) _NOEXCEPT
- {
- _LIBCPP_ASSERT(__mlf > 0,
- "unordered container::max_load_factor(lf) called with lf <= 0");
- max_load_factor() = _VSTD::max(__mlf, load_factor());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- local_iterator
- begin(size_type __n)
- {
- _LIBCPP_ASSERT(__n < bucket_count(),
- "unordered container::begin(n) called with n >= bucket_count()");
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return local_iterator(__bucket_list_[__n], __n, bucket_count(), this);
-#else
- return local_iterator(__bucket_list_[__n], __n, bucket_count());
-#endif
- }
-
- _LIBCPP_INLINE_VISIBILITY
- local_iterator
- end(size_type __n)
- {
- _LIBCPP_ASSERT(__n < bucket_count(),
- "unordered container::end(n) called with n >= bucket_count()");
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return local_iterator(nullptr, __n, bucket_count(), this);
-#else
- return local_iterator(nullptr, __n, bucket_count());
-#endif
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator
- cbegin(size_type __n) const
- {
- _LIBCPP_ASSERT(__n < bucket_count(),
- "unordered container::cbegin(n) called with n >= bucket_count()");
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return const_local_iterator(__bucket_list_[__n], __n, bucket_count(), this);
-#else
- return const_local_iterator(__bucket_list_[__n], __n, bucket_count());
-#endif
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator
- cend(size_type __n) const
- {
- _LIBCPP_ASSERT(__n < bucket_count(),
- "unordered container::cend(n) called with n >= bucket_count()");
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return const_local_iterator(nullptr, __n, bucket_count(), this);
-#else
- return const_local_iterator(nullptr, __n, bucket_count());
-#endif
- }
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
-
- bool __dereferenceable(const const_iterator* __i) const;
- bool __decrementable(const const_iterator* __i) const;
- bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
- bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
-
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-
-private:
- void __rehash(size_type __n);
-
-#ifndef _LIBCPP_CXX03_LANG
- template <class ..._Args>
- __node_holder __construct_node(_Args&& ...__args);
-
- template <class _First, class ..._Rest>
- __node_holder __construct_node_hash(size_t __hash, _First&& __f, _Rest&&... __rest);
-#else // _LIBCPP_CXX03_LANG
- __node_holder __construct_node(const __container_value_type& __v);
- __node_holder __construct_node_hash(size_t __hash, const __container_value_type& __v);
-#endif
-
-
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __hash_table& __u)
- {__copy_assign_alloc(__u, integral_constant<bool,
- __node_traits::propagate_on_container_copy_assignment::value>());}
- void __copy_assign_alloc(const __hash_table& __u, true_type);
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __hash_table&, false_type) {}
-
-#ifndef _LIBCPP_CXX03_LANG
- void __move_assign(__hash_table& __u, false_type);
- void __move_assign(__hash_table& __u, true_type)
- _NOEXCEPT_(
- is_nothrow_move_assignable<__node_allocator>::value &&
- is_nothrow_move_assignable<hasher>::value &&
- is_nothrow_move_assignable<key_equal>::value);
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__hash_table& __u)
- _NOEXCEPT_(
- !__node_traits::propagate_on_container_move_assignment::value ||
- (is_nothrow_move_assignable<__pointer_allocator>::value &&
- is_nothrow_move_assignable<__node_allocator>::value))
- {__move_assign_alloc(__u, integral_constant<bool,
- __node_traits::propagate_on_container_move_assignment::value>());}
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__hash_table& __u, true_type)
- _NOEXCEPT_(
- is_nothrow_move_assignable<__pointer_allocator>::value &&
- is_nothrow_move_assignable<__node_allocator>::value)
- {
- __bucket_list_.get_deleter().__alloc() =
- _VSTD::move(__u.__bucket_list_.get_deleter().__alloc());
- __node_alloc() = _VSTD::move(__u.__node_alloc());
- }
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__hash_table&, false_type) _NOEXCEPT {}
-#endif // _LIBCPP_CXX03_LANG
-
- void __deallocate_node(__next_pointer __np) _NOEXCEPT;
- __next_pointer __detach() _NOEXCEPT;
-
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
-};
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table()
- _NOEXCEPT_(
- is_nothrow_default_constructible<__bucket_list>::value &&
- is_nothrow_default_constructible<__first_node>::value &&
- is_nothrow_default_constructible<__node_allocator>::value &&
- is_nothrow_default_constructible<hasher>::value &&
- is_nothrow_default_constructible<key_equal>::value)
- : __p2_(0),
- __p3_(1.0f)
-{
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const hasher& __hf,
- const key_equal& __eql)
- : __bucket_list_(nullptr, __bucket_list_deleter()),
- __p1_(),
- __p2_(0, __hf),
- __p3_(1.0f, __eql)
-{
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const hasher& __hf,
- const key_equal& __eql,
- const allocator_type& __a)
- : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)),
- __p1_(__second_tag(), __node_allocator(__a)),
- __p2_(0, __hf),
- __p3_(1.0f, __eql)
-{
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const allocator_type& __a)
- : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)),
- __p1_(__second_tag(), __node_allocator(__a)),
- __p2_(0),
- __p3_(1.0f)
-{
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const __hash_table& __u)
- : __bucket_list_(nullptr,
- __bucket_list_deleter(allocator_traits<__pointer_allocator>::
- select_on_container_copy_construction(
- __u.__bucket_list_.get_deleter().__alloc()), 0)),
- __p1_(__second_tag(), allocator_traits<__node_allocator>::
- select_on_container_copy_construction(__u.__node_alloc())),
- __p2_(0, __u.hash_function()),
- __p3_(__u.__p3_)
-{
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const __hash_table& __u,
- const allocator_type& __a)
- : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)),
- __p1_(__second_tag(), __node_allocator(__a)),
- __p2_(0, __u.hash_function()),
- __p3_(__u.__p3_)
-{
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(__hash_table&& __u)
- _NOEXCEPT_(
- is_nothrow_move_constructible<__bucket_list>::value &&
- is_nothrow_move_constructible<__first_node>::value &&
- is_nothrow_move_constructible<__node_allocator>::value &&
- is_nothrow_move_constructible<hasher>::value &&
- is_nothrow_move_constructible<key_equal>::value)
- : __bucket_list_(_VSTD::move(__u.__bucket_list_)),
- __p1_(_VSTD::move(__u.__p1_)),
- __p2_(_VSTD::move(__u.__p2_)),
- __p3_(_VSTD::move(__u.__p3_))
-{
- if (size() > 0)
- {
- __bucket_list_[__constrain_hash(__p1_.first().__next_->__hash(), bucket_count())] =
- __p1_.first().__ptr();
- __u.__p1_.first().__next_ = nullptr;
- __u.size() = 0;
- }
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(__hash_table&& __u,
- const allocator_type& __a)
- : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)),
- __p1_(__second_tag(), __node_allocator(__a)),
- __p2_(0, _VSTD::move(__u.hash_function())),
- __p3_(_VSTD::move(__u.__p3_))
-{
- if (__a == allocator_type(__u.__node_alloc()))
- {
- __bucket_list_.reset(__u.__bucket_list_.release());
- __bucket_list_.get_deleter().size() = __u.__bucket_list_.get_deleter().size();
- __u.__bucket_list_.get_deleter().size() = 0;
- if (__u.size() > 0)
- {
- __p1_.first().__next_ = __u.__p1_.first().__next_;
- __u.__p1_.first().__next_ = nullptr;
- __bucket_list_[__constrain_hash(__p1_.first().__next_->__hash(), bucket_count())] =
- __p1_.first().__ptr();
- size() = __u.size();
- __u.size() = 0;
- }
- }
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::~__hash_table()
-{
-#if defined(_LIBCPP_CXX03_LANG)
- static_assert((is_copy_constructible<key_equal>::value),
- "Predicate must be copy-constructible.");
- static_assert((is_copy_constructible<hasher>::value),
- "Hasher must be copy-constructible.");
-#endif
-
- __deallocate_node(__p1_.first().__next_);
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__erase_c(this);
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__copy_assign_alloc(
- const __hash_table& __u, true_type)
-{
- if (__node_alloc() != __u.__node_alloc())
- {
- clear();
- __bucket_list_.reset();
- __bucket_list_.get_deleter().size() = 0;
- }
- __bucket_list_.get_deleter().__alloc() = __u.__bucket_list_.get_deleter().__alloc();
- __node_alloc() = __u.__node_alloc();
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>&
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::operator=(const __hash_table& __u)
-{
- if (this != &__u)
- {
- __copy_assign_alloc(__u);
- hash_function() = __u.hash_function();
- key_eq() = __u.key_eq();
- max_load_factor() = __u.max_load_factor();
- __assign_multi(__u.begin(), __u.end());
- }
- return *this;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__deallocate_node(__next_pointer __np)
- _NOEXCEPT
-{
- __node_allocator& __na = __node_alloc();
- while (__np != nullptr)
- {
- __next_pointer __next = __np->__next_;
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __c_node* __c = __get_db()->__find_c_and_lock(this);
- for (__i_node** __p = __c->end_; __p != __c->beg_; )
- {
- --__p;
- iterator* __i = static_cast<iterator*>((*__p)->__i_);
- if (__i->__node_ == __np)
- {
- (*__p)->__c_ = nullptr;
- if (--__c->end_ != __p)
- memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
- }
- }
- __get_db()->unlock();
-#endif
- __node_pointer __real_np = __np->__upcast();
- __node_traits::destroy(__na, _NodeTypes::__get_ptr(__real_np->__value_));
- __node_traits::deallocate(__na, __real_np, 1);
- __np = __next;
- }
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__next_pointer
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__detach() _NOEXCEPT
-{
- size_type __bc = bucket_count();
- for (size_type __i = 0; __i < __bc; ++__i)
- __bucket_list_[__i] = nullptr;
- size() = 0;
- __next_pointer __cache = __p1_.first().__next_;
- __p1_.first().__next_ = nullptr;
- return __cache;
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__move_assign(
- __hash_table& __u, true_type)
- _NOEXCEPT_(
- is_nothrow_move_assignable<__node_allocator>::value &&
- is_nothrow_move_assignable<hasher>::value &&
- is_nothrow_move_assignable<key_equal>::value)
-{
- clear();
- __bucket_list_.reset(__u.__bucket_list_.release());
- __bucket_list_.get_deleter().size() = __u.__bucket_list_.get_deleter().size();
- __u.__bucket_list_.get_deleter().size() = 0;
- __move_assign_alloc(__u);
- size() = __u.size();
- hash_function() = _VSTD::move(__u.hash_function());
- max_load_factor() = __u.max_load_factor();
- key_eq() = _VSTD::move(__u.key_eq());
- __p1_.first().__next_ = __u.__p1_.first().__next_;
- if (size() > 0)
- {
- __bucket_list_[__constrain_hash(__p1_.first().__next_->__hash(), bucket_count())] =
- __p1_.first().__ptr();
- __u.__p1_.first().__next_ = nullptr;
- __u.size() = 0;
- }
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->swap(this, &__u);
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__move_assign(
- __hash_table& __u, false_type)
-{
- if (__node_alloc() == __u.__node_alloc())
- __move_assign(__u, true_type());
- else
- {
- hash_function() = _VSTD::move(__u.hash_function());
- key_eq() = _VSTD::move(__u.key_eq());
- max_load_factor() = __u.max_load_factor();
- if (bucket_count() != 0)
- {
- __next_pointer __cache = __detach();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- const_iterator __i = __u.begin();
- while (__cache != nullptr && __u.size() != 0)
- {
- __cache->__upcast()->__value_ =
- _VSTD::move(__u.remove(__i++)->__value_);
- __next_pointer __next = __cache->__next_;
- __node_insert_multi(__cache->__upcast());
- __cache = __next;
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __deallocate_node(__cache);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- __deallocate_node(__cache);
- }
- const_iterator __i = __u.begin();
- while (__u.size() != 0)
- {
- __node_holder __h = __construct_node(_NodeTypes::__move(__u.remove(__i++)->__value_));
- __node_insert_multi(__h.get());
- __h.release();
- }
- }
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline
-__hash_table<_Tp, _Hash, _Equal, _Alloc>&
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::operator=(__hash_table&& __u)
- _NOEXCEPT_(
- __node_traits::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<__node_allocator>::value &&
- is_nothrow_move_assignable<hasher>::value &&
- is_nothrow_move_assignable<key_equal>::value)
-{
- __move_assign(__u, integral_constant<bool,
- __node_traits::propagate_on_container_move_assignment::value>());
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _InputIterator>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__assign_unique(_InputIterator __first,
- _InputIterator __last)
-{
- typedef iterator_traits<_InputIterator> _ITraits;
- typedef typename _ITraits::value_type _ItValueType;
- static_assert((is_same<_ItValueType, __container_value_type>::value),
- "__assign_unique may only be called with the containers value type");
-
- if (bucket_count() != 0)
- {
- __next_pointer __cache = __detach();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (; __cache != nullptr && __first != __last; ++__first)
- {
- __cache->__upcast()->__value_ = *__first;
- __next_pointer __next = __cache->__next_;
- __node_insert_unique(__cache->__upcast());
- __cache = __next;
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __deallocate_node(__cache);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- __deallocate_node(__cache);
- }
- for (; __first != __last; ++__first)
- __insert_unique(*__first);
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _InputIterator>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__assign_multi(_InputIterator __first,
- _InputIterator __last)
-{
- typedef iterator_traits<_InputIterator> _ITraits;
- typedef typename _ITraits::value_type _ItValueType;
- static_assert((is_same<_ItValueType, __container_value_type>::value ||
- is_same<_ItValueType, __node_value_type>::value),
- "__assign_multi may only be called with the containers value type"
- " or the nodes value type");
- if (bucket_count() != 0)
- {
- __next_pointer __cache = __detach();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (; __cache != nullptr && __first != __last; ++__first)
- {
- __cache->__upcast()->__value_ = *__first;
- __next_pointer __next = __cache->__next_;
- __node_insert_multi(__cache->__upcast());
- __cache = __next;
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __deallocate_node(__cache);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- __deallocate_node(__cache);
- }
- for (; __first != __last; ++__first)
- __insert_multi(_NodeTypes::__get_value(*__first));
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::begin() _NOEXCEPT
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return iterator(__p1_.first().__next_, this);
-#else
- return iterator(__p1_.first().__next_);
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::end() _NOEXCEPT
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return iterator(nullptr, this);
-#else
- return iterator(nullptr);
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::begin() const _NOEXCEPT
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return const_iterator(__p1_.first().__next_, this);
-#else
- return const_iterator(__p1_.first().__next_);
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::end() const _NOEXCEPT
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return const_iterator(nullptr, this);
-#else
- return const_iterator(nullptr);
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::clear() _NOEXCEPT
-{
- if (size() > 0)
- {
- __deallocate_node(__p1_.first().__next_);
- __p1_.first().__next_ = nullptr;
- size_type __bc = bucket_count();
- for (size_type __i = 0; __i < __bc; ++__i)
- __bucket_list_[__i] = nullptr;
- size() = 0;
- }
-}
-
-
-// Prepare the container for an insertion of the value __value with the hash
-// __hash. This does a lookup into the container to see if __value is already
-// present, and performs a rehash if necessary. Returns a pointer to the
-// existing element if it exists, otherwise nullptr.
-//
-// Note that this function does forward exceptions if key_eq() throws, and never
-// mutates __value or actually inserts into the map.
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-_LIBCPP_INLINE_VISIBILITY
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__next_pointer
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_unique_prepare(
- size_t __hash, value_type& __value)
-{
- size_type __bc = bucket_count();
-
- if (__bc != 0)
- {
- size_t __chash = __constrain_hash(__hash, __bc);
- __next_pointer __ndptr = __bucket_list_[__chash];
- if (__ndptr != nullptr)
- {
- for (__ndptr = __ndptr->__next_; __ndptr != nullptr &&
- __constrain_hash(__ndptr->__hash(), __bc) == __chash;
- __ndptr = __ndptr->__next_)
- {
- if (key_eq()(__ndptr->__upcast()->__value_, __value))
- return __ndptr;
- }
- }
- }
- if (size()+1 > __bc * max_load_factor() || __bc == 0)
- {
- rehash(_VSTD::max<size_type>(2 * __bc + !__is_hash_power2(__bc),
- size_type(ceil(float(size() + 1) / max_load_factor()))));
- }
- return nullptr;
-}
-
-// Insert the node __nd into the container by pushing it into the right bucket,
-// and updating size(). Assumes that __nd->__hash is up-to-date, and that
-// rehashing has already occurred and that no element with the same key exists
-// in the map.
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-_LIBCPP_INLINE_VISIBILITY
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_unique_perform(
- __node_pointer __nd) _NOEXCEPT
-{
- size_type __bc = bucket_count();
- size_t __chash = __constrain_hash(__nd->__hash(), __bc);
- // insert_after __bucket_list_[__chash], or __first_node if bucket is null
- __next_pointer __pn = __bucket_list_[__chash];
- if (__pn == nullptr)
- {
- __pn =__p1_.first().__ptr();
- __nd->__next_ = __pn->__next_;
- __pn->__next_ = __nd->__ptr();
- // fix up __bucket_list_
- __bucket_list_[__chash] = __pn;
- if (__nd->__next_ != nullptr)
- __bucket_list_[__constrain_hash(__nd->__next_->__hash(), __bc)] = __nd->__ptr();
- }
- else
- {
- __nd->__next_ = __pn->__next_;
- __pn->__next_ = __nd->__ptr();
- }
- ++size();
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, bool>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_unique(__node_pointer __nd)
-{
- __nd->__hash_ = hash_function()(__nd->__value_);
- __next_pointer __existing_node =
- __node_insert_unique_prepare(__nd->__hash(), __nd->__value_);
-
- // Insert the node, unless it already exists in the container.
- bool __inserted = false;
- if (__existing_node == nullptr)
- {
- __node_insert_unique_perform(__nd);
- __existing_node = __nd->__ptr();
- __inserted = true;
- }
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return pair<iterator, bool>(iterator(__existing_node, this), __inserted);
-#else
- return pair<iterator, bool>(iterator(__existing_node), __inserted);
-#endif
-}
-
-// Prepare the container for an insertion of the value __cp_val with the hash
-// __cp_hash. This does a lookup into the container to see if __cp_value is
-// already present, and performs a rehash if necessary. Returns a pointer to the
-// last occurance of __cp_val in the map.
-//
-// Note that this function does forward exceptions if key_eq() throws, and never
-// mutates __value or actually inserts into the map.
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__next_pointer
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi_prepare(
- size_t __cp_hash, value_type& __cp_val)
-{
- size_type __bc = bucket_count();
- if (size()+1 > __bc * max_load_factor() || __bc == 0)
- {
- rehash(_VSTD::max<size_type>(2 * __bc + !__is_hash_power2(__bc),
- size_type(ceil(float(size() + 1) / max_load_factor()))));
- __bc = bucket_count();
- }
- size_t __chash = __constrain_hash(__cp_hash, __bc);
- __next_pointer __pn = __bucket_list_[__chash];
- if (__pn != nullptr)
- {
- for (bool __found = false; __pn->__next_ != nullptr &&
- __constrain_hash(__pn->__next_->__hash(), __bc) == __chash;
- __pn = __pn->__next_)
- {
- // __found key_eq() action
- // false false loop
- // true true loop
- // false true set __found to true
- // true false break
- if (__found != (__pn->__next_->__hash() == __cp_hash &&
- key_eq()(__pn->__next_->__upcast()->__value_, __cp_val)))
- {
- if (!__found)
- __found = true;
- else
- break;
- }
- }
- }
- return __pn;
-}
-
-// Insert the node __cp into the container after __pn (which is the last node in
-// the bucket that compares equal to __cp). Rehashing, and checking for
-// uniqueness has already been performed (in __node_insert_multi_prepare), so
-// all we need to do is update the bucket and size(). Assumes that __cp->__hash
-// is up-to-date.
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi_perform(
- __node_pointer __cp, __next_pointer __pn) _NOEXCEPT
-{
- size_type __bc = bucket_count();
- size_t __chash = __constrain_hash(__cp->__hash_, __bc);
- if (__pn == nullptr)
- {
- __pn =__p1_.first().__ptr();
- __cp->__next_ = __pn->__next_;
- __pn->__next_ = __cp->__ptr();
- // fix up __bucket_list_
- __bucket_list_[__chash] = __pn;
- if (__cp->__next_ != nullptr)
- __bucket_list_[__constrain_hash(__cp->__next_->__hash(), __bc)]
- = __cp->__ptr();
- }
- else
- {
- __cp->__next_ = __pn->__next_;
- __pn->__next_ = __cp->__ptr();
- if (__cp->__next_ != nullptr)
- {
- size_t __nhash = __constrain_hash(__cp->__next_->__hash(), __bc);
- if (__nhash != __chash)
- __bucket_list_[__nhash] = __cp->__ptr();
- }
- }
- ++size();
-}
-
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi(__node_pointer __cp)
-{
- __cp->__hash_ = hash_function()(__cp->__value_);
- __next_pointer __pn = __node_insert_multi_prepare(__cp->__hash(), __cp->__value_);
- __node_insert_multi_perform(__cp, __pn);
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return iterator(__cp->__ptr(), this);
-#else
- return iterator(__cp->__ptr());
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi(
- const_iterator __p, __node_pointer __cp)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "unordered container::emplace_hint(const_iterator, args...) called with an iterator not"
- " referring to this unordered container");
-#endif
- if (__p != end() && key_eq()(*__p, __cp->__value_))
- {
- __next_pointer __np = __p.__node_;
- __cp->__hash_ = __np->__hash();
- size_type __bc = bucket_count();
- if (size()+1 > __bc * max_load_factor() || __bc == 0)
- {
- rehash(_VSTD::max<size_type>(2 * __bc + !__is_hash_power2(__bc),
- size_type(ceil(float(size() + 1) / max_load_factor()))));
- __bc = bucket_count();
- }
- size_t __chash = __constrain_hash(__cp->__hash_, __bc);
- __next_pointer __pp = __bucket_list_[__chash];
- while (__pp->__next_ != __np)
- __pp = __pp->__next_;
- __cp->__next_ = __np;
- __pp->__next_ = static_cast<__next_pointer>(__cp);
- ++size();
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return iterator(static_cast<__next_pointer>(__cp), this);
-#else
- return iterator(static_cast<__next_pointer>(__cp));
-#endif
- }
- return __node_insert_multi(__cp);
-}
-
-
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Key, class ..._Args>
-pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, bool>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_unique_key_args(_Key const& __k, _Args&&... __args)
-#else
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Key, class _Args>
-pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, bool>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_unique_key_args(_Key const& __k, _Args& __args)
-#endif
-{
-
- size_t __hash = hash_function()(__k);
- size_type __bc = bucket_count();
- bool __inserted = false;
- __next_pointer __nd;
- size_t __chash;
- if (__bc != 0)
- {
- __chash = __constrain_hash(__hash, __bc);
- __nd = __bucket_list_[__chash];
- if (__nd != nullptr)
- {
- for (__nd = __nd->__next_; __nd != nullptr &&
- (__nd->__hash() == __hash || __constrain_hash(__nd->__hash(), __bc) == __chash);
- __nd = __nd->__next_)
- {
- if (key_eq()(__nd->__upcast()->__value_, __k))
- goto __done;
- }
- }
- }
- {
-#ifndef _LIBCPP_CXX03_LANG
- __node_holder __h = __construct_node_hash(__hash, _VSTD::forward<_Args>(__args)...);
-#else
- __node_holder __h = __construct_node_hash(__hash, __args);
-#endif
- if (size()+1 > __bc * max_load_factor() || __bc == 0)
- {
- rehash(_VSTD::max<size_type>(2 * __bc + !__is_hash_power2(__bc),
- size_type(ceil(float(size() + 1) / max_load_factor()))));
- __bc = bucket_count();
- __chash = __constrain_hash(__hash, __bc);
- }
- // insert_after __bucket_list_[__chash], or __first_node if bucket is null
- __next_pointer __pn = __bucket_list_[__chash];
- if (__pn == nullptr)
- {
- __pn = __p1_.first().__ptr();
- __h->__next_ = __pn->__next_;
- __pn->__next_ = __h.get()->__ptr();
- // fix up __bucket_list_
- __bucket_list_[__chash] = __pn;
- if (__h->__next_ != nullptr)
- __bucket_list_[__constrain_hash(__h->__next_->__hash(), __bc)]
- = __h.get()->__ptr();
- }
- else
- {
- __h->__next_ = __pn->__next_;
- __pn->__next_ = static_cast<__next_pointer>(__h.get());
- }
- __nd = static_cast<__next_pointer>(__h.release());
- // increment size
- ++size();
- __inserted = true;
- }
-__done:
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return pair<iterator, bool>(iterator(__nd, this), __inserted);
-#else
- return pair<iterator, bool>(iterator(__nd), __inserted);
-#endif
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class... _Args>
-pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, bool>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_unique_impl(_Args&&... __args)
-{
- __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
- pair<iterator, bool> __r = __node_insert_unique(__h.get());
- if (__r.second)
- __h.release();
- return __r;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class... _Args>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_multi(_Args&&... __args)
-{
- __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
- iterator __r = __node_insert_multi(__h.get());
- __h.release();
- return __r;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class... _Args>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_hint_multi(
- const_iterator __p, _Args&&... __args)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "unordered container::emplace_hint(const_iterator, args...) called with an iterator not"
- " referring to this unordered container");
-#endif
- __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
- iterator __r = __node_insert_multi(__p, __h.get());
- __h.release();
- return __r;
-}
-
-#else // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__insert_multi(const __container_value_type& __x)
-{
- __node_holder __h = __construct_node(__x);
- iterator __r = __node_insert_multi(__h.get());
- __h.release();
- return __r;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__insert_multi(const_iterator __p,
- const __container_value_type& __x)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "unordered container::insert(const_iterator, lvalue) called with an iterator not"
- " referring to this unordered container");
-#endif
- __node_holder __h = __construct_node(__x);
- iterator __r = __node_insert_multi(__p, __h.get());
- __h.release();
- return __r;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-#if _LIBCPP_STD_VER > 14
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _NodeHandle, class _InsertReturnType>
-_LIBCPP_INLINE_VISIBILITY
-_InsertReturnType
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_insert_unique(
- _NodeHandle&& __nh)
-{
- if (__nh.empty())
- return _InsertReturnType{end(), false, _NodeHandle()};
- pair<iterator, bool> __result = __node_insert_unique(__nh.__ptr_);
- if (__result.second)
- __nh.__release();
- return _InsertReturnType{__result.first, __result.second, _VSTD::move(__nh)};
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _NodeHandle>
-_LIBCPP_INLINE_VISIBILITY
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_insert_unique(
- const_iterator, _NodeHandle&& __nh)
-{
- if (__nh.empty())
- return end();
- pair<iterator, bool> __result = __node_insert_unique(__nh.__ptr_);
- if (__result.second)
- __nh.__release();
- return __result.first;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _NodeHandle>
-_LIBCPP_INLINE_VISIBILITY
-_NodeHandle
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_extract(
- key_type const& __key)
-{
- iterator __i = find(__key);
- if (__i == end())
- return _NodeHandle();
- return __node_handle_extract<_NodeHandle>(__i);
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _NodeHandle>
-_LIBCPP_INLINE_VISIBILITY
-_NodeHandle
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_extract(
- const_iterator __p)
-{
- allocator_type __alloc(__node_alloc());
- return _NodeHandle(remove(__p).release(), __alloc);
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Table>
-_LIBCPP_INLINE_VISIBILITY
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_merge_unique(
- _Table& __source)
-{
- static_assert(is_same<__node, typename _Table::__node>::value, "");
-
- for (typename _Table::iterator __it = __source.begin();
- __it != __source.end();)
- {
- __node_pointer __src_ptr = __it.__node_->__upcast();
- size_t __hash = hash_function()(__src_ptr->__value_);
- __next_pointer __existing_node =
- __node_insert_unique_prepare(__hash, __src_ptr->__value_);
- auto __prev_iter = __it++;
- if (__existing_node == nullptr)
- {
- (void)__source.remove(__prev_iter).release();
- __src_ptr->__hash_ = __hash;
- __node_insert_unique_perform(__src_ptr);
- }
- }
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _NodeHandle>
-_LIBCPP_INLINE_VISIBILITY
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_insert_multi(
- _NodeHandle&& __nh)
-{
- if (__nh.empty())
- return end();
- iterator __result = __node_insert_multi(__nh.__ptr_);
- __nh.__release();
- return __result;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _NodeHandle>
-_LIBCPP_INLINE_VISIBILITY
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_insert_multi(
- const_iterator __hint, _NodeHandle&& __nh)
-{
- if (__nh.empty())
- return end();
- iterator __result = __node_insert_multi(__hint, __nh.__ptr_);
- __nh.__release();
- return __result;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Table>
-_LIBCPP_INLINE_VISIBILITY
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_merge_multi(
- _Table& __source)
-{
- static_assert(is_same<typename _Table::__node, __node>::value, "");
-
- for (typename _Table::iterator __it = __source.begin();
- __it != __source.end();)
- {
- __node_pointer __src_ptr = __it.__node_->__upcast();
- size_t __src_hash = hash_function()(__src_ptr->__value_);
- __next_pointer __pn =
- __node_insert_multi_prepare(__src_hash, __src_ptr->__value_);
- (void)__source.remove(__it++).release();
- __src_ptr->__hash_ = __src_hash;
- __node_insert_multi_perform(__src_ptr, __pn);
- }
-}
-#endif // _LIBCPP_STD_VER > 14
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::rehash(size_type __n)
-{
- if (__n == 1)
- __n = 2;
- else if (__n & (__n - 1))
- __n = __next_prime(__n);
- size_type __bc = bucket_count();
- if (__n > __bc)
- __rehash(__n);
- else if (__n < __bc)
- {
- __n = _VSTD::max<size_type>
- (
- __n,
- __is_hash_power2(__bc) ? __next_hash_pow2(size_t(ceil(float(size()) / max_load_factor()))) :
- __next_prime(size_t(ceil(float(size()) / max_load_factor())))
- );
- if (__n < __bc)
- __rehash(__n);
- }
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__rehash(size_type __nbc)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__invalidate_all(this);
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
- __pointer_allocator& __npa = __bucket_list_.get_deleter().__alloc();
- __bucket_list_.reset(__nbc > 0 ?
- __pointer_alloc_traits::allocate(__npa, __nbc) : nullptr);
- __bucket_list_.get_deleter().size() = __nbc;
- if (__nbc > 0)
- {
- for (size_type __i = 0; __i < __nbc; ++__i)
- __bucket_list_[__i] = nullptr;
- __next_pointer __pp = __p1_.first().__ptr();
- __next_pointer __cp = __pp->__next_;
- if (__cp != nullptr)
- {
- size_type __chash = __constrain_hash(__cp->__hash(), __nbc);
- __bucket_list_[__chash] = __pp;
- size_type __phash = __chash;
- for (__pp = __cp, __cp = __cp->__next_; __cp != nullptr;
- __cp = __pp->__next_)
- {
- __chash = __constrain_hash(__cp->__hash(), __nbc);
- if (__chash == __phash)
- __pp = __cp;
- else
- {
- if (__bucket_list_[__chash] == nullptr)
- {
- __bucket_list_[__chash] = __pp;
- __pp = __cp;
- __phash = __chash;
- }
- else
- {
- __next_pointer __np = __cp;
- for (; __np->__next_ != nullptr &&
- key_eq()(__cp->__upcast()->__value_,
- __np->__next_->__upcast()->__value_);
- __np = __np->__next_)
- ;
- __pp->__next_ = __np->__next_;
- __np->__next_ = __bucket_list_[__chash]->__next_;
- __bucket_list_[__chash]->__next_ = __cp;
-
- }
- }
- }
- }
- }
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Key>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::find(const _Key& __k)
-{
- size_t __hash = hash_function()(__k);
- size_type __bc = bucket_count();
- if (__bc != 0)
- {
- size_t __chash = __constrain_hash(__hash, __bc);
- __next_pointer __nd = __bucket_list_[__chash];
- if (__nd != nullptr)
- {
- for (__nd = __nd->__next_; __nd != nullptr &&
- (__nd->__hash() == __hash
- || __constrain_hash(__nd->__hash(), __bc) == __chash);
- __nd = __nd->__next_)
- {
- if ((__nd->__hash() == __hash)
- && key_eq()(__nd->__upcast()->__value_, __k))
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return iterator(__nd, this);
-#else
- return iterator(__nd);
-#endif
- }
- }
- }
- return end();
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Key>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::find(const _Key& __k) const
-{
- size_t __hash = hash_function()(__k);
- size_type __bc = bucket_count();
- if (__bc != 0)
- {
- size_t __chash = __constrain_hash(__hash, __bc);
- __next_pointer __nd = __bucket_list_[__chash];
- if (__nd != nullptr)
- {
- for (__nd = __nd->__next_; __nd != nullptr &&
- (__hash == __nd->__hash()
- || __constrain_hash(__nd->__hash(), __bc) == __chash);
- __nd = __nd->__next_)
- {
- if ((__nd->__hash() == __hash)
- && key_eq()(__nd->__upcast()->__value_, __k))
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return const_iterator(__nd, this);
-#else
- return const_iterator(__nd);
-#endif
- }
- }
-
- }
- return end();
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class ..._Args>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node(_Args&& ...__args)
-{
- static_assert(!__is_hash_value_type<_Args...>::value,
- "Construct cannot be called with a hash value type");
- __node_allocator& __na = __node_alloc();
- __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _NodeTypes::__get_ptr(__h->__value_), _VSTD::forward<_Args>(__args)...);
- __h.get_deleter().__value_constructed = true;
- __h->__hash_ = hash_function()(__h->__value_);
- __h->__next_ = nullptr;
- return __h;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _First, class ..._Rest>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node_hash(
- size_t __hash, _First&& __f, _Rest&& ...__rest)
-{
- static_assert(!__is_hash_value_type<_First, _Rest...>::value,
- "Construct cannot be called with a hash value type");
- __node_allocator& __na = __node_alloc();
- __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _NodeTypes::__get_ptr(__h->__value_),
- _VSTD::forward<_First>(__f),
- _VSTD::forward<_Rest>(__rest)...);
- __h.get_deleter().__value_constructed = true;
- __h->__hash_ = __hash;
- __h->__next_ = nullptr;
- return __h;
-}
-
-#else // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node(const __container_value_type& __v)
-{
- __node_allocator& __na = __node_alloc();
- __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _NodeTypes::__get_ptr(__h->__value_), __v);
- __h.get_deleter().__value_constructed = true;
- __h->__hash_ = hash_function()(__h->__value_);
- __h->__next_ = nullptr;
- return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node_hash(size_t __hash,
- const __container_value_type& __v)
-{
- __node_allocator& __na = __node_alloc();
- __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _NodeTypes::__get_ptr(__h->__value_), __v);
- __h.get_deleter().__value_constructed = true;
- __h->__hash_ = __hash;
- __h->__next_ = nullptr;
- return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::erase(const_iterator __p)
-{
- __next_pointer __np = __p.__node_;
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "unordered container erase(iterator) called with an iterator not"
- " referring to this container");
- _LIBCPP_ASSERT(__p != end(),
- "unordered container erase(iterator) called with a non-dereferenceable iterator");
- iterator __r(__np, this);
-#else
- iterator __r(__np);
-#endif
- ++__r;
- remove(__p);
- return __r;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::erase(const_iterator __first,
- const_iterator __last)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
- "unodered container::erase(iterator, iterator) called with an iterator not"
- " referring to this unodered container");
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__last) == this,
- "unodered container::erase(iterator, iterator) called with an iterator not"
- " referring to this unodered container");
-#endif
- for (const_iterator __p = __first; __first != __last; __p = __first)
- {
- ++__first;
- erase(__p);
- }
- __next_pointer __np = __last.__node_;
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return iterator (__np, this);
-#else
- return iterator (__np);
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Key>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__erase_unique(const _Key& __k)
-{
- iterator __i = find(__k);
- if (__i == end())
- return 0;
- erase(__i);
- return 1;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Key>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__erase_multi(const _Key& __k)
-{
- size_type __r = 0;
- iterator __i = find(__k);
- if (__i != end())
- {
- iterator __e = end();
- do
- {
- erase(__i++);
- ++__r;
- } while (__i != __e && key_eq()(*__i, __k));
- }
- return __r;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::remove(const_iterator __p) _NOEXCEPT
-{
- // current node
- __next_pointer __cn = __p.__node_;
- size_type __bc = bucket_count();
- size_t __chash = __constrain_hash(__cn->__hash(), __bc);
- // find previous node
- __next_pointer __pn = __bucket_list_[__chash];
- for (; __pn->__next_ != __cn; __pn = __pn->__next_)
- ;
- // Fix up __bucket_list_
- // if __pn is not in same bucket (before begin is not in same bucket) &&
- // if __cn->__next_ is not in same bucket (nullptr is not in same bucket)
- if (__pn == __p1_.first().__ptr()
- || __constrain_hash(__pn->__hash(), __bc) != __chash)
- {
- if (__cn->__next_ == nullptr
- || __constrain_hash(__cn->__next_->__hash(), __bc) != __chash)
- __bucket_list_[__chash] = nullptr;
- }
- // if __cn->__next_ is not in same bucket (nullptr is in same bucket)
- if (__cn->__next_ != nullptr)
- {
- size_t __nhash = __constrain_hash(__cn->__next_->__hash(), __bc);
- if (__nhash != __chash)
- __bucket_list_[__nhash] = __pn;
- }
- // remove __cn
- __pn->__next_ = __cn->__next_;
- __cn->__next_ = nullptr;
- --size();
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __c_node* __c = __get_db()->__find_c_and_lock(this);
- for (__i_node** __dp = __c->end_; __dp != __c->beg_; )
- {
- --__dp;
- iterator* __i = static_cast<iterator*>((*__dp)->__i_);
- if (__i->__node_ == __cn)
- {
- (*__dp)->__c_ = nullptr;
- if (--__c->end_ != __dp)
- memmove(__dp, __dp+1, (__c->end_ - __dp)*sizeof(__i_node*));
- }
- }
- __get_db()->unlock();
-#endif
- return __node_holder(__cn->__upcast(), _Dp(__node_alloc(), true));
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Key>
-inline
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__count_unique(const _Key& __k) const
-{
- return static_cast<size_type>(find(__k) != end());
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Key>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__count_multi(const _Key& __k) const
-{
- size_type __r = 0;
- const_iterator __i = find(__k);
- if (__i != end())
- {
- const_iterator __e = end();
- do
- {
- ++__i;
- ++__r;
- } while (__i != __e && key_eq()(*__i, __k));
- }
- return __r;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Key>
-pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator,
- typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__equal_range_unique(
- const _Key& __k)
-{
- iterator __i = find(__k);
- iterator __j = __i;
- if (__i != end())
- ++__j;
- return pair<iterator, iterator>(__i, __j);
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Key>
-pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator,
- typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__equal_range_unique(
- const _Key& __k) const
-{
- const_iterator __i = find(__k);
- const_iterator __j = __i;
- if (__i != end())
- ++__j;
- return pair<const_iterator, const_iterator>(__i, __j);
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Key>
-pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator,
- typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__equal_range_multi(
- const _Key& __k)
-{
- iterator __i = find(__k);
- iterator __j = __i;
- if (__i != end())
- {
- iterator __e = end();
- do
- {
- ++__j;
- } while (__j != __e && key_eq()(*__j, __k));
- }
- return pair<iterator, iterator>(__i, __j);
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Key>
-pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator,
- typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__equal_range_multi(
- const _Key& __k) const
-{
- const_iterator __i = find(__k);
- const_iterator __j = __i;
- if (__i != end())
- {
- const_iterator __e = end();
- do
- {
- ++__j;
- } while (__j != __e && key_eq()(*__j, __k));
- }
- return pair<const_iterator, const_iterator>(__i, __j);
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::swap(__hash_table& __u)
-#if _LIBCPP_STD_VER <= 11
- _NOEXCEPT_DEBUG_(
- __is_nothrow_swappable<hasher>::value && __is_nothrow_swappable<key_equal>::value
- && (!allocator_traits<__pointer_allocator>::propagate_on_container_swap::value
- || __is_nothrow_swappable<__pointer_allocator>::value)
- && (!__node_traits::propagate_on_container_swap::value
- || __is_nothrow_swappable<__node_allocator>::value)
- )
-#else
- _NOEXCEPT_DEBUG_(__is_nothrow_swappable<hasher>::value && __is_nothrow_swappable<key_equal>::value)
-#endif
-{
- _LIBCPP_ASSERT(__node_traits::propagate_on_container_swap::value ||
- this->__node_alloc() == __u.__node_alloc(),
- "list::swap: Either propagate_on_container_swap must be true"
- " or the allocators must compare equal");
- {
- __node_pointer_pointer __npp = __bucket_list_.release();
- __bucket_list_.reset(__u.__bucket_list_.release());
- __u.__bucket_list_.reset(__npp);
- }
- _VSTD::swap(__bucket_list_.get_deleter().size(), __u.__bucket_list_.get_deleter().size());
- __swap_allocator(__bucket_list_.get_deleter().__alloc(),
- __u.__bucket_list_.get_deleter().__alloc());
- __swap_allocator(__node_alloc(), __u.__node_alloc());
- _VSTD::swap(__p1_.first().__next_, __u.__p1_.first().__next_);
- __p2_.swap(__u.__p2_);
- __p3_.swap(__u.__p3_);
- if (size() > 0)
- __bucket_list_[__constrain_hash(__p1_.first().__next_->__hash(), bucket_count())] =
- __p1_.first().__ptr();
- if (__u.size() > 0)
- __u.__bucket_list_[__constrain_hash(__u.__p1_.first().__next_->__hash(), __u.bucket_count())] =
- __u.__p1_.first().__ptr();
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->swap(this, &__u);
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::bucket_size(size_type __n) const
-{
- _LIBCPP_ASSERT(__n < bucket_count(),
- "unordered container::bucket_size(n) called with n >= bucket_count()");
- __next_pointer __np = __bucket_list_[__n];
- size_type __bc = bucket_count();
- size_type __r = 0;
- if (__np != nullptr)
- {
- for (__np = __np->__next_; __np != nullptr &&
- __constrain_hash(__np->__hash(), __bc) == __n;
- __np = __np->__next_, ++__r)
- ;
- }
- return __r;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(__hash_table<_Tp, _Hash, _Equal, _Alloc>& __x,
- __hash_table<_Tp, _Hash, _Equal, _Alloc>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-bool
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__dereferenceable(const const_iterator* __i) const
-{
- return __i->__node_ != nullptr;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-bool
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__decrementable(const const_iterator*) const
-{
- return false;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-bool
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__addable(const const_iterator*, ptrdiff_t) const
-{
- return false;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-bool
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__subscriptable(const const_iterator*, ptrdiff_t) const
-{
- return false;
-}
-
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP__HASH_TABLE
diff --git a/lib/libcxx/include/__libcpp_version b/lib/libcxx/include/__libcpp_version
deleted file mode 100644
index e002b3628b3..00000000000
--- a/lib/libcxx/include/__libcpp_version
+++ /dev/null
@@ -1 +0,0 @@
-8000
diff --git a/lib/libcxx/include/__locale b/lib/libcxx/include/__locale
deleted file mode 100644
index af5e5d02e83..00000000000
--- a/lib/libcxx/include/__locale
+++ /dev/null
@@ -1,1523 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP___LOCALE
-#define _LIBCPP___LOCALE
-
-#include <__config>
-#include <string>
-#include <memory>
-#include <utility>
-#include <mutex>
-#include <cstdint>
-#include <cctype>
-#include <locale.h>
-#if defined(_LIBCPP_MSVCRT_LIKE)
-# include <support/win32/locale_win32.h>
-#elif defined(_AIX)
-# include <support/ibm/xlocale.h>
-#elif defined(__ANDROID__)
-# include <support/android/locale_bionic.h>
-#elif defined(__sun__)
-# include <xlocale.h>
-# include <support/solaris/xlocale.h>
-#elif defined(_NEWLIB_VERSION) || defined(__OpenBSD__)
-# include <support/newlib/xlocale.h>
-#elif (defined(__APPLE__) || defined(__FreeBSD__) \
- || defined(__EMSCRIPTEN__) || defined(__IBMCPP__))
-# include <xlocale.h>
-#elif defined(__Fuchsia__)
-# include <support/fuchsia/xlocale.h>
-#elif defined(_LIBCPP_HAS_MUSL_LIBC)
-# include <support/musl/xlocale.h>
-#endif
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-#if !defined(_LIBCPP_LOCALE__L_EXTENSIONS)
-struct __libcpp_locale_guard {
- _LIBCPP_INLINE_VISIBILITY
- __libcpp_locale_guard(locale_t& __loc) : __old_loc_(uselocale(__loc)) {}
-
- _LIBCPP_INLINE_VISIBILITY
- ~__libcpp_locale_guard() {
- if (__old_loc_)
- uselocale(__old_loc_);
- }
-
- locale_t __old_loc_;
-private:
- __libcpp_locale_guard(__libcpp_locale_guard const&);
- __libcpp_locale_guard& operator=(__libcpp_locale_guard const&);
-};
-#elif defined(_LIBCPP_MSVCRT_LIKE)
-struct __libcpp_locale_guard {
- __libcpp_locale_guard(locale_t __l) :
- __status(_configthreadlocale(_ENABLE_PER_THREAD_LOCALE)),
- __locale_collate(setlocale(LC_COLLATE, __l.__get_locale())),
- __locale_ctype(setlocale(LC_CTYPE, __l.__get_locale())),
- __locale_monetary(setlocale(LC_MONETARY, __l.__get_locale())),
- __locale_numeric(setlocale(LC_NUMERIC, __l.__get_locale())),
- __locale_time(setlocale(LC_TIME, __l.__get_locale()))
- // LC_MESSAGES is not supported on Windows.
- {}
- ~__libcpp_locale_guard() {
- setlocale(LC_COLLATE, __locale_collate);
- setlocale(LC_CTYPE, __locale_ctype);
- setlocale(LC_MONETARY, __locale_monetary);
- setlocale(LC_NUMERIC, __locale_numeric);
- setlocale(LC_TIME, __locale_time);
- _configthreadlocale(__status);
- }
- int __status;
- char* __locale_collate;
- char* __locale_ctype;
- char* __locale_monetary;
- char* __locale_numeric;
- char* __locale_time;
-};
-#endif
-
-
-class _LIBCPP_TYPE_VIS locale;
-
-template <class _Facet>
-_LIBCPP_INLINE_VISIBILITY
-bool
-has_facet(const locale&) _NOEXCEPT;
-
-template <class _Facet>
-_LIBCPP_INLINE_VISIBILITY
-const _Facet&
-use_facet(const locale&);
-
-class _LIBCPP_TYPE_VIS locale
-{
-public:
- // types:
- class _LIBCPP_TYPE_VIS facet;
- class _LIBCPP_TYPE_VIS id;
-
- typedef int category;
- _LIBCPP_AVAILABILITY_LOCALE_CATEGORY
- static const category // values assigned here are for exposition only
- none = 0,
- collate = LC_COLLATE_MASK,
- ctype = LC_CTYPE_MASK,
- monetary = LC_MONETARY_MASK,
- numeric = LC_NUMERIC_MASK,
- time = LC_TIME_MASK,
- messages = LC_MESSAGES_MASK,
- all = collate | ctype | monetary | numeric | time | messages;
-
- // construct/copy/destroy:
- locale() _NOEXCEPT;
- locale(const locale&) _NOEXCEPT;
- explicit locale(const char*);
- explicit locale(const string&);
- locale(const locale&, const char*, category);
- locale(const locale&, const string&, category);
- template <class _Facet>
- _LIBCPP_INLINE_VISIBILITY locale(const locale&, _Facet*);
- locale(const locale&, const locale&, category);
-
- ~locale();
-
- const locale& operator=(const locale&) _NOEXCEPT;
-
- template <class _Facet>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- locale combine(const locale&) const;
-
- // locale operations:
- string name() const;
- bool operator==(const locale&) const;
- bool operator!=(const locale& __y) const {return !(*this == __y);}
- template <class _CharT, class _Traits, class _Allocator>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- bool operator()(const basic_string<_CharT, _Traits, _Allocator>&,
- const basic_string<_CharT, _Traits, _Allocator>&) const;
-
- // global locale objects:
- static locale global(const locale&);
- static const locale& classic();
-
-private:
- class __imp;
- __imp* __locale_;
-
- void __install_ctor(const locale&, facet*, long);
- static locale& __global();
- bool has_facet(id&) const;
- const facet* use_facet(id&) const;
-
- template <class _Facet> friend bool has_facet(const locale&) _NOEXCEPT;
- template <class _Facet> friend const _Facet& use_facet(const locale&);
-};
-
-class _LIBCPP_TYPE_VIS locale::facet
- : public __shared_count
-{
-protected:
- _LIBCPP_INLINE_VISIBILITY
- explicit facet(size_t __refs = 0)
- : __shared_count(static_cast<long>(__refs)-1) {}
-
- virtual ~facet();
-
-// facet(const facet&) = delete; // effectively done in __shared_count
-// void operator=(const facet&) = delete;
-private:
- virtual void __on_zero_shared() _NOEXCEPT;
-};
-
-class _LIBCPP_TYPE_VIS locale::id
-{
- once_flag __flag_;
- int32_t __id_;
-
- static int32_t __next_id;
-public:
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR id() :__id_(0) {}
-private:
- void __init();
- void operator=(const id&); // = delete;
- id(const id&); // = delete;
-public: // only needed for tests
- long __get();
-
- friend class locale;
- friend class locale::__imp;
-};
-
-template <class _Facet>
-inline _LIBCPP_INLINE_VISIBILITY
-locale::locale(const locale& __other, _Facet* __f)
-{
- __install_ctor(__other, __f, __f ? __f->id.__get() : 0);
-}
-
-template <class _Facet>
-locale
-locale::combine(const locale& __other) const
-{
- if (!_VSTD::has_facet<_Facet>(__other))
- __throw_runtime_error("locale::combine: locale missing facet");
-
- return locale(*this, &const_cast<_Facet&>(_VSTD::use_facet<_Facet>(__other)));
-}
-
-template <class _Facet>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-has_facet(const locale& __l) _NOEXCEPT
-{
- return __l.has_facet(_Facet::id);
-}
-
-template <class _Facet>
-inline _LIBCPP_INLINE_VISIBILITY
-const _Facet&
-use_facet(const locale& __l)
-{
- return static_cast<const _Facet&>(*__l.use_facet(_Facet::id));
-}
-
-// template <class _CharT> class collate;
-
-template <class _CharT>
-class _LIBCPP_TEMPLATE_VIS collate
- : public locale::facet
-{
-public:
- typedef _CharT char_type;
- typedef basic_string<char_type> string_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit collate(size_t __refs = 0)
- : locale::facet(__refs) {}
-
- _LIBCPP_INLINE_VISIBILITY
- int compare(const char_type* __lo1, const char_type* __hi1,
- const char_type* __lo2, const char_type* __hi2) const
- {
- return do_compare(__lo1, __hi1, __lo2, __hi2);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- string_type transform(const char_type* __lo, const char_type* __hi) const
- {
- return do_transform(__lo, __hi);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- long hash(const char_type* __lo, const char_type* __hi) const
- {
- return do_hash(__lo, __hi);
- }
-
- static locale::id id;
-
-protected:
- ~collate();
- virtual int do_compare(const char_type* __lo1, const char_type* __hi1,
- const char_type* __lo2, const char_type* __hi2) const;
- virtual string_type do_transform(const char_type* __lo, const char_type* __hi) const
- {return string_type(__lo, __hi);}
- virtual long do_hash(const char_type* __lo, const char_type* __hi) const;
-};
-
-template <class _CharT> locale::id collate<_CharT>::id;
-
-template <class _CharT>
-collate<_CharT>::~collate()
-{
-}
-
-template <class _CharT>
-int
-collate<_CharT>::do_compare(const char_type* __lo1, const char_type* __hi1,
- const char_type* __lo2, const char_type* __hi2) const
-{
- for (; __lo2 != __hi2; ++__lo1, ++__lo2)
- {
- if (__lo1 == __hi1 || *__lo1 < *__lo2)
- return -1;
- if (*__lo2 < *__lo1)
- return 1;
- }
- return __lo1 != __hi1;
-}
-
-template <class _CharT>
-long
-collate<_CharT>::do_hash(const char_type* __lo, const char_type* __hi) const
-{
- size_t __h = 0;
- const size_t __sr = __CHAR_BIT__ * sizeof(size_t) - 8;
- const size_t __mask = size_t(0xF) << (__sr + 4);
- for(const char_type* __p = __lo; __p != __hi; ++__p)
- {
- __h = (__h << 4) + static_cast<size_t>(*__p);
- size_t __g = __h & __mask;
- __h ^= __g | (__g >> __sr);
- }
- return static_cast<long>(__h);
-}
-
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS collate<char>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS collate<wchar_t>)
-
-// template <class CharT> class collate_byname;
-
-template <class _CharT> class _LIBCPP_TEMPLATE_VIS collate_byname;
-
-template <>
-class _LIBCPP_TYPE_VIS collate_byname<char>
- : public collate<char>
-{
- locale_t __l;
-public:
- typedef char char_type;
- typedef basic_string<char_type> string_type;
-
- explicit collate_byname(const char* __n, size_t __refs = 0);
- explicit collate_byname(const string& __n, size_t __refs = 0);
-
-protected:
- ~collate_byname();
- virtual int do_compare(const char_type* __lo1, const char_type* __hi1,
- const char_type* __lo2, const char_type* __hi2) const;
- virtual string_type do_transform(const char_type* __lo, const char_type* __hi) const;
-};
-
-template <>
-class _LIBCPP_TYPE_VIS collate_byname<wchar_t>
- : public collate<wchar_t>
-{
- locale_t __l;
-public:
- typedef wchar_t char_type;
- typedef basic_string<char_type> string_type;
-
- explicit collate_byname(const char* __n, size_t __refs = 0);
- explicit collate_byname(const string& __n, size_t __refs = 0);
-
-protected:
- ~collate_byname();
-
- virtual int do_compare(const char_type* __lo1, const char_type* __hi1,
- const char_type* __lo2, const char_type* __hi2) const;
- virtual string_type do_transform(const char_type* __lo, const char_type* __hi) const;
-};
-
-template <class _CharT, class _Traits, class _Allocator>
-bool
-locale::operator()(const basic_string<_CharT, _Traits, _Allocator>& __x,
- const basic_string<_CharT, _Traits, _Allocator>& __y) const
-{
- return _VSTD::use_facet<_VSTD::collate<_CharT> >(*this).compare(
- __x.data(), __x.data() + __x.size(),
- __y.data(), __y.data() + __y.size()) < 0;
-}
-
-// template <class charT> class ctype
-
-class _LIBCPP_TYPE_VIS ctype_base
-{
-public:
-#if defined(__GLIBC__)
- typedef unsigned short mask;
- static const mask space = _ISspace;
- static const mask print = _ISprint;
- static const mask cntrl = _IScntrl;
- static const mask upper = _ISupper;
- static const mask lower = _ISlower;
- static const mask alpha = _ISalpha;
- static const mask digit = _ISdigit;
- static const mask punct = _ISpunct;
- static const mask xdigit = _ISxdigit;
- static const mask blank = _ISblank;
-#elif defined(_LIBCPP_MSVCRT_LIKE)
- typedef unsigned short mask;
- static const mask space = _SPACE;
- static const mask print = _BLANK|_PUNCT|_ALPHA|_DIGIT;
- static const mask cntrl = _CONTROL;
- static const mask upper = _UPPER;
- static const mask lower = _LOWER;
- static const mask alpha = _ALPHA;
- static const mask digit = _DIGIT;
- static const mask punct = _PUNCT;
- static const mask xdigit = _HEX;
- static const mask blank = _BLANK;
-# define _LIBCPP_CTYPE_MASK_IS_COMPOSITE_PRINT
-#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__EMSCRIPTEN__) || defined(__NetBSD__)
-# ifdef __APPLE__
- typedef __uint32_t mask;
-# elif defined(__FreeBSD__)
- typedef unsigned long mask;
-# elif defined(__EMSCRIPTEN__) || defined(__NetBSD__)
- typedef unsigned short mask;
-# endif
- static const mask space = _CTYPE_S;
- static const mask print = _CTYPE_R;
- static const mask cntrl = _CTYPE_C;
- static const mask upper = _CTYPE_U;
- static const mask lower = _CTYPE_L;
- static const mask alpha = _CTYPE_A;
- static const mask digit = _CTYPE_D;
- static const mask punct = _CTYPE_P;
- static const mask xdigit = _CTYPE_X;
-
-# if defined(__NetBSD__)
- static const mask blank = _CTYPE_BL;
-# else
- static const mask blank = _CTYPE_B;
-# endif
-#elif defined(__sun__) || defined(_AIX)
- typedef unsigned int mask;
- static const mask space = _ISSPACE;
- static const mask print = _ISPRINT;
- static const mask cntrl = _ISCNTRL;
- static const mask upper = _ISUPPER;
- static const mask lower = _ISLOWER;
- static const mask alpha = _ISALPHA;
- static const mask digit = _ISDIGIT;
- static const mask punct = _ISPUNCT;
- static const mask xdigit = _ISXDIGIT;
- static const mask blank = _ISBLANK;
-#elif defined(_NEWLIB_VERSION)
- // Same type as Newlib's _ctype_ array in newlib/libc/include/ctype.h.
- typedef char mask;
- static const mask space = _S;
- static const mask print = _P | _U | _L | _N | _B;
- static const mask cntrl = _C;
- static const mask upper = _U;
- static const mask lower = _L;
- static const mask alpha = _U | _L;
- static const mask digit = _N;
- static const mask punct = _P;
- static const mask xdigit = _X | _N;
- static const mask blank = _B;
-# define _LIBCPP_CTYPE_MASK_IS_COMPOSITE_PRINT
-# define _LIBCPP_CTYPE_MASK_IS_COMPOSITE_ALPHA
-# define _LIBCPP_CTYPE_MASK_IS_COMPOSITE_XDIGIT
-#else
- typedef unsigned long mask;
- static const mask space = 1<<0;
- static const mask print = 1<<1;
- static const mask cntrl = 1<<2;
- static const mask upper = 1<<3;
- static const mask lower = 1<<4;
- static const mask alpha = 1<<5;
- static const mask digit = 1<<6;
- static const mask punct = 1<<7;
- static const mask xdigit = 1<<8;
- static const mask blank = 1<<9;
-#endif
- static const mask alnum = alpha | digit;
- static const mask graph = alnum | punct;
-
- _LIBCPP_INLINE_VISIBILITY ctype_base() {}
-};
-
-template <class _CharT> class _LIBCPP_TEMPLATE_VIS ctype;
-
-template <>
-class _LIBCPP_TYPE_VIS ctype<wchar_t>
- : public locale::facet,
- public ctype_base
-{
-public:
- typedef wchar_t char_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit ctype(size_t __refs = 0)
- : locale::facet(__refs) {}
-
- _LIBCPP_INLINE_VISIBILITY
- bool is(mask __m, char_type __c) const
- {
- return do_is(__m, __c);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const char_type* is(const char_type* __low, const char_type* __high, mask* __vec) const
- {
- return do_is(__low, __high, __vec);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const char_type* scan_is(mask __m, const char_type* __low, const char_type* __high) const
- {
- return do_scan_is(__m, __low, __high);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const char_type* scan_not(mask __m, const char_type* __low, const char_type* __high) const
- {
- return do_scan_not(__m, __low, __high);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- char_type toupper(char_type __c) const
- {
- return do_toupper(__c);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const char_type* toupper(char_type* __low, const char_type* __high) const
- {
- return do_toupper(__low, __high);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- char_type tolower(char_type __c) const
- {
- return do_tolower(__c);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const char_type* tolower(char_type* __low, const char_type* __high) const
- {
- return do_tolower(__low, __high);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- char_type widen(char __c) const
- {
- return do_widen(__c);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const char* widen(const char* __low, const char* __high, char_type* __to) const
- {
- return do_widen(__low, __high, __to);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- char narrow(char_type __c, char __dfault) const
- {
- return do_narrow(__c, __dfault);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const char_type* narrow(const char_type* __low, const char_type* __high, char __dfault, char* __to) const
- {
- return do_narrow(__low, __high, __dfault, __to);
- }
-
- static locale::id id;
-
-protected:
- ~ctype();
- virtual bool do_is(mask __m, char_type __c) const;
- virtual const char_type* do_is(const char_type* __low, const char_type* __high, mask* __vec) const;
- virtual const char_type* do_scan_is(mask __m, const char_type* __low, const char_type* __high) const;
- virtual const char_type* do_scan_not(mask __m, const char_type* __low, const char_type* __high) const;
- virtual char_type do_toupper(char_type) const;
- virtual const char_type* do_toupper(char_type* __low, const char_type* __high) const;
- virtual char_type do_tolower(char_type) const;
- virtual const char_type* do_tolower(char_type* __low, const char_type* __high) const;
- virtual char_type do_widen(char) const;
- virtual const char* do_widen(const char* __low, const char* __high, char_type* __dest) const;
- virtual char do_narrow(char_type, char __dfault) const;
- virtual const char_type* do_narrow(const char_type* __low, const char_type* __high, char __dfault, char* __dest) const;
-};
-
-template <>
-class _LIBCPP_TYPE_VIS ctype<char>
- : public locale::facet, public ctype_base
-{
- const mask* __tab_;
- bool __del_;
-public:
- typedef char char_type;
-
- explicit ctype(const mask* __tab = 0, bool __del = false, size_t __refs = 0);
-
- _LIBCPP_INLINE_VISIBILITY
- bool is(mask __m, char_type __c) const
- {
- return isascii(__c) ? (__tab_[static_cast<int>(__c)] & __m) !=0 : false;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const char_type* is(const char_type* __low, const char_type* __high, mask* __vec) const
- {
- for (; __low != __high; ++__low, ++__vec)
- *__vec = isascii(*__low) ? __tab_[static_cast<int>(*__low)] : 0;
- return __low;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const char_type* scan_is (mask __m, const char_type* __low, const char_type* __high) const
- {
- for (; __low != __high; ++__low)
- if (isascii(*__low) && (__tab_[static_cast<int>(*__low)] & __m))
- break;
- return __low;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const char_type* scan_not(mask __m, const char_type* __low, const char_type* __high) const
- {
- for (; __low != __high; ++__low)
- if (!(isascii(*__low) && (__tab_[static_cast<int>(*__low)] & __m)))
- break;
- return __low;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- char_type toupper(char_type __c) const
- {
- return do_toupper(__c);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const char_type* toupper(char_type* __low, const char_type* __high) const
- {
- return do_toupper(__low, __high);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- char_type tolower(char_type __c) const
- {
- return do_tolower(__c);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const char_type* tolower(char_type* __low, const char_type* __high) const
- {
- return do_tolower(__low, __high);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- char_type widen(char __c) const
- {
- return do_widen(__c);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const char* widen(const char* __low, const char* __high, char_type* __to) const
- {
- return do_widen(__low, __high, __to);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- char narrow(char_type __c, char __dfault) const
- {
- return do_narrow(__c, __dfault);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const char* narrow(const char_type* __low, const char_type* __high, char __dfault, char* __to) const
- {
- return do_narrow(__low, __high, __dfault, __to);
- }
-
- static locale::id id;
-
-#ifdef _CACHED_RUNES
- static const size_t table_size = _CACHED_RUNES;
-#else
- static const size_t table_size = 256; // FIXME: Don't hardcode this.
-#endif
- _LIBCPP_INLINE_VISIBILITY const mask* table() const _NOEXCEPT {return __tab_;}
- static const mask* classic_table() _NOEXCEPT;
-#if defined(__GLIBC__) || defined(__EMSCRIPTEN__)
- static const int* __classic_upper_table() _NOEXCEPT;
- static const int* __classic_lower_table() _NOEXCEPT;
-#endif
-#if defined(__NetBSD__)
- static const short* __classic_upper_table() _NOEXCEPT;
- static const short* __classic_lower_table() _NOEXCEPT;
-#endif
-
-protected:
- ~ctype();
- virtual char_type do_toupper(char_type __c) const;
- virtual const char_type* do_toupper(char_type* __low, const char_type* __high) const;
- virtual char_type do_tolower(char_type __c) const;
- virtual const char_type* do_tolower(char_type* __low, const char_type* __high) const;
- virtual char_type do_widen(char __c) const;
- virtual const char* do_widen(const char* __low, const char* __high, char_type* __to) const;
- virtual char do_narrow(char_type __c, char __dfault) const;
- virtual const char* do_narrow(const char_type* __low, const char_type* __high, char __dfault, char* __to) const;
-};
-
-// template <class CharT> class ctype_byname;
-
-template <class _CharT> class _LIBCPP_TEMPLATE_VIS ctype_byname;
-
-template <>
-class _LIBCPP_TYPE_VIS ctype_byname<char>
- : public ctype<char>
-{
- locale_t __l;
-
-public:
- explicit ctype_byname(const char*, size_t = 0);
- explicit ctype_byname(const string&, size_t = 0);
-
-protected:
- ~ctype_byname();
- virtual char_type do_toupper(char_type) const;
- virtual const char_type* do_toupper(char_type* __low, const char_type* __high) const;
- virtual char_type do_tolower(char_type) const;
- virtual const char_type* do_tolower(char_type* __low, const char_type* __high) const;
-};
-
-template <>
-class _LIBCPP_TYPE_VIS ctype_byname<wchar_t>
- : public ctype<wchar_t>
-{
- locale_t __l;
-
-public:
- explicit ctype_byname(const char*, size_t = 0);
- explicit ctype_byname(const string&, size_t = 0);
-
-protected:
- ~ctype_byname();
- virtual bool do_is(mask __m, char_type __c) const;
- virtual const char_type* do_is(const char_type* __low, const char_type* __high, mask* __vec) const;
- virtual const char_type* do_scan_is(mask __m, const char_type* __low, const char_type* __high) const;
- virtual const char_type* do_scan_not(mask __m, const char_type* __low, const char_type* __high) const;
- virtual char_type do_toupper(char_type) const;
- virtual const char_type* do_toupper(char_type* __low, const char_type* __high) const;
- virtual char_type do_tolower(char_type) const;
- virtual const char_type* do_tolower(char_type* __low, const char_type* __high) const;
- virtual char_type do_widen(char) const;
- virtual const char* do_widen(const char* __low, const char* __high, char_type* __dest) const;
- virtual char do_narrow(char_type, char __dfault) const;
- virtual const char_type* do_narrow(const char_type* __low, const char_type* __high, char __dfault, char* __dest) const;
-};
-
-template <class _CharT>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-isspace(_CharT __c, const locale& __loc)
-{
- return use_facet<ctype<_CharT> >(__loc).is(ctype_base::space, __c);
-}
-
-template <class _CharT>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-isprint(_CharT __c, const locale& __loc)
-{
- return use_facet<ctype<_CharT> >(__loc).is(ctype_base::print, __c);
-}
-
-template <class _CharT>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-iscntrl(_CharT __c, const locale& __loc)
-{
- return use_facet<ctype<_CharT> >(__loc).is(ctype_base::cntrl, __c);
-}
-
-template <class _CharT>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-isupper(_CharT __c, const locale& __loc)
-{
- return use_facet<ctype<_CharT> >(__loc).is(ctype_base::upper, __c);
-}
-
-template <class _CharT>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-islower(_CharT __c, const locale& __loc)
-{
- return use_facet<ctype<_CharT> >(__loc).is(ctype_base::lower, __c);
-}
-
-template <class _CharT>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-isalpha(_CharT __c, const locale& __loc)
-{
- return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alpha, __c);
-}
-
-template <class _CharT>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-isdigit(_CharT __c, const locale& __loc)
-{
- return use_facet<ctype<_CharT> >(__loc).is(ctype_base::digit, __c);
-}
-
-template <class _CharT>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-ispunct(_CharT __c, const locale& __loc)
-{
- return use_facet<ctype<_CharT> >(__loc).is(ctype_base::punct, __c);
-}
-
-template <class _CharT>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-isxdigit(_CharT __c, const locale& __loc)
-{
- return use_facet<ctype<_CharT> >(__loc).is(ctype_base::xdigit, __c);
-}
-
-template <class _CharT>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-isalnum(_CharT __c, const locale& __loc)
-{
- return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alnum, __c);
-}
-
-template <class _CharT>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-isgraph(_CharT __c, const locale& __loc)
-{
- return use_facet<ctype<_CharT> >(__loc).is(ctype_base::graph, __c);
-}
-
-template <class _CharT>
-inline _LIBCPP_INLINE_VISIBILITY
-_CharT
-toupper(_CharT __c, const locale& __loc)
-{
- return use_facet<ctype<_CharT> >(__loc).toupper(__c);
-}
-
-template <class _CharT>
-inline _LIBCPP_INLINE_VISIBILITY
-_CharT
-tolower(_CharT __c, const locale& __loc)
-{
- return use_facet<ctype<_CharT> >(__loc).tolower(__c);
-}
-
-// codecvt_base
-
-class _LIBCPP_TYPE_VIS codecvt_base
-{
-public:
- _LIBCPP_INLINE_VISIBILITY codecvt_base() {}
- enum result {ok, partial, error, noconv};
-};
-
-// template <class internT, class externT, class stateT> class codecvt;
-
-template <class _InternT, class _ExternT, class _StateT> class _LIBCPP_TEMPLATE_VIS codecvt;
-
-// template <> class codecvt<char, char, mbstate_t>
-
-template <>
-class _LIBCPP_TYPE_VIS codecvt<char, char, mbstate_t>
- : public locale::facet,
- public codecvt_base
-{
-public:
- typedef char intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit codecvt(size_t __refs = 0)
- : locale::facet(__refs) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
- {
- return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- result unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
- {
- return do_unshift(__st, __to, __to_end, __to_nxt);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- result in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const
- {
- return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- int encoding() const _NOEXCEPT
- {
- return do_encoding();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool always_noconv() const _NOEXCEPT
- {
- return do_always_noconv();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const
- {
- return do_length(__st, __frm, __end, __mx);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- int max_length() const _NOEXCEPT
- {
- return do_max_length();
- }
-
- static locale::id id;
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- explicit codecvt(const char*, size_t __refs = 0)
- : locale::facet(__refs) {}
-
- ~codecvt();
-
- virtual result do_out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual result do_in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
- virtual result do_unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual int do_encoding() const _NOEXCEPT;
- virtual bool do_always_noconv() const _NOEXCEPT;
- virtual int do_length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const;
- virtual int do_max_length() const _NOEXCEPT;
-};
-
-// template <> class codecvt<wchar_t, char, mbstate_t>
-
-template <>
-class _LIBCPP_TYPE_VIS codecvt<wchar_t, char, mbstate_t>
- : public locale::facet,
- public codecvt_base
-{
- locale_t __l;
-public:
- typedef wchar_t intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
-
- explicit codecvt(size_t __refs = 0);
-
- _LIBCPP_INLINE_VISIBILITY
- result out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
- {
- return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- result unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
- {
- return do_unshift(__st, __to, __to_end, __to_nxt);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- result in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const
- {
- return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- int encoding() const _NOEXCEPT
- {
- return do_encoding();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool always_noconv() const _NOEXCEPT
- {
- return do_always_noconv();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const
- {
- return do_length(__st, __frm, __end, __mx);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- int max_length() const _NOEXCEPT
- {
- return do_max_length();
- }
-
- static locale::id id;
-
-protected:
- explicit codecvt(const char*, size_t __refs = 0);
-
- ~codecvt();
-
- virtual result do_out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual result do_in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
- virtual result do_unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual int do_encoding() const _NOEXCEPT;
- virtual bool do_always_noconv() const _NOEXCEPT;
- virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const;
- virtual int do_max_length() const _NOEXCEPT;
-};
-
-// template <> class codecvt<char16_t, char, mbstate_t>
-
-template <>
-class _LIBCPP_TYPE_VIS codecvt<char16_t, char, mbstate_t>
- : public locale::facet,
- public codecvt_base
-{
-public:
- typedef char16_t intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit codecvt(size_t __refs = 0)
- : locale::facet(__refs) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
- {
- return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- result unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
- {
- return do_unshift(__st, __to, __to_end, __to_nxt);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- result in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const
- {
- return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- int encoding() const _NOEXCEPT
- {
- return do_encoding();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool always_noconv() const _NOEXCEPT
- {
- return do_always_noconv();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const
- {
- return do_length(__st, __frm, __end, __mx);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- int max_length() const _NOEXCEPT
- {
- return do_max_length();
- }
-
- static locale::id id;
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- explicit codecvt(const char*, size_t __refs = 0)
- : locale::facet(__refs) {}
-
- ~codecvt();
-
- virtual result do_out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual result do_in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
- virtual result do_unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual int do_encoding() const _NOEXCEPT;
- virtual bool do_always_noconv() const _NOEXCEPT;
- virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const;
- virtual int do_max_length() const _NOEXCEPT;
-};
-
-// template <> class codecvt<char32_t, char, mbstate_t>
-
-template <>
-class _LIBCPP_TYPE_VIS codecvt<char32_t, char, mbstate_t>
- : public locale::facet,
- public codecvt_base
-{
-public:
- typedef char32_t intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit codecvt(size_t __refs = 0)
- : locale::facet(__refs) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
- {
- return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- result unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
- {
- return do_unshift(__st, __to, __to_end, __to_nxt);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- result in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const
- {
- return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- int encoding() const _NOEXCEPT
- {
- return do_encoding();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool always_noconv() const _NOEXCEPT
- {
- return do_always_noconv();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const
- {
- return do_length(__st, __frm, __end, __mx);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- int max_length() const _NOEXCEPT
- {
- return do_max_length();
- }
-
- static locale::id id;
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- explicit codecvt(const char*, size_t __refs = 0)
- : locale::facet(__refs) {}
-
- ~codecvt();
-
- virtual result do_out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual result do_in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
- virtual result do_unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual int do_encoding() const _NOEXCEPT;
- virtual bool do_always_noconv() const _NOEXCEPT;
- virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const;
- virtual int do_max_length() const _NOEXCEPT;
-};
-
-// template <class _InternT, class _ExternT, class _StateT> class codecvt_byname
-
-template <class _InternT, class _ExternT, class _StateT>
-class _LIBCPP_TEMPLATE_VIS codecvt_byname
- : public codecvt<_InternT, _ExternT, _StateT>
-{
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit codecvt_byname(const char* __nm, size_t __refs = 0)
- : codecvt<_InternT, _ExternT, _StateT>(__nm, __refs) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit codecvt_byname(const string& __nm, size_t __refs = 0)
- : codecvt<_InternT, _ExternT, _StateT>(__nm.c_str(), __refs) {}
-protected:
- ~codecvt_byname();
-};
-
-template <class _InternT, class _ExternT, class _StateT>
-codecvt_byname<_InternT, _ExternT, _StateT>::~codecvt_byname()
-{
-}
-
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char, char, mbstate_t>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<wchar_t, char, mbstate_t>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char16_t, char, mbstate_t>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char32_t, char, mbstate_t>)
-
-_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_runtime_error(const char*);
-
-template <size_t _Np>
-struct __narrow_to_utf8
-{
- template <class _OutputIterator, class _CharT>
- _OutputIterator
- operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const;
-};
-
-template <>
-struct __narrow_to_utf8<8>
-{
- template <class _OutputIterator, class _CharT>
- _LIBCPP_INLINE_VISIBILITY
- _OutputIterator
- operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const
- {
- for (; __wb < __we; ++__wb, ++__s)
- *__s = *__wb;
- return __s;
- }
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS __narrow_to_utf8<16>
- : public codecvt<char16_t, char, mbstate_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- __narrow_to_utf8() : codecvt<char16_t, char, mbstate_t>(1) {}
-
- _LIBCPP_EXPORTED_FROM_ABI ~__narrow_to_utf8();
-
- template <class _OutputIterator, class _CharT>
- _LIBCPP_INLINE_VISIBILITY
- _OutputIterator
- operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const
- {
- result __r = ok;
- mbstate_t __mb;
- while (__wb < __we && __r != error)
- {
- const int __sz = 32;
- char __buf[__sz];
- char* __bn;
- const char16_t* __wn = (const char16_t*)__wb;
- __r = do_out(__mb, (const char16_t*)__wb, (const char16_t*)__we, __wn,
- __buf, __buf+__sz, __bn);
- if (__r == codecvt_base::error || __wn == (const char16_t*)__wb)
- __throw_runtime_error("locale not supported");
- for (const char* __p = __buf; __p < __bn; ++__p, ++__s)
- *__s = *__p;
- __wb = (const _CharT*)__wn;
- }
- return __s;
- }
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS __narrow_to_utf8<32>
- : public codecvt<char32_t, char, mbstate_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- __narrow_to_utf8() : codecvt<char32_t, char, mbstate_t>(1) {}
-
- _LIBCPP_EXPORTED_FROM_ABI ~__narrow_to_utf8();
-
- template <class _OutputIterator, class _CharT>
- _LIBCPP_INLINE_VISIBILITY
- _OutputIterator
- operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const
- {
- result __r = ok;
- mbstate_t __mb;
- while (__wb < __we && __r != error)
- {
- const int __sz = 32;
- char __buf[__sz];
- char* __bn;
- const char32_t* __wn = (const char32_t*)__wb;
- __r = do_out(__mb, (const char32_t*)__wb, (const char32_t*)__we, __wn,
- __buf, __buf+__sz, __bn);
- if (__r == codecvt_base::error || __wn == (const char32_t*)__wb)
- __throw_runtime_error("locale not supported");
- for (const char* __p = __buf; __p < __bn; ++__p, ++__s)
- *__s = *__p;
- __wb = (const _CharT*)__wn;
- }
- return __s;
- }
-};
-
-template <size_t _Np>
-struct __widen_from_utf8
-{
- template <class _OutputIterator>
- _OutputIterator
- operator()(_OutputIterator __s, const char* __nb, const char* __ne) const;
-};
-
-template <>
-struct __widen_from_utf8<8>
-{
- template <class _OutputIterator>
- _LIBCPP_INLINE_VISIBILITY
- _OutputIterator
- operator()(_OutputIterator __s, const char* __nb, const char* __ne) const
- {
- for (; __nb < __ne; ++__nb, ++__s)
- *__s = *__nb;
- return __s;
- }
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS __widen_from_utf8<16>
- : public codecvt<char16_t, char, mbstate_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- __widen_from_utf8() : codecvt<char16_t, char, mbstate_t>(1) {}
-
- _LIBCPP_EXPORTED_FROM_ABI ~__widen_from_utf8();
-
- template <class _OutputIterator>
- _LIBCPP_INLINE_VISIBILITY
- _OutputIterator
- operator()(_OutputIterator __s, const char* __nb, const char* __ne) const
- {
- result __r = ok;
- mbstate_t __mb;
- while (__nb < __ne && __r != error)
- {
- const int __sz = 32;
- char16_t __buf[__sz];
- char16_t* __bn;
- const char* __nn = __nb;
- __r = do_in(__mb, __nb, __ne - __nb > __sz ? __nb+__sz : __ne, __nn,
- __buf, __buf+__sz, __bn);
- if (__r == codecvt_base::error || __nn == __nb)
- __throw_runtime_error("locale not supported");
- for (const char16_t* __p = __buf; __p < __bn; ++__p, ++__s)
- *__s = (wchar_t)*__p;
- __nb = __nn;
- }
- return __s;
- }
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS __widen_from_utf8<32>
- : public codecvt<char32_t, char, mbstate_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- __widen_from_utf8() : codecvt<char32_t, char, mbstate_t>(1) {}
-
- _LIBCPP_EXPORTED_FROM_ABI ~__widen_from_utf8();
-
- template <class _OutputIterator>
- _LIBCPP_INLINE_VISIBILITY
- _OutputIterator
- operator()(_OutputIterator __s, const char* __nb, const char* __ne) const
- {
- result __r = ok;
- mbstate_t __mb;
- while (__nb < __ne && __r != error)
- {
- const int __sz = 32;
- char32_t __buf[__sz];
- char32_t* __bn;
- const char* __nn = __nb;
- __r = do_in(__mb, __nb, __ne - __nb > __sz ? __nb+__sz : __ne, __nn,
- __buf, __buf+__sz, __bn);
- if (__r == codecvt_base::error || __nn == __nb)
- __throw_runtime_error("locale not supported");
- for (const char32_t* __p = __buf; __p < __bn; ++__p, ++__s)
- *__s = (wchar_t)*__p;
- __nb = __nn;
- }
- return __s;
- }
-};
-
-// template <class charT> class numpunct
-
-template <class _CharT> class _LIBCPP_TEMPLATE_VIS numpunct;
-
-template <>
-class _LIBCPP_TYPE_VIS numpunct<char>
- : public locale::facet
-{
-public:
- typedef char char_type;
- typedef basic_string<char_type> string_type;
-
- explicit numpunct(size_t __refs = 0);
-
- _LIBCPP_INLINE_VISIBILITY char_type decimal_point() const {return do_decimal_point();}
- _LIBCPP_INLINE_VISIBILITY char_type thousands_sep() const {return do_thousands_sep();}
- _LIBCPP_INLINE_VISIBILITY string grouping() const {return do_grouping();}
- _LIBCPP_INLINE_VISIBILITY string_type truename() const {return do_truename();}
- _LIBCPP_INLINE_VISIBILITY string_type falsename() const {return do_falsename();}
-
- static locale::id id;
-
-protected:
- ~numpunct();
- virtual char_type do_decimal_point() const;
- virtual char_type do_thousands_sep() const;
- virtual string do_grouping() const;
- virtual string_type do_truename() const;
- virtual string_type do_falsename() const;
-
- char_type __decimal_point_;
- char_type __thousands_sep_;
- string __grouping_;
-};
-
-template <>
-class _LIBCPP_TYPE_VIS numpunct<wchar_t>
- : public locale::facet
-{
-public:
- typedef wchar_t char_type;
- typedef basic_string<char_type> string_type;
-
- explicit numpunct(size_t __refs = 0);
-
- _LIBCPP_INLINE_VISIBILITY char_type decimal_point() const {return do_decimal_point();}
- _LIBCPP_INLINE_VISIBILITY char_type thousands_sep() const {return do_thousands_sep();}
- _LIBCPP_INLINE_VISIBILITY string grouping() const {return do_grouping();}
- _LIBCPP_INLINE_VISIBILITY string_type truename() const {return do_truename();}
- _LIBCPP_INLINE_VISIBILITY string_type falsename() const {return do_falsename();}
-
- static locale::id id;
-
-protected:
- ~numpunct();
- virtual char_type do_decimal_point() const;
- virtual char_type do_thousands_sep() const;
- virtual string do_grouping() const;
- virtual string_type do_truename() const;
- virtual string_type do_falsename() const;
-
- char_type __decimal_point_;
- char_type __thousands_sep_;
- string __grouping_;
-};
-
-// template <class charT> class numpunct_byname
-
-template <class _CharT> class _LIBCPP_TEMPLATE_VIS numpunct_byname;
-
-template <>
-class _LIBCPP_TYPE_VIS numpunct_byname<char>
-: public numpunct<char>
-{
-public:
- typedef char char_type;
- typedef basic_string<char_type> string_type;
-
- explicit numpunct_byname(const char* __nm, size_t __refs = 0);
- explicit numpunct_byname(const string& __nm, size_t __refs = 0);
-
-protected:
- ~numpunct_byname();
-
-private:
- void __init(const char*);
-};
-
-template <>
-class _LIBCPP_TYPE_VIS numpunct_byname<wchar_t>
-: public numpunct<wchar_t>
-{
-public:
- typedef wchar_t char_type;
- typedef basic_string<char_type> string_type;
-
- explicit numpunct_byname(const char* __nm, size_t __refs = 0);
- explicit numpunct_byname(const string& __nm, size_t __refs = 0);
-
-protected:
- ~numpunct_byname();
-
-private:
- void __init(const char*);
-};
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP___LOCALE
diff --git a/lib/libcxx/include/__mutex_base b/lib/libcxx/include/__mutex_base
deleted file mode 100644
index da21a5f8eb6..00000000000
--- a/lib/libcxx/include/__mutex_base
+++ /dev/null
@@ -1,440 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP___MUTEX_BASE
-#define _LIBCPP___MUTEX_BASE
-
-#include <__config>
-#include <chrono>
-#include <system_error>
-#include <__threading_support>
-
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-#ifndef _LIBCPP_HAS_NO_THREADS
-
-#ifndef _LIBCPP_THREAD_SAFETY_ANNOTATION
-# ifdef _LIBCPP_HAS_THREAD_SAFETY_ANNOTATIONS
-# define _LIBCPP_THREAD_SAFETY_ANNOTATION(x) __attribute__((x))
-# else
-# define _LIBCPP_THREAD_SAFETY_ANNOTATION(x)
-# endif
-#endif // _LIBCPP_THREAD_SAFETY_ANNOTATION
-
-class _LIBCPP_TYPE_VIS _LIBCPP_THREAD_SAFETY_ANNOTATION(capability("mutex")) mutex
-{
-#ifndef _LIBCPP_CXX03_LANG
- __libcpp_mutex_t __m_ = _LIBCPP_MUTEX_INITIALIZER;
-#else
- __libcpp_mutex_t __m_;
-#endif
-
-public:
- _LIBCPP_INLINE_VISIBILITY
-#ifndef _LIBCPP_CXX03_LANG
- constexpr mutex() = default;
-#else
- mutex() _NOEXCEPT {__m_ = (__libcpp_mutex_t)_LIBCPP_MUTEX_INITIALIZER;}
-#endif
- ~mutex();
-
-private:
- mutex(const mutex&);// = delete;
- mutex& operator=(const mutex&);// = delete;
-
-public:
- void lock() _LIBCPP_THREAD_SAFETY_ANNOTATION(acquire_capability());
- bool try_lock() _NOEXCEPT _LIBCPP_THREAD_SAFETY_ANNOTATION(try_acquire_capability(true));
- void unlock() _NOEXCEPT _LIBCPP_THREAD_SAFETY_ANNOTATION(release_capability());
-
- typedef __libcpp_mutex_t* native_handle_type;
- _LIBCPP_INLINE_VISIBILITY native_handle_type native_handle() {return &__m_;}
-};
-
-static_assert(is_nothrow_default_constructible<mutex>::value,
- "the default constructor for std::mutex must be nothrow");
-
-struct _LIBCPP_TYPE_VIS defer_lock_t {};
-struct _LIBCPP_TYPE_VIS try_to_lock_t {};
-struct _LIBCPP_TYPE_VIS adopt_lock_t {};
-
-#if defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY)
-
-extern _LIBCPP_EXPORTED_FROM_ABI const defer_lock_t defer_lock;
-extern _LIBCPP_EXPORTED_FROM_ABI const try_to_lock_t try_to_lock;
-extern _LIBCPP_EXPORTED_FROM_ABI const adopt_lock_t adopt_lock;
-
-#else
-
-/* _LIBCPP_INLINE_VAR */ constexpr defer_lock_t defer_lock = defer_lock_t();
-/* _LIBCPP_INLINE_VAR */ constexpr try_to_lock_t try_to_lock = try_to_lock_t();
-/* _LIBCPP_INLINE_VAR */ constexpr adopt_lock_t adopt_lock = adopt_lock_t();
-
-#endif
-
-template <class _Mutex>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_THREAD_SAFETY_ANNOTATION(scoped_lockable)
-lock_guard
-{
-public:
- typedef _Mutex mutex_type;
-
-private:
- mutex_type& __m_;
-public:
-
- _LIBCPP_INLINE_VISIBILITY
- explicit lock_guard(mutex_type& __m) _LIBCPP_THREAD_SAFETY_ANNOTATION(acquire_capability(__m))
- : __m_(__m) {__m_.lock();}
- _LIBCPP_INLINE_VISIBILITY
- lock_guard(mutex_type& __m, adopt_lock_t) _LIBCPP_THREAD_SAFETY_ANNOTATION(requires_capability(__m))
- : __m_(__m) {}
- _LIBCPP_INLINE_VISIBILITY
- ~lock_guard() _LIBCPP_THREAD_SAFETY_ANNOTATION(release_capability()) {__m_.unlock();}
-
-private:
- lock_guard(lock_guard const&) _LIBCPP_EQUAL_DELETE;
- lock_guard& operator=(lock_guard const&) _LIBCPP_EQUAL_DELETE;
-};
-
-template <class _Mutex>
-class _LIBCPP_TEMPLATE_VIS unique_lock
-{
-public:
- typedef _Mutex mutex_type;
-
-private:
- mutex_type* __m_;
- bool __owns_;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- unique_lock() _NOEXCEPT : __m_(nullptr), __owns_(false) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit unique_lock(mutex_type& __m)
- : __m_(_VSTD::addressof(__m)), __owns_(true) {__m_->lock();}
- _LIBCPP_INLINE_VISIBILITY
- unique_lock(mutex_type& __m, defer_lock_t) _NOEXCEPT
- : __m_(_VSTD::addressof(__m)), __owns_(false) {}
- _LIBCPP_INLINE_VISIBILITY
- unique_lock(mutex_type& __m, try_to_lock_t)
- : __m_(_VSTD::addressof(__m)), __owns_(__m.try_lock()) {}
- _LIBCPP_INLINE_VISIBILITY
- unique_lock(mutex_type& __m, adopt_lock_t)
- : __m_(_VSTD::addressof(__m)), __owns_(true) {}
- template <class _Clock, class _Duration>
- _LIBCPP_INLINE_VISIBILITY
- unique_lock(mutex_type& __m, const chrono::time_point<_Clock, _Duration>& __t)
- : __m_(_VSTD::addressof(__m)), __owns_(__m.try_lock_until(__t)) {}
- template <class _Rep, class _Period>
- _LIBCPP_INLINE_VISIBILITY
- unique_lock(mutex_type& __m, const chrono::duration<_Rep, _Period>& __d)
- : __m_(_VSTD::addressof(__m)), __owns_(__m.try_lock_for(__d)) {}
- _LIBCPP_INLINE_VISIBILITY
- ~unique_lock()
- {
- if (__owns_)
- __m_->unlock();
- }
-
-private:
- unique_lock(unique_lock const&); // = delete;
- unique_lock& operator=(unique_lock const&); // = delete;
-
-public:
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- unique_lock(unique_lock&& __u) _NOEXCEPT
- : __m_(__u.__m_), __owns_(__u.__owns_)
- {__u.__m_ = nullptr; __u.__owns_ = false;}
- _LIBCPP_INLINE_VISIBILITY
- unique_lock& operator=(unique_lock&& __u) _NOEXCEPT
- {
- if (__owns_)
- __m_->unlock();
- __m_ = __u.__m_;
- __owns_ = __u.__owns_;
- __u.__m_ = nullptr;
- __u.__owns_ = false;
- return *this;
- }
-
-#endif // _LIBCPP_CXX03_LANG
-
- void lock();
- bool try_lock();
-
- template <class _Rep, class _Period>
- bool try_lock_for(const chrono::duration<_Rep, _Period>& __d);
- template <class _Clock, class _Duration>
- bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __t);
-
- void unlock();
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(unique_lock& __u) _NOEXCEPT
- {
- _VSTD::swap(__m_, __u.__m_);
- _VSTD::swap(__owns_, __u.__owns_);
- }
- _LIBCPP_INLINE_VISIBILITY
- mutex_type* release() _NOEXCEPT
- {
- mutex_type* __m = __m_;
- __m_ = nullptr;
- __owns_ = false;
- return __m;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool owns_lock() const _NOEXCEPT {return __owns_;}
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_EXPLICIT
- operator bool () const _NOEXCEPT {return __owns_;}
- _LIBCPP_INLINE_VISIBILITY
- mutex_type* mutex() const _NOEXCEPT {return __m_;}
-};
-
-template <class _Mutex>
-void
-unique_lock<_Mutex>::lock()
-{
- if (__m_ == nullptr)
- __throw_system_error(EPERM, "unique_lock::lock: references null mutex");
- if (__owns_)
- __throw_system_error(EDEADLK, "unique_lock::lock: already locked");
- __m_->lock();
- __owns_ = true;
-}
-
-template <class _Mutex>
-bool
-unique_lock<_Mutex>::try_lock()
-{
- if (__m_ == nullptr)
- __throw_system_error(EPERM, "unique_lock::try_lock: references null mutex");
- if (__owns_)
- __throw_system_error(EDEADLK, "unique_lock::try_lock: already locked");
- __owns_ = __m_->try_lock();
- return __owns_;
-}
-
-template <class _Mutex>
-template <class _Rep, class _Period>
-bool
-unique_lock<_Mutex>::try_lock_for(const chrono::duration<_Rep, _Period>& __d)
-{
- if (__m_ == nullptr)
- __throw_system_error(EPERM, "unique_lock::try_lock_for: references null mutex");
- if (__owns_)
- __throw_system_error(EDEADLK, "unique_lock::try_lock_for: already locked");
- __owns_ = __m_->try_lock_for(__d);
- return __owns_;
-}
-
-template <class _Mutex>
-template <class _Clock, class _Duration>
-bool
-unique_lock<_Mutex>::try_lock_until(const chrono::time_point<_Clock, _Duration>& __t)
-{
- if (__m_ == nullptr)
- __throw_system_error(EPERM, "unique_lock::try_lock_until: references null mutex");
- if (__owns_)
- __throw_system_error(EDEADLK, "unique_lock::try_lock_until: already locked");
- __owns_ = __m_->try_lock_until(__t);
- return __owns_;
-}
-
-template <class _Mutex>
-void
-unique_lock<_Mutex>::unlock()
-{
- if (!__owns_)
- __throw_system_error(EPERM, "unique_lock::unlock: not locked");
- __m_->unlock();
- __owns_ = false;
-}
-
-template <class _Mutex>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(unique_lock<_Mutex>& __x, unique_lock<_Mutex>& __y) _NOEXCEPT
- {__x.swap(__y);}
-
-//enum class cv_status
-_LIBCPP_DECLARE_STRONG_ENUM(cv_status)
-{
- no_timeout,
- timeout
-};
-_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(cv_status)
-
-class _LIBCPP_TYPE_VIS condition_variable
-{
-#ifndef _LIBCPP_CXX03_LANG
- __libcpp_condvar_t __cv_ = _LIBCPP_CONDVAR_INITIALIZER;
-#else
- __libcpp_condvar_t __cv_;
-#endif
-
-public:
- _LIBCPP_INLINE_VISIBILITY
-#ifndef _LIBCPP_CXX03_LANG
- constexpr condition_variable() _NOEXCEPT = default;
-#else
- condition_variable() _NOEXCEPT {__cv_ = (__libcpp_condvar_t)_LIBCPP_CONDVAR_INITIALIZER;}
-#endif
- ~condition_variable();
-
-private:
- condition_variable(const condition_variable&); // = delete;
- condition_variable& operator=(const condition_variable&); // = delete;
-
-public:
- void notify_one() _NOEXCEPT;
- void notify_all() _NOEXCEPT;
-
- void wait(unique_lock<mutex>& __lk) _NOEXCEPT;
- template <class _Predicate>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- void wait(unique_lock<mutex>& __lk, _Predicate __pred);
-
- template <class _Clock, class _Duration>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- cv_status
- wait_until(unique_lock<mutex>& __lk,
- const chrono::time_point<_Clock, _Duration>& __t);
-
- template <class _Clock, class _Duration, class _Predicate>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- bool
- wait_until(unique_lock<mutex>& __lk,
- const chrono::time_point<_Clock, _Duration>& __t,
- _Predicate __pred);
-
- template <class _Rep, class _Period>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- cv_status
- wait_for(unique_lock<mutex>& __lk,
- const chrono::duration<_Rep, _Period>& __d);
-
- template <class _Rep, class _Period, class _Predicate>
- bool
- _LIBCPP_INLINE_VISIBILITY
- wait_for(unique_lock<mutex>& __lk,
- const chrono::duration<_Rep, _Period>& __d,
- _Predicate __pred);
-
- typedef __libcpp_condvar_t* native_handle_type;
- _LIBCPP_INLINE_VISIBILITY native_handle_type native_handle() {return &__cv_;}
-
-private:
- void __do_timed_wait(unique_lock<mutex>& __lk,
- chrono::time_point<chrono::system_clock, chrono::nanoseconds>) _NOEXCEPT;
-};
-#endif // !_LIBCPP_HAS_NO_THREADS
-
-template <class _To, class _Rep, class _Period>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- chrono::__is_duration<_To>::value,
- _To
->::type
-__ceil(chrono::duration<_Rep, _Period> __d)
-{
- using namespace chrono;
- _To __r = duration_cast<_To>(__d);
- if (__r < __d)
- ++__r;
- return __r;
-}
-
-#ifndef _LIBCPP_HAS_NO_THREADS
-template <class _Predicate>
-void
-condition_variable::wait(unique_lock<mutex>& __lk, _Predicate __pred)
-{
- while (!__pred())
- wait(__lk);
-}
-
-template <class _Clock, class _Duration>
-cv_status
-condition_variable::wait_until(unique_lock<mutex>& __lk,
- const chrono::time_point<_Clock, _Duration>& __t)
-{
- using namespace chrono;
- wait_for(__lk, __t - _Clock::now());
- return _Clock::now() < __t ? cv_status::no_timeout : cv_status::timeout;
-}
-
-template <class _Clock, class _Duration, class _Predicate>
-bool
-condition_variable::wait_until(unique_lock<mutex>& __lk,
- const chrono::time_point<_Clock, _Duration>& __t,
- _Predicate __pred)
-{
- while (!__pred())
- {
- if (wait_until(__lk, __t) == cv_status::timeout)
- return __pred();
- }
- return true;
-}
-
-template <class _Rep, class _Period>
-cv_status
-condition_variable::wait_for(unique_lock<mutex>& __lk,
- const chrono::duration<_Rep, _Period>& __d)
-{
- using namespace chrono;
- if (__d <= __d.zero())
- return cv_status::timeout;
- typedef time_point<system_clock, duration<long double, nano> > __sys_tpf;
- typedef time_point<system_clock, nanoseconds> __sys_tpi;
- __sys_tpf _Max = __sys_tpi::max();
- steady_clock::time_point __c_now = steady_clock::now();
- system_clock::time_point __s_now = system_clock::now();
- if (_Max - __d > __s_now)
- __do_timed_wait(__lk, __s_now + __ceil<nanoseconds>(__d));
- else
- __do_timed_wait(__lk, __sys_tpi::max());
- return steady_clock::now() - __c_now < __d ? cv_status::no_timeout :
- cv_status::timeout;
-}
-
-template <class _Rep, class _Period, class _Predicate>
-inline
-bool
-condition_variable::wait_for(unique_lock<mutex>& __lk,
- const chrono::duration<_Rep, _Period>& __d,
- _Predicate __pred)
-{
- return wait_until(__lk, chrono::steady_clock::now() + __d,
- _VSTD::move(__pred));
-}
-
-#endif // !_LIBCPP_HAS_NO_THREADS
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP___MUTEX_BASE
diff --git a/lib/libcxx/include/__node_handle b/lib/libcxx/include/__node_handle
deleted file mode 100644
index a9cf3b7217a..00000000000
--- a/lib/libcxx/include/__node_handle
+++ /dev/null
@@ -1,210 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP___NODE_HANDLE
-#define _LIBCPP___NODE_HANDLE
-
-#include <__config>
-#include <memory>
-#include <optional>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-#if _LIBCPP_STD_VER > 14
-
-// Specialized in __tree & __hash_table for their _NodeType.
-template <class _NodeType, class _Alloc>
-struct __generic_container_node_destructor;
-
-template <class _NodeType, class _Alloc,
- template <class, class> class _MapOrSetSpecifics>
-class _LIBCPP_TEMPLATE_VIS __basic_node_handle
- : public _MapOrSetSpecifics<
- _NodeType,
- __basic_node_handle<_NodeType, _Alloc, _MapOrSetSpecifics>>
-{
- template <class _Tp, class _Compare, class _Allocator>
- friend class __tree;
- template <class _Tp, class _Hash, class _Equal, class _Allocator>
- friend class __hash_table;
- friend struct _MapOrSetSpecifics<
- _NodeType, __basic_node_handle<_NodeType, _Alloc, _MapOrSetSpecifics>>;
-
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_pointer<typename __alloc_traits::void_pointer,
- _NodeType>::type
- __node_pointer_type;
-
-public:
- typedef _Alloc allocator_type;
-
-private:
- __node_pointer_type __ptr_ = nullptr;
- optional<allocator_type> __alloc_;
-
- _LIBCPP_INLINE_VISIBILITY
- void __release()
- {
- __ptr_ = nullptr;
- __alloc_ = _VSTD::nullopt;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __destroy_node_pointer()
- {
- if (__ptr_ != nullptr)
- {
- typedef typename __allocator_traits_rebind<
- allocator_type, _NodeType>::type __node_alloc_type;
- __node_alloc_type __alloc(*__alloc_);
- __generic_container_node_destructor<_NodeType, __node_alloc_type>(
- __alloc, true)(__ptr_);
- __ptr_ = nullptr;
- }
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __basic_node_handle(__node_pointer_type __ptr,
- allocator_type const& __alloc)
- : __ptr_(__ptr), __alloc_(__alloc)
- {
- }
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- __basic_node_handle() = default;
-
- _LIBCPP_INLINE_VISIBILITY
- __basic_node_handle(__basic_node_handle&& __other) noexcept
- : __ptr_(__other.__ptr_),
- __alloc_(_VSTD::move(__other.__alloc_))
- {
- __other.__ptr_ = nullptr;
- __other.__alloc_ = _VSTD::nullopt;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __basic_node_handle& operator=(__basic_node_handle&& __other)
- {
- _LIBCPP_ASSERT(
- __alloc_ == _VSTD::nullopt ||
- __alloc_traits::propagate_on_container_move_assignment::value ||
- __alloc_ == __other.__alloc_,
- "node_type with incompatible allocator passed to "
- "node_type::operator=(node_type&&)");
-
- __destroy_node_pointer();
- __ptr_ = __other.__ptr_;
-
- if (__alloc_traits::propagate_on_container_move_assignment::value ||
- __alloc_ == _VSTD::nullopt)
- __alloc_ = _VSTD::move(__other.__alloc_);
-
- __other.__ptr_ = nullptr;
- __other.__alloc_ = _VSTD::nullopt;
-
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const { return *__alloc_; }
-
- _LIBCPP_INLINE_VISIBILITY
- explicit operator bool() const { return __ptr_ != nullptr; }
-
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const { return __ptr_ == nullptr; }
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(__basic_node_handle& __other) noexcept(
- __alloc_traits::propagate_on_container_swap::value ||
- __alloc_traits::is_always_equal::value)
- {
- using _VSTD::swap;
- swap(__ptr_, __other.__ptr_);
- if (__alloc_traits::propagate_on_container_swap::value ||
- __alloc_ == _VSTD::nullopt || __other.__alloc_ == _VSTD::nullopt)
- swap(__alloc_, __other.__alloc_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- friend void swap(__basic_node_handle& __a, __basic_node_handle& __b)
- noexcept(noexcept(__a.swap(__b))) { __a.swap(__b); }
-
- _LIBCPP_INLINE_VISIBILITY
- ~__basic_node_handle()
- {
- __destroy_node_pointer();
- }
-};
-
-template <class _NodeType, class _Derived>
-struct __set_node_handle_specifics
-{
- typedef typename _NodeType::__node_value_type value_type;
-
- _LIBCPP_INLINE_VISIBILITY
- value_type& value() const
- {
- return static_cast<_Derived const*>(this)->__ptr_->__value_;
- }
-};
-
-template <class _NodeType, class _Derived>
-struct __map_node_handle_specifics
-{
- typedef typename _NodeType::__node_value_type::key_type key_type;
- typedef typename _NodeType::__node_value_type::mapped_type mapped_type;
-
- _LIBCPP_INLINE_VISIBILITY
- key_type& key() const
- {
- return static_cast<_Derived const*>(this)->
- __ptr_->__value_.__ref().first;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- mapped_type& mapped() const
- {
- return static_cast<_Derived const*>(this)->
- __ptr_->__value_.__ref().second;
- }
-};
-
-template <class _NodeType, class _Alloc>
-using __set_node_handle =
- __basic_node_handle< _NodeType, _Alloc, __set_node_handle_specifics>;
-
-template <class _NodeType, class _Alloc>
-using __map_node_handle =
- __basic_node_handle< _NodeType, _Alloc, __map_node_handle_specifics>;
-
-template <class _Iterator, class _NodeType>
-_LIBCPP_TEMPLATE_VIS
-struct __insert_return_type
-{
- _Iterator position;
- bool inserted;
- _NodeType node;
-};
-
-#endif // _LIBCPP_STD_VER > 14
-
-_LIBCPP_END_NAMESPACE_STD
-_LIBCPP_POP_MACROS
-
-#endif
diff --git a/lib/libcxx/include/__nullptr b/lib/libcxx/include/__nullptr
deleted file mode 100644
index aa3b4d2145a..00000000000
--- a/lib/libcxx/include/__nullptr
+++ /dev/null
@@ -1,62 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- __nullptr --------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_NULLPTR
-#define _LIBCPP_NULLPTR
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#ifdef _LIBCPP_HAS_NO_NULLPTR
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-struct _LIBCPP_TEMPLATE_VIS nullptr_t
-{
- void* __lx;
-
- struct __nat {int __for_bool_;};
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR nullptr_t() : __lx(0) {}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR nullptr_t(int __nat::*) : __lx(0) {}
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR operator int __nat::*() const {return 0;}
-
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- operator _Tp* () const {return 0;}
-
- template <class _Tp, class _Up>
- _LIBCPP_INLINE_VISIBILITY
- operator _Tp _Up::* () const {return 0;}
-
- friend _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR bool operator==(nullptr_t, nullptr_t) {return true;}
- friend _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR bool operator!=(nullptr_t, nullptr_t) {return false;}
-};
-
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR nullptr_t __get_nullptr_t() {return nullptr_t(0);}
-
-#define nullptr _VSTD::__get_nullptr_t()
-
-_LIBCPP_END_NAMESPACE_STD
-
-#else // _LIBCPP_HAS_NO_NULLPTR
-
-namespace std
-{
- typedef decltype(nullptr) nullptr_t;
-}
-
-#endif // _LIBCPP_HAS_NO_NULLPTR
-
-#endif // _LIBCPP_NULLPTR
diff --git a/lib/libcxx/include/__split_buffer b/lib/libcxx/include/__split_buffer
deleted file mode 100644
index 1daa4e5ada3..00000000000
--- a/lib/libcxx/include/__split_buffer
+++ /dev/null
@@ -1,637 +0,0 @@
-// -*- C++ -*-
-#ifndef _LIBCPP_SPLIT_BUFFER
-#define _LIBCPP_SPLIT_BUFFER
-
-#include <__config>
-#include <type_traits>
-#include <algorithm>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <bool>
-class __split_buffer_common
-{
-protected:
- void __throw_length_error() const;
- void __throw_out_of_range() const;
-};
-
-template <class _Tp, class _Allocator = allocator<_Tp> >
-struct __split_buffer
- : private __split_buffer_common<true>
-{
-private:
- __split_buffer(const __split_buffer&);
- __split_buffer& operator=(const __split_buffer&);
-public:
- typedef _Tp value_type;
- typedef _Allocator allocator_type;
- typedef typename remove_reference<allocator_type>::type __alloc_rr;
- typedef allocator_traits<__alloc_rr> __alloc_traits;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename __alloc_traits::size_type size_type;
- typedef typename __alloc_traits::difference_type difference_type;
- typedef typename __alloc_traits::pointer pointer;
- typedef typename __alloc_traits::const_pointer const_pointer;
- typedef pointer iterator;
- typedef const_pointer const_iterator;
-
- pointer __first_;
- pointer __begin_;
- pointer __end_;
- __compressed_pair<pointer, allocator_type> __end_cap_;
-
- typedef typename add_lvalue_reference<allocator_type>::type __alloc_ref;
- typedef typename add_lvalue_reference<allocator_type>::type __alloc_const_ref;
-
- _LIBCPP_INLINE_VISIBILITY __alloc_rr& __alloc() _NOEXCEPT {return __end_cap_.second();}
- _LIBCPP_INLINE_VISIBILITY const __alloc_rr& __alloc() const _NOEXCEPT {return __end_cap_.second();}
- _LIBCPP_INLINE_VISIBILITY pointer& __end_cap() _NOEXCEPT {return __end_cap_.first();}
- _LIBCPP_INLINE_VISIBILITY const pointer& __end_cap() const _NOEXCEPT {return __end_cap_.first();}
-
- _LIBCPP_INLINE_VISIBILITY
- __split_buffer()
- _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
- _LIBCPP_INLINE_VISIBILITY
- explicit __split_buffer(__alloc_rr& __a);
- _LIBCPP_INLINE_VISIBILITY
- explicit __split_buffer(const __alloc_rr& __a);
- __split_buffer(size_type __cap, size_type __start, __alloc_rr& __a);
- ~__split_buffer();
-
-#ifndef _LIBCPP_CXX03_LANG
- __split_buffer(__split_buffer&& __c)
- _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
- __split_buffer(__split_buffer&& __c, const __alloc_rr& __a);
- __split_buffer& operator=(__split_buffer&& __c)
- _NOEXCEPT_((__alloc_traits::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value) ||
- !__alloc_traits::propagate_on_container_move_assignment::value);
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY iterator begin() _NOEXCEPT {return __begin_;}
- _LIBCPP_INLINE_VISIBILITY const_iterator begin() const _NOEXCEPT {return __begin_;}
- _LIBCPP_INLINE_VISIBILITY iterator end() _NOEXCEPT {return __end_;}
- _LIBCPP_INLINE_VISIBILITY const_iterator end() const _NOEXCEPT {return __end_;}
-
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT
- {__destruct_at_end(__begin_);}
- _LIBCPP_INLINE_VISIBILITY size_type size() const {return static_cast<size_type>(__end_ - __begin_);}
- _LIBCPP_INLINE_VISIBILITY bool empty() const {return __end_ == __begin_;}
- _LIBCPP_INLINE_VISIBILITY size_type capacity() const {return static_cast<size_type>(__end_cap() - __first_);}
- _LIBCPP_INLINE_VISIBILITY size_type __front_spare() const {return static_cast<size_type>(__begin_ - __first_);}
- _LIBCPP_INLINE_VISIBILITY size_type __back_spare() const {return static_cast<size_type>(__end_cap() - __end_);}
-
- _LIBCPP_INLINE_VISIBILITY reference front() {return *__begin_;}
- _LIBCPP_INLINE_VISIBILITY const_reference front() const {return *__begin_;}
- _LIBCPP_INLINE_VISIBILITY reference back() {return *(__end_ - 1);}
- _LIBCPP_INLINE_VISIBILITY const_reference back() const {return *(__end_ - 1);}
-
- void reserve(size_type __n);
- void shrink_to_fit() _NOEXCEPT;
- void push_front(const_reference __x);
- _LIBCPP_INLINE_VISIBILITY void push_back(const_reference __x);
-#ifndef _LIBCPP_CXX03_LANG
- void push_front(value_type&& __x);
- void push_back(value_type&& __x);
- template <class... _Args>
- void emplace_back(_Args&&... __args);
-#endif // !defined(_LIBCPP_CXX03_LANG)
-
- _LIBCPP_INLINE_VISIBILITY void pop_front() {__destruct_at_begin(__begin_+1);}
- _LIBCPP_INLINE_VISIBILITY void pop_back() {__destruct_at_end(__end_-1);}
-
- void __construct_at_end(size_type __n);
- void __construct_at_end(size_type __n, const_reference __x);
- template <class _InputIter>
- typename enable_if
- <
- __is_input_iterator<_InputIter>::value &&
- !__is_forward_iterator<_InputIter>::value,
- void
- >::type
- __construct_at_end(_InputIter __first, _InputIter __last);
- template <class _ForwardIterator>
- typename enable_if
- <
- __is_forward_iterator<_ForwardIterator>::value,
- void
- >::type
- __construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
-
- _LIBCPP_INLINE_VISIBILITY void __destruct_at_begin(pointer __new_begin)
- {__destruct_at_begin(__new_begin, is_trivially_destructible<value_type>());}
- _LIBCPP_INLINE_VISIBILITY
- void __destruct_at_begin(pointer __new_begin, false_type);
- _LIBCPP_INLINE_VISIBILITY
- void __destruct_at_begin(pointer __new_begin, true_type);
-
- _LIBCPP_INLINE_VISIBILITY
- void __destruct_at_end(pointer __new_last) _NOEXCEPT
- {__destruct_at_end(__new_last, false_type());}
- _LIBCPP_INLINE_VISIBILITY
- void __destruct_at_end(pointer __new_last, false_type) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- void __destruct_at_end(pointer __new_last, true_type) _NOEXCEPT;
-
- void swap(__split_buffer& __x)
- _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value||
- __is_nothrow_swappable<__alloc_rr>::value);
-
- bool __invariants() const;
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__split_buffer& __c, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
- {
- __alloc() = _VSTD::move(__c.__alloc());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__split_buffer&, false_type) _NOEXCEPT
- {}
-};
-
-template <class _Tp, class _Allocator>
-bool
-__split_buffer<_Tp, _Allocator>::__invariants() const
-{
- if (__first_ == nullptr)
- {
- if (__begin_ != nullptr)
- return false;
- if (__end_ != nullptr)
- return false;
- if (__end_cap() != nullptr)
- return false;
- }
- else
- {
- if (__begin_ < __first_)
- return false;
- if (__end_ < __begin_)
- return false;
- if (__end_cap() < __end_)
- return false;
- }
- return true;
-}
-
-// Default constructs __n objects starting at __end_
-// throws if construction throws
-// Precondition: __n > 0
-// Precondition: size() + __n <= capacity()
-// Postcondition: size() == size() + __n
-template <class _Tp, class _Allocator>
-void
-__split_buffer<_Tp, _Allocator>::__construct_at_end(size_type __n)
-{
- __alloc_rr& __a = this->__alloc();
- do
- {
- __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_));
- ++this->__end_;
- --__n;
- } while (__n > 0);
-}
-
-// Copy constructs __n objects starting at __end_ from __x
-// throws if construction throws
-// Precondition: __n > 0
-// Precondition: size() + __n <= capacity()
-// Postcondition: size() == old size() + __n
-// Postcondition: [i] == __x for all i in [size() - __n, __n)
-template <class _Tp, class _Allocator>
-void
-__split_buffer<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x)
-{
- __alloc_rr& __a = this->__alloc();
- do
- {
- __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), __x);
- ++this->__end_;
- --__n;
- } while (__n > 0);
-}
-
-template <class _Tp, class _Allocator>
-template <class _InputIter>
-typename enable_if
-<
- __is_input_iterator<_InputIter>::value &&
- !__is_forward_iterator<_InputIter>::value,
- void
->::type
-__split_buffer<_Tp, _Allocator>::__construct_at_end(_InputIter __first, _InputIter __last)
-{
- __alloc_rr& __a = this->__alloc();
- for (; __first != __last; ++__first)
- {
- if (__end_ == __end_cap())
- {
- size_type __old_cap = __end_cap() - __first_;
- size_type __new_cap = _VSTD::max<size_type>(2 * __old_cap, 8);
- __split_buffer __buf(__new_cap, 0, __a);
- for (pointer __p = __begin_; __p != __end_; ++__p, ++__buf.__end_)
- __alloc_traits::construct(__buf.__alloc(),
- _VSTD::__to_raw_pointer(__buf.__end_), _VSTD::move(*__p));
- swap(__buf);
- }
- __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), *__first);
- ++this->__end_;
- }
-}
-
-template <class _Tp, class _Allocator>
-template <class _ForwardIterator>
-typename enable_if
-<
- __is_forward_iterator<_ForwardIterator>::value,
- void
->::type
-__split_buffer<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last)
-{
- __alloc_rr& __a = this->__alloc();
- for (; __first != __last; ++__first)
- {
- __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), *__first);
- ++this->__end_;
- }
-}
-
-template <class _Tp, class _Allocator>
-inline
-void
-__split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, false_type)
-{
- while (__begin_ != __new_begin)
- __alloc_traits::destroy(__alloc(), __to_raw_pointer(__begin_++));
-}
-
-template <class _Tp, class _Allocator>
-inline
-void
-__split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, true_type)
-{
- __begin_ = __new_begin;
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-__split_buffer<_Tp, _Allocator>::__destruct_at_end(pointer __new_last, false_type) _NOEXCEPT
-{
- while (__new_last != __end_)
- __alloc_traits::destroy(__alloc(), __to_raw_pointer(--__end_));
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-__split_buffer<_Tp, _Allocator>::__destruct_at_end(pointer __new_last, true_type) _NOEXCEPT
-{
- __end_ = __new_last;
-}
-
-template <class _Tp, class _Allocator>
-__split_buffer<_Tp, _Allocator>::__split_buffer(size_type __cap, size_type __start, __alloc_rr& __a)
- : __end_cap_(nullptr, __a)
-{
- __first_ = __cap != 0 ? __alloc_traits::allocate(__alloc(), __cap) : nullptr;
- __begin_ = __end_ = __first_ + __start;
- __end_cap() = __first_ + __cap;
-}
-
-template <class _Tp, class _Allocator>
-inline
-__split_buffer<_Tp, _Allocator>::__split_buffer()
- _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
- : __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr)
-{
-}
-
-template <class _Tp, class _Allocator>
-inline
-__split_buffer<_Tp, _Allocator>::__split_buffer(__alloc_rr& __a)
- : __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr, __a)
-{
-}
-
-template <class _Tp, class _Allocator>
-inline
-__split_buffer<_Tp, _Allocator>::__split_buffer(const __alloc_rr& __a)
- : __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr, __a)
-{
-}
-
-template <class _Tp, class _Allocator>
-__split_buffer<_Tp, _Allocator>::~__split_buffer()
-{
- clear();
- if (__first_)
- __alloc_traits::deallocate(__alloc(), __first_, capacity());
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Allocator>
-__split_buffer<_Tp, _Allocator>::__split_buffer(__split_buffer&& __c)
- _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
- : __first_(_VSTD::move(__c.__first_)),
- __begin_(_VSTD::move(__c.__begin_)),
- __end_(_VSTD::move(__c.__end_)),
- __end_cap_(_VSTD::move(__c.__end_cap_))
-{
- __c.__first_ = nullptr;
- __c.__begin_ = nullptr;
- __c.__end_ = nullptr;
- __c.__end_cap() = nullptr;
-}
-
-template <class _Tp, class _Allocator>
-__split_buffer<_Tp, _Allocator>::__split_buffer(__split_buffer&& __c, const __alloc_rr& __a)
- : __end_cap_(__second_tag(), __a)
-{
- if (__a == __c.__alloc())
- {
- __first_ = __c.__first_;
- __begin_ = __c.__begin_;
- __end_ = __c.__end_;
- __end_cap() = __c.__end_cap();
- __c.__first_ = nullptr;
- __c.__begin_ = nullptr;
- __c.__end_ = nullptr;
- __c.__end_cap() = nullptr;
- }
- else
- {
- size_type __cap = __c.size();
- __first_ = __alloc_traits::allocate(__alloc(), __cap);
- __begin_ = __end_ = __first_;
- __end_cap() = __first_ + __cap;
- typedef move_iterator<iterator> _Ip;
- __construct_at_end(_Ip(__c.begin()), _Ip(__c.end()));
- }
-}
-
-template <class _Tp, class _Allocator>
-__split_buffer<_Tp, _Allocator>&
-__split_buffer<_Tp, _Allocator>::operator=(__split_buffer&& __c)
- _NOEXCEPT_((__alloc_traits::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value) ||
- !__alloc_traits::propagate_on_container_move_assignment::value)
-{
- clear();
- shrink_to_fit();
- __first_ = __c.__first_;
- __begin_ = __c.__begin_;
- __end_ = __c.__end_;
- __end_cap() = __c.__end_cap();
- __move_assign_alloc(__c,
- integral_constant<bool,
- __alloc_traits::propagate_on_container_move_assignment::value>());
- __c.__first_ = __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr;
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Allocator>
-void
-__split_buffer<_Tp, _Allocator>::swap(__split_buffer& __x)
- _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value||
- __is_nothrow_swappable<__alloc_rr>::value)
-{
- _VSTD::swap(__first_, __x.__first_);
- _VSTD::swap(__begin_, __x.__begin_);
- _VSTD::swap(__end_, __x.__end_);
- _VSTD::swap(__end_cap(), __x.__end_cap());
- __swap_allocator(__alloc(), __x.__alloc());
-}
-
-template <class _Tp, class _Allocator>
-void
-__split_buffer<_Tp, _Allocator>::reserve(size_type __n)
-{
- if (__n < capacity())
- {
- __split_buffer<value_type, __alloc_rr&> __t(__n, 0, __alloc());
- __t.__construct_at_end(move_iterator<pointer>(__begin_),
- move_iterator<pointer>(__end_));
- _VSTD::swap(__first_, __t.__first_);
- _VSTD::swap(__begin_, __t.__begin_);
- _VSTD::swap(__end_, __t.__end_);
- _VSTD::swap(__end_cap(), __t.__end_cap());
- }
-}
-
-template <class _Tp, class _Allocator>
-void
-__split_buffer<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
-{
- if (capacity() > size())
- {
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- __split_buffer<value_type, __alloc_rr&> __t(size(), 0, __alloc());
- __t.__construct_at_end(move_iterator<pointer>(__begin_),
- move_iterator<pointer>(__end_));
- __t.__end_ = __t.__begin_ + (__end_ - __begin_);
- _VSTD::swap(__first_, __t.__first_);
- _VSTD::swap(__begin_, __t.__begin_);
- _VSTD::swap(__end_, __t.__end_);
- _VSTD::swap(__end_cap(), __t.__end_cap());
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
-}
-
-template <class _Tp, class _Allocator>
-void
-__split_buffer<_Tp, _Allocator>::push_front(const_reference __x)
-{
- if (__begin_ == __first_)
- {
- if (__end_ < __end_cap())
- {
- difference_type __d = __end_cap() - __end_;
- __d = (__d + 1) / 2;
- __begin_ = _VSTD::move_backward(__begin_, __end_, __end_ + __d);
- __end_ += __d;
- }
- else
- {
- size_type __c = max<size_type>(2 * static_cast<size_t>(__end_cap() - __first_), 1);
- __split_buffer<value_type, __alloc_rr&> __t(__c, (__c + 3) / 4, __alloc());
- __t.__construct_at_end(move_iterator<pointer>(__begin_),
- move_iterator<pointer>(__end_));
- _VSTD::swap(__first_, __t.__first_);
- _VSTD::swap(__begin_, __t.__begin_);
- _VSTD::swap(__end_, __t.__end_);
- _VSTD::swap(__end_cap(), __t.__end_cap());
- }
- }
- __alloc_traits::construct(__alloc(), _VSTD::__to_raw_pointer(__begin_-1), __x);
- --__begin_;
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Allocator>
-void
-__split_buffer<_Tp, _Allocator>::push_front(value_type&& __x)
-{
- if (__begin_ == __first_)
- {
- if (__end_ < __end_cap())
- {
- difference_type __d = __end_cap() - __end_;
- __d = (__d + 1) / 2;
- __begin_ = _VSTD::move_backward(__begin_, __end_, __end_ + __d);
- __end_ += __d;
- }
- else
- {
- size_type __c = max<size_type>(2 * static_cast<size_t>(__end_cap() - __first_), 1);
- __split_buffer<value_type, __alloc_rr&> __t(__c, (__c + 3) / 4, __alloc());
- __t.__construct_at_end(move_iterator<pointer>(__begin_),
- move_iterator<pointer>(__end_));
- _VSTD::swap(__first_, __t.__first_);
- _VSTD::swap(__begin_, __t.__begin_);
- _VSTD::swap(__end_, __t.__end_);
- _VSTD::swap(__end_cap(), __t.__end_cap());
- }
- }
- __alloc_traits::construct(__alloc(), _VSTD::__to_raw_pointer(__begin_-1),
- _VSTD::move(__x));
- --__begin_;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-__split_buffer<_Tp, _Allocator>::push_back(const_reference __x)
-{
- if (__end_ == __end_cap())
- {
- if (__begin_ > __first_)
- {
- difference_type __d = __begin_ - __first_;
- __d = (__d + 1) / 2;
- __end_ = _VSTD::move(__begin_, __end_, __begin_ - __d);
- __begin_ -= __d;
- }
- else
- {
- size_type __c = max<size_type>(2 * static_cast<size_t>(__end_cap() - __first_), 1);
- __split_buffer<value_type, __alloc_rr&> __t(__c, __c / 4, __alloc());
- __t.__construct_at_end(move_iterator<pointer>(__begin_),
- move_iterator<pointer>(__end_));
- _VSTD::swap(__first_, __t.__first_);
- _VSTD::swap(__begin_, __t.__begin_);
- _VSTD::swap(__end_, __t.__end_);
- _VSTD::swap(__end_cap(), __t.__end_cap());
- }
- }
- __alloc_traits::construct(__alloc(), _VSTD::__to_raw_pointer(__end_), __x);
- ++__end_;
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Allocator>
-void
-__split_buffer<_Tp, _Allocator>::push_back(value_type&& __x)
-{
- if (__end_ == __end_cap())
- {
- if (__begin_ > __first_)
- {
- difference_type __d = __begin_ - __first_;
- __d = (__d + 1) / 2;
- __end_ = _VSTD::move(__begin_, __end_, __begin_ - __d);
- __begin_ -= __d;
- }
- else
- {
- size_type __c = max<size_type>(2 * static_cast<size_t>(__end_cap() - __first_), 1);
- __split_buffer<value_type, __alloc_rr&> __t(__c, __c / 4, __alloc());
- __t.__construct_at_end(move_iterator<pointer>(__begin_),
- move_iterator<pointer>(__end_));
- _VSTD::swap(__first_, __t.__first_);
- _VSTD::swap(__begin_, __t.__begin_);
- _VSTD::swap(__end_, __t.__end_);
- _VSTD::swap(__end_cap(), __t.__end_cap());
- }
- }
- __alloc_traits::construct(__alloc(), _VSTD::__to_raw_pointer(__end_),
- _VSTD::move(__x));
- ++__end_;
-}
-
-template <class _Tp, class _Allocator>
-template <class... _Args>
-void
-__split_buffer<_Tp, _Allocator>::emplace_back(_Args&&... __args)
-{
- if (__end_ == __end_cap())
- {
- if (__begin_ > __first_)
- {
- difference_type __d = __begin_ - __first_;
- __d = (__d + 1) / 2;
- __end_ = _VSTD::move(__begin_, __end_, __begin_ - __d);
- __begin_ -= __d;
- }
- else
- {
- size_type __c = max<size_type>(2 * static_cast<size_t>(__end_cap() - __first_), 1);
- __split_buffer<value_type, __alloc_rr&> __t(__c, __c / 4, __alloc());
- __t.__construct_at_end(move_iterator<pointer>(__begin_),
- move_iterator<pointer>(__end_));
- _VSTD::swap(__first_, __t.__first_);
- _VSTD::swap(__begin_, __t.__begin_);
- _VSTD::swap(__end_, __t.__end_);
- _VSTD::swap(__end_cap(), __t.__end_cap());
- }
- }
- __alloc_traits::construct(__alloc(), _VSTD::__to_raw_pointer(__end_),
- _VSTD::forward<_Args>(__args)...);
- ++__end_;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(__split_buffer<_Tp, _Allocator>& __x, __split_buffer<_Tp, _Allocator>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_SPLIT_BUFFER
diff --git a/lib/libcxx/include/__sso_allocator b/lib/libcxx/include/__sso_allocator
deleted file mode 100644
index 8aca0495d75..00000000000
--- a/lib/libcxx/include/__sso_allocator
+++ /dev/null
@@ -1,77 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP___SSO_ALLOCATOR
-#define _LIBCPP___SSO_ALLOCATOR
-
-#include <__config>
-#include <type_traits>
-#include <new>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Tp, size_t _Np> class _LIBCPP_HIDDEN __sso_allocator;
-
-template <size_t _Np>
-class _LIBCPP_HIDDEN __sso_allocator<void, _Np>
-{
-public:
- typedef const void* const_pointer;
- typedef void value_type;
-};
-
-template <class _Tp, size_t _Np>
-class _LIBCPP_HIDDEN __sso_allocator
-{
- typename aligned_storage<sizeof(_Tp) * _Np>::type buf_;
- bool __allocated_;
-public:
- typedef size_t size_type;
- typedef _Tp* pointer;
- typedef _Tp value_type;
-
- _LIBCPP_INLINE_VISIBILITY __sso_allocator() throw() : __allocated_(false) {}
- _LIBCPP_INLINE_VISIBILITY __sso_allocator(const __sso_allocator&) throw() : __allocated_(false) {}
- template <class _Up> _LIBCPP_INLINE_VISIBILITY __sso_allocator(const __sso_allocator<_Up, _Np>&) throw()
- : __allocated_(false) {}
-private:
- __sso_allocator& operator=(const __sso_allocator&);
-public:
- _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, typename __sso_allocator<void, _Np>::const_pointer = 0)
- {
- if (!__allocated_ && __n <= _Np)
- {
- __allocated_ = true;
- return (pointer)&buf_;
- }
- return static_cast<pointer>(_VSTD::__libcpp_allocate(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)));
- }
- _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type __n)
- {
- if (__p == (pointer)&buf_)
- __allocated_ = false;
- else
- _VSTD::__libcpp_deallocate(__p, __n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
- }
- _LIBCPP_INLINE_VISIBILITY size_type max_size() const throw() {return size_type(~0) / sizeof(_Tp);}
-
- _LIBCPP_INLINE_VISIBILITY
- bool operator==(__sso_allocator& __a) const {return &buf_ == &__a.buf_;}
- _LIBCPP_INLINE_VISIBILITY
- bool operator!=(__sso_allocator& __a) const {return &buf_ != &__a.buf_;}
-};
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP___SSO_ALLOCATOR
diff --git a/lib/libcxx/include/__std_stream b/lib/libcxx/include/__std_stream
deleted file mode 100644
index db90795f66f..00000000000
--- a/lib/libcxx/include/__std_stream
+++ /dev/null
@@ -1,362 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP___STD_STREAM
-#define _LIBCPP___STD_STREAM
-
-#include <__config>
-#include <ostream>
-#include <istream>
-#include <__locale>
-#include <cstdio>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-static const int __limit = 8;
-
-// __stdinbuf
-
-template <class _CharT>
-class _LIBCPP_HIDDEN __stdinbuf
- : public basic_streambuf<_CharT, char_traits<_CharT> >
-{
-public:
- typedef _CharT char_type;
- typedef char_traits<char_type> traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
- typedef typename traits_type::state_type state_type;
-
- __stdinbuf(FILE* __fp, state_type* __st);
-
-protected:
- virtual int_type underflow();
- virtual int_type uflow();
- virtual int_type pbackfail(int_type __c = traits_type::eof());
- virtual void imbue(const locale& __loc);
-
-private:
-
- FILE* __file_;
- const codecvt<char_type, char, state_type>* __cv_;
- state_type* __st_;
- int __encoding_;
- int_type __last_consumed_;
- bool __last_consumed_is_next_;
- bool __always_noconv_;
-
- __stdinbuf(const __stdinbuf&);
- __stdinbuf& operator=(const __stdinbuf&);
-
- int_type __getchar(bool __consume);
-};
-
-template <class _CharT>
-__stdinbuf<_CharT>::__stdinbuf(FILE* __fp, state_type* __st)
- : __file_(__fp),
- __st_(__st),
- __last_consumed_(traits_type::eof()),
- __last_consumed_is_next_(false)
-{
- imbue(this->getloc());
-}
-
-template <class _CharT>
-void
-__stdinbuf<_CharT>::imbue(const locale& __loc)
-{
- __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc);
- __encoding_ = __cv_->encoding();
- __always_noconv_ = __cv_->always_noconv();
- if (__encoding_ > __limit)
- __throw_runtime_error("unsupported locale for standard input");
-}
-
-template <class _CharT>
-typename __stdinbuf<_CharT>::int_type
-__stdinbuf<_CharT>::underflow()
-{
- return __getchar(false);
-}
-
-template <class _CharT>
-typename __stdinbuf<_CharT>::int_type
-__stdinbuf<_CharT>::uflow()
-{
- return __getchar(true);
-}
-
-template <class _CharT>
-typename __stdinbuf<_CharT>::int_type
-__stdinbuf<_CharT>::__getchar(bool __consume)
-{
- if (__last_consumed_is_next_)
- {
- int_type __result = __last_consumed_;
- if (__consume)
- {
- __last_consumed_ = traits_type::eof();
- __last_consumed_is_next_ = false;
- }
- return __result;
- }
- char __extbuf[__limit];
- int __nread = _VSTD::max(1, __encoding_);
- for (int __i = 0; __i < __nread; ++__i)
- {
- int __c = getc(__file_);
- if (__c == EOF)
- return traits_type::eof();
- __extbuf[__i] = static_cast<char>(__c);
- }
- char_type __1buf;
- if (__always_noconv_)
- __1buf = static_cast<char_type>(__extbuf[0]);
- else
- {
- const char* __enxt;
- char_type* __inxt;
- codecvt_base::result __r;
- do
- {
- state_type __sv_st = *__st_;
- __r = __cv_->in(*__st_, __extbuf, __extbuf + __nread, __enxt,
- &__1buf, &__1buf + 1, __inxt);
- switch (__r)
- {
- case _VSTD::codecvt_base::ok:
- break;
- case codecvt_base::partial:
- *__st_ = __sv_st;
- if (__nread == sizeof(__extbuf))
- return traits_type::eof();
- {
- int __c = getc(__file_);
- if (__c == EOF)
- return traits_type::eof();
- __extbuf[__nread] = static_cast<char>(__c);
- }
- ++__nread;
- break;
- case codecvt_base::error:
- return traits_type::eof();
- case _VSTD::codecvt_base::noconv:
- __1buf = static_cast<char_type>(__extbuf[0]);
- break;
- }
- } while (__r == _VSTD::codecvt_base::partial);
- }
- if (!__consume)
- {
- for (int __i = __nread; __i > 0;)
- {
- if (ungetc(traits_type::to_int_type(__extbuf[--__i]), __file_) == EOF)
- return traits_type::eof();
- }
- }
- else
- __last_consumed_ = traits_type::to_int_type(__1buf);
- return traits_type::to_int_type(__1buf);
-}
-
-template <class _CharT>
-typename __stdinbuf<_CharT>::int_type
-__stdinbuf<_CharT>::pbackfail(int_type __c)
-{
- if (traits_type::eq_int_type(__c, traits_type::eof()))
- {
- if (!__last_consumed_is_next_)
- {
- __c = __last_consumed_;
- __last_consumed_is_next_ = !traits_type::eq_int_type(__last_consumed_,
- traits_type::eof());
- }
- return __c;
- }
- if (__last_consumed_is_next_)
- {
- char __extbuf[__limit];
- char* __enxt;
- const char_type __ci = traits_type::to_char_type(__last_consumed_);
- const char_type* __inxt;
- switch (__cv_->out(*__st_, &__ci, &__ci + 1, __inxt,
- __extbuf, __extbuf + sizeof(__extbuf), __enxt))
- {
- case _VSTD::codecvt_base::ok:
- break;
- case _VSTD::codecvt_base::noconv:
- __extbuf[0] = static_cast<char>(__last_consumed_);
- __enxt = __extbuf + 1;
- break;
- case codecvt_base::partial:
- case codecvt_base::error:
- return traits_type::eof();
- }
- while (__enxt > __extbuf)
- if (ungetc(*--__enxt, __file_) == EOF)
- return traits_type::eof();
- }
- __last_consumed_ = __c;
- __last_consumed_is_next_ = true;
- return __c;
-}
-
-// __stdoutbuf
-
-template <class _CharT>
-class _LIBCPP_HIDDEN __stdoutbuf
- : public basic_streambuf<_CharT, char_traits<_CharT> >
-{
-public:
- typedef _CharT char_type;
- typedef char_traits<char_type> traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
- typedef typename traits_type::state_type state_type;
-
- __stdoutbuf(FILE* __fp, state_type* __st);
-
-protected:
- virtual int_type overflow (int_type __c = traits_type::eof());
- virtual streamsize xsputn(const char_type* __s, streamsize __n);
- virtual int sync();
- virtual void imbue(const locale& __loc);
-
-private:
- FILE* __file_;
- const codecvt<char_type, char, state_type>* __cv_;
- state_type* __st_;
- bool __always_noconv_;
-
- __stdoutbuf(const __stdoutbuf&);
- __stdoutbuf& operator=(const __stdoutbuf&);
-};
-
-template <class _CharT>
-__stdoutbuf<_CharT>::__stdoutbuf(FILE* __fp, state_type* __st)
- : __file_(__fp),
- __cv_(&use_facet<codecvt<char_type, char, state_type> >(this->getloc())),
- __st_(__st),
- __always_noconv_(__cv_->always_noconv())
-{
-}
-
-template <class _CharT>
-typename __stdoutbuf<_CharT>::int_type
-__stdoutbuf<_CharT>::overflow(int_type __c)
-{
- char __extbuf[__limit];
- char_type __1buf;
- if (!traits_type::eq_int_type(__c, traits_type::eof()))
- {
- __1buf = traits_type::to_char_type(__c);
- if (__always_noconv_)
- {
- if (fwrite(&__1buf, sizeof(char_type), 1, __file_) != 1)
- return traits_type::eof();
- }
- else
- {
- char* __extbe = __extbuf;
- codecvt_base::result __r;
- char_type* pbase = &__1buf;
- char_type* pptr = pbase + 1;
- do
- {
- const char_type* __e;
- __r = __cv_->out(*__st_, pbase, pptr, __e,
- __extbuf,
- __extbuf + sizeof(__extbuf),
- __extbe);
- if (__e == pbase)
- return traits_type::eof();
- if (__r == codecvt_base::noconv)
- {
- if (fwrite(pbase, 1, 1, __file_) != 1)
- return traits_type::eof();
- }
- else if (__r == codecvt_base::ok || __r == codecvt_base::partial)
- {
- size_t __nmemb = static_cast<size_t>(__extbe - __extbuf);
- if (fwrite(__extbuf, 1, __nmemb, __file_) != __nmemb)
- return traits_type::eof();
- if (__r == codecvt_base::partial)
- {
- pbase = const_cast<char_type*>(__e);
- }
- }
- else
- return traits_type::eof();
- } while (__r == codecvt_base::partial);
- }
- }
- return traits_type::not_eof(__c);
-}
-
-template <class _CharT>
-streamsize
-__stdoutbuf<_CharT>::xsputn(const char_type* __s, streamsize __n)
-{
- if (__always_noconv_)
- return fwrite(__s, sizeof(char_type), __n, __file_);
- streamsize __i = 0;
- for (; __i < __n; ++__i, ++__s)
- if (overflow(traits_type::to_int_type(*__s)) == traits_type::eof())
- break;
- return __i;
-}
-
-template <class _CharT>
-int
-__stdoutbuf<_CharT>::sync()
-{
- char __extbuf[__limit];
- codecvt_base::result __r;
- do
- {
- char* __extbe;
- __r = __cv_->unshift(*__st_, __extbuf,
- __extbuf + sizeof(__extbuf),
- __extbe);
- size_t __nmemb = static_cast<size_t>(__extbe - __extbuf);
- if (fwrite(__extbuf, 1, __nmemb, __file_) != __nmemb)
- return -1;
- } while (__r == codecvt_base::partial);
- if (__r == codecvt_base::error)
- return -1;
- if (fflush(__file_))
- return -1;
- return 0;
-}
-
-template <class _CharT>
-void
-__stdoutbuf<_CharT>::imbue(const locale& __loc)
-{
- sync();
- __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc);
- __always_noconv_ = __cv_->always_noconv();
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP___STD_STREAM
diff --git a/lib/libcxx/include/__string b/lib/libcxx/include/__string
deleted file mode 100644
index 1ddeec7149f..00000000000
--- a/lib/libcxx/include/__string
+++ /dev/null
@@ -1,974 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- __string ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP___STRING
-#define _LIBCPP___STRING
-
-/*
- string synopsis
-
-namespace std
-{
-
-template <class charT>
-struct char_traits
-{
- typedef charT char_type;
- typedef ... int_type;
- typedef streamoff off_type;
- typedef streampos pos_type;
- typedef mbstate_t state_type;
-
- static constexpr void assign(char_type& c1, const char_type& c2) noexcept;
- static constexpr bool eq(char_type c1, char_type c2) noexcept;
- static constexpr bool lt(char_type c1, char_type c2) noexcept;
-
- static constexpr int compare(const char_type* s1, const char_type* s2, size_t n);
- static constexpr size_t length(const char_type* s);
- static constexpr const char_type*
- find(const char_type* s, size_t n, const char_type& a);
- static char_type* move(char_type* s1, const char_type* s2, size_t n);
- static char_type* copy(char_type* s1, const char_type* s2, size_t n);
- static char_type* assign(char_type* s, size_t n, char_type a);
-
- static constexpr int_type not_eof(int_type c) noexcept;
- static constexpr char_type to_char_type(int_type c) noexcept;
- static constexpr int_type to_int_type(char_type c) noexcept;
- static constexpr bool eq_int_type(int_type c1, int_type c2) noexcept;
- static constexpr int_type eof() noexcept;
-};
-
-template <> struct char_traits<char>;
-template <> struct char_traits<wchar_t>;
-template <> struct char_traits<char8_t>; // c++20
-
-} // std
-
-*/
-
-#include <__config>
-#include <algorithm> // for search and min
-#include <cstdio> // For EOF.
-#include <memory> // for __murmur2_or_cityhash
-
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-// char_traits
-
-template <class _CharT>
-struct _LIBCPP_TEMPLATE_VIS char_traits
-{
- typedef _CharT char_type;
- typedef int int_type;
- typedef streamoff off_type;
- typedef streampos pos_type;
- typedef mbstate_t state_type;
-
- static inline void _LIBCPP_CONSTEXPR_AFTER_CXX14
- assign(char_type& __c1, const char_type& __c2) _NOEXCEPT {__c1 = __c2;}
- static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
- {return __c1 == __c2;}
- static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
- {return __c1 < __c2;}
-
- static _LIBCPP_CONSTEXPR_AFTER_CXX14
- int compare(const char_type* __s1, const char_type* __s2, size_t __n);
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR_AFTER_CXX14
- size_t length(const char_type* __s);
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR_AFTER_CXX14
- const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
- static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
- _LIBCPP_INLINE_VISIBILITY
- static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
- _LIBCPP_INLINE_VISIBILITY
- static char_type* assign(char_type* __s, size_t __n, char_type __a);
-
- static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
- {return eq_int_type(__c, eof()) ? ~eof() : __c;}
- static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
- {return char_type(__c);}
- static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
- {return int_type(__c);}
- static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
- {return __c1 == __c2;}
- static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
- {return int_type(EOF);}
-};
-
-template <class _CharT>
-_LIBCPP_CONSTEXPR_AFTER_CXX14 int
-char_traits<_CharT>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
-{
- for (; __n; --__n, ++__s1, ++__s2)
- {
- if (lt(*__s1, *__s2))
- return -1;
- if (lt(*__s2, *__s1))
- return 1;
- }
- return 0;
-}
-
-template <class _CharT>
-inline
-_LIBCPP_CONSTEXPR_AFTER_CXX14 size_t
-char_traits<_CharT>::length(const char_type* __s)
-{
- size_t __len = 0;
- for (; !eq(*__s, char_type(0)); ++__s)
- ++__len;
- return __len;
-}
-
-template <class _CharT>
-inline
-_LIBCPP_CONSTEXPR_AFTER_CXX14 const _CharT*
-char_traits<_CharT>::find(const char_type* __s, size_t __n, const char_type& __a)
-{
- for (; __n; --__n)
- {
- if (eq(*__s, __a))
- return __s;
- ++__s;
- }
- return 0;
-}
-
-template <class _CharT>
-_CharT*
-char_traits<_CharT>::move(char_type* __s1, const char_type* __s2, size_t __n)
-{
- char_type* __r = __s1;
- if (__s1 < __s2)
- {
- for (; __n; --__n, ++__s1, ++__s2)
- assign(*__s1, *__s2);
- }
- else if (__s2 < __s1)
- {
- __s1 += __n;
- __s2 += __n;
- for (; __n; --__n)
- assign(*--__s1, *--__s2);
- }
- return __r;
-}
-
-template <class _CharT>
-inline
-_CharT*
-char_traits<_CharT>::copy(char_type* __s1, const char_type* __s2, size_t __n)
-{
- _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
- char_type* __r = __s1;
- for (; __n; --__n, ++__s1, ++__s2)
- assign(*__s1, *__s2);
- return __r;
-}
-
-template <class _CharT>
-inline
-_CharT*
-char_traits<_CharT>::assign(char_type* __s, size_t __n, char_type __a)
-{
- char_type* __r = __s;
- for (; __n; --__n, ++__s)
- assign(*__s, __a);
- return __r;
-}
-
-// char_traits<char>
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS char_traits<char>
-{
- typedef char char_type;
- typedef int int_type;
- typedef streamoff off_type;
- typedef streampos pos_type;
- typedef mbstate_t state_type;
-
- static inline _LIBCPP_CONSTEXPR_AFTER_CXX14
- void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT {__c1 = __c2;}
- static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
- {return __c1 == __c2;}
- static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
- {return (unsigned char)__c1 < (unsigned char)__c2;}
-
- static _LIBCPP_CONSTEXPR_AFTER_CXX14
- int compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
- static inline size_t _LIBCPP_CONSTEXPR_AFTER_CXX14
- length(const char_type* __s) _NOEXCEPT {return __builtin_strlen(__s);}
- static _LIBCPP_CONSTEXPR_AFTER_CXX14
- const char_type* find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT;
- static inline char_type* move(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
- {return __n == 0 ? __s1 : (char_type*) memmove(__s1, __s2, __n);}
- static inline char_type* copy(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
- {
- _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
- return __n == 0 ? __s1 : (char_type*)memcpy(__s1, __s2, __n);
- }
- static inline char_type* assign(char_type* __s, size_t __n, char_type __a) _NOEXCEPT
- {return __n == 0 ? __s : (char_type*)memset(__s, to_int_type(__a), __n);}
-
- static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
- {return eq_int_type(__c, eof()) ? ~eof() : __c;}
- static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
- {return char_type(__c);}
- static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
- {return int_type((unsigned char)__c);}
- static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
- {return __c1 == __c2;}
- static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
- {return int_type(EOF);}
-};
-
-inline _LIBCPP_CONSTEXPR_AFTER_CXX14
-int
-char_traits<char>::compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
-{
- if (__n == 0)
- return 0;
-#if __has_feature(cxx_constexpr_string_builtins)
- return __builtin_memcmp(__s1, __s2, __n);
-#elif _LIBCPP_STD_VER <= 14
- return memcmp(__s1, __s2, __n);
-#else
- for (; __n; --__n, ++__s1, ++__s2)
- {
- if (lt(*__s1, *__s2))
- return -1;
- if (lt(*__s2, *__s1))
- return 1;
- }
- return 0;
-#endif
-}
-
-inline _LIBCPP_CONSTEXPR_AFTER_CXX14
-const char*
-char_traits<char>::find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT
-{
- if (__n == 0)
- return nullptr;
-#if __has_feature(cxx_constexpr_string_builtins)
- return __builtin_char_memchr(__s, to_int_type(__a), __n);
-#elif _LIBCPP_STD_VER <= 14
- return (const char_type*) memchr(__s, to_int_type(__a), __n);
-#else
- for (; __n; --__n)
- {
- if (eq(*__s, __a))
- return __s;
- ++__s;
- }
- return nullptr;
-#endif
-}
-
-
-// char_traits<wchar_t>
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS char_traits<wchar_t>
-{
- typedef wchar_t char_type;
- typedef wint_t int_type;
- typedef streamoff off_type;
- typedef streampos pos_type;
- typedef mbstate_t state_type;
-
- static inline _LIBCPP_CONSTEXPR_AFTER_CXX14
- void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT {__c1 = __c2;}
- static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
- {return __c1 == __c2;}
- static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
- {return __c1 < __c2;}
-
- static _LIBCPP_CONSTEXPR_AFTER_CXX14
- int compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
- static _LIBCPP_CONSTEXPR_AFTER_CXX14
- size_t length(const char_type* __s) _NOEXCEPT;
- static _LIBCPP_CONSTEXPR_AFTER_CXX14
- const char_type* find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT;
- static inline char_type* move(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
- {return __n == 0 ? __s1 : (char_type*)wmemmove(__s1, __s2, __n);}
- static inline char_type* copy(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
- {
- _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
- return __n == 0 ? __s1 : (char_type*)wmemcpy(__s1, __s2, __n);
- }
- static inline char_type* assign(char_type* __s, size_t __n, char_type __a) _NOEXCEPT
- {return __n == 0 ? __s : (char_type*)wmemset(__s, __a, __n);}
-
- static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
- {return eq_int_type(__c, eof()) ? ~eof() : __c;}
- static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
- {return char_type(__c);}
- static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
- {return int_type(__c);}
- static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
- {return __c1 == __c2;}
- static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
- {return int_type(WEOF);}
-};
-
-inline _LIBCPP_CONSTEXPR_AFTER_CXX14
-int
-char_traits<wchar_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
-{
- if (__n == 0)
- return 0;
-#if __has_feature(cxx_constexpr_string_builtins)
- return __builtin_wmemcmp(__s1, __s2, __n);
-#elif _LIBCPP_STD_VER <= 14
- return wmemcmp(__s1, __s2, __n);
-#else
- for (; __n; --__n, ++__s1, ++__s2)
- {
- if (lt(*__s1, *__s2))
- return -1;
- if (lt(*__s2, *__s1))
- return 1;
- }
- return 0;
-#endif
-}
-
-inline _LIBCPP_CONSTEXPR_AFTER_CXX14
-size_t
-char_traits<wchar_t>::length(const char_type* __s) _NOEXCEPT
-{
-#if __has_feature(cxx_constexpr_string_builtins)
- return __builtin_wcslen(__s);
-#elif _LIBCPP_STD_VER <= 14
- return wcslen(__s);
-#else
- size_t __len = 0;
- for (; !eq(*__s, char_type(0)); ++__s)
- ++__len;
- return __len;
-#endif
-}
-
-inline _LIBCPP_CONSTEXPR_AFTER_CXX14
-const wchar_t*
-char_traits<wchar_t>::find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT
-{
- if (__n == 0)
- return nullptr;
-#if __has_feature(cxx_constexpr_string_builtins)
- return __builtin_wmemchr(__s, __a, __n);
-#elif _LIBCPP_STD_VER <= 14
- return wmemchr(__s, __a, __n);
-#else
- for (; __n; --__n)
- {
- if (eq(*__s, __a))
- return __s;
- ++__s;
- }
- return nullptr;
-#endif
-}
-
-
-#ifndef _LIBCPP_NO_HAS_CHAR8_T
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS char_traits<char8_t>
-{
- typedef char8_t char_type;
- typedef unsigned int int_type;
- typedef streamoff off_type;
- typedef u8streampos pos_type;
- typedef mbstate_t state_type;
-
- static inline constexpr void assign(char_type& __c1, const char_type& __c2) noexcept
- {__c1 = __c2;}
- static inline constexpr bool eq(char_type __c1, char_type __c2) noexcept
- {return __c1 == __c2;}
- static inline constexpr bool lt(char_type __c1, char_type __c2) noexcept
- {return __c1 < __c2;}
-
- static constexpr
- int compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
-
- static constexpr
- size_t length(const char_type* __s) _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY static constexpr
- const char_type* find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT;
-
- static char_type* move(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
- {return __n == 0 ? __s1 : (char_type*) memmove(__s1, __s2, __n);}
-
- static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
- {
- _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
- return __n == 0 ? __s1 : (char_type*)memcpy(__s1, __s2, __n);
- }
-
- static char_type* assign(char_type* __s, size_t __n, char_type __a) _NOEXCEPT
- {return __n == 0 ? __s : (char_type*)memset(__s, to_int_type(__a), __n);}
-
- static inline constexpr int_type not_eof(int_type __c) noexcept
- {return eq_int_type(__c, eof()) ? ~eof() : __c;}
- static inline constexpr char_type to_char_type(int_type __c) noexcept
- {return char_type(__c);}
- static inline constexpr int_type to_int_type(char_type __c) noexcept
- {return int_type(__c);}
- static inline constexpr bool eq_int_type(int_type __c1, int_type __c2) noexcept
- {return __c1 == __c2;}
- static inline constexpr int_type eof() noexcept
- {return int_type(EOF);}
-};
-
-// TODO use '__builtin_strlen' if it ever supports char8_t ??
-inline constexpr
-size_t
-char_traits<char8_t>::length(const char_type* __s) _NOEXCEPT
-{
- size_t __len = 0;
- for (; !eq(*__s, char_type(0)); ++__s)
- ++__len;
- return __len;
-}
-
-inline constexpr
-int
-char_traits<char8_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
-{
-#if __has_feature(cxx_constexpr_string_builtins)
- return __builtin_memcmp(__s1, __s2, __n);
-#else
- for (; __n; --__n, ++__s1, ++__s2)
- {
- if (lt(*__s1, *__s2))
- return -1;
- if (lt(*__s2, *__s1))
- return 1;
- }
- return 0;
-#endif
-}
-
-// TODO use '__builtin_char_memchr' if it ever supports char8_t ??
-inline constexpr
-const char8_t*
-char_traits<char8_t>::find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT
-{
- for (; __n; --__n)
- {
- if (eq(*__s, __a))
- return __s;
- ++__s;
- }
- return 0;
-}
-
-#endif // #_LIBCPP_NO_HAS_CHAR8_T
-
-#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS char_traits<char16_t>
-{
- typedef char16_t char_type;
- typedef uint_least16_t int_type;
- typedef streamoff off_type;
- typedef u16streampos pos_type;
- typedef mbstate_t state_type;
-
- static inline _LIBCPP_CONSTEXPR_AFTER_CXX14
- void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT {__c1 = __c2;}
- static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
- {return __c1 == __c2;}
- static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
- {return __c1 < __c2;}
-
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR_AFTER_CXX14
- int compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR_AFTER_CXX14
- size_t length(const char_type* __s) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR_AFTER_CXX14
- const char_type* find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- static char_type* move(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- static char_type* assign(char_type* __s, size_t __n, char_type __a) _NOEXCEPT;
-
- static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
- {return eq_int_type(__c, eof()) ? ~eof() : __c;}
- static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
- {return char_type(__c);}
- static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
- {return int_type(__c);}
- static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
- {return __c1 == __c2;}
- static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
- {return int_type(0xFFFF);}
-};
-
-inline _LIBCPP_CONSTEXPR_AFTER_CXX14
-int
-char_traits<char16_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
-{
- for (; __n; --__n, ++__s1, ++__s2)
- {
- if (lt(*__s1, *__s2))
- return -1;
- if (lt(*__s2, *__s1))
- return 1;
- }
- return 0;
-}
-
-inline _LIBCPP_CONSTEXPR_AFTER_CXX14
-size_t
-char_traits<char16_t>::length(const char_type* __s) _NOEXCEPT
-{
- size_t __len = 0;
- for (; !eq(*__s, char_type(0)); ++__s)
- ++__len;
- return __len;
-}
-
-inline _LIBCPP_CONSTEXPR_AFTER_CXX14
-const char16_t*
-char_traits<char16_t>::find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT
-{
- for (; __n; --__n)
- {
- if (eq(*__s, __a))
- return __s;
- ++__s;
- }
- return 0;
-}
-
-inline
-char16_t*
-char_traits<char16_t>::move(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
-{
- char_type* __r = __s1;
- if (__s1 < __s2)
- {
- for (; __n; --__n, ++__s1, ++__s2)
- assign(*__s1, *__s2);
- }
- else if (__s2 < __s1)
- {
- __s1 += __n;
- __s2 += __n;
- for (; __n; --__n)
- assign(*--__s1, *--__s2);
- }
- return __r;
-}
-
-inline
-char16_t*
-char_traits<char16_t>::copy(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
-{
- _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
- char_type* __r = __s1;
- for (; __n; --__n, ++__s1, ++__s2)
- assign(*__s1, *__s2);
- return __r;
-}
-
-inline
-char16_t*
-char_traits<char16_t>::assign(char_type* __s, size_t __n, char_type __a) _NOEXCEPT
-{
- char_type* __r = __s;
- for (; __n; --__n, ++__s)
- assign(*__s, __a);
- return __r;
-}
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS char_traits<char32_t>
-{
- typedef char32_t char_type;
- typedef uint_least32_t int_type;
- typedef streamoff off_type;
- typedef u32streampos pos_type;
- typedef mbstate_t state_type;
-
- static inline _LIBCPP_CONSTEXPR_AFTER_CXX14
- void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT {__c1 = __c2;}
- static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
- {return __c1 == __c2;}
- static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
- {return __c1 < __c2;}
-
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR_AFTER_CXX14
- int compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR_AFTER_CXX14
- size_t length(const char_type* __s) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR_AFTER_CXX14
- const char_type* find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- static char_type* move(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- static char_type* assign(char_type* __s, size_t __n, char_type __a) _NOEXCEPT;
-
- static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
- {return eq_int_type(__c, eof()) ? ~eof() : __c;}
- static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
- {return char_type(__c);}
- static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
- {return int_type(__c);}
- static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
- {return __c1 == __c2;}
- static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
- {return int_type(0xFFFFFFFF);}
-};
-
-inline _LIBCPP_CONSTEXPR_AFTER_CXX14
-int
-char_traits<char32_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
-{
- for (; __n; --__n, ++__s1, ++__s2)
- {
- if (lt(*__s1, *__s2))
- return -1;
- if (lt(*__s2, *__s1))
- return 1;
- }
- return 0;
-}
-
-inline _LIBCPP_CONSTEXPR_AFTER_CXX14
-size_t
-char_traits<char32_t>::length(const char_type* __s) _NOEXCEPT
-{
- size_t __len = 0;
- for (; !eq(*__s, char_type(0)); ++__s)
- ++__len;
- return __len;
-}
-
-inline _LIBCPP_CONSTEXPR_AFTER_CXX14
-const char32_t*
-char_traits<char32_t>::find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT
-{
- for (; __n; --__n)
- {
- if (eq(*__s, __a))
- return __s;
- ++__s;
- }
- return 0;
-}
-
-inline
-char32_t*
-char_traits<char32_t>::move(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
-{
- char_type* __r = __s1;
- if (__s1 < __s2)
- {
- for (; __n; --__n, ++__s1, ++__s2)
- assign(*__s1, *__s2);
- }
- else if (__s2 < __s1)
- {
- __s1 += __n;
- __s2 += __n;
- for (; __n; --__n)
- assign(*--__s1, *--__s2);
- }
- return __r;
-}
-
-inline
-char32_t*
-char_traits<char32_t>::copy(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
-{
- _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
- char_type* __r = __s1;
- for (; __n; --__n, ++__s1, ++__s2)
- assign(*__s1, *__s2);
- return __r;
-}
-
-inline
-char32_t*
-char_traits<char32_t>::assign(char_type* __s, size_t __n, char_type __a) _NOEXCEPT
-{
- char_type* __r = __s;
- for (; __n; --__n, ++__s)
- assign(*__s, __a);
- return __r;
-}
-
-#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
-
-// helper fns for basic_string and string_view
-
-// __str_find
-template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
-inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-__str_find(const _CharT *__p, _SizeT __sz,
- _CharT __c, _SizeT __pos) _NOEXCEPT
-{
- if (__pos >= __sz)
- return __npos;
- const _CharT* __r = _Traits::find(__p + __pos, __sz - __pos, __c);
- if (__r == 0)
- return __npos;
- return static_cast<_SizeT>(__r - __p);
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_CONSTEXPR_AFTER_CXX11 const _CharT *
-__search_substring(const _CharT *__first1, const _CharT *__last1,
- const _CharT *__first2, const _CharT *__last2) {
- // Take advantage of knowing source and pattern lengths.
- // Stop short when source is smaller than pattern.
- const ptrdiff_t __len2 = __last2 - __first2;
- if (__len2 == 0)
- return __first1;
-
- ptrdiff_t __len1 = __last1 - __first1;
- if (__len1 < __len2)
- return __last1;
-
- // First element of __first2 is loop invariant.
- _CharT __f2 = *__first2;
- while (true) {
- __len1 = __last1 - __first1;
- // Check whether __first1 still has at least __len2 bytes.
- if (__len1 < __len2)
- return __last1;
-
- // Find __f2 the first byte matching in __first1.
- __first1 = _Traits::find(__first1, __len1 - __len2 + 1, __f2);
- if (__first1 == 0)
- return __last1;
-
- // It is faster to compare from the first byte of __first1 even if we
- // already know that it matches the first byte of __first2: this is because
- // __first2 is most likely aligned, as it is user's "pattern" string, and
- // __first1 + 1 is most likely not aligned, as the match is in the middle of
- // the string.
- if (_Traits::compare(__first1, __first2, __len2) == 0)
- return __first1;
-
- ++__first1;
- }
-}
-
-template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
-inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-__str_find(const _CharT *__p, _SizeT __sz,
- const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
-{
- if (__pos > __sz)
- return __npos;
-
- if (__n == 0) // There is nothing to search, just return __pos.
- return __pos;
-
- const _CharT *__r = __search_substring<_CharT, _Traits>(
- __p + __pos, __p + __sz, __s, __s + __n);
-
- if (__r == __p + __sz)
- return __npos;
- return static_cast<_SizeT>(__r - __p);
-}
-
-
-// __str_rfind
-
-template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
-inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-__str_rfind(const _CharT *__p, _SizeT __sz,
- _CharT __c, _SizeT __pos) _NOEXCEPT
-{
- if (__sz < 1)
- return __npos;
- if (__pos < __sz)
- ++__pos;
- else
- __pos = __sz;
- for (const _CharT* __ps = __p + __pos; __ps != __p;)
- {
- if (_Traits::eq(*--__ps, __c))
- return static_cast<_SizeT>(__ps - __p);
- }
- return __npos;
-}
-
-template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
-inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-__str_rfind(const _CharT *__p, _SizeT __sz,
- const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
-{
- __pos = _VSTD::min(__pos, __sz);
- if (__n < __sz - __pos)
- __pos += __n;
- else
- __pos = __sz;
- const _CharT* __r = _VSTD::__find_end(
- __p, __p + __pos, __s, __s + __n, _Traits::eq,
- random_access_iterator_tag(), random_access_iterator_tag());
- if (__n > 0 && __r == __p + __pos)
- return __npos;
- return static_cast<_SizeT>(__r - __p);
-}
-
-// __str_find_first_of
-template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
-inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-__str_find_first_of(const _CharT *__p, _SizeT __sz,
- const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
-{
- if (__pos >= __sz || __n == 0)
- return __npos;
- const _CharT* __r = _VSTD::__find_first_of_ce
- (__p + __pos, __p + __sz, __s, __s + __n, _Traits::eq );
- if (__r == __p + __sz)
- return __npos;
- return static_cast<_SizeT>(__r - __p);
-}
-
-
-// __str_find_last_of
-template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
-inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-__str_find_last_of(const _CharT *__p, _SizeT __sz,
- const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
- {
- if (__n != 0)
- {
- if (__pos < __sz)
- ++__pos;
- else
- __pos = __sz;
- for (const _CharT* __ps = __p + __pos; __ps != __p;)
- {
- const _CharT* __r = _Traits::find(__s, __n, *--__ps);
- if (__r)
- return static_cast<_SizeT>(__ps - __p);
- }
- }
- return __npos;
-}
-
-
-// __str_find_first_not_of
-template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
-inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-__str_find_first_not_of(const _CharT *__p, _SizeT __sz,
- const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
-{
- if (__pos < __sz)
- {
- const _CharT* __pe = __p + __sz;
- for (const _CharT* __ps = __p + __pos; __ps != __pe; ++__ps)
- if (_Traits::find(__s, __n, *__ps) == 0)
- return static_cast<_SizeT>(__ps - __p);
- }
- return __npos;
-}
-
-
-template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
-inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-__str_find_first_not_of(const _CharT *__p, _SizeT __sz,
- _CharT __c, _SizeT __pos) _NOEXCEPT
-{
- if (__pos < __sz)
- {
- const _CharT* __pe = __p + __sz;
- for (const _CharT* __ps = __p + __pos; __ps != __pe; ++__ps)
- if (!_Traits::eq(*__ps, __c))
- return static_cast<_SizeT>(__ps - __p);
- }
- return __npos;
-}
-
-
-// __str_find_last_not_of
-template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
-inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-__str_find_last_not_of(const _CharT *__p, _SizeT __sz,
- const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
-{
- if (__pos < __sz)
- ++__pos;
- else
- __pos = __sz;
- for (const _CharT* __ps = __p + __pos; __ps != __p;)
- if (_Traits::find(__s, __n, *--__ps) == 0)
- return static_cast<_SizeT>(__ps - __p);
- return __npos;
-}
-
-
-template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
-inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-__str_find_last_not_of(const _CharT *__p, _SizeT __sz,
- _CharT __c, _SizeT __pos) _NOEXCEPT
-{
- if (__pos < __sz)
- ++__pos;
- else
- __pos = __sz;
- for (const _CharT* __ps = __p + __pos; __ps != __p;)
- if (!_Traits::eq(*--__ps, __c))
- return static_cast<_SizeT>(__ps - __p);
- return __npos;
-}
-
-template<class _Ptr>
-inline _LIBCPP_INLINE_VISIBILITY
-size_t __do_string_hash(_Ptr __p, _Ptr __e)
-{
- typedef typename iterator_traits<_Ptr>::value_type value_type;
- return __murmur2_or_cityhash<size_t>()(__p, (__e-__p)*sizeof(value_type));
-}
-
-template <class _CharT, class _Iter, class _Traits=char_traits<_CharT> >
-struct __quoted_output_proxy
-{
- _Iter __first;
- _Iter __last;
- _CharT __delim;
- _CharT __escape;
-
- __quoted_output_proxy(_Iter __f, _Iter __l, _CharT __d, _CharT __e)
- : __first(__f), __last(__l), __delim(__d), __escape(__e) {}
- // This would be a nice place for a string_ref
-};
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP___STRING
diff --git a/lib/libcxx/include/__threading_support b/lib/libcxx/include/__threading_support
deleted file mode 100644
index 20249006272..00000000000
--- a/lib/libcxx/include/__threading_support
+++ /dev/null
@@ -1,402 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_THREADING_SUPPORT
-#define _LIBCPP_THREADING_SUPPORT
-
-#include <__config>
-#include <chrono>
-#include <errno.h>
-
-#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
-#pragma GCC system_header
-#endif
-
-#if defined(_LIBCPP_HAS_THREAD_API_EXTERNAL)
-# include <__external_threading>
-#elif !defined(_LIBCPP_HAS_NO_THREADS)
-
-#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
-# include <pthread.h>
-# include <sched.h>
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-#if defined(_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL) || \
- defined(_LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL) || \
- defined(_LIBCPP_HAS_THREAD_API_WIN32)
-#define _LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_FUNC_VIS
-#else
-#define _LIBCPP_THREAD_ABI_VISIBILITY inline _LIBCPP_INLINE_VISIBILITY
-#endif
-
-#if defined(__FreeBSD__) && defined(__clang__) && __has_attribute(no_thread_safety_analysis)
-#define _LIBCPP_NO_THREAD_SAFETY_ANALYSIS __attribute__((no_thread_safety_analysis))
-#else
-#define _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
-// Mutex
-typedef pthread_mutex_t __libcpp_mutex_t;
-#define _LIBCPP_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
-
-typedef pthread_mutex_t __libcpp_recursive_mutex_t;
-
-// Condition Variable
-typedef pthread_cond_t __libcpp_condvar_t;
-#define _LIBCPP_CONDVAR_INITIALIZER PTHREAD_COND_INITIALIZER
-
-// Execute once
-typedef pthread_once_t __libcpp_exec_once_flag;
-#define _LIBCPP_EXEC_ONCE_INITIALIZER PTHREAD_ONCE_INIT
-
-// Thread id
-typedef pthread_t __libcpp_thread_id;
-
-// Thread
-#define _LIBCPP_NULL_THREAD 0U
-
-typedef pthread_t __libcpp_thread_t;
-
-// Thread Local Storage
-typedef pthread_key_t __libcpp_tls_key;
-
-#define _LIBCPP_TLS_DESTRUCTOR_CC
-#else
-// Mutex
-typedef void* __libcpp_mutex_t;
-#define _LIBCPP_MUTEX_INITIALIZER 0
-
-#if defined(_M_IX86) || defined(__i386__) || defined(_M_ARM) || defined(__arm__)
-typedef void* __libcpp_recursive_mutex_t[6];
-#elif defined(_M_AMD64) || defined(__x86_64__) || defined(_M_ARM64) || defined(__aarch64__)
-typedef void* __libcpp_recursive_mutex_t[5];
-#else
-# error Unsupported architecture
-#endif
-
-// Condition Variable
-typedef void* __libcpp_condvar_t;
-#define _LIBCPP_CONDVAR_INITIALIZER 0
-
-// Execute Once
-typedef void* __libcpp_exec_once_flag;
-#define _LIBCPP_EXEC_ONCE_INITIALIZER 0
-
-// Thread ID
-typedef long __libcpp_thread_id;
-
-// Thread
-#define _LIBCPP_NULL_THREAD 0U
-
-typedef void* __libcpp_thread_t;
-
-// Thread Local Storage
-typedef long __libcpp_tls_key;
-
-#define _LIBCPP_TLS_DESTRUCTOR_CC __stdcall
-#endif
-
-// Mutex
-_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t *__m);
-
-_LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
-int __libcpp_recursive_mutex_lock(__libcpp_recursive_mutex_t *__m);
-
-_LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
-bool __libcpp_recursive_mutex_trylock(__libcpp_recursive_mutex_t *__m);
-
-_LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
-int __libcpp_recursive_mutex_unlock(__libcpp_recursive_mutex_t *__m);
-
-_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_recursive_mutex_destroy(__libcpp_recursive_mutex_t *__m);
-
-_LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
-int __libcpp_mutex_lock(__libcpp_mutex_t *__m);
-
-_LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
-bool __libcpp_mutex_trylock(__libcpp_mutex_t *__m);
-
-_LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
-int __libcpp_mutex_unlock(__libcpp_mutex_t *__m);
-
-_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_mutex_destroy(__libcpp_mutex_t *__m);
-
-// Condition variable
-_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_condvar_signal(__libcpp_condvar_t* __cv);
-
-_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_condvar_broadcast(__libcpp_condvar_t* __cv);
-
-_LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
-int __libcpp_condvar_wait(__libcpp_condvar_t* __cv, __libcpp_mutex_t* __m);
-
-_LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
-int __libcpp_condvar_timedwait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m,
- timespec *__ts);
-
-_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_condvar_destroy(__libcpp_condvar_t* __cv);
-
-// Execute once
-_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_execute_once(__libcpp_exec_once_flag *flag,
- void (*init_routine)(void));
-
-// Thread id
-_LIBCPP_THREAD_ABI_VISIBILITY
-bool __libcpp_thread_id_equal(__libcpp_thread_id t1, __libcpp_thread_id t2);
-
-_LIBCPP_THREAD_ABI_VISIBILITY
-bool __libcpp_thread_id_less(__libcpp_thread_id t1, __libcpp_thread_id t2);
-
-// Thread
-_LIBCPP_THREAD_ABI_VISIBILITY
-bool __libcpp_thread_isnull(const __libcpp_thread_t *__t);
-
-_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_thread_create(__libcpp_thread_t *__t, void *(*__func)(void *),
- void *__arg);
-
-_LIBCPP_THREAD_ABI_VISIBILITY
-__libcpp_thread_id __libcpp_thread_get_current_id();
-
-_LIBCPP_THREAD_ABI_VISIBILITY
-__libcpp_thread_id __libcpp_thread_get_id(const __libcpp_thread_t *__t);
-
-_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_thread_join(__libcpp_thread_t *__t);
-
-_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_thread_detach(__libcpp_thread_t *__t);
-
-_LIBCPP_THREAD_ABI_VISIBILITY
-void __libcpp_thread_yield();
-
-_LIBCPP_THREAD_ABI_VISIBILITY
-void __libcpp_thread_sleep_for(const chrono::nanoseconds& __ns);
-
-// Thread local storage
-_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_tls_create(__libcpp_tls_key* __key,
- void(_LIBCPP_TLS_DESTRUCTOR_CC* __at_exit)(void*));
-
-_LIBCPP_THREAD_ABI_VISIBILITY
-void *__libcpp_tls_get(__libcpp_tls_key __key);
-
-_LIBCPP_THREAD_ABI_VISIBILITY
-int __libcpp_tls_set(__libcpp_tls_key __key, void *__p);
-
-#if (!defined(_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL) || \
- defined(_LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL)) && \
- defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
-
-int __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t *__m)
-{
- pthread_mutexattr_t attr;
- int __ec = pthread_mutexattr_init(&attr);
- if (__ec)
- return __ec;
- __ec = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
- if (__ec) {
- pthread_mutexattr_destroy(&attr);
- return __ec;
- }
- __ec = pthread_mutex_init(__m, &attr);
- if (__ec) {
- pthread_mutexattr_destroy(&attr);
- return __ec;
- }
- __ec = pthread_mutexattr_destroy(&attr);
- if (__ec) {
- pthread_mutex_destroy(__m);
- return __ec;
- }
- return 0;
-}
-
-int __libcpp_recursive_mutex_lock(__libcpp_recursive_mutex_t *__m)
-{
- return pthread_mutex_lock(__m);
-}
-
-bool __libcpp_recursive_mutex_trylock(__libcpp_recursive_mutex_t *__m)
-{
- return pthread_mutex_trylock(__m) == 0;
-}
-
-int __libcpp_recursive_mutex_unlock(__libcpp_mutex_t *__m)
-{
- return pthread_mutex_unlock(__m);
-}
-
-int __libcpp_recursive_mutex_destroy(__libcpp_recursive_mutex_t *__m)
-{
- return pthread_mutex_destroy(__m);
-}
-
-int __libcpp_mutex_lock(__libcpp_mutex_t *__m)
-{
- return pthread_mutex_lock(__m);
-}
-
-bool __libcpp_mutex_trylock(__libcpp_mutex_t *__m)
-{
- return pthread_mutex_trylock(__m) == 0;
-}
-
-int __libcpp_mutex_unlock(__libcpp_mutex_t *__m)
-{
- return pthread_mutex_unlock(__m);
-}
-
-int __libcpp_mutex_destroy(__libcpp_mutex_t *__m)
-{
- return pthread_mutex_destroy(__m);
-}
-
-// Condition Variable
-int __libcpp_condvar_signal(__libcpp_condvar_t *__cv)
-{
- return pthread_cond_signal(__cv);
-}
-
-int __libcpp_condvar_broadcast(__libcpp_condvar_t *__cv)
-{
- return pthread_cond_broadcast(__cv);
-}
-
-int __libcpp_condvar_wait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m)
-{
- return pthread_cond_wait(__cv, __m);
-}
-
-int __libcpp_condvar_timedwait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m,
- timespec *__ts)
-{
- return pthread_cond_timedwait(__cv, __m, __ts);
-}
-
-int __libcpp_condvar_destroy(__libcpp_condvar_t *__cv)
-{
- return pthread_cond_destroy(__cv);
-}
-
-// Execute once
-int __libcpp_execute_once(__libcpp_exec_once_flag *flag,
- void (*init_routine)(void)) {
- return pthread_once(flag, init_routine);
-}
-
-// Thread id
-// Returns non-zero if the thread ids are equal, otherwise 0
-bool __libcpp_thread_id_equal(__libcpp_thread_id t1, __libcpp_thread_id t2)
-{
- return pthread_equal(t1, t2) != 0;
-}
-
-// Returns non-zero if t1 < t2, otherwise 0
-bool __libcpp_thread_id_less(__libcpp_thread_id t1, __libcpp_thread_id t2)
-{
- return t1 < t2;
-}
-
-// Thread
-bool __libcpp_thread_isnull(const __libcpp_thread_t *__t) {
- return *__t == 0;
-}
-
-int __libcpp_thread_create(__libcpp_thread_t *__t, void *(*__func)(void *),
- void *__arg)
-{
- return pthread_create(__t, 0, __func, __arg);
-}
-
-__libcpp_thread_id __libcpp_thread_get_current_id()
-{
- return pthread_self();
-}
-
-__libcpp_thread_id __libcpp_thread_get_id(const __libcpp_thread_t *__t)
-{
- return *__t;
-}
-
-int __libcpp_thread_join(__libcpp_thread_t *__t)
-{
- return pthread_join(*__t, 0);
-}
-
-int __libcpp_thread_detach(__libcpp_thread_t *__t)
-{
- return pthread_detach(*__t);
-}
-
-void __libcpp_thread_yield()
-{
- sched_yield();
-}
-
-void __libcpp_thread_sleep_for(const chrono::nanoseconds& __ns)
-{
- using namespace chrono;
- seconds __s = duration_cast<seconds>(__ns);
- timespec __ts;
- typedef decltype(__ts.tv_sec) ts_sec;
- _LIBCPP_CONSTEXPR ts_sec __ts_sec_max = numeric_limits<ts_sec>::max();
-
- if (__s.count() < __ts_sec_max)
- {
- __ts.tv_sec = static_cast<ts_sec>(__s.count());
- __ts.tv_nsec = static_cast<decltype(__ts.tv_nsec)>((__ns - __s).count());
- }
- else
- {
- __ts.tv_sec = __ts_sec_max;
- __ts.tv_nsec = 999999999; // (10^9 - 1)
- }
-
- while (nanosleep(&__ts, &__ts) == -1 && errno == EINTR);
-}
-
-// Thread local storage
-int __libcpp_tls_create(__libcpp_tls_key *__key, void (*__at_exit)(void *))
-{
- return pthread_key_create(__key, __at_exit);
-}
-
-void *__libcpp_tls_get(__libcpp_tls_key __key)
-{
- return pthread_getspecific(__key);
-}
-
-int __libcpp_tls_set(__libcpp_tls_key __key, void *__p)
-{
- return pthread_setspecific(__key, __p);
-}
-
-#endif // !_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL || _LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // !_LIBCPP_HAS_NO_THREADS
-
-#endif // _LIBCPP_THREADING_SUPPORT
diff --git a/lib/libcxx/include/__tree b/lib/libcxx/include/__tree
deleted file mode 100644
index 814851085b9..00000000000
--- a/lib/libcxx/include/__tree
+++ /dev/null
@@ -1,2879 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP___TREE
-#define _LIBCPP___TREE
-
-#include <__config>
-#include <iterator>
-#include <memory>
-#include <stdexcept>
-#include <algorithm>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Tp, class _Compare, class _Allocator> class __tree;
-template <class _Tp, class _NodePtr, class _DiffType>
- class _LIBCPP_TEMPLATE_VIS __tree_iterator;
-template <class _Tp, class _ConstNodePtr, class _DiffType>
- class _LIBCPP_TEMPLATE_VIS __tree_const_iterator;
-
-template <class _Pointer> class __tree_end_node;
-template <class _VoidPtr> class __tree_node_base;
-template <class _Tp, class _VoidPtr> class __tree_node;
-
-template <class _Key, class _Value>
-struct __value_type;
-
-template <class _Allocator> class __map_node_destructor;
-template <class _TreeIterator> class _LIBCPP_TEMPLATE_VIS __map_iterator;
-template <class _TreeIterator> class _LIBCPP_TEMPLATE_VIS __map_const_iterator;
-
-/*
-
-_NodePtr algorithms
-
-The algorithms taking _NodePtr are red black tree algorithms. Those
-algorithms taking a parameter named __root should assume that __root
-points to a proper red black tree (unless otherwise specified).
-
-Each algorithm herein assumes that __root->__parent_ points to a non-null
-structure which has a member __left_ which points back to __root. No other
-member is read or written to at __root->__parent_.
-
-__root->__parent_ will be referred to below (in comments only) as end_node.
-end_node->__left_ is an externably accessible lvalue for __root, and can be
-changed by node insertion and removal (without explicit reference to end_node).
-
-All nodes (with the exception of end_node), even the node referred to as
-__root, have a non-null __parent_ field.
-
-*/
-
-// Returns: true if __x is a left child of its parent, else false
-// Precondition: __x != nullptr.
-template <class _NodePtr>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-__tree_is_left_child(_NodePtr __x) _NOEXCEPT
-{
- return __x == __x->__parent_->__left_;
-}
-
-// Determines if the subtree rooted at __x is a proper red black subtree. If
-// __x is a proper subtree, returns the black height (null counts as 1). If
-// __x is an improper subtree, returns 0.
-template <class _NodePtr>
-unsigned
-__tree_sub_invariant(_NodePtr __x)
-{
- if (__x == nullptr)
- return 1;
- // parent consistency checked by caller
- // check __x->__left_ consistency
- if (__x->__left_ != nullptr && __x->__left_->__parent_ != __x)
- return 0;
- // check __x->__right_ consistency
- if (__x->__right_ != nullptr && __x->__right_->__parent_ != __x)
- return 0;
- // check __x->__left_ != __x->__right_ unless both are nullptr
- if (__x->__left_ == __x->__right_ && __x->__left_ != nullptr)
- return 0;
- // If this is red, neither child can be red
- if (!__x->__is_black_)
- {
- if (__x->__left_ && !__x->__left_->__is_black_)
- return 0;
- if (__x->__right_ && !__x->__right_->__is_black_)
- return 0;
- }
- unsigned __h = __tree_sub_invariant(__x->__left_);
- if (__h == 0)
- return 0; // invalid left subtree
- if (__h != __tree_sub_invariant(__x->__right_))
- return 0; // invalid or different height right subtree
- return __h + __x->__is_black_; // return black height of this node
-}
-
-// Determines if the red black tree rooted at __root is a proper red black tree.
-// __root == nullptr is a proper tree. Returns true is __root is a proper
-// red black tree, else returns false.
-template <class _NodePtr>
-bool
-__tree_invariant(_NodePtr __root)
-{
- if (__root == nullptr)
- return true;
- // check __x->__parent_ consistency
- if (__root->__parent_ == nullptr)
- return false;
- if (!__tree_is_left_child(__root))
- return false;
- // root must be black
- if (!__root->__is_black_)
- return false;
- // do normal node checks
- return __tree_sub_invariant(__root) != 0;
-}
-
-// Returns: pointer to the left-most node under __x.
-// Precondition: __x != nullptr.
-template <class _NodePtr>
-inline _LIBCPP_INLINE_VISIBILITY
-_NodePtr
-__tree_min(_NodePtr __x) _NOEXCEPT
-{
- while (__x->__left_ != nullptr)
- __x = __x->__left_;
- return __x;
-}
-
-// Returns: pointer to the right-most node under __x.
-// Precondition: __x != nullptr.
-template <class _NodePtr>
-inline _LIBCPP_INLINE_VISIBILITY
-_NodePtr
-__tree_max(_NodePtr __x) _NOEXCEPT
-{
- while (__x->__right_ != nullptr)
- __x = __x->__right_;
- return __x;
-}
-
-// Returns: pointer to the next in-order node after __x.
-// Precondition: __x != nullptr.
-template <class _NodePtr>
-_NodePtr
-__tree_next(_NodePtr __x) _NOEXCEPT
-{
- if (__x->__right_ != nullptr)
- return __tree_min(__x->__right_);
- while (!__tree_is_left_child(__x))
- __x = __x->__parent_unsafe();
- return __x->__parent_unsafe();
-}
-
-template <class _EndNodePtr, class _NodePtr>
-inline _LIBCPP_INLINE_VISIBILITY
-_EndNodePtr
-__tree_next_iter(_NodePtr __x) _NOEXCEPT
-{
- if (__x->__right_ != nullptr)
- return static_cast<_EndNodePtr>(__tree_min(__x->__right_));
- while (!__tree_is_left_child(__x))
- __x = __x->__parent_unsafe();
- return static_cast<_EndNodePtr>(__x->__parent_);
-}
-
-// Returns: pointer to the previous in-order node before __x.
-// Precondition: __x != nullptr.
-// Note: __x may be the end node.
-template <class _NodePtr, class _EndNodePtr>
-inline _LIBCPP_INLINE_VISIBILITY
-_NodePtr
-__tree_prev_iter(_EndNodePtr __x) _NOEXCEPT
-{
- if (__x->__left_ != nullptr)
- return __tree_max(__x->__left_);
- _NodePtr __xx = static_cast<_NodePtr>(__x);
- while (__tree_is_left_child(__xx))
- __xx = __xx->__parent_unsafe();
- return __xx->__parent_unsafe();
-}
-
-// Returns: pointer to a node which has no children
-// Precondition: __x != nullptr.
-template <class _NodePtr>
-_NodePtr
-__tree_leaf(_NodePtr __x) _NOEXCEPT
-{
- while (true)
- {
- if (__x->__left_ != nullptr)
- {
- __x = __x->__left_;
- continue;
- }
- if (__x->__right_ != nullptr)
- {
- __x = __x->__right_;
- continue;
- }
- break;
- }
- return __x;
-}
-
-// Effects: Makes __x->__right_ the subtree root with __x as its left child
-// while preserving in-order order.
-// Precondition: __x->__right_ != nullptr
-template <class _NodePtr>
-void
-__tree_left_rotate(_NodePtr __x) _NOEXCEPT
-{
- _NodePtr __y = __x->__right_;
- __x->__right_ = __y->__left_;
- if (__x->__right_ != nullptr)
- __x->__right_->__set_parent(__x);
- __y->__parent_ = __x->__parent_;
- if (__tree_is_left_child(__x))
- __x->__parent_->__left_ = __y;
- else
- __x->__parent_unsafe()->__right_ = __y;
- __y->__left_ = __x;
- __x->__set_parent(__y);
-}
-
-// Effects: Makes __x->__left_ the subtree root with __x as its right child
-// while preserving in-order order.
-// Precondition: __x->__left_ != nullptr
-template <class _NodePtr>
-void
-__tree_right_rotate(_NodePtr __x) _NOEXCEPT
-{
- _NodePtr __y = __x->__left_;
- __x->__left_ = __y->__right_;
- if (__x->__left_ != nullptr)
- __x->__left_->__set_parent(__x);
- __y->__parent_ = __x->__parent_;
- if (__tree_is_left_child(__x))
- __x->__parent_->__left_ = __y;
- else
- __x->__parent_unsafe()->__right_ = __y;
- __y->__right_ = __x;
- __x->__set_parent(__y);
-}
-
-// Effects: Rebalances __root after attaching __x to a leaf.
-// Precondition: __root != nulptr && __x != nullptr.
-// __x has no children.
-// __x == __root or == a direct or indirect child of __root.
-// If __x were to be unlinked from __root (setting __root to
-// nullptr if __root == __x), __tree_invariant(__root) == true.
-// Postcondition: __tree_invariant(end_node->__left_) == true. end_node->__left_
-// may be different than the value passed in as __root.
-template <class _NodePtr>
-void
-__tree_balance_after_insert(_NodePtr __root, _NodePtr __x) _NOEXCEPT
-{
- __x->__is_black_ = __x == __root;
- while (__x != __root && !__x->__parent_unsafe()->__is_black_)
- {
- // __x->__parent_ != __root because __x->__parent_->__is_black == false
- if (__tree_is_left_child(__x->__parent_unsafe()))
- {
- _NodePtr __y = __x->__parent_unsafe()->__parent_unsafe()->__right_;
- if (__y != nullptr && !__y->__is_black_)
- {
- __x = __x->__parent_unsafe();
- __x->__is_black_ = true;
- __x = __x->__parent_unsafe();
- __x->__is_black_ = __x == __root;
- __y->__is_black_ = true;
- }
- else
- {
- if (!__tree_is_left_child(__x))
- {
- __x = __x->__parent_unsafe();
- __tree_left_rotate(__x);
- }
- __x = __x->__parent_unsafe();
- __x->__is_black_ = true;
- __x = __x->__parent_unsafe();
- __x->__is_black_ = false;
- __tree_right_rotate(__x);
- break;
- }
- }
- else
- {
- _NodePtr __y = __x->__parent_unsafe()->__parent_->__left_;
- if (__y != nullptr && !__y->__is_black_)
- {
- __x = __x->__parent_unsafe();
- __x->__is_black_ = true;
- __x = __x->__parent_unsafe();
- __x->__is_black_ = __x == __root;
- __y->__is_black_ = true;
- }
- else
- {
- if (__tree_is_left_child(__x))
- {
- __x = __x->__parent_unsafe();
- __tree_right_rotate(__x);
- }
- __x = __x->__parent_unsafe();
- __x->__is_black_ = true;
- __x = __x->__parent_unsafe();
- __x->__is_black_ = false;
- __tree_left_rotate(__x);
- break;
- }
- }
- }
-}
-
-// Precondition: __root != nullptr && __z != nullptr.
-// __tree_invariant(__root) == true.
-// __z == __root or == a direct or indirect child of __root.
-// Effects: unlinks __z from the tree rooted at __root, rebalancing as needed.
-// Postcondition: __tree_invariant(end_node->__left_) == true && end_node->__left_
-// nor any of its children refer to __z. end_node->__left_
-// may be different than the value passed in as __root.
-template <class _NodePtr>
-void
-__tree_remove(_NodePtr __root, _NodePtr __z) _NOEXCEPT
-{
- // __z will be removed from the tree. Client still needs to destruct/deallocate it
- // __y is either __z, or if __z has two children, __tree_next(__z).
- // __y will have at most one child.
- // __y will be the initial hole in the tree (make the hole at a leaf)
- _NodePtr __y = (__z->__left_ == nullptr || __z->__right_ == nullptr) ?
- __z : __tree_next(__z);
- // __x is __y's possibly null single child
- _NodePtr __x = __y->__left_ != nullptr ? __y->__left_ : __y->__right_;
- // __w is __x's possibly null uncle (will become __x's sibling)
- _NodePtr __w = nullptr;
- // link __x to __y's parent, and find __w
- if (__x != nullptr)
- __x->__parent_ = __y->__parent_;
- if (__tree_is_left_child(__y))
- {
- __y->__parent_->__left_ = __x;
- if (__y != __root)
- __w = __y->__parent_unsafe()->__right_;
- else
- __root = __x; // __w == nullptr
- }
- else
- {
- __y->__parent_unsafe()->__right_ = __x;
- // __y can't be root if it is a right child
- __w = __y->__parent_->__left_;
- }
- bool __removed_black = __y->__is_black_;
- // If we didn't remove __z, do so now by splicing in __y for __z,
- // but copy __z's color. This does not impact __x or __w.
- if (__y != __z)
- {
- // __z->__left_ != nulptr but __z->__right_ might == __x == nullptr
- __y->__parent_ = __z->__parent_;
- if (__tree_is_left_child(__z))
- __y->__parent_->__left_ = __y;
- else
- __y->__parent_unsafe()->__right_ = __y;
- __y->__left_ = __z->__left_;
- __y->__left_->__set_parent(__y);
- __y->__right_ = __z->__right_;
- if (__y->__right_ != nullptr)
- __y->__right_->__set_parent(__y);
- __y->__is_black_ = __z->__is_black_;
- if (__root == __z)
- __root = __y;
- }
- // There is no need to rebalance if we removed a red, or if we removed
- // the last node.
- if (__removed_black && __root != nullptr)
- {
- // Rebalance:
- // __x has an implicit black color (transferred from the removed __y)
- // associated with it, no matter what its color is.
- // If __x is __root (in which case it can't be null), it is supposed
- // to be black anyway, and if it is doubly black, then the double
- // can just be ignored.
- // If __x is red (in which case it can't be null), then it can absorb
- // the implicit black just by setting its color to black.
- // Since __y was black and only had one child (which __x points to), __x
- // is either red with no children, else null, otherwise __y would have
- // different black heights under left and right pointers.
- // if (__x == __root || __x != nullptr && !__x->__is_black_)
- if (__x != nullptr)
- __x->__is_black_ = true;
- else
- {
- // Else __x isn't root, and is "doubly black", even though it may
- // be null. __w can not be null here, else the parent would
- // see a black height >= 2 on the __x side and a black height
- // of 1 on the __w side (__w must be a non-null black or a red
- // with a non-null black child).
- while (true)
- {
- if (!__tree_is_left_child(__w)) // if x is left child
- {
- if (!__w->__is_black_)
- {
- __w->__is_black_ = true;
- __w->__parent_unsafe()->__is_black_ = false;
- __tree_left_rotate(__w->__parent_unsafe());
- // __x is still valid
- // reset __root only if necessary
- if (__root == __w->__left_)
- __root = __w;
- // reset sibling, and it still can't be null
- __w = __w->__left_->__right_;
- }
- // __w->__is_black_ is now true, __w may have null children
- if ((__w->__left_ == nullptr || __w->__left_->__is_black_) &&
- (__w->__right_ == nullptr || __w->__right_->__is_black_))
- {
- __w->__is_black_ = false;
- __x = __w->__parent_unsafe();
- // __x can no longer be null
- if (__x == __root || !__x->__is_black_)
- {
- __x->__is_black_ = true;
- break;
- }
- // reset sibling, and it still can't be null
- __w = __tree_is_left_child(__x) ?
- __x->__parent_unsafe()->__right_ :
- __x->__parent_->__left_;
- // continue;
- }
- else // __w has a red child
- {
- if (__w->__right_ == nullptr || __w->__right_->__is_black_)
- {
- // __w left child is non-null and red
- __w->__left_->__is_black_ = true;
- __w->__is_black_ = false;
- __tree_right_rotate(__w);
- // __w is known not to be root, so root hasn't changed
- // reset sibling, and it still can't be null
- __w = __w->__parent_unsafe();
- }
- // __w has a right red child, left child may be null
- __w->__is_black_ = __w->__parent_unsafe()->__is_black_;
- __w->__parent_unsafe()->__is_black_ = true;
- __w->__right_->__is_black_ = true;
- __tree_left_rotate(__w->__parent_unsafe());
- break;
- }
- }
- else
- {
- if (!__w->__is_black_)
- {
- __w->__is_black_ = true;
- __w->__parent_unsafe()->__is_black_ = false;
- __tree_right_rotate(__w->__parent_unsafe());
- // __x is still valid
- // reset __root only if necessary
- if (__root == __w->__right_)
- __root = __w;
- // reset sibling, and it still can't be null
- __w = __w->__right_->__left_;
- }
- // __w->__is_black_ is now true, __w may have null children
- if ((__w->__left_ == nullptr || __w->__left_->__is_black_) &&
- (__w->__right_ == nullptr || __w->__right_->__is_black_))
- {
- __w->__is_black_ = false;
- __x = __w->__parent_unsafe();
- // __x can no longer be null
- if (!__x->__is_black_ || __x == __root)
- {
- __x->__is_black_ = true;
- break;
- }
- // reset sibling, and it still can't be null
- __w = __tree_is_left_child(__x) ?
- __x->__parent_unsafe()->__right_ :
- __x->__parent_->__left_;
- // continue;
- }
- else // __w has a red child
- {
- if (__w->__left_ == nullptr || __w->__left_->__is_black_)
- {
- // __w right child is non-null and red
- __w->__right_->__is_black_ = true;
- __w->__is_black_ = false;
- __tree_left_rotate(__w);
- // __w is known not to be root, so root hasn't changed
- // reset sibling, and it still can't be null
- __w = __w->__parent_unsafe();
- }
- // __w has a left red child, right child may be null
- __w->__is_black_ = __w->__parent_unsafe()->__is_black_;
- __w->__parent_unsafe()->__is_black_ = true;
- __w->__left_->__is_black_ = true;
- __tree_right_rotate(__w->__parent_unsafe());
- break;
- }
- }
- }
- }
- }
-}
-
-// node traits
-
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Tp>
-struct __is_tree_value_type_imp : false_type {};
-
-template <class _Key, class _Value>
-struct __is_tree_value_type_imp<__value_type<_Key, _Value>> : true_type {};
-
-template <class ..._Args>
-struct __is_tree_value_type : false_type {};
-
-template <class _One>
-struct __is_tree_value_type<_One> : __is_tree_value_type_imp<typename __uncvref<_One>::type> {};
-#endif
-
-template <class _Tp>
-struct __tree_key_value_types {
- typedef _Tp key_type;
- typedef _Tp __node_value_type;
- typedef _Tp __container_value_type;
- static const bool __is_map = false;
-
- _LIBCPP_INLINE_VISIBILITY
- static key_type const& __get_key(_Tp const& __v) {
- return __v;
- }
- _LIBCPP_INLINE_VISIBILITY
- static __container_value_type const& __get_value(__node_value_type const& __v) {
- return __v;
- }
- _LIBCPP_INLINE_VISIBILITY
- static __container_value_type* __get_ptr(__node_value_type& __n) {
- return _VSTD::addressof(__n);
- }
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- static __container_value_type&& __move(__node_value_type& __v) {
- return _VSTD::move(__v);
- }
-#endif
-};
-
-template <class _Key, class _Tp>
-struct __tree_key_value_types<__value_type<_Key, _Tp> > {
- typedef _Key key_type;
- typedef _Tp mapped_type;
- typedef __value_type<_Key, _Tp> __node_value_type;
- typedef pair<const _Key, _Tp> __container_value_type;
- typedef __container_value_type __map_value_type;
- static const bool __is_map = true;
-
- _LIBCPP_INLINE_VISIBILITY
- static key_type const&
- __get_key(__node_value_type const& __t) {
- return __t.__get_value().first;
- }
-
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- static typename enable_if<__is_same_uncvref<_Up, __container_value_type>::value,
- key_type const&>::type
- __get_key(_Up& __t) {
- return __t.first;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- static __container_value_type const&
- __get_value(__node_value_type const& __t) {
- return __t.__get_value();
- }
-
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- static typename enable_if<__is_same_uncvref<_Up, __container_value_type>::value,
- __container_value_type const&>::type
- __get_value(_Up& __t) {
- return __t;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- static __container_value_type* __get_ptr(__node_value_type& __n) {
- return _VSTD::addressof(__n.__get_value());
- }
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- static pair<key_type&&, mapped_type&&> __move(__node_value_type& __v) {
- return __v.__move();
- }
-#endif
-};
-
-template <class _VoidPtr>
-struct __tree_node_base_types {
- typedef _VoidPtr __void_pointer;
-
- typedef __tree_node_base<__void_pointer> __node_base_type;
- typedef typename __rebind_pointer<_VoidPtr, __node_base_type>::type
- __node_base_pointer;
-
- typedef __tree_end_node<__node_base_pointer> __end_node_type;
- typedef typename __rebind_pointer<_VoidPtr, __end_node_type>::type
- __end_node_pointer;
-#if defined(_LIBCPP_ABI_TREE_REMOVE_NODE_POINTER_UB)
- typedef __end_node_pointer __parent_pointer;
-#else
- typedef typename conditional<
- is_pointer<__end_node_pointer>::value,
- __end_node_pointer,
- __node_base_pointer>::type __parent_pointer;
-#endif
-
-private:
- static_assert((is_same<typename pointer_traits<_VoidPtr>::element_type, void>::value),
- "_VoidPtr does not point to unqualified void type");
-};
-
-template <class _Tp, class _AllocPtr, class _KVTypes = __tree_key_value_types<_Tp>,
- bool = _KVTypes::__is_map>
-struct __tree_map_pointer_types {};
-
-template <class _Tp, class _AllocPtr, class _KVTypes>
-struct __tree_map_pointer_types<_Tp, _AllocPtr, _KVTypes, true> {
- typedef typename _KVTypes::__map_value_type _Mv;
- typedef typename __rebind_pointer<_AllocPtr, _Mv>::type
- __map_value_type_pointer;
- typedef typename __rebind_pointer<_AllocPtr, const _Mv>::type
- __const_map_value_type_pointer;
-};
-
-template <class _NodePtr, class _NodeT = typename pointer_traits<_NodePtr>::element_type>
-struct __tree_node_types;
-
-template <class _NodePtr, class _Tp, class _VoidPtr>
-struct __tree_node_types<_NodePtr, __tree_node<_Tp, _VoidPtr> >
- : public __tree_node_base_types<_VoidPtr>,
- __tree_key_value_types<_Tp>,
- __tree_map_pointer_types<_Tp, _VoidPtr>
-{
- typedef __tree_node_base_types<_VoidPtr> __base;
- typedef __tree_key_value_types<_Tp> __key_base;
- typedef __tree_map_pointer_types<_Tp, _VoidPtr> __map_pointer_base;
-public:
-
- typedef typename pointer_traits<_NodePtr>::element_type __node_type;
- typedef _NodePtr __node_pointer;
-
- typedef _Tp __node_value_type;
- typedef typename __rebind_pointer<_VoidPtr, __node_value_type>::type
- __node_value_type_pointer;
- typedef typename __rebind_pointer<_VoidPtr, const __node_value_type>::type
- __const_node_value_type_pointer;
-#if defined(_LIBCPP_ABI_TREE_REMOVE_NODE_POINTER_UB)
- typedef typename __base::__end_node_pointer __iter_pointer;
-#else
- typedef typename conditional<
- is_pointer<__node_pointer>::value,
- typename __base::__end_node_pointer,
- __node_pointer>::type __iter_pointer;
-#endif
-private:
- static_assert(!is_const<__node_type>::value,
- "_NodePtr should never be a pointer to const");
- static_assert((is_same<typename __rebind_pointer<_VoidPtr, __node_type>::type,
- _NodePtr>::value), "_VoidPtr does not rebind to _NodePtr.");
-};
-
-template <class _ValueTp, class _VoidPtr>
-struct __make_tree_node_types {
- typedef typename __rebind_pointer<_VoidPtr, __tree_node<_ValueTp, _VoidPtr> >::type
- _NodePtr;
- typedef __tree_node_types<_NodePtr> type;
-};
-
-// node
-
-template <class _Pointer>
-class __tree_end_node
-{
-public:
- typedef _Pointer pointer;
- pointer __left_;
-
- _LIBCPP_INLINE_VISIBILITY
- __tree_end_node() _NOEXCEPT : __left_() {}
-};
-
-template <class _VoidPtr>
-class __tree_node_base
- : public __tree_node_base_types<_VoidPtr>::__end_node_type
-{
- typedef __tree_node_base_types<_VoidPtr> _NodeBaseTypes;
-
-public:
- typedef typename _NodeBaseTypes::__node_base_pointer pointer;
- typedef typename _NodeBaseTypes::__parent_pointer __parent_pointer;
-
- pointer __right_;
- __parent_pointer __parent_;
- bool __is_black_;
-
- _LIBCPP_INLINE_VISIBILITY
- pointer __parent_unsafe() const { return static_cast<pointer>(__parent_);}
-
- _LIBCPP_INLINE_VISIBILITY
- void __set_parent(pointer __p) {
- __parent_ = static_cast<__parent_pointer>(__p);
- }
-
-private:
- ~__tree_node_base() _LIBCPP_EQUAL_DELETE;
- __tree_node_base(__tree_node_base const&) _LIBCPP_EQUAL_DELETE;
- __tree_node_base& operator=(__tree_node_base const&) _LIBCPP_EQUAL_DELETE;
-};
-
-template <class _Tp, class _VoidPtr>
-class __tree_node
- : public __tree_node_base<_VoidPtr>
-{
-public:
- typedef _Tp __node_value_type;
-
- __node_value_type __value_;
-
-private:
- ~__tree_node() _LIBCPP_EQUAL_DELETE;
- __tree_node(__tree_node const&) _LIBCPP_EQUAL_DELETE;
- __tree_node& operator=(__tree_node const&) _LIBCPP_EQUAL_DELETE;
-};
-
-
-template <class _Allocator>
-class __tree_node_destructor
-{
- typedef _Allocator allocator_type;
- typedef allocator_traits<allocator_type> __alloc_traits;
-
-public:
- typedef typename __alloc_traits::pointer pointer;
-private:
- typedef __tree_node_types<pointer> _NodeTypes;
- allocator_type& __na_;
-
- __tree_node_destructor& operator=(const __tree_node_destructor&);
-
-public:
- bool __value_constructed;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __tree_node_destructor(allocator_type& __na, bool __val = false) _NOEXCEPT
- : __na_(__na),
- __value_constructed(__val)
- {}
-
- _LIBCPP_INLINE_VISIBILITY
- void operator()(pointer __p) _NOEXCEPT
- {
- if (__value_constructed)
- __alloc_traits::destroy(__na_, _NodeTypes::__get_ptr(__p->__value_));
- if (__p)
- __alloc_traits::deallocate(__na_, __p, 1);
- }
-
- template <class> friend class __map_node_destructor;
-};
-
-#if _LIBCPP_STD_VER > 14
-template <class _NodeType, class _Alloc>
-struct __generic_container_node_destructor;
-template <class _Tp, class _VoidPtr, class _Alloc>
-struct __generic_container_node_destructor<__tree_node<_Tp, _VoidPtr>, _Alloc>
- : __tree_node_destructor<_Alloc>
-{
- using __tree_node_destructor<_Alloc>::__tree_node_destructor;
-};
-#endif
-
-template <class _Tp, class _NodePtr, class _DiffType>
-class _LIBCPP_TEMPLATE_VIS __tree_iterator
-{
- typedef __tree_node_types<_NodePtr> _NodeTypes;
- typedef _NodePtr __node_pointer;
- typedef typename _NodeTypes::__node_base_pointer __node_base_pointer;
- typedef typename _NodeTypes::__end_node_pointer __end_node_pointer;
- typedef typename _NodeTypes::__iter_pointer __iter_pointer;
- typedef pointer_traits<__node_pointer> __pointer_traits;
-
- __iter_pointer __ptr_;
-
-public:
- typedef bidirectional_iterator_tag iterator_category;
- typedef _Tp value_type;
- typedef _DiffType difference_type;
- typedef value_type& reference;
- typedef typename _NodeTypes::__node_value_type_pointer pointer;
-
- _LIBCPP_INLINE_VISIBILITY __tree_iterator() _NOEXCEPT
-#if _LIBCPP_STD_VER > 11
- : __ptr_(nullptr)
-#endif
- {}
-
- _LIBCPP_INLINE_VISIBILITY reference operator*() const
- {return __get_np()->__value_;}
- _LIBCPP_INLINE_VISIBILITY pointer operator->() const
- {return pointer_traits<pointer>::pointer_to(__get_np()->__value_);}
-
- _LIBCPP_INLINE_VISIBILITY
- __tree_iterator& operator++() {
- __ptr_ = static_cast<__iter_pointer>(
- __tree_next_iter<__end_node_pointer>(static_cast<__node_base_pointer>(__ptr_)));
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY
- __tree_iterator operator++(int)
- {__tree_iterator __t(*this); ++(*this); return __t;}
-
- _LIBCPP_INLINE_VISIBILITY
- __tree_iterator& operator--() {
- __ptr_ = static_cast<__iter_pointer>(__tree_prev_iter<__node_base_pointer>(
- static_cast<__end_node_pointer>(__ptr_)));
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY
- __tree_iterator operator--(int)
- {__tree_iterator __t(*this); --(*this); return __t;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __tree_iterator& __x, const __tree_iterator& __y)
- {return __x.__ptr_ == __y.__ptr_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __tree_iterator& __x, const __tree_iterator& __y)
- {return !(__x == __y);}
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- explicit __tree_iterator(__node_pointer __p) _NOEXCEPT : __ptr_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit __tree_iterator(__end_node_pointer __p) _NOEXCEPT : __ptr_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- __node_pointer __get_np() const { return static_cast<__node_pointer>(__ptr_); }
- template <class, class, class> friend class __tree;
- template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __map_iterator;
- template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
- template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
- template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS set;
- template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS multiset;
-};
-
-template <class _Tp, class _NodePtr, class _DiffType>
-class _LIBCPP_TEMPLATE_VIS __tree_const_iterator
-{
- typedef __tree_node_types<_NodePtr> _NodeTypes;
- typedef typename _NodeTypes::__node_pointer __node_pointer;
- typedef typename _NodeTypes::__node_base_pointer __node_base_pointer;
- typedef typename _NodeTypes::__end_node_pointer __end_node_pointer;
- typedef typename _NodeTypes::__iter_pointer __iter_pointer;
- typedef pointer_traits<__node_pointer> __pointer_traits;
-
- __iter_pointer __ptr_;
-
-public:
- typedef bidirectional_iterator_tag iterator_category;
- typedef _Tp value_type;
- typedef _DiffType difference_type;
- typedef const value_type& reference;
- typedef typename _NodeTypes::__const_node_value_type_pointer pointer;
-
- _LIBCPP_INLINE_VISIBILITY __tree_const_iterator() _NOEXCEPT
-#if _LIBCPP_STD_VER > 11
- : __ptr_(nullptr)
-#endif
- {}
-
-private:
- typedef __tree_iterator<value_type, __node_pointer, difference_type>
- __non_const_iterator;
-public:
- _LIBCPP_INLINE_VISIBILITY
- __tree_const_iterator(__non_const_iterator __p) _NOEXCEPT
- : __ptr_(__p.__ptr_) {}
-
- _LIBCPP_INLINE_VISIBILITY reference operator*() const
- {return __get_np()->__value_;}
- _LIBCPP_INLINE_VISIBILITY pointer operator->() const
- {return pointer_traits<pointer>::pointer_to(__get_np()->__value_);}
-
- _LIBCPP_INLINE_VISIBILITY
- __tree_const_iterator& operator++() {
- __ptr_ = static_cast<__iter_pointer>(
- __tree_next_iter<__end_node_pointer>(static_cast<__node_base_pointer>(__ptr_)));
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __tree_const_iterator operator++(int)
- {__tree_const_iterator __t(*this); ++(*this); return __t;}
-
- _LIBCPP_INLINE_VISIBILITY
- __tree_const_iterator& operator--() {
- __ptr_ = static_cast<__iter_pointer>(__tree_prev_iter<__node_base_pointer>(
- static_cast<__end_node_pointer>(__ptr_)));
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __tree_const_iterator operator--(int)
- {__tree_const_iterator __t(*this); --(*this); return __t;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __tree_const_iterator& __x, const __tree_const_iterator& __y)
- {return __x.__ptr_ == __y.__ptr_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __tree_const_iterator& __x, const __tree_const_iterator& __y)
- {return !(__x == __y);}
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- explicit __tree_const_iterator(__node_pointer __p) _NOEXCEPT
- : __ptr_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit __tree_const_iterator(__end_node_pointer __p) _NOEXCEPT
- : __ptr_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- __node_pointer __get_np() const { return static_cast<__node_pointer>(__ptr_); }
-
- template <class, class, class> friend class __tree;
- template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
- template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
- template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS set;
- template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS multiset;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator;
-
-};
-
-template<class _Tp, class _Compare>
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_DIAGNOSE_WARNING(!std::__invokable<_Compare const&, _Tp const&, _Tp const&>::value,
- "the specified comparator type does not provide a const call operator")
-#endif
-int __diagnose_non_const_comparator();
-
-template <class _Tp, class _Compare, class _Allocator>
-class __tree
-{
-public:
- typedef _Tp value_type;
- typedef _Compare value_compare;
- typedef _Allocator allocator_type;
-
-private:
- typedef allocator_traits<allocator_type> __alloc_traits;
- typedef typename __make_tree_node_types<value_type,
- typename __alloc_traits::void_pointer>::type
- _NodeTypes;
- typedef typename _NodeTypes::key_type key_type;
-public:
- typedef typename _NodeTypes::__node_value_type __node_value_type;
- typedef typename _NodeTypes::__container_value_type __container_value_type;
-
- typedef typename __alloc_traits::pointer pointer;
- typedef typename __alloc_traits::const_pointer const_pointer;
- typedef typename __alloc_traits::size_type size_type;
- typedef typename __alloc_traits::difference_type difference_type;
-
-public:
- typedef typename _NodeTypes::__void_pointer __void_pointer;
-
- typedef typename _NodeTypes::__node_type __node;
- typedef typename _NodeTypes::__node_pointer __node_pointer;
-
- typedef typename _NodeTypes::__node_base_type __node_base;
- typedef typename _NodeTypes::__node_base_pointer __node_base_pointer;
-
- typedef typename _NodeTypes::__end_node_type __end_node_t;
- typedef typename _NodeTypes::__end_node_pointer __end_node_ptr;
-
- typedef typename _NodeTypes::__parent_pointer __parent_pointer;
- typedef typename _NodeTypes::__iter_pointer __iter_pointer;
-
- typedef typename __rebind_alloc_helper<__alloc_traits, __node>::type __node_allocator;
- typedef allocator_traits<__node_allocator> __node_traits;
-
-private:
- // check for sane allocator pointer rebinding semantics. Rebinding the
- // allocator for a new pointer type should be exactly the same as rebinding
- // the pointer using 'pointer_traits'.
- static_assert((is_same<__node_pointer, typename __node_traits::pointer>::value),
- "Allocator does not rebind pointers in a sane manner.");
- typedef typename __rebind_alloc_helper<__node_traits, __node_base>::type
- __node_base_allocator;
- typedef allocator_traits<__node_base_allocator> __node_base_traits;
- static_assert((is_same<__node_base_pointer, typename __node_base_traits::pointer>::value),
- "Allocator does not rebind pointers in a sane manner.");
-
-private:
- __iter_pointer __begin_node_;
- __compressed_pair<__end_node_t, __node_allocator> __pair1_;
- __compressed_pair<size_type, value_compare> __pair3_;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- __iter_pointer __end_node() _NOEXCEPT
- {
- return static_cast<__iter_pointer>(
- pointer_traits<__end_node_ptr>::pointer_to(__pair1_.first())
- );
- }
- _LIBCPP_INLINE_VISIBILITY
- __iter_pointer __end_node() const _NOEXCEPT
- {
- return static_cast<__iter_pointer>(
- pointer_traits<__end_node_ptr>::pointer_to(
- const_cast<__end_node_t&>(__pair1_.first())
- )
- );
- }
- _LIBCPP_INLINE_VISIBILITY
- __node_allocator& __node_alloc() _NOEXCEPT {return __pair1_.second();}
-private:
- _LIBCPP_INLINE_VISIBILITY
- const __node_allocator& __node_alloc() const _NOEXCEPT
- {return __pair1_.second();}
- _LIBCPP_INLINE_VISIBILITY
- __iter_pointer& __begin_node() _NOEXCEPT {return __begin_node_;}
- _LIBCPP_INLINE_VISIBILITY
- const __iter_pointer& __begin_node() const _NOEXCEPT {return __begin_node_;}
-public:
- _LIBCPP_INLINE_VISIBILITY
- allocator_type __alloc() const _NOEXCEPT
- {return allocator_type(__node_alloc());}
-private:
- _LIBCPP_INLINE_VISIBILITY
- size_type& size() _NOEXCEPT {return __pair3_.first();}
-public:
- _LIBCPP_INLINE_VISIBILITY
- const size_type& size() const _NOEXCEPT {return __pair3_.first();}
- _LIBCPP_INLINE_VISIBILITY
- value_compare& value_comp() _NOEXCEPT {return __pair3_.second();}
- _LIBCPP_INLINE_VISIBILITY
- const value_compare& value_comp() const _NOEXCEPT
- {return __pair3_.second();}
-public:
-
- _LIBCPP_INLINE_VISIBILITY
- __node_pointer __root() const _NOEXCEPT
- {return static_cast<__node_pointer>(__end_node()->__left_);}
-
- __node_base_pointer* __root_ptr() const _NOEXCEPT {
- return _VSTD::addressof(__end_node()->__left_);
- }
-
- typedef __tree_iterator<value_type, __node_pointer, difference_type> iterator;
- typedef __tree_const_iterator<value_type, __node_pointer, difference_type> const_iterator;
-
- explicit __tree(const value_compare& __comp)
- _NOEXCEPT_(
- is_nothrow_default_constructible<__node_allocator>::value &&
- is_nothrow_copy_constructible<value_compare>::value);
- explicit __tree(const allocator_type& __a);
- __tree(const value_compare& __comp, const allocator_type& __a);
- __tree(const __tree& __t);
- __tree& operator=(const __tree& __t);
- template <class _InputIterator>
- void __assign_unique(_InputIterator __first, _InputIterator __last);
- template <class _InputIterator>
- void __assign_multi(_InputIterator __first, _InputIterator __last);
-#ifndef _LIBCPP_CXX03_LANG
- __tree(__tree&& __t)
- _NOEXCEPT_(
- is_nothrow_move_constructible<__node_allocator>::value &&
- is_nothrow_move_constructible<value_compare>::value);
- __tree(__tree&& __t, const allocator_type& __a);
- __tree& operator=(__tree&& __t)
- _NOEXCEPT_(
- __node_traits::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<value_compare>::value &&
- is_nothrow_move_assignable<__node_allocator>::value);
-#endif // _LIBCPP_CXX03_LANG
-
- ~__tree();
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT {return iterator(__begin_node());}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT {return const_iterator(__begin_node());}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT {return iterator(__end_node());}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT {return const_iterator(__end_node());}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const _NOEXCEPT
- {return std::min<size_type>(
- __node_traits::max_size(__node_alloc()),
- numeric_limits<difference_type >::max());}
-
- void clear() _NOEXCEPT;
-
- void swap(__tree& __t)
-#if _LIBCPP_STD_VER <= 11
- _NOEXCEPT_(
- __is_nothrow_swappable<value_compare>::value
- && (!__node_traits::propagate_on_container_swap::value ||
- __is_nothrow_swappable<__node_allocator>::value)
- );
-#else
- _NOEXCEPT_(__is_nothrow_swappable<value_compare>::value);
-#endif
-
-#ifndef _LIBCPP_CXX03_LANG
- template <class _Key, class ..._Args>
- pair<iterator, bool>
- __emplace_unique_key_args(_Key const&, _Args&&... __args);
- template <class _Key, class ..._Args>
- iterator
- __emplace_hint_unique_key_args(const_iterator, _Key const&, _Args&&...);
-
- template <class... _Args>
- pair<iterator, bool> __emplace_unique_impl(_Args&&... __args);
-
- template <class... _Args>
- iterator __emplace_hint_unique_impl(const_iterator __p, _Args&&... __args);
-
- template <class... _Args>
- iterator __emplace_multi(_Args&&... __args);
-
- template <class... _Args>
- iterator __emplace_hint_multi(const_iterator __p, _Args&&... __args);
-
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __emplace_unique(_Pp&& __x) {
- return __emplace_unique_extract_key(_VSTD::forward<_Pp>(__x),
- __can_extract_key<_Pp, key_type>());
- }
-
- template <class _First, class _Second>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<
- __can_extract_map_key<_First, key_type, __container_value_type>::value,
- pair<iterator, bool>
- >::type __emplace_unique(_First&& __f, _Second&& __s) {
- return __emplace_unique_key_args(__f, _VSTD::forward<_First>(__f),
- _VSTD::forward<_Second>(__s));
- }
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __emplace_unique(_Args&&... __args) {
- return __emplace_unique_impl(_VSTD::forward<_Args>(__args)...);
- }
-
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool>
- __emplace_unique_extract_key(_Pp&& __x, __extract_key_fail_tag) {
- return __emplace_unique_impl(_VSTD::forward<_Pp>(__x));
- }
-
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool>
- __emplace_unique_extract_key(_Pp&& __x, __extract_key_self_tag) {
- return __emplace_unique_key_args(__x, _VSTD::forward<_Pp>(__x));
- }
-
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool>
- __emplace_unique_extract_key(_Pp&& __x, __extract_key_first_tag) {
- return __emplace_unique_key_args(__x.first, _VSTD::forward<_Pp>(__x));
- }
-
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- iterator __emplace_hint_unique(const_iterator __p, _Pp&& __x) {
- return __emplace_hint_unique_extract_key(__p, _VSTD::forward<_Pp>(__x),
- __can_extract_key<_Pp, key_type>());
- }
-
- template <class _First, class _Second>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<
- __can_extract_map_key<_First, key_type, __container_value_type>::value,
- iterator
- >::type __emplace_hint_unique(const_iterator __p, _First&& __f, _Second&& __s) {
- return __emplace_hint_unique_key_args(__p, __f,
- _VSTD::forward<_First>(__f),
- _VSTD::forward<_Second>(__s));
- }
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator __emplace_hint_unique(const_iterator __p, _Args&&... __args) {
- return __emplace_hint_unique_impl(__p, _VSTD::forward<_Args>(__args)...);
- }
-
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- iterator
- __emplace_hint_unique_extract_key(const_iterator __p, _Pp&& __x, __extract_key_fail_tag) {
- return __emplace_hint_unique_impl(__p, _VSTD::forward<_Pp>(__x));
- }
-
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- iterator
- __emplace_hint_unique_extract_key(const_iterator __p, _Pp&& __x, __extract_key_self_tag) {
- return __emplace_hint_unique_key_args(__p, __x, _VSTD::forward<_Pp>(__x));
- }
-
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- iterator
- __emplace_hint_unique_extract_key(const_iterator __p, _Pp&& __x, __extract_key_first_tag) {
- return __emplace_hint_unique_key_args(__p, __x.first, _VSTD::forward<_Pp>(__x));
- }
-
-#else
- template <class _Key, class _Args>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __emplace_unique_key_args(_Key const&, _Args& __args);
- template <class _Key, class _Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator __emplace_hint_unique_key_args(const_iterator, _Key const&, _Args&);
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __insert_unique(const __container_value_type& __v) {
- return __emplace_unique_key_args(_NodeTypes::__get_key(__v), __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iterator __insert_unique(const_iterator __p, const __container_value_type& __v) {
- return __emplace_hint_unique_key_args(__p, _NodeTypes::__get_key(__v), __v);
- }
-
-#ifdef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- iterator __insert_multi(const __container_value_type& __v);
- _LIBCPP_INLINE_VISIBILITY
- iterator __insert_multi(const_iterator __p, const __container_value_type& __v);
-#else
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __insert_unique(__container_value_type&& __v) {
- return __emplace_unique_key_args(_NodeTypes::__get_key(__v), _VSTD::move(__v));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iterator __insert_unique(const_iterator __p, __container_value_type&& __v) {
- return __emplace_hint_unique_key_args(__p, _NodeTypes::__get_key(__v), _VSTD::move(__v));
- }
-
- template <class _Vp, class = typename enable_if<
- !is_same<typename __unconstref<_Vp>::type,
- __container_value_type
- >::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __insert_unique(_Vp&& __v) {
- return __emplace_unique(_VSTD::forward<_Vp>(__v));
- }
-
- template <class _Vp, class = typename enable_if<
- !is_same<typename __unconstref<_Vp>::type,
- __container_value_type
- >::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- iterator __insert_unique(const_iterator __p, _Vp&& __v) {
- return __emplace_hint_unique(__p, _VSTD::forward<_Vp>(__v));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iterator __insert_multi(__container_value_type&& __v) {
- return __emplace_multi(_VSTD::move(__v));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iterator __insert_multi(const_iterator __p, __container_value_type&& __v) {
- return __emplace_hint_multi(__p, _VSTD::move(__v));
- }
-
- template <class _Vp>
- _LIBCPP_INLINE_VISIBILITY
- iterator __insert_multi(_Vp&& __v) {
- return __emplace_multi(_VSTD::forward<_Vp>(__v));
- }
-
- template <class _Vp>
- _LIBCPP_INLINE_VISIBILITY
- iterator __insert_multi(const_iterator __p, _Vp&& __v) {
- return __emplace_hint_multi(__p, _VSTD::forward<_Vp>(__v));
- }
-
-#endif // !_LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __node_insert_unique(__node_pointer __nd);
- _LIBCPP_INLINE_VISIBILITY
- iterator __node_insert_unique(const_iterator __p,
- __node_pointer __nd);
-
- _LIBCPP_INLINE_VISIBILITY
- iterator __node_insert_multi(__node_pointer __nd);
- _LIBCPP_INLINE_VISIBILITY
- iterator __node_insert_multi(const_iterator __p, __node_pointer __nd);
-
-
- _LIBCPP_INLINE_VISIBILITY iterator
- __remove_node_pointer(__node_pointer) _NOEXCEPT;
-
-#if _LIBCPP_STD_VER > 14
- template <class _NodeHandle, class _InsertReturnType>
- _LIBCPP_INLINE_VISIBILITY
- _InsertReturnType __node_handle_insert_unique(_NodeHandle&&);
- template <class _NodeHandle>
- _LIBCPP_INLINE_VISIBILITY
- iterator __node_handle_insert_unique(const_iterator, _NodeHandle&&);
- template <class _Tree>
- _LIBCPP_INLINE_VISIBILITY
- void __node_handle_merge_unique(_Tree& __source);
-
- template <class _NodeHandle>
- _LIBCPP_INLINE_VISIBILITY
- iterator __node_handle_insert_multi(_NodeHandle&&);
- template <class _NodeHandle>
- _LIBCPP_INLINE_VISIBILITY
- iterator __node_handle_insert_multi(const_iterator, _NodeHandle&&);
- template <class _Tree>
- _LIBCPP_INLINE_VISIBILITY
- void __node_handle_merge_multi(_Tree& __source);
-
-
- template <class _NodeHandle>
- _LIBCPP_INLINE_VISIBILITY
- _NodeHandle __node_handle_extract(key_type const&);
- template <class _NodeHandle>
- _LIBCPP_INLINE_VISIBILITY
- _NodeHandle __node_handle_extract(const_iterator);
-#endif
-
- iterator erase(const_iterator __p);
- iterator erase(const_iterator __f, const_iterator __l);
- template <class _Key>
- size_type __erase_unique(const _Key& __k);
- template <class _Key>
- size_type __erase_multi(const _Key& __k);
-
- void __insert_node_at(__parent_pointer __parent,
- __node_base_pointer& __child,
- __node_base_pointer __new_node) _NOEXCEPT;
-
- template <class _Key>
- iterator find(const _Key& __v);
- template <class _Key>
- const_iterator find(const _Key& __v) const;
-
- template <class _Key>
- size_type __count_unique(const _Key& __k) const;
- template <class _Key>
- size_type __count_multi(const _Key& __k) const;
-
- template <class _Key>
- _LIBCPP_INLINE_VISIBILITY
- iterator lower_bound(const _Key& __v)
- {return __lower_bound(__v, __root(), __end_node());}
- template <class _Key>
- iterator __lower_bound(const _Key& __v,
- __node_pointer __root,
- __iter_pointer __result);
- template <class _Key>
- _LIBCPP_INLINE_VISIBILITY
- const_iterator lower_bound(const _Key& __v) const
- {return __lower_bound(__v, __root(), __end_node());}
- template <class _Key>
- const_iterator __lower_bound(const _Key& __v,
- __node_pointer __root,
- __iter_pointer __result) const;
- template <class _Key>
- _LIBCPP_INLINE_VISIBILITY
- iterator upper_bound(const _Key& __v)
- {return __upper_bound(__v, __root(), __end_node());}
- template <class _Key>
- iterator __upper_bound(const _Key& __v,
- __node_pointer __root,
- __iter_pointer __result);
- template <class _Key>
- _LIBCPP_INLINE_VISIBILITY
- const_iterator upper_bound(const _Key& __v) const
- {return __upper_bound(__v, __root(), __end_node());}
- template <class _Key>
- const_iterator __upper_bound(const _Key& __v,
- __node_pointer __root,
- __iter_pointer __result) const;
- template <class _Key>
- pair<iterator, iterator>
- __equal_range_unique(const _Key& __k);
- template <class _Key>
- pair<const_iterator, const_iterator>
- __equal_range_unique(const _Key& __k) const;
-
- template <class _Key>
- pair<iterator, iterator>
- __equal_range_multi(const _Key& __k);
- template <class _Key>
- pair<const_iterator, const_iterator>
- __equal_range_multi(const _Key& __k) const;
-
- typedef __tree_node_destructor<__node_allocator> _Dp;
- typedef unique_ptr<__node, _Dp> __node_holder;
-
- __node_holder remove(const_iterator __p) _NOEXCEPT;
-private:
- __node_base_pointer&
- __find_leaf_low(__parent_pointer& __parent, const key_type& __v);
- __node_base_pointer&
- __find_leaf_high(__parent_pointer& __parent, const key_type& __v);
- __node_base_pointer&
- __find_leaf(const_iterator __hint,
- __parent_pointer& __parent, const key_type& __v);
- // FIXME: Make this function const qualified. Unfortunetly doing so
- // breaks existing code which uses non-const callable comparators.
- template <class _Key>
- __node_base_pointer&
- __find_equal(__parent_pointer& __parent, const _Key& __v);
- template <class _Key>
- _LIBCPP_INLINE_VISIBILITY __node_base_pointer&
- __find_equal(__parent_pointer& __parent, const _Key& __v) const {
- return const_cast<__tree*>(this)->__find_equal(__parent, __v);
- }
- template <class _Key>
- __node_base_pointer&
- __find_equal(const_iterator __hint, __parent_pointer& __parent,
- __node_base_pointer& __dummy,
- const _Key& __v);
-
-#ifndef _LIBCPP_CXX03_LANG
- template <class ..._Args>
- __node_holder __construct_node(_Args&& ...__args);
-#else
- __node_holder __construct_node(const __container_value_type& __v);
-#endif
-
- void destroy(__node_pointer __nd) _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __tree& __t)
- {__copy_assign_alloc(__t, integral_constant<bool,
- __node_traits::propagate_on_container_copy_assignment::value>());}
-
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __tree& __t, true_type)
- {
- if (__node_alloc() != __t.__node_alloc())
- clear();
- __node_alloc() = __t.__node_alloc();
- }
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __tree&, false_type) {}
-
- void __move_assign(__tree& __t, false_type);
- void __move_assign(__tree& __t, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<value_compare>::value &&
- is_nothrow_move_assignable<__node_allocator>::value);
-
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__tree& __t)
- _NOEXCEPT_(
- !__node_traits::propagate_on_container_move_assignment::value ||
- is_nothrow_move_assignable<__node_allocator>::value)
- {__move_assign_alloc(__t, integral_constant<bool,
- __node_traits::propagate_on_container_move_assignment::value>());}
-
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__tree& __t, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value)
- {__node_alloc() = _VSTD::move(__t.__node_alloc());}
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__tree&, false_type) _NOEXCEPT {}
-
- __node_pointer __detach();
- static __node_pointer __detach(__node_pointer);
-
- template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
- template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
-};
-
-template <class _Tp, class _Compare, class _Allocator>
-__tree<_Tp, _Compare, _Allocator>::__tree(const value_compare& __comp)
- _NOEXCEPT_(
- is_nothrow_default_constructible<__node_allocator>::value &&
- is_nothrow_copy_constructible<value_compare>::value)
- : __pair3_(0, __comp)
-{
- __begin_node() = __end_node();
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-__tree<_Tp, _Compare, _Allocator>::__tree(const allocator_type& __a)
- : __begin_node_(__iter_pointer()),
- __pair1_(__second_tag(), __node_allocator(__a)),
- __pair3_(0)
-{
- __begin_node() = __end_node();
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-__tree<_Tp, _Compare, _Allocator>::__tree(const value_compare& __comp,
- const allocator_type& __a)
- : __begin_node_(__iter_pointer()),
- __pair1_(__second_tag(), __node_allocator(__a)),
- __pair3_(0, __comp)
-{
- __begin_node() = __end_node();
-}
-
-// Precondition: size() != 0
-template <class _Tp, class _Compare, class _Allocator>
-typename __tree<_Tp, _Compare, _Allocator>::__node_pointer
-__tree<_Tp, _Compare, _Allocator>::__detach()
-{
- __node_pointer __cache = static_cast<__node_pointer>(__begin_node());
- __begin_node() = __end_node();
- __end_node()->__left_->__parent_ = nullptr;
- __end_node()->__left_ = nullptr;
- size() = 0;
- // __cache->__left_ == nullptr
- if (__cache->__right_ != nullptr)
- __cache = static_cast<__node_pointer>(__cache->__right_);
- // __cache->__left_ == nullptr
- // __cache->__right_ == nullptr
- return __cache;
-}
-
-// Precondition: __cache != nullptr
-// __cache->left_ == nullptr
-// __cache->right_ == nullptr
-// This is no longer a red-black tree
-template <class _Tp, class _Compare, class _Allocator>
-typename __tree<_Tp, _Compare, _Allocator>::__node_pointer
-__tree<_Tp, _Compare, _Allocator>::__detach(__node_pointer __cache)
-{
- if (__cache->__parent_ == nullptr)
- return nullptr;
- if (__tree_is_left_child(static_cast<__node_base_pointer>(__cache)))
- {
- __cache->__parent_->__left_ = nullptr;
- __cache = static_cast<__node_pointer>(__cache->__parent_);
- if (__cache->__right_ == nullptr)
- return __cache;
- return static_cast<__node_pointer>(__tree_leaf(__cache->__right_));
- }
- // __cache is right child
- __cache->__parent_unsafe()->__right_ = nullptr;
- __cache = static_cast<__node_pointer>(__cache->__parent_);
- if (__cache->__left_ == nullptr)
- return __cache;
- return static_cast<__node_pointer>(__tree_leaf(__cache->__left_));
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-__tree<_Tp, _Compare, _Allocator>&
-__tree<_Tp, _Compare, _Allocator>::operator=(const __tree& __t)
-{
- if (this != &__t)
- {
- value_comp() = __t.value_comp();
- __copy_assign_alloc(__t);
- __assign_multi(__t.begin(), __t.end());
- }
- return *this;
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _InputIterator>
-void
-__tree<_Tp, _Compare, _Allocator>::__assign_unique(_InputIterator __first, _InputIterator __last)
-{
- typedef iterator_traits<_InputIterator> _ITraits;
- typedef typename _ITraits::value_type _ItValueType;
- static_assert((is_same<_ItValueType, __container_value_type>::value),
- "__assign_unique may only be called with the containers value type");
-
- if (size() != 0)
- {
- __node_pointer __cache = __detach();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (; __cache != nullptr && __first != __last; ++__first)
- {
- __cache->__value_ = *__first;
- __node_pointer __next = __detach(__cache);
- __node_insert_unique(__cache);
- __cache = __next;
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- while (__cache->__parent_ != nullptr)
- __cache = static_cast<__node_pointer>(__cache->__parent_);
- destroy(__cache);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (__cache != nullptr)
- {
- while (__cache->__parent_ != nullptr)
- __cache = static_cast<__node_pointer>(__cache->__parent_);
- destroy(__cache);
- }
- }
- for (; __first != __last; ++__first)
- __insert_unique(*__first);
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _InputIterator>
-void
-__tree<_Tp, _Compare, _Allocator>::__assign_multi(_InputIterator __first, _InputIterator __last)
-{
- typedef iterator_traits<_InputIterator> _ITraits;
- typedef typename _ITraits::value_type _ItValueType;
- static_assert((is_same<_ItValueType, __container_value_type>::value ||
- is_same<_ItValueType, __node_value_type>::value),
- "__assign_multi may only be called with the containers value type"
- " or the nodes value type");
- if (size() != 0)
- {
- __node_pointer __cache = __detach();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (; __cache != nullptr && __first != __last; ++__first)
- {
- __cache->__value_ = *__first;
- __node_pointer __next = __detach(__cache);
- __node_insert_multi(__cache);
- __cache = __next;
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- while (__cache->__parent_ != nullptr)
- __cache = static_cast<__node_pointer>(__cache->__parent_);
- destroy(__cache);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (__cache != nullptr)
- {
- while (__cache->__parent_ != nullptr)
- __cache = static_cast<__node_pointer>(__cache->__parent_);
- destroy(__cache);
- }
- }
- for (; __first != __last; ++__first)
- __insert_multi(_NodeTypes::__get_value(*__first));
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-__tree<_Tp, _Compare, _Allocator>::__tree(const __tree& __t)
- : __begin_node_(__iter_pointer()),
- __pair1_(__second_tag(), __node_traits::select_on_container_copy_construction(__t.__node_alloc())),
- __pair3_(0, __t.value_comp())
-{
- __begin_node() = __end_node();
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Compare, class _Allocator>
-__tree<_Tp, _Compare, _Allocator>::__tree(__tree&& __t)
- _NOEXCEPT_(
- is_nothrow_move_constructible<__node_allocator>::value &&
- is_nothrow_move_constructible<value_compare>::value)
- : __begin_node_(_VSTD::move(__t.__begin_node_)),
- __pair1_(_VSTD::move(__t.__pair1_)),
- __pair3_(_VSTD::move(__t.__pair3_))
-{
- if (size() == 0)
- __begin_node() = __end_node();
- else
- {
- __end_node()->__left_->__parent_ = static_cast<__parent_pointer>(__end_node());
- __t.__begin_node() = __t.__end_node();
- __t.__end_node()->__left_ = nullptr;
- __t.size() = 0;
- }
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-__tree<_Tp, _Compare, _Allocator>::__tree(__tree&& __t, const allocator_type& __a)
- : __pair1_(__second_tag(), __node_allocator(__a)),
- __pair3_(0, _VSTD::move(__t.value_comp()))
-{
- if (__a == __t.__alloc())
- {
- if (__t.size() == 0)
- __begin_node() = __end_node();
- else
- {
- __begin_node() = __t.__begin_node();
- __end_node()->__left_ = __t.__end_node()->__left_;
- __end_node()->__left_->__parent_ = static_cast<__parent_pointer>(__end_node());
- size() = __t.size();
- __t.__begin_node() = __t.__end_node();
- __t.__end_node()->__left_ = nullptr;
- __t.size() = 0;
- }
- }
- else
- {
- __begin_node() = __end_node();
- }
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-void
-__tree<_Tp, _Compare, _Allocator>::__move_assign(__tree& __t, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<value_compare>::value &&
- is_nothrow_move_assignable<__node_allocator>::value)
-{
- destroy(static_cast<__node_pointer>(__end_node()->__left_));
- __begin_node_ = __t.__begin_node_;
- __pair1_.first() = __t.__pair1_.first();
- __move_assign_alloc(__t);
- __pair3_ = _VSTD::move(__t.__pair3_);
- if (size() == 0)
- __begin_node() = __end_node();
- else
- {
- __end_node()->__left_->__parent_ = static_cast<__parent_pointer>(__end_node());
- __t.__begin_node() = __t.__end_node();
- __t.__end_node()->__left_ = nullptr;
- __t.size() = 0;
- }
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-void
-__tree<_Tp, _Compare, _Allocator>::__move_assign(__tree& __t, false_type)
-{
- if (__node_alloc() == __t.__node_alloc())
- __move_assign(__t, true_type());
- else
- {
- value_comp() = _VSTD::move(__t.value_comp());
- const_iterator __e = end();
- if (size() != 0)
- {
- __node_pointer __cache = __detach();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- while (__cache != nullptr && __t.size() != 0)
- {
- __cache->__value_ = _VSTD::move(__t.remove(__t.begin())->__value_);
- __node_pointer __next = __detach(__cache);
- __node_insert_multi(__cache);
- __cache = __next;
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- while (__cache->__parent_ != nullptr)
- __cache = static_cast<__node_pointer>(__cache->__parent_);
- destroy(__cache);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (__cache != nullptr)
- {
- while (__cache->__parent_ != nullptr)
- __cache = static_cast<__node_pointer>(__cache->__parent_);
- destroy(__cache);
- }
- }
- while (__t.size() != 0)
- __insert_multi(__e, _NodeTypes::__move(__t.remove(__t.begin())->__value_));
- }
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-__tree<_Tp, _Compare, _Allocator>&
-__tree<_Tp, _Compare, _Allocator>::operator=(__tree&& __t)
- _NOEXCEPT_(
- __node_traits::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<value_compare>::value &&
- is_nothrow_move_assignable<__node_allocator>::value)
-
-{
- __move_assign(__t, integral_constant<bool,
- __node_traits::propagate_on_container_move_assignment::value>());
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Compare, class _Allocator>
-__tree<_Tp, _Compare, _Allocator>::~__tree()
-{
- static_assert((is_copy_constructible<value_compare>::value),
- "Comparator must be copy-constructible.");
- destroy(__root());
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-void
-__tree<_Tp, _Compare, _Allocator>::destroy(__node_pointer __nd) _NOEXCEPT
-{
- if (__nd != nullptr)
- {
- destroy(static_cast<__node_pointer>(__nd->__left_));
- destroy(static_cast<__node_pointer>(__nd->__right_));
- __node_allocator& __na = __node_alloc();
- __node_traits::destroy(__na, _NodeTypes::__get_ptr(__nd->__value_));
- __node_traits::deallocate(__na, __nd, 1);
- }
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-void
-__tree<_Tp, _Compare, _Allocator>::swap(__tree& __t)
-#if _LIBCPP_STD_VER <= 11
- _NOEXCEPT_(
- __is_nothrow_swappable<value_compare>::value
- && (!__node_traits::propagate_on_container_swap::value ||
- __is_nothrow_swappable<__node_allocator>::value)
- )
-#else
- _NOEXCEPT_(__is_nothrow_swappable<value_compare>::value)
-#endif
-{
- using _VSTD::swap;
- swap(__begin_node_, __t.__begin_node_);
- swap(__pair1_.first(), __t.__pair1_.first());
- __swap_allocator(__node_alloc(), __t.__node_alloc());
- __pair3_.swap(__t.__pair3_);
- if (size() == 0)
- __begin_node() = __end_node();
- else
- __end_node()->__left_->__parent_ = static_cast<__parent_pointer>(__end_node());
- if (__t.size() == 0)
- __t.__begin_node() = __t.__end_node();
- else
- __t.__end_node()->__left_->__parent_ = static_cast<__parent_pointer>(__t.__end_node());
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-void
-__tree<_Tp, _Compare, _Allocator>::clear() _NOEXCEPT
-{
- destroy(__root());
- size() = 0;
- __begin_node() = __end_node();
- __end_node()->__left_ = nullptr;
-}
-
-// Find lower_bound place to insert
-// Set __parent to parent of null leaf
-// Return reference to null leaf
-template <class _Tp, class _Compare, class _Allocator>
-typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer&
-__tree<_Tp, _Compare, _Allocator>::__find_leaf_low(__parent_pointer& __parent,
- const key_type& __v)
-{
- __node_pointer __nd = __root();
- if (__nd != nullptr)
- {
- while (true)
- {
- if (value_comp()(__nd->__value_, __v))
- {
- if (__nd->__right_ != nullptr)
- __nd = static_cast<__node_pointer>(__nd->__right_);
- else
- {
- __parent = static_cast<__parent_pointer>(__nd);
- return __nd->__right_;
- }
- }
- else
- {
- if (__nd->__left_ != nullptr)
- __nd = static_cast<__node_pointer>(__nd->__left_);
- else
- {
- __parent = static_cast<__parent_pointer>(__nd);
- return __parent->__left_;
- }
- }
- }
- }
- __parent = static_cast<__parent_pointer>(__end_node());
- return __parent->__left_;
-}
-
-// Find upper_bound place to insert
-// Set __parent to parent of null leaf
-// Return reference to null leaf
-template <class _Tp, class _Compare, class _Allocator>
-typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer&
-__tree<_Tp, _Compare, _Allocator>::__find_leaf_high(__parent_pointer& __parent,
- const key_type& __v)
-{
- __node_pointer __nd = __root();
- if (__nd != nullptr)
- {
- while (true)
- {
- if (value_comp()(__v, __nd->__value_))
- {
- if (__nd->__left_ != nullptr)
- __nd = static_cast<__node_pointer>(__nd->__left_);
- else
- {
- __parent = static_cast<__parent_pointer>(__nd);
- return __parent->__left_;
- }
- }
- else
- {
- if (__nd->__right_ != nullptr)
- __nd = static_cast<__node_pointer>(__nd->__right_);
- else
- {
- __parent = static_cast<__parent_pointer>(__nd);
- return __nd->__right_;
- }
- }
- }
- }
- __parent = static_cast<__parent_pointer>(__end_node());
- return __parent->__left_;
-}
-
-// Find leaf place to insert closest to __hint
-// First check prior to __hint.
-// Next check after __hint.
-// Next do O(log N) search.
-// Set __parent to parent of null leaf
-// Return reference to null leaf
-template <class _Tp, class _Compare, class _Allocator>
-typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer&
-__tree<_Tp, _Compare, _Allocator>::__find_leaf(const_iterator __hint,
- __parent_pointer& __parent,
- const key_type& __v)
-{
- if (__hint == end() || !value_comp()(*__hint, __v)) // check before
- {
- // __v <= *__hint
- const_iterator __prior = __hint;
- if (__prior == begin() || !value_comp()(__v, *--__prior))
- {
- // *prev(__hint) <= __v <= *__hint
- if (__hint.__ptr_->__left_ == nullptr)
- {
- __parent = static_cast<__parent_pointer>(__hint.__ptr_);
- return __parent->__left_;
- }
- else
- {
- __parent = static_cast<__parent_pointer>(__prior.__ptr_);
- return static_cast<__node_base_pointer>(__prior.__ptr_)->__right_;
- }
- }
- // __v < *prev(__hint)
- return __find_leaf_high(__parent, __v);
- }
- // else __v > *__hint
- return __find_leaf_low(__parent, __v);
-}
-
-// Find place to insert if __v doesn't exist
-// Set __parent to parent of null leaf
-// Return reference to null leaf
-// If __v exists, set parent to node of __v and return reference to node of __v
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key>
-typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer&
-__tree<_Tp, _Compare, _Allocator>::__find_equal(__parent_pointer& __parent,
- const _Key& __v)
-{
- __node_pointer __nd = __root();
- __node_base_pointer* __nd_ptr = __root_ptr();
- if (__nd != nullptr)
- {
- while (true)
- {
- if (value_comp()(__v, __nd->__value_))
- {
- if (__nd->__left_ != nullptr) {
- __nd_ptr = _VSTD::addressof(__nd->__left_);
- __nd = static_cast<__node_pointer>(__nd->__left_);
- } else {
- __parent = static_cast<__parent_pointer>(__nd);
- return __parent->__left_;
- }
- }
- else if (value_comp()(__nd->__value_, __v))
- {
- if (__nd->__right_ != nullptr) {
- __nd_ptr = _VSTD::addressof(__nd->__right_);
- __nd = static_cast<__node_pointer>(__nd->__right_);
- } else {
- __parent = static_cast<__parent_pointer>(__nd);
- return __nd->__right_;
- }
- }
- else
- {
- __parent = static_cast<__parent_pointer>(__nd);
- return *__nd_ptr;
- }
- }
- }
- __parent = static_cast<__parent_pointer>(__end_node());
- return __parent->__left_;
-}
-
-// Find place to insert if __v doesn't exist
-// First check prior to __hint.
-// Next check after __hint.
-// Next do O(log N) search.
-// Set __parent to parent of null leaf
-// Return reference to null leaf
-// If __v exists, set parent to node of __v and return reference to node of __v
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key>
-typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer&
-__tree<_Tp, _Compare, _Allocator>::__find_equal(const_iterator __hint,
- __parent_pointer& __parent,
- __node_base_pointer& __dummy,
- const _Key& __v)
-{
- if (__hint == end() || value_comp()(__v, *__hint)) // check before
- {
- // __v < *__hint
- const_iterator __prior = __hint;
- if (__prior == begin() || value_comp()(*--__prior, __v))
- {
- // *prev(__hint) < __v < *__hint
- if (__hint.__ptr_->__left_ == nullptr)
- {
- __parent = static_cast<__parent_pointer>(__hint.__ptr_);
- return __parent->__left_;
- }
- else
- {
- __parent = static_cast<__parent_pointer>(__prior.__ptr_);
- return static_cast<__node_base_pointer>(__prior.__ptr_)->__right_;
- }
- }
- // __v <= *prev(__hint)
- return __find_equal(__parent, __v);
- }
- else if (value_comp()(*__hint, __v)) // check after
- {
- // *__hint < __v
- const_iterator __next = _VSTD::next(__hint);
- if (__next == end() || value_comp()(__v, *__next))
- {
- // *__hint < __v < *_VSTD::next(__hint)
- if (__hint.__get_np()->__right_ == nullptr)
- {
- __parent = static_cast<__parent_pointer>(__hint.__ptr_);
- return static_cast<__node_base_pointer>(__hint.__ptr_)->__right_;
- }
- else
- {
- __parent = static_cast<__parent_pointer>(__next.__ptr_);
- return __parent->__left_;
- }
- }
- // *next(__hint) <= __v
- return __find_equal(__parent, __v);
- }
- // else __v == *__hint
- __parent = static_cast<__parent_pointer>(__hint.__ptr_);
- __dummy = static_cast<__node_base_pointer>(__hint.__ptr_);
- return __dummy;
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-void __tree<_Tp, _Compare, _Allocator>::__insert_node_at(
- __parent_pointer __parent, __node_base_pointer& __child,
- __node_base_pointer __new_node) _NOEXCEPT
-{
- __new_node->__left_ = nullptr;
- __new_node->__right_ = nullptr;
- __new_node->__parent_ = __parent;
- // __new_node->__is_black_ is initialized in __tree_balance_after_insert
- __child = __new_node;
- if (__begin_node()->__left_ != nullptr)
- __begin_node() = static_cast<__iter_pointer>(__begin_node()->__left_);
- __tree_balance_after_insert(__end_node()->__left_, __child);
- ++size();
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key, class... _Args>
-pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool>
-__tree<_Tp, _Compare, _Allocator>::__emplace_unique_key_args(_Key const& __k, _Args&&... __args)
-#else
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key, class _Args>
-pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool>
-__tree<_Tp, _Compare, _Allocator>::__emplace_unique_key_args(_Key const& __k, _Args& __args)
-#endif
-{
- __parent_pointer __parent;
- __node_base_pointer& __child = __find_equal(__parent, __k);
- __node_pointer __r = static_cast<__node_pointer>(__child);
- bool __inserted = false;
- if (__child == nullptr)
- {
-#ifndef _LIBCPP_CXX03_LANG
- __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
-#else
- __node_holder __h = __construct_node(__args);
-#endif
- __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
- __r = __h.release();
- __inserted = true;
- }
- return pair<iterator, bool>(iterator(__r), __inserted);
-}
-
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key, class... _Args>
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::__emplace_hint_unique_key_args(
- const_iterator __p, _Key const& __k, _Args&&... __args)
-#else
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key, class _Args>
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::__emplace_hint_unique_key_args(
- const_iterator __p, _Key const& __k, _Args& __args)
-#endif
-{
- __parent_pointer __parent;
- __node_base_pointer __dummy;
- __node_base_pointer& __child = __find_equal(__p, __parent, __dummy, __k);
- __node_pointer __r = static_cast<__node_pointer>(__child);
- if (__child == nullptr)
- {
-#ifndef _LIBCPP_CXX03_LANG
- __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
-#else
- __node_holder __h = __construct_node(__args);
-#endif
- __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
- __r = __h.release();
- }
- return iterator(__r);
-}
-
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class ..._Args>
-typename __tree<_Tp, _Compare, _Allocator>::__node_holder
-__tree<_Tp, _Compare, _Allocator>::__construct_node(_Args&& ...__args)
-{
- static_assert(!__is_tree_value_type<_Args...>::value,
- "Cannot construct from __value_type");
- __node_allocator& __na = __node_alloc();
- __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _NodeTypes::__get_ptr(__h->__value_), _VSTD::forward<_Args>(__args)...);
- __h.get_deleter().__value_constructed = true;
- return __h;
-}
-
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class... _Args>
-pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool>
-__tree<_Tp, _Compare, _Allocator>::__emplace_unique_impl(_Args&&... __args)
-{
- __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
- __parent_pointer __parent;
- __node_base_pointer& __child = __find_equal(__parent, __h->__value_);
- __node_pointer __r = static_cast<__node_pointer>(__child);
- bool __inserted = false;
- if (__child == nullptr)
- {
- __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
- __r = __h.release();
- __inserted = true;
- }
- return pair<iterator, bool>(iterator(__r), __inserted);
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class... _Args>
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::__emplace_hint_unique_impl(const_iterator __p, _Args&&... __args)
-{
- __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
- __parent_pointer __parent;
- __node_base_pointer __dummy;
- __node_base_pointer& __child = __find_equal(__p, __parent, __dummy, __h->__value_);
- __node_pointer __r = static_cast<__node_pointer>(__child);
- if (__child == nullptr)
- {
- __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
- __r = __h.release();
- }
- return iterator(__r);
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class... _Args>
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::__emplace_multi(_Args&&... __args)
-{
- __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
- __parent_pointer __parent;
- __node_base_pointer& __child = __find_leaf_high(__parent, _NodeTypes::__get_key(__h->__value_));
- __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
- return iterator(static_cast<__node_pointer>(__h.release()));
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class... _Args>
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::__emplace_hint_multi(const_iterator __p,
- _Args&&... __args)
-{
- __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
- __parent_pointer __parent;
- __node_base_pointer& __child = __find_leaf(__p, __parent, _NodeTypes::__get_key(__h->__value_));
- __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
- return iterator(static_cast<__node_pointer>(__h.release()));
-}
-
-
-#else // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Compare, class _Allocator>
-typename __tree<_Tp, _Compare, _Allocator>::__node_holder
-__tree<_Tp, _Compare, _Allocator>::__construct_node(const __container_value_type& __v)
-{
- __node_allocator& __na = __node_alloc();
- __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _NodeTypes::__get_ptr(__h->__value_), __v);
- __h.get_deleter().__value_constructed = true;
- return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-#ifdef _LIBCPP_CXX03_LANG
-template <class _Tp, class _Compare, class _Allocator>
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::__insert_multi(const __container_value_type& __v)
-{
- __parent_pointer __parent;
- __node_base_pointer& __child = __find_leaf_high(__parent, _NodeTypes::__get_key(__v));
- __node_holder __h = __construct_node(__v);
- __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
- return iterator(__h.release());
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::__insert_multi(const_iterator __p, const __container_value_type& __v)
-{
- __parent_pointer __parent;
- __node_base_pointer& __child = __find_leaf(__p, __parent, _NodeTypes::__get_key(__v));
- __node_holder __h = __construct_node(__v);
- __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
- return iterator(__h.release());
-}
-#endif
-
-template <class _Tp, class _Compare, class _Allocator>
-pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool>
-__tree<_Tp, _Compare, _Allocator>::__node_insert_unique(__node_pointer __nd)
-{
- __parent_pointer __parent;
- __node_base_pointer& __child = __find_equal(__parent, __nd->__value_);
- __node_pointer __r = static_cast<__node_pointer>(__child);
- bool __inserted = false;
- if (__child == nullptr)
- {
- __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd));
- __r = __nd;
- __inserted = true;
- }
- return pair<iterator, bool>(iterator(__r), __inserted);
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::__node_insert_unique(const_iterator __p,
- __node_pointer __nd)
-{
- __parent_pointer __parent;
- __node_base_pointer __dummy;
- __node_base_pointer& __child = __find_equal(__p, __parent, __nd->__value_);
- __node_pointer __r = static_cast<__node_pointer>(__child);
- if (__child == nullptr)
- {
- __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd));
- __r = __nd;
- }
- return iterator(__r);
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::__node_insert_multi(__node_pointer __nd)
-{
- __parent_pointer __parent;
- __node_base_pointer& __child = __find_leaf_high(__parent, _NodeTypes::__get_key(__nd->__value_));
- __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd));
- return iterator(__nd);
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::__node_insert_multi(const_iterator __p,
- __node_pointer __nd)
-{
- __parent_pointer __parent;
- __node_base_pointer& __child = __find_leaf(__p, __parent, _NodeTypes::__get_key(__nd->__value_));
- __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd));
- return iterator(__nd);
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::__remove_node_pointer(__node_pointer __ptr) _NOEXCEPT
-{
- iterator __r(__ptr);
- ++__r;
- if (__begin_node() == __ptr)
- __begin_node() = __r.__ptr_;
- --size();
- __tree_remove(__end_node()->__left_,
- static_cast<__node_base_pointer>(__ptr));
- return __r;
-}
-
-#if _LIBCPP_STD_VER > 14
-template <class _Tp, class _Compare, class _Allocator>
-template <class _NodeHandle, class _InsertReturnType>
-_LIBCPP_INLINE_VISIBILITY
-_InsertReturnType
-__tree<_Tp, _Compare, _Allocator>::__node_handle_insert_unique(
- _NodeHandle&& __nh)
-{
- if (__nh.empty())
- return _InsertReturnType{end(), false, _NodeHandle()};
-
- __node_pointer __ptr = __nh.__ptr_;
- __parent_pointer __parent;
- __node_base_pointer& __child = __find_equal(__parent,
- __ptr->__value_);
- if (__child != nullptr)
- return _InsertReturnType{
- iterator(static_cast<__node_pointer>(__child)),
- false, _VSTD::move(__nh)};
-
- __insert_node_at(__parent, __child,
- static_cast<__node_base_pointer>(__ptr));
- __nh.__release();
- return _InsertReturnType{iterator(__ptr), true, _NodeHandle()};
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _NodeHandle>
-_LIBCPP_INLINE_VISIBILITY
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::__node_handle_insert_unique(
- const_iterator __hint, _NodeHandle&& __nh)
-{
- if (__nh.empty())
- return end();
-
- __node_pointer __ptr = __nh.__ptr_;
- __parent_pointer __parent;
- __node_base_pointer __dummy;
- __node_base_pointer& __child = __find_equal(__hint, __parent, __dummy,
- __ptr->__value_);
- __node_pointer __r = static_cast<__node_pointer>(__child);
- if (__child == nullptr)
- {
- __insert_node_at(__parent, __child,
- static_cast<__node_base_pointer>(__ptr));
- __r = __ptr;
- __nh.__release();
- }
- return iterator(__r);
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _NodeHandle>
-_LIBCPP_INLINE_VISIBILITY
-_NodeHandle
-__tree<_Tp, _Compare, _Allocator>::__node_handle_extract(key_type const& __key)
-{
- iterator __it = find(__key);
- if (__it == end())
- return _NodeHandle();
- return __node_handle_extract<_NodeHandle>(__it);
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _NodeHandle>
-_LIBCPP_INLINE_VISIBILITY
-_NodeHandle
-__tree<_Tp, _Compare, _Allocator>::__node_handle_extract(const_iterator __p)
-{
- __node_pointer __np = __p.__get_np();
- __remove_node_pointer(__np);
- return _NodeHandle(__np, __alloc());
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Tree>
-_LIBCPP_INLINE_VISIBILITY
-void
-__tree<_Tp, _Compare, _Allocator>::__node_handle_merge_unique(_Tree& __source)
-{
- static_assert(is_same<typename _Tree::__node_pointer, __node_pointer>::value, "");
-
- for (typename _Tree::iterator __i = __source.begin();
- __i != __source.end();)
- {
- __node_pointer __src_ptr = __i.__get_np();
- __parent_pointer __parent;
- __node_base_pointer& __child =
- __find_equal(__parent, _NodeTypes::__get_key(__src_ptr->__value_));
- ++__i;
- if (__child != nullptr)
- continue;
- __source.__remove_node_pointer(__src_ptr);
- __insert_node_at(__parent, __child,
- static_cast<__node_base_pointer>(__src_ptr));
- }
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _NodeHandle>
-_LIBCPP_INLINE_VISIBILITY
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::__node_handle_insert_multi(_NodeHandle&& __nh)
-{
- if (__nh.empty())
- return end();
- __node_pointer __ptr = __nh.__ptr_;
- __parent_pointer __parent;
- __node_base_pointer& __child = __find_leaf_high(
- __parent, _NodeTypes::__get_key(__ptr->__value_));
- __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__ptr));
- __nh.__release();
- return iterator(__ptr);
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _NodeHandle>
-_LIBCPP_INLINE_VISIBILITY
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::__node_handle_insert_multi(
- const_iterator __hint, _NodeHandle&& __nh)
-{
- if (__nh.empty())
- return end();
-
- __node_pointer __ptr = __nh.__ptr_;
- __parent_pointer __parent;
- __node_base_pointer& __child = __find_leaf(__hint, __parent,
- _NodeTypes::__get_key(__ptr->__value_));
- __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__ptr));
- __nh.__release();
- return iterator(__ptr);
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Tree>
-_LIBCPP_INLINE_VISIBILITY
-void
-__tree<_Tp, _Compare, _Allocator>::__node_handle_merge_multi(_Tree& __source)
-{
- static_assert(is_same<typename _Tree::__node_pointer, __node_pointer>::value, "");
-
- for (typename _Tree::iterator __i = __source.begin();
- __i != __source.end();)
- {
- __node_pointer __src_ptr = __i.__get_np();
- __parent_pointer __parent;
- __node_base_pointer& __child = __find_leaf_high(
- __parent, _NodeTypes::__get_key(__src_ptr->__value_));
- ++__i;
- __source.__remove_node_pointer(__src_ptr);
- __insert_node_at(__parent, __child,
- static_cast<__node_base_pointer>(__src_ptr));
- }
-}
-
-#endif // _LIBCPP_STD_VER > 14
-
-template <class _Tp, class _Compare, class _Allocator>
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::erase(const_iterator __p)
-{
- __node_pointer __np = __p.__get_np();
- iterator __r = __remove_node_pointer(__np);
- __node_allocator& __na = __node_alloc();
- __node_traits::destroy(__na, _NodeTypes::__get_ptr(
- const_cast<__node_value_type&>(*__p)));
- __node_traits::deallocate(__na, __np, 1);
- return __r;
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::erase(const_iterator __f, const_iterator __l)
-{
- while (__f != __l)
- __f = erase(__f);
- return iterator(__l.__ptr_);
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key>
-typename __tree<_Tp, _Compare, _Allocator>::size_type
-__tree<_Tp, _Compare, _Allocator>::__erase_unique(const _Key& __k)
-{
- iterator __i = find(__k);
- if (__i == end())
- return 0;
- erase(__i);
- return 1;
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key>
-typename __tree<_Tp, _Compare, _Allocator>::size_type
-__tree<_Tp, _Compare, _Allocator>::__erase_multi(const _Key& __k)
-{
- pair<iterator, iterator> __p = __equal_range_multi(__k);
- size_type __r = 0;
- for (; __p.first != __p.second; ++__r)
- __p.first = erase(__p.first);
- return __r;
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key>
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::find(const _Key& __v)
-{
- iterator __p = __lower_bound(__v, __root(), __end_node());
- if (__p != end() && !value_comp()(__v, *__p))
- return __p;
- return end();
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key>
-typename __tree<_Tp, _Compare, _Allocator>::const_iterator
-__tree<_Tp, _Compare, _Allocator>::find(const _Key& __v) const
-{
- const_iterator __p = __lower_bound(__v, __root(), __end_node());
- if (__p != end() && !value_comp()(__v, *__p))
- return __p;
- return end();
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key>
-typename __tree<_Tp, _Compare, _Allocator>::size_type
-__tree<_Tp, _Compare, _Allocator>::__count_unique(const _Key& __k) const
-{
- __node_pointer __rt = __root();
- while (__rt != nullptr)
- {
- if (value_comp()(__k, __rt->__value_))
- {
- __rt = static_cast<__node_pointer>(__rt->__left_);
- }
- else if (value_comp()(__rt->__value_, __k))
- __rt = static_cast<__node_pointer>(__rt->__right_);
- else
- return 1;
- }
- return 0;
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key>
-typename __tree<_Tp, _Compare, _Allocator>::size_type
-__tree<_Tp, _Compare, _Allocator>::__count_multi(const _Key& __k) const
-{
- __iter_pointer __result = __end_node();
- __node_pointer __rt = __root();
- while (__rt != nullptr)
- {
- if (value_comp()(__k, __rt->__value_))
- {
- __result = static_cast<__iter_pointer>(__rt);
- __rt = static_cast<__node_pointer>(__rt->__left_);
- }
- else if (value_comp()(__rt->__value_, __k))
- __rt = static_cast<__node_pointer>(__rt->__right_);
- else
- return _VSTD::distance(
- __lower_bound(__k, static_cast<__node_pointer>(__rt->__left_), static_cast<__iter_pointer>(__rt)),
- __upper_bound(__k, static_cast<__node_pointer>(__rt->__right_), __result)
- );
- }
- return 0;
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key>
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::__lower_bound(const _Key& __v,
- __node_pointer __root,
- __iter_pointer __result)
-{
- while (__root != nullptr)
- {
- if (!value_comp()(__root->__value_, __v))
- {
- __result = static_cast<__iter_pointer>(__root);
- __root = static_cast<__node_pointer>(__root->__left_);
- }
- else
- __root = static_cast<__node_pointer>(__root->__right_);
- }
- return iterator(__result);
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key>
-typename __tree<_Tp, _Compare, _Allocator>::const_iterator
-__tree<_Tp, _Compare, _Allocator>::__lower_bound(const _Key& __v,
- __node_pointer __root,
- __iter_pointer __result) const
-{
- while (__root != nullptr)
- {
- if (!value_comp()(__root->__value_, __v))
- {
- __result = static_cast<__iter_pointer>(__root);
- __root = static_cast<__node_pointer>(__root->__left_);
- }
- else
- __root = static_cast<__node_pointer>(__root->__right_);
- }
- return const_iterator(__result);
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key>
-typename __tree<_Tp, _Compare, _Allocator>::iterator
-__tree<_Tp, _Compare, _Allocator>::__upper_bound(const _Key& __v,
- __node_pointer __root,
- __iter_pointer __result)
-{
- while (__root != nullptr)
- {
- if (value_comp()(__v, __root->__value_))
- {
- __result = static_cast<__iter_pointer>(__root);
- __root = static_cast<__node_pointer>(__root->__left_);
- }
- else
- __root = static_cast<__node_pointer>(__root->__right_);
- }
- return iterator(__result);
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key>
-typename __tree<_Tp, _Compare, _Allocator>::const_iterator
-__tree<_Tp, _Compare, _Allocator>::__upper_bound(const _Key& __v,
- __node_pointer __root,
- __iter_pointer __result) const
-{
- while (__root != nullptr)
- {
- if (value_comp()(__v, __root->__value_))
- {
- __result = static_cast<__iter_pointer>(__root);
- __root = static_cast<__node_pointer>(__root->__left_);
- }
- else
- __root = static_cast<__node_pointer>(__root->__right_);
- }
- return const_iterator(__result);
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key>
-pair<typename __tree<_Tp, _Compare, _Allocator>::iterator,
- typename __tree<_Tp, _Compare, _Allocator>::iterator>
-__tree<_Tp, _Compare, _Allocator>::__equal_range_unique(const _Key& __k)
-{
- typedef pair<iterator, iterator> _Pp;
- __iter_pointer __result = __end_node();
- __node_pointer __rt = __root();
- while (__rt != nullptr)
- {
- if (value_comp()(__k, __rt->__value_))
- {
- __result = static_cast<__iter_pointer>(__rt);
- __rt = static_cast<__node_pointer>(__rt->__left_);
- }
- else if (value_comp()(__rt->__value_, __k))
- __rt = static_cast<__node_pointer>(__rt->__right_);
- else
- return _Pp(iterator(__rt),
- iterator(
- __rt->__right_ != nullptr ?
- static_cast<__iter_pointer>(__tree_min(__rt->__right_))
- : __result));
- }
- return _Pp(iterator(__result), iterator(__result));
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key>
-pair<typename __tree<_Tp, _Compare, _Allocator>::const_iterator,
- typename __tree<_Tp, _Compare, _Allocator>::const_iterator>
-__tree<_Tp, _Compare, _Allocator>::__equal_range_unique(const _Key& __k) const
-{
- typedef pair<const_iterator, const_iterator> _Pp;
- __iter_pointer __result = __end_node();
- __node_pointer __rt = __root();
- while (__rt != nullptr)
- {
- if (value_comp()(__k, __rt->__value_))
- {
- __result = static_cast<__iter_pointer>(__rt);
- __rt = static_cast<__node_pointer>(__rt->__left_);
- }
- else if (value_comp()(__rt->__value_, __k))
- __rt = static_cast<__node_pointer>(__rt->__right_);
- else
- return _Pp(const_iterator(__rt),
- const_iterator(
- __rt->__right_ != nullptr ?
- static_cast<__iter_pointer>(__tree_min(__rt->__right_))
- : __result));
- }
- return _Pp(const_iterator(__result), const_iterator(__result));
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key>
-pair<typename __tree<_Tp, _Compare, _Allocator>::iterator,
- typename __tree<_Tp, _Compare, _Allocator>::iterator>
-__tree<_Tp, _Compare, _Allocator>::__equal_range_multi(const _Key& __k)
-{
- typedef pair<iterator, iterator> _Pp;
- __iter_pointer __result = __end_node();
- __node_pointer __rt = __root();
- while (__rt != nullptr)
- {
- if (value_comp()(__k, __rt->__value_))
- {
- __result = static_cast<__iter_pointer>(__rt);
- __rt = static_cast<__node_pointer>(__rt->__left_);
- }
- else if (value_comp()(__rt->__value_, __k))
- __rt = static_cast<__node_pointer>(__rt->__right_);
- else
- return _Pp(__lower_bound(__k, static_cast<__node_pointer>(__rt->__left_), static_cast<__iter_pointer>(__rt)),
- __upper_bound(__k, static_cast<__node_pointer>(__rt->__right_), __result));
- }
- return _Pp(iterator(__result), iterator(__result));
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-template <class _Key>
-pair<typename __tree<_Tp, _Compare, _Allocator>::const_iterator,
- typename __tree<_Tp, _Compare, _Allocator>::const_iterator>
-__tree<_Tp, _Compare, _Allocator>::__equal_range_multi(const _Key& __k) const
-{
- typedef pair<const_iterator, const_iterator> _Pp;
- __iter_pointer __result = __end_node();
- __node_pointer __rt = __root();
- while (__rt != nullptr)
- {
- if (value_comp()(__k, __rt->__value_))
- {
- __result = static_cast<__iter_pointer>(__rt);
- __rt = static_cast<__node_pointer>(__rt->__left_);
- }
- else if (value_comp()(__rt->__value_, __k))
- __rt = static_cast<__node_pointer>(__rt->__right_);
- else
- return _Pp(__lower_bound(__k, static_cast<__node_pointer>(__rt->__left_), static_cast<__iter_pointer>(__rt)),
- __upper_bound(__k, static_cast<__node_pointer>(__rt->__right_), __result));
- }
- return _Pp(const_iterator(__result), const_iterator(__result));
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-typename __tree<_Tp, _Compare, _Allocator>::__node_holder
-__tree<_Tp, _Compare, _Allocator>::remove(const_iterator __p) _NOEXCEPT
-{
- __node_pointer __np = __p.__get_np();
- if (__begin_node() == __p.__ptr_)
- {
- if (__np->__right_ != nullptr)
- __begin_node() = static_cast<__iter_pointer>(__np->__right_);
- else
- __begin_node() = static_cast<__iter_pointer>(__np->__parent_);
- }
- --size();
- __tree_remove(__end_node()->__left_,
- static_cast<__node_base_pointer>(__np));
- return __node_holder(__np, _Dp(__node_alloc(), true));
-}
-
-template <class _Tp, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(__tree<_Tp, _Compare, _Allocator>& __x,
- __tree<_Tp, _Compare, _Allocator>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP___TREE
diff --git a/lib/libcxx/include/__tuple b/lib/libcxx/include/__tuple
deleted file mode 100644
index 3b23d78afa1..00000000000
--- a/lib/libcxx/include/__tuple
+++ /dev/null
@@ -1,556 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP___TUPLE
-#define _LIBCPP___TUPLE
-
-#include <__config>
-#include <cstddef>
-#include <type_traits>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS tuple_size;
-
-#if !defined(_LIBCPP_CXX03_LANG)
-template <class _Tp, class...>
-using __enable_if_tuple_size_imp = _Tp;
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS tuple_size<__enable_if_tuple_size_imp<
- const _Tp,
- typename enable_if<!is_volatile<_Tp>::value>::type,
- integral_constant<size_t, sizeof(tuple_size<_Tp>)>>>
- : public integral_constant<size_t, tuple_size<_Tp>::value> {};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS tuple_size<__enable_if_tuple_size_imp<
- volatile _Tp,
- typename enable_if<!is_const<_Tp>::value>::type,
- integral_constant<size_t, sizeof(tuple_size<_Tp>)>>>
- : public integral_constant<size_t, tuple_size<_Tp>::value> {};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS tuple_size<__enable_if_tuple_size_imp<
- const volatile _Tp,
- integral_constant<size_t, sizeof(tuple_size<_Tp>)>>>
- : public integral_constant<size_t, tuple_size<_Tp>::value> {};
-
-#else
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS tuple_size<const _Tp> : public tuple_size<_Tp> {};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS tuple_size<volatile _Tp> : public tuple_size<_Tp> {};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS tuple_size<const volatile _Tp> : public tuple_size<_Tp> {};
-#endif
-
-template <size_t _Ip, class _Tp> class _LIBCPP_TEMPLATE_VIS tuple_element;
-
-template <size_t _Ip, class _Tp>
-class _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, const _Tp>
-{
-public:
- typedef typename add_const<typename tuple_element<_Ip, _Tp>::type>::type type;
-};
-
-template <size_t _Ip, class _Tp>
-class _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, volatile _Tp>
-{
-public:
- typedef typename add_volatile<typename tuple_element<_Ip, _Tp>::type>::type type;
-};
-
-template <size_t _Ip, class _Tp>
-class _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, const volatile _Tp>
-{
-public:
- typedef typename add_cv<typename tuple_element<_Ip, _Tp>::type>::type type;
-};
-
-template <class _Tp> struct __tuple_like : false_type {};
-
-template <class _Tp> struct __tuple_like<const _Tp> : public __tuple_like<_Tp> {};
-template <class _Tp> struct __tuple_like<volatile _Tp> : public __tuple_like<_Tp> {};
-template <class _Tp> struct __tuple_like<const volatile _Tp> : public __tuple_like<_Tp> {};
-
-// tuple specializations
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <size_t...> struct __tuple_indices {};
-
-template <class _IdxType, _IdxType... _Values>
-struct __integer_sequence {
- template <template <class _OIdxType, _OIdxType...> class _ToIndexSeq, class _ToIndexType>
- using __convert = _ToIndexSeq<_ToIndexType, _Values...>;
-
- template <size_t _Sp>
- using __to_tuple_indices = __tuple_indices<(_Values + _Sp)...>;
-};
-
-#if !__has_builtin(__make_integer_seq) || defined(_LIBCPP_TESTING_FALLBACK_MAKE_INTEGER_SEQUENCE)
-namespace __detail {
-
-template<typename _Tp, size_t ..._Extra> struct __repeat;
-template<typename _Tp, _Tp ..._Np, size_t ..._Extra> struct __repeat<__integer_sequence<_Tp, _Np...>, _Extra...> {
- typedef __integer_sequence<_Tp,
- _Np...,
- sizeof...(_Np) + _Np...,
- 2 * sizeof...(_Np) + _Np...,
- 3 * sizeof...(_Np) + _Np...,
- 4 * sizeof...(_Np) + _Np...,
- 5 * sizeof...(_Np) + _Np...,
- 6 * sizeof...(_Np) + _Np...,
- 7 * sizeof...(_Np) + _Np...,
- _Extra...> type;
-};
-
-template<size_t _Np> struct __parity;
-template<size_t _Np> struct __make : __parity<_Np % 8>::template __pmake<_Np> {};
-
-template<> struct __make<0> { typedef __integer_sequence<size_t> type; };
-template<> struct __make<1> { typedef __integer_sequence<size_t, 0> type; };
-template<> struct __make<2> { typedef __integer_sequence<size_t, 0, 1> type; };
-template<> struct __make<3> { typedef __integer_sequence<size_t, 0, 1, 2> type; };
-template<> struct __make<4> { typedef __integer_sequence<size_t, 0, 1, 2, 3> type; };
-template<> struct __make<5> { typedef __integer_sequence<size_t, 0, 1, 2, 3, 4> type; };
-template<> struct __make<6> { typedef __integer_sequence<size_t, 0, 1, 2, 3, 4, 5> type; };
-template<> struct __make<7> { typedef __integer_sequence<size_t, 0, 1, 2, 3, 4, 5, 6> type; };
-
-template<> struct __parity<0> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type> {}; };
-template<> struct __parity<1> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 1> {}; };
-template<> struct __parity<2> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 2, _Np - 1> {}; };
-template<> struct __parity<3> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 3, _Np - 2, _Np - 1> {}; };
-template<> struct __parity<4> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
-template<> struct __parity<5> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
-template<> struct __parity<6> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
-template<> struct __parity<7> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 7, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
-
-} // namespace detail
-
-#endif // !__has_builtin(__make_integer_seq) || defined(_LIBCPP_TESTING_FALLBACK_MAKE_INTEGER_SEQUENCE)
-
-#if __has_builtin(__make_integer_seq)
-template <size_t _Ep, size_t _Sp>
-using __make_indices_imp =
- typename __make_integer_seq<__integer_sequence, size_t, _Ep - _Sp>::template
- __to_tuple_indices<_Sp>;
-#else
-template <size_t _Ep, size_t _Sp>
-using __make_indices_imp =
- typename __detail::__make<_Ep - _Sp>::type::template __to_tuple_indices<_Sp>;
-
-#endif
-
-template <size_t _Ep, size_t _Sp = 0>
-struct __make_tuple_indices
-{
- static_assert(_Sp <= _Ep, "__make_tuple_indices input error");
- typedef __make_indices_imp<_Ep, _Sp> type;
-};
-
-
-template <class ..._Tp> class _LIBCPP_TEMPLATE_VIS tuple;
-
-template <class... _Tp> struct __tuple_like<tuple<_Tp...> > : true_type {};
-
-template <class ..._Tp>
-struct _LIBCPP_TEMPLATE_VIS tuple_size<tuple<_Tp...> >
- : public integral_constant<size_t, sizeof...(_Tp)>
-{
-};
-
-template <size_t _Ip, class ..._Tp>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-typename tuple_element<_Ip, tuple<_Tp...> >::type&
-get(tuple<_Tp...>&) _NOEXCEPT;
-
-template <size_t _Ip, class ..._Tp>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-const typename tuple_element<_Ip, tuple<_Tp...> >::type&
-get(const tuple<_Tp...>&) _NOEXCEPT;
-
-template <size_t _Ip, class ..._Tp>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-typename tuple_element<_Ip, tuple<_Tp...> >::type&&
-get(tuple<_Tp...>&&) _NOEXCEPT;
-
-template <size_t _Ip, class ..._Tp>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-const typename tuple_element<_Ip, tuple<_Tp...> >::type&&
-get(const tuple<_Tp...>&&) _NOEXCEPT;
-
-#endif // !defined(_LIBCPP_CXX03_LANG)
-
-// pair specializations
-
-template <class _T1, class _T2> struct __tuple_like<pair<_T1, _T2> > : true_type {};
-
-template <size_t _Ip, class _T1, class _T2>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-typename tuple_element<_Ip, pair<_T1, _T2> >::type&
-get(pair<_T1, _T2>&) _NOEXCEPT;
-
-template <size_t _Ip, class _T1, class _T2>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-const typename tuple_element<_Ip, pair<_T1, _T2> >::type&
-get(const pair<_T1, _T2>&) _NOEXCEPT;
-
-#ifndef _LIBCPP_CXX03_LANG
-template <size_t _Ip, class _T1, class _T2>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-typename tuple_element<_Ip, pair<_T1, _T2> >::type&&
-get(pair<_T1, _T2>&&) _NOEXCEPT;
-
-template <size_t _Ip, class _T1, class _T2>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-const typename tuple_element<_Ip, pair<_T1, _T2> >::type&&
-get(const pair<_T1, _T2>&&) _NOEXCEPT;
-#endif
-
-// array specializations
-
-template <class _Tp, size_t _Size> struct _LIBCPP_TEMPLATE_VIS array;
-
-template <class _Tp, size_t _Size> struct __tuple_like<array<_Tp, _Size> > : true_type {};
-
-template <size_t _Ip, class _Tp, size_t _Size>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-_Tp&
-get(array<_Tp, _Size>&) _NOEXCEPT;
-
-template <size_t _Ip, class _Tp, size_t _Size>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-const _Tp&
-get(const array<_Tp, _Size>&) _NOEXCEPT;
-
-#ifndef _LIBCPP_CXX03_LANG
-template <size_t _Ip, class _Tp, size_t _Size>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-_Tp&&
-get(array<_Tp, _Size>&&) _NOEXCEPT;
-
-template <size_t _Ip, class _Tp, size_t _Size>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-const _Tp&&
-get(const array<_Tp, _Size>&&) _NOEXCEPT;
-#endif
-
-#ifndef _LIBCPP_CXX03_LANG
-
-// __tuple_types
-
-template <class ..._Tp> struct __tuple_types {};
-
-#if !__has_builtin(__type_pack_element)
-
-namespace __indexer_detail {
-
-template <size_t _Idx, class _Tp>
-struct __indexed { using type = _Tp; };
-
-template <class _Types, class _Indexes> struct __indexer;
-
-template <class ..._Types, size_t ..._Idx>
-struct __indexer<__tuple_types<_Types...>, __tuple_indices<_Idx...>>
- : __indexed<_Idx, _Types>...
-{};
-
-template <size_t _Idx, class _Tp>
-__indexed<_Idx, _Tp> __at_index(__indexed<_Idx, _Tp> const&);
-
-} // namespace __indexer_detail
-
-template <size_t _Idx, class ..._Types>
-using __type_pack_element = typename decltype(
- __indexer_detail::__at_index<_Idx>(
- __indexer_detail::__indexer<
- __tuple_types<_Types...>,
- typename __make_tuple_indices<sizeof...(_Types)>::type
- >{})
- )::type;
-#endif
-
-template <size_t _Ip, class ..._Types>
-class _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, __tuple_types<_Types...>>
-{
-public:
- static_assert(_Ip < sizeof...(_Types), "tuple_element index out of range");
- typedef __type_pack_element<_Ip, _Types...> type;
-};
-
-
-template <class ..._Tp>
-struct _LIBCPP_TEMPLATE_VIS tuple_size<__tuple_types<_Tp...> >
- : public integral_constant<size_t, sizeof...(_Tp)>
-{
-};
-
-template <class... _Tp> struct __tuple_like<__tuple_types<_Tp...> > : true_type {};
-
-template <bool _ApplyLV, bool _ApplyConst, bool _ApplyVolatile>
-struct __apply_cv_mf;
-template <>
-struct __apply_cv_mf<false, false, false> {
- template <class _Tp> using __apply = _Tp;
-};
-template <>
-struct __apply_cv_mf<false, true, false> {
- template <class _Tp> using __apply = const _Tp;
-};
-template <>
-struct __apply_cv_mf<false, false, true> {
- template <class _Tp> using __apply = volatile _Tp;
-};
-template <>
-struct __apply_cv_mf<false, true, true> {
- template <class _Tp> using __apply = const volatile _Tp;
-};
-template <>
-struct __apply_cv_mf<true, false, false> {
- template <class _Tp> using __apply = _Tp&;
-};
-template <>
-struct __apply_cv_mf<true, true, false> {
- template <class _Tp> using __apply = const _Tp&;
-};
-template <>
-struct __apply_cv_mf<true, false, true> {
- template <class _Tp> using __apply = volatile _Tp&;
-};
-template <>
-struct __apply_cv_mf<true, true, true> {
- template <class _Tp> using __apply = const volatile _Tp&;
-};
-template <class _Tp, class _RawTp = typename remove_reference<_Tp>::type>
-using __apply_cv_t = __apply_cv_mf<
- is_lvalue_reference<_Tp>::value,
- is_const<_RawTp>::value,
- is_volatile<_RawTp>::value>;
-
-// __make_tuple_types
-
-// __make_tuple_types<_Tuple<_Types...>, _Ep, _Sp>::type is a
-// __tuple_types<_Types...> using only those _Types in the range [_Sp, _Ep).
-// _Sp defaults to 0 and _Ep defaults to tuple_size<_Tuple>. If _Tuple is a
-// lvalue_reference type, then __tuple_types<_Types&...> is the result.
-
-template <class _TupleTypes, class _TupleIndices>
-struct __make_tuple_types_flat;
-
-template <template <class...> class _Tuple, class ..._Types, size_t ..._Idx>
-struct __make_tuple_types_flat<_Tuple<_Types...>, __tuple_indices<_Idx...>> {
- // Specialization for pair, tuple, and __tuple_types
- template <class _Tp, class _ApplyFn = __apply_cv_t<_Tp>>
- using __apply_quals = __tuple_types<
- typename _ApplyFn::template __apply<__type_pack_element<_Idx, _Types...>>...
- >;
-};
-
-template <class _Vt, size_t _Np, size_t ..._Idx>
-struct __make_tuple_types_flat<array<_Vt, _Np>, __tuple_indices<_Idx...>> {
- template <size_t>
- using __value_type = _Vt;
- template <class _Tp, class _ApplyFn = __apply_cv_t<_Tp>>
- using __apply_quals = __tuple_types<
- typename _ApplyFn::template __apply<__value_type<_Idx>>...
- >;
-};
-
-template <class _Tp, size_t _Ep = tuple_size<typename remove_reference<_Tp>::type>::value,
- size_t _Sp = 0,
- bool _SameSize = (_Ep == tuple_size<typename remove_reference<_Tp>::type>::value)>
-struct __make_tuple_types
-{
- static_assert(_Sp <= _Ep, "__make_tuple_types input error");
- using _RawTp = typename remove_cv<typename remove_reference<_Tp>::type>::type;
- using _Maker = __make_tuple_types_flat<_RawTp, typename __make_tuple_indices<_Ep, _Sp>::type>;
- using type = typename _Maker::template __apply_quals<_Tp>;
-};
-
-template <class ..._Types, size_t _Ep>
-struct __make_tuple_types<tuple<_Types...>, _Ep, 0, true> {
- typedef __tuple_types<_Types...> type;
-};
-
-template <class ..._Types, size_t _Ep>
-struct __make_tuple_types<__tuple_types<_Types...>, _Ep, 0, true> {
- typedef __tuple_types<_Types...> type;
-};
-
-template <bool ..._Preds>
-struct __all_dummy;
-
-template <bool ..._Pred>
-using __all = is_same<__all_dummy<_Pred...>, __all_dummy<((void)_Pred, true)...>>;
-
-struct __tuple_sfinae_base {
- template <template <class, class...> class _Trait,
- class ..._LArgs, class ..._RArgs>
- static auto __do_test(__tuple_types<_LArgs...>, __tuple_types<_RArgs...>)
- -> __all<typename enable_if<_Trait<_LArgs, _RArgs>::value, bool>::type{true}...>;
- template <template <class...> class>
- static auto __do_test(...) -> false_type;
-
- template <class _FromArgs, class _ToArgs>
- using __constructible = decltype(__do_test<is_constructible>(_ToArgs{}, _FromArgs{}));
- template <class _FromArgs, class _ToArgs>
- using __convertible = decltype(__do_test<is_convertible>(_FromArgs{}, _ToArgs{}));
- template <class _FromArgs, class _ToArgs>
- using __assignable = decltype(__do_test<is_assignable>(_ToArgs{}, _FromArgs{}));
-};
-
-// __tuple_convertible
-
-template <class _Tp, class _Up, bool = __tuple_like<typename remove_reference<_Tp>::type>::value,
- bool = __tuple_like<_Up>::value>
-struct __tuple_convertible
- : public false_type {};
-
-template <class _Tp, class _Up>
-struct __tuple_convertible<_Tp, _Up, true, true>
- : public __tuple_sfinae_base::__convertible<
- typename __make_tuple_types<_Tp>::type
- , typename __make_tuple_types<_Up>::type
- >
-{};
-
-// __tuple_constructible
-
-template <class _Tp, class _Up, bool = __tuple_like<typename remove_reference<_Tp>::type>::value,
- bool = __tuple_like<_Up>::value>
-struct __tuple_constructible
- : public false_type {};
-
-template <class _Tp, class _Up>
-struct __tuple_constructible<_Tp, _Up, true, true>
- : public __tuple_sfinae_base::__constructible<
- typename __make_tuple_types<_Tp>::type
- , typename __make_tuple_types<_Up>::type
- >
-{};
-
-// __tuple_assignable
-
-template <class _Tp, class _Up, bool = __tuple_like<typename remove_reference<_Tp>::type>::value,
- bool = __tuple_like<_Up>::value>
-struct __tuple_assignable
- : public false_type {};
-
-template <class _Tp, class _Up>
-struct __tuple_assignable<_Tp, _Up, true, true>
- : public __tuple_sfinae_base::__assignable<
- typename __make_tuple_types<_Tp>::type
- , typename __make_tuple_types<_Up&>::type
- >
-{};
-
-
-template <size_t _Ip, class ..._Tp>
-class _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, tuple<_Tp...> >
-{
-public:
- typedef typename tuple_element<_Ip, __tuple_types<_Tp...> >::type type;
-};
-
-#if _LIBCPP_STD_VER > 11
-template <size_t _Ip, class ..._Tp>
-using tuple_element_t = typename tuple_element <_Ip, _Tp...>::type;
-#endif
-
-template <bool _IsTuple, class _SizeTrait, size_t _Expected>
-struct __tuple_like_with_size_imp : false_type {};
-
-template <class _SizeTrait, size_t _Expected>
-struct __tuple_like_with_size_imp<true, _SizeTrait, _Expected>
- : integral_constant<bool, _SizeTrait::value == _Expected> {};
-
-template <class _Tuple, size_t _ExpectedSize,
- class _RawTuple = typename __uncvref<_Tuple>::type>
-using __tuple_like_with_size = __tuple_like_with_size_imp<
- __tuple_like<_RawTuple>::value,
- tuple_size<_RawTuple>, _ExpectedSize
- >;
-
-struct _LIBCPP_TYPE_VIS __check_tuple_constructor_fail {
- template <class ...>
- static constexpr bool __enable_default() { return false; }
- template <class ...>
- static constexpr bool __enable_explicit() { return false; }
- template <class ...>
- static constexpr bool __enable_implicit() { return false; }
- template <class ...>
- static constexpr bool __enable_assign() { return false; }
-};
-#endif // !defined(_LIBCPP_CXX03_LANG)
-
-#if _LIBCPP_STD_VER > 14
-
-template <bool _CanCopy, bool _CanMove>
-struct __sfinae_ctor_base {};
-template <>
-struct __sfinae_ctor_base<false, false> {
- __sfinae_ctor_base() = default;
- __sfinae_ctor_base(__sfinae_ctor_base const&) = delete;
- __sfinae_ctor_base(__sfinae_ctor_base &&) = delete;
- __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
- __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
-};
-template <>
-struct __sfinae_ctor_base<true, false> {
- __sfinae_ctor_base() = default;
- __sfinae_ctor_base(__sfinae_ctor_base const&) = default;
- __sfinae_ctor_base(__sfinae_ctor_base &&) = delete;
- __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
- __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
-};
-template <>
-struct __sfinae_ctor_base<false, true> {
- __sfinae_ctor_base() = default;
- __sfinae_ctor_base(__sfinae_ctor_base const&) = delete;
- __sfinae_ctor_base(__sfinae_ctor_base &&) = default;
- __sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
- __sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
-};
-
-template <bool _CanCopy, bool _CanMove>
-struct __sfinae_assign_base {};
-template <>
-struct __sfinae_assign_base<false, false> {
- __sfinae_assign_base() = default;
- __sfinae_assign_base(__sfinae_assign_base const&) = default;
- __sfinae_assign_base(__sfinae_assign_base &&) = default;
- __sfinae_assign_base& operator=(__sfinae_assign_base const&) = delete;
- __sfinae_assign_base& operator=(__sfinae_assign_base&&) = delete;
-};
-template <>
-struct __sfinae_assign_base<true, false> {
- __sfinae_assign_base() = default;
- __sfinae_assign_base(__sfinae_assign_base const&) = default;
- __sfinae_assign_base(__sfinae_assign_base &&) = default;
- __sfinae_assign_base& operator=(__sfinae_assign_base const&) = default;
- __sfinae_assign_base& operator=(__sfinae_assign_base&&) = delete;
-};
-template <>
-struct __sfinae_assign_base<false, true> {
- __sfinae_assign_base() = default;
- __sfinae_assign_base(__sfinae_assign_base const&) = default;
- __sfinae_assign_base(__sfinae_assign_base &&) = default;
- __sfinae_assign_base& operator=(__sfinae_assign_base const&) = delete;
- __sfinae_assign_base& operator=(__sfinae_assign_base&&) = default;
-};
-#endif // _LIBCPP_STD_VER > 14
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP___TUPLE
diff --git a/lib/libcxx/include/__undef_macros b/lib/libcxx/include/__undef_macros
deleted file mode 100644
index 60ab1dbfb5f..00000000000
--- a/lib/libcxx/include/__undef_macros
+++ /dev/null
@@ -1,34 +0,0 @@
-// -*- C++ -*-
-//===------------------------ __undef_macros ------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-
-#ifdef min
-#if !defined(_LIBCPP_DISABLE_MACRO_CONFLICT_WARNINGS)
-#if defined(_LIBCPP_WARNING)
-_LIBCPP_WARNING("macro min is incompatible with C++. Try #define NOMINMAX "
- "before any Windows header. #undefing min")
-#else
-#warning: macro min is incompatible with C++. #undefing min
-#endif
-#endif
-#undef min
-#endif
-
-#ifdef max
-#if !defined(_LIBCPP_DISABLE_MACRO_CONFLICT_WARNINGS)
-#if defined(_LIBCPP_WARNING)
-_LIBCPP_WARNING("macro max is incompatible with C++. Try #define NOMINMAX "
- "before any Windows header. #undefing max")
-#else
-#warning: macro max is incompatible with C++. #undefing max
-#endif
-#endif
-#undef max
-#endif
diff --git a/lib/libcxx/include/algorithm b/lib/libcxx/include/algorithm
deleted file mode 100644
index d102899f2df..00000000000
--- a/lib/libcxx/include/algorithm
+++ /dev/null
@@ -1,5710 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- algorithm ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_ALGORITHM
-#define _LIBCPP_ALGORITHM
-
-/*
- algorithm synopsis
-
-#include <initializer_list>
-
-namespace std
-{
-
-template <class InputIterator, class Predicate>
- constexpr bool // constexpr in C++20
- all_of(InputIterator first, InputIterator last, Predicate pred);
-
-template <class InputIterator, class Predicate>
- constexpr bool // constexpr in C++20
- any_of(InputIterator first, InputIterator last, Predicate pred);
-
-template <class InputIterator, class Predicate>
- constexpr bool // constexpr in C++20
- none_of(InputIterator first, InputIterator last, Predicate pred);
-
-template <class InputIterator, class Function>
- constexpr Function // constexpr in C++20
- for_each(InputIterator first, InputIterator last, Function f);
-
-template<class InputIterator, class Size, class Function>
- constexpr InputIterator // constexpr in C++20
- for_each_n(InputIterator first, Size n, Function f); // C++17
-
-template <class InputIterator, class T>
- constexpr InputIterator // constexpr in C++20
- find(InputIterator first, InputIterator last, const T& value);
-
-template <class InputIterator, class Predicate>
- constexpr InputIterator // constexpr in C++20
- find_if(InputIterator first, InputIterator last, Predicate pred);
-
-template<class InputIterator, class Predicate>
- InputIterator // constexpr in C++20
- find_if_not(InputIterator first, InputIterator last, Predicate pred);
-
-template <class ForwardIterator1, class ForwardIterator2>
- ForwardIterator1 // constexpr in C++20
- find_end(ForwardIterator1 first1, ForwardIterator1 last1,
- ForwardIterator2 first2, ForwardIterator2 last2);
-
-template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
- ForwardIterator1 // constexpr in C++20
- find_end(ForwardIterator1 first1, ForwardIterator1 last1,
- ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
-
-template <class ForwardIterator1, class ForwardIterator2>
- constexpr ForwardIterator1 // constexpr in C++20
- find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
- ForwardIterator2 first2, ForwardIterator2 last2);
-
-template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
- constexpr ForwardIterator1 // constexpr in C++20
- find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
- ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
-
-template <class ForwardIterator>
- constexpr ForwardIterator // constexpr in C++20
- adjacent_find(ForwardIterator first, ForwardIterator last);
-
-template <class ForwardIterator, class BinaryPredicate>
- constexpr ForwardIterator // constexpr in C++20
- adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
-
-template <class InputIterator, class T>
- constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20
- count(InputIterator first, InputIterator last, const T& value);
-
-template <class InputIterator, class Predicate>
- constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20
- count_if(InputIterator first, InputIterator last, Predicate pred);
-
-template <class InputIterator1, class InputIterator2>
- constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
- mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
-
-template <class InputIterator1, class InputIterator2>
- constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
- mismatch(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, InputIterator2 last2); // **C++14**
-
-template <class InputIterator1, class InputIterator2, class BinaryPredicate>
- constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
- mismatch(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, BinaryPredicate pred);
-
-template <class InputIterator1, class InputIterator2, class BinaryPredicate>
- constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
- mismatch(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, InputIterator2 last2,
- BinaryPredicate pred); // **C++14**
-
-template <class InputIterator1, class InputIterator2>
- constexpr bool // constexpr in C++20
- equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
-
-template <class InputIterator1, class InputIterator2>
- constexpr bool // constexpr in C++20
- equal(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, InputIterator2 last2); // **C++14**
-
-template <class InputIterator1, class InputIterator2, class BinaryPredicate>
- constexpr bool // constexpr in C++20
- equal(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, BinaryPredicate pred);
-
-template <class InputIterator1, class InputIterator2, class BinaryPredicate>
- constexpr bool // constexpr in C++20
- equal(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, InputIterator2 last2,
- BinaryPredicate pred); // **C++14**
-
-template<class ForwardIterator1, class ForwardIterator2>
- constexpr bool // constexpr in C++20
- is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
- ForwardIterator2 first2);
-
-template<class ForwardIterator1, class ForwardIterator2>
- constexpr bool // constexpr in C++20
- is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
- ForwardIterator2 first2, ForwardIterator2 last2); // **C++14**
-
-template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
- constexpr bool // constexpr in C++20
- is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
- ForwardIterator2 first2, BinaryPredicate pred);
-
-template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
- constexpr bool // constexpr in C++20
- is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
- ForwardIterator2 first2, ForwardIterator2 last2,
- BinaryPredicate pred); // **C++14**
-
-template <class ForwardIterator1, class ForwardIterator2>
- constexpr ForwardIterator1 // constexpr in C++20
- search(ForwardIterator1 first1, ForwardIterator1 last1,
- ForwardIterator2 first2, ForwardIterator2 last2);
-
-template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
- constexpr ForwardIterator1 // constexpr in C++20
- search(ForwardIterator1 first1, ForwardIterator1 last1,
- ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
-
-template <class ForwardIterator, class Size, class T>
- constexpr ForwardIterator // constexpr in C++20
- search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value);
-
-template <class ForwardIterator, class Size, class T, class BinaryPredicate>
- constexpr ForwardIterator // constexpr in C++20
- search_n(ForwardIterator first, ForwardIterator last,
- Size count, const T& value, BinaryPredicate pred);
-
-template <class InputIterator, class OutputIterator>
- OutputIterator
- copy(InputIterator first, InputIterator last, OutputIterator result);
-
-template<class InputIterator, class OutputIterator, class Predicate>
- OutputIterator
- copy_if(InputIterator first, InputIterator last,
- OutputIterator result, Predicate pred);
-
-template<class InputIterator, class Size, class OutputIterator>
- OutputIterator
- copy_n(InputIterator first, Size n, OutputIterator result);
-
-template <class BidirectionalIterator1, class BidirectionalIterator2>
- BidirectionalIterator2
- copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
- BidirectionalIterator2 result);
-
-template <class ForwardIterator1, class ForwardIterator2>
- ForwardIterator2
- swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2);
-
-template <class ForwardIterator1, class ForwardIterator2>
- void
- iter_swap(ForwardIterator1 a, ForwardIterator2 b);
-
-template <class InputIterator, class OutputIterator, class UnaryOperation>
- constexpr OutputIterator // constexpr in C++20
- transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op);
-
-template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
- constexpr OutputIterator // constexpr in C++20
- transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
- OutputIterator result, BinaryOperation binary_op);
-
-template <class ForwardIterator, class T>
- constexpr void // constexpr in C++20
- replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);
-
-template <class ForwardIterator, class Predicate, class T>
- constexpr void // constexpr in C++20
- replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value);
-
-template <class InputIterator, class OutputIterator, class T>
- constexpr OutputIterator // constexpr in C++20
- replace_copy(InputIterator first, InputIterator last, OutputIterator result,
- const T& old_value, const T& new_value);
-
-template <class InputIterator, class OutputIterator, class Predicate, class T>
- constexpr OutputIterator // constexpr in C++20
- replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value);
-
-template <class ForwardIterator, class T>
- constexpr void // constexpr in C++20
- fill(ForwardIterator first, ForwardIterator last, const T& value);
-
-template <class OutputIterator, class Size, class T>
- constexpr OutputIterator // constexpr in C++20
- fill_n(OutputIterator first, Size n, const T& value);
-
-template <class ForwardIterator, class Generator>
- constexpr void // constexpr in C++20
- generate(ForwardIterator first, ForwardIterator last, Generator gen);
-
-template <class OutputIterator, class Size, class Generator>
- constexpr OutputIterator // constexpr in C++20
- generate_n(OutputIterator first, Size n, Generator gen);
-
-template <class ForwardIterator, class T>
- constexpr ForwardIterator // constexpr in C++20
- remove(ForwardIterator first, ForwardIterator last, const T& value);
-
-template <class ForwardIterator, class Predicate>
- constexpr ForwardIterator // constexpr in C++20
- remove_if(ForwardIterator first, ForwardIterator last, Predicate pred);
-
-template <class InputIterator, class OutputIterator, class T>
- constexpr OutputIterator // constexpr in C++20
- remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value);
-
-template <class InputIterator, class OutputIterator, class Predicate>
- constexpr OutputIterator // constexpr in C++20
- remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred);
-
-template <class ForwardIterator>
- ForwardIterator
- unique(ForwardIterator first, ForwardIterator last);
-
-template <class ForwardIterator, class BinaryPredicate>
- ForwardIterator
- unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
-
-template <class InputIterator, class OutputIterator>
- OutputIterator
- unique_copy(InputIterator first, InputIterator last, OutputIterator result);
-
-template <class InputIterator, class OutputIterator, class BinaryPredicate>
- OutputIterator
- unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
-
-template <class BidirectionalIterator>
- void
- reverse(BidirectionalIterator first, BidirectionalIterator last);
-
-template <class BidirectionalIterator, class OutputIterator>
- constexpr OutputIterator // constexpr in C++20
- reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);
-
-template <class ForwardIterator>
- ForwardIterator
- rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last);
-
-template <class ForwardIterator, class OutputIterator>
- OutputIterator
- rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);
-
-template <class RandomAccessIterator>
- void
- random_shuffle(RandomAccessIterator first, RandomAccessIterator last); // deprecated in C++14, removed in C++17
-
-template <class RandomAccessIterator, class RandomNumberGenerator>
- void
- random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
- RandomNumberGenerator& rand); // deprecated in C++14, removed in C++17
-
-template<class PopulationIterator, class SampleIterator,
- class Distance, class UniformRandomBitGenerator>
- SampleIterator sample(PopulationIterator first, PopulationIterator last,
- SampleIterator out, Distance n,
- UniformRandomBitGenerator&& g); // C++17
-
-template<class RandomAccessIterator, class UniformRandomNumberGenerator>
- void shuffle(RandomAccessIterator first, RandomAccessIterator last,
- UniformRandomNumberGenerator&& g);
-
-template <class InputIterator, class Predicate>
- constexpr bool // constexpr in C++20
- is_partitioned(InputIterator first, InputIterator last, Predicate pred);
-
-template <class ForwardIterator, class Predicate>
- ForwardIterator
- partition(ForwardIterator first, ForwardIterator last, Predicate pred);
-
-template <class InputIterator, class OutputIterator1,
- class OutputIterator2, class Predicate>
- constexpr pair<OutputIterator1, OutputIterator2> // constexpr in C++20
- partition_copy(InputIterator first, InputIterator last,
- OutputIterator1 out_true, OutputIterator2 out_false,
- Predicate pred);
-
-template <class ForwardIterator, class Predicate>
- ForwardIterator
- stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred);
-
-template<class ForwardIterator, class Predicate>
- constexpr ForwardIterator // constexpr in C++20
- partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);
-
-template <class ForwardIterator>
- constexpr bool // constexpr in C++20
- is_sorted(ForwardIterator first, ForwardIterator last);
-
-template <class ForwardIterator, class Compare>
- bool
- is_sorted(ForwardIterator first, ForwardIterator last, Compare comp);
-
-template<class ForwardIterator>
- constexpr ForwardIterator // constexpr in C++20
- is_sorted_until(ForwardIterator first, ForwardIterator last);
-
-template <class ForwardIterator, class Compare>
- constexpr ForwardIterator // constexpr in C++20
- is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp);
-
-template <class RandomAccessIterator>
- void
- sort(RandomAccessIterator first, RandomAccessIterator last);
-
-template <class RandomAccessIterator, class Compare>
- void
- sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
-
-template <class RandomAccessIterator>
- void
- stable_sort(RandomAccessIterator first, RandomAccessIterator last);
-
-template <class RandomAccessIterator, class Compare>
- void
- stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
-
-template <class RandomAccessIterator>
- void
- partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);
-
-template <class RandomAccessIterator, class Compare>
- void
- partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);
-
-template <class InputIterator, class RandomAccessIterator>
- RandomAccessIterator
- partial_sort_copy(InputIterator first, InputIterator last,
- RandomAccessIterator result_first, RandomAccessIterator result_last);
-
-template <class InputIterator, class RandomAccessIterator, class Compare>
- RandomAccessIterator
- partial_sort_copy(InputIterator first, InputIterator last,
- RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp);
-
-template <class RandomAccessIterator>
- void
- nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);
-
-template <class RandomAccessIterator, class Compare>
- void
- nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp);
-
-template <class ForwardIterator, class T>
- constexpr ForwardIterator // constexpr in C++20
- lower_bound(ForwardIterator first, ForwardIterator last, const T& value);
-
-template <class ForwardIterator, class T, class Compare>
- constexpr ForwardIterator // constexpr in C++20
- lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
-
-template <class ForwardIterator, class T>
- constexpr ForwardIterator // constexpr in C++20
- upper_bound(ForwardIterator first, ForwardIterator last, const T& value);
-
-template <class ForwardIterator, class T, class Compare>
- constexpr ForwardIterator // constexpr in C++20
- upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
-
-template <class ForwardIterator, class T>
- constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20
- equal_range(ForwardIterator first, ForwardIterator last, const T& value);
-
-template <class ForwardIterator, class T, class Compare>
- constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20
- equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
-
-template <class ForwardIterator, class T>
- constexpr bool // constexpr in C++20
- binary_search(ForwardIterator first, ForwardIterator last, const T& value);
-
-template <class ForwardIterator, class T, class Compare>
- constexpr bool // constexpr in C++20
- binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
-
-template <class InputIterator1, class InputIterator2, class OutputIterator>
- OutputIterator
- merge(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, InputIterator2 last2, OutputIterator result);
-
-template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
- OutputIterator
- merge(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
-
-template <class BidirectionalIterator>
- void
- inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last);
-
-template <class BidirectionalIterator, class Compare>
- void
- inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp);
-
-template <class InputIterator1, class InputIterator2>
- constexpr bool // constexpr in C++20
- includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
-
-template <class InputIterator1, class InputIterator2, class Compare>
- constexpr bool // constexpr in C++20
- includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp);
-
-template <class InputIterator1, class InputIterator2, class OutputIterator>
- OutputIterator
- set_union(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, InputIterator2 last2, OutputIterator result);
-
-template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
- OutputIterator
- set_union(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
-
-template <class InputIterator1, class InputIterator2, class OutputIterator>
- constexpr OutputIterator // constexpr in C++20
- set_intersection(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, InputIterator2 last2, OutputIterator result);
-
-template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
- constexpr OutputIterator // constexpr in C++20
- set_intersection(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
-
-template <class InputIterator1, class InputIterator2, class OutputIterator>
- OutputIterator
- set_difference(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, InputIterator2 last2, OutputIterator result);
-
-template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
- OutputIterator
- set_difference(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
-
-template <class InputIterator1, class InputIterator2, class OutputIterator>
- OutputIterator
- set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, InputIterator2 last2, OutputIterator result);
-
-template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
- OutputIterator
- set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
-
-template <class RandomAccessIterator>
- void
- push_heap(RandomAccessIterator first, RandomAccessIterator last);
-
-template <class RandomAccessIterator, class Compare>
- void
- push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
-
-template <class RandomAccessIterator>
- void
- pop_heap(RandomAccessIterator first, RandomAccessIterator last);
-
-template <class RandomAccessIterator, class Compare>
- void
- pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
-
-template <class RandomAccessIterator>
- void
- make_heap(RandomAccessIterator first, RandomAccessIterator last);
-
-template <class RandomAccessIterator, class Compare>
- void
- make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
-
-template <class RandomAccessIterator>
- void
- sort_heap(RandomAccessIterator first, RandomAccessIterator last);
-
-template <class RandomAccessIterator, class Compare>
- void
- sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
-
-template <class RandomAccessIterator>
- constexpr bool // constexpr in C++20
- is_heap(RandomAccessIterator first, RandomAccessiterator last);
-
-template <class RandomAccessIterator, class Compare>
- constexpr bool // constexpr in C++20
- is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
-
-template <class RandomAccessIterator>
- constexpr RandomAccessIterator // constexpr in C++20
- is_heap_until(RandomAccessIterator first, RandomAccessiterator last);
-
-template <class RandomAccessIterator, class Compare>
- constexpr RandomAccessIterator // constexpr in C++20
- is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
-
-template <class ForwardIterator>
- ForwardIterator
- min_element(ForwardIterator first, ForwardIterator last); // constexpr in C++14
-
-template <class ForwardIterator, class Compare>
- ForwardIterator
- min_element(ForwardIterator first, ForwardIterator last, Compare comp); // constexpr in C++14
-
-template <class T>
- const T&
- min(const T& a, const T& b); // constexpr in C++14
-
-template <class T, class Compare>
- const T&
- min(const T& a, const T& b, Compare comp); // constexpr in C++14
-
-template<class T>
- T
- min(initializer_list<T> t); // constexpr in C++14
-
-template<class T, class Compare>
- T
- min(initializer_list<T> t, Compare comp); // constexpr in C++14
-
-template<class T>
- constexpr const T& clamp( const T& v, const T& lo, const T& hi ); // C++17
-
-template<class T, class Compare>
- constexpr const T& clamp( const T& v, const T& lo, const T& hi, Compare comp ); // C++17
-
-template <class ForwardIterator>
- ForwardIterator
- max_element(ForwardIterator first, ForwardIterator last); // constexpr in C++14
-
-template <class ForwardIterator, class Compare>
- ForwardIterator
- max_element(ForwardIterator first, ForwardIterator last, Compare comp); // constexpr in C++14
-
-template <class T>
- const T&
- max(const T& a, const T& b); // constexpr in C++14
-
-template <class T, class Compare>
- const T&
- max(const T& a, const T& b, Compare comp); // constexpr in C++14
-
-template<class T>
- T
- max(initializer_list<T> t); // constexpr in C++14
-
-template<class T, class Compare>
- T
- max(initializer_list<T> t, Compare comp); // constexpr in C++14
-
-template<class ForwardIterator>
- pair<ForwardIterator, ForwardIterator>
- minmax_element(ForwardIterator first, ForwardIterator last); // constexpr in C++14
-
-template<class ForwardIterator, class Compare>
- pair<ForwardIterator, ForwardIterator>
- minmax_element(ForwardIterator first, ForwardIterator last, Compare comp); // constexpr in C++14
-
-template<class T>
- pair<const T&, const T&>
- minmax(const T& a, const T& b); // constexpr in C++14
-
-template<class T, class Compare>
- pair<const T&, const T&>
- minmax(const T& a, const T& b, Compare comp); // constexpr in C++14
-
-template<class T>
- pair<T, T>
- minmax(initializer_list<T> t); // constexpr in C++14
-
-template<class T, class Compare>
- pair<T, T>
- minmax(initializer_list<T> t, Compare comp); // constexpr in C++14
-
-template <class InputIterator1, class InputIterator2>
- constexpr bool // constexpr in C++20
- lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
-
-template <class InputIterator1, class InputIterator2, class Compare>
- constexpr bool // constexpr in C++20
- lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, InputIterator2 last2, Compare comp);
-
-template <class BidirectionalIterator>
- bool
- next_permutation(BidirectionalIterator first, BidirectionalIterator last);
-
-template <class BidirectionalIterator, class Compare>
- bool
- next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
-
-template <class BidirectionalIterator>
- bool
- prev_permutation(BidirectionalIterator first, BidirectionalIterator last);
-
-template <class BidirectionalIterator, class Compare>
- bool
- prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
-
-} // std
-
-*/
-
-#include <__config>
-#include <initializer_list>
-#include <type_traits>
-#include <cstring>
-#include <utility> // needed to provide swap_ranges.
-#include <memory>
-#include <functional>
-#include <iterator>
-#include <cstddef>
-#include <bit>
-#include <version>
-
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-// I'd like to replace these with _VSTD::equal_to<void>, but can't because:
-// * That only works with C++14 and later, and
-// * We haven't included <functional> here.
-template <class _T1, class _T2 = _T1>
-struct __equal_to
-{
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T1& __x, const _T2& __y) const {return __x == __y;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T2& __x, const _T1& __y) const {return __x == __y;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T2& __x, const _T2& __y) const {return __x == __y;}
-};
-
-template <class _T1>
-struct __equal_to<_T1, _T1>
-{
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
-};
-
-template <class _T1>
-struct __equal_to<const _T1, _T1>
-{
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
-};
-
-template <class _T1>
-struct __equal_to<_T1, const _T1>
-{
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
-};
-
-template <class _T1, class _T2 = _T1>
-struct __less
-{
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- bool operator()(const _T1& __x, const _T2& __y) const {return __x < __y;}
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- bool operator()(const _T2& __x, const _T1& __y) const {return __x < __y;}
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- bool operator()(const _T2& __x, const _T2& __y) const {return __x < __y;}
-};
-
-template <class _T1>
-struct __less<_T1, _T1>
-{
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
-};
-
-template <class _T1>
-struct __less<const _T1, _T1>
-{
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
-};
-
-template <class _T1>
-struct __less<_T1, const _T1>
-{
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
-};
-
-template <class _Predicate>
-class __invert // invert the sense of a comparison
-{
-private:
- _Predicate __p_;
-public:
- _LIBCPP_INLINE_VISIBILITY __invert() {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __invert(_Predicate __p) : __p_(__p) {}
-
- template <class _T1>
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _T1& __x) {return !__p_(__x);}
-
- template <class _T1, class _T2>
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _T1& __x, const _T2& __y) {return __p_(__y, __x);}
-};
-
-// Perform division by two quickly for positive integers (llvm.org/PR39129)
-
-template <typename _Integral>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-typename enable_if
-<
- is_integral<_Integral>::value,
- _Integral
->::type
-__half_positive(_Integral __value)
-{
- return static_cast<_Integral>(static_cast<typename make_unsigned<_Integral>::type>(__value) / 2);
-}
-
-template <typename _Tp>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-typename enable_if
-<
- !is_integral<_Tp>::value,
- _Tp
->::type
-__half_positive(_Tp __value)
-{
- return __value / 2;
-}
-
-#ifdef _LIBCPP_DEBUG
-
-template <class _Compare>
-struct __debug_less
-{
- _Compare __comp_;
- __debug_less(_Compare& __c) : __comp_(__c) {}
-
- template <class _Tp, class _Up>
- bool operator()(const _Tp& __x, const _Up& __y)
- {
- bool __r = __comp_(__x, __y);
- if (__r)
- __do_compare_assert(0, __y, __x);
- return __r;
- }
-
- template <class _LHS, class _RHS>
- inline _LIBCPP_INLINE_VISIBILITY
- decltype((void)_VSTD::declval<_Compare&>()(
- _VSTD::declval<_LHS const&>(), _VSTD::declval<_RHS const&>()))
- __do_compare_assert(int, _LHS const& __l, _RHS const& __r) {
- _LIBCPP_ASSERT(!__comp_(__l, __r),
- "Comparator does not induce a strict weak ordering");
- }
-
- template <class _LHS, class _RHS>
- inline _LIBCPP_INLINE_VISIBILITY
- void __do_compare_assert(long, _LHS const&, _RHS const&) {}
-};
-
-#endif // _LIBCPP_DEBUG
-
-// all_of
-
-template <class _InputIterator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
-{
- for (; __first != __last; ++__first)
- if (!__pred(*__first))
- return false;
- return true;
-}
-
-// any_of
-
-template <class _InputIterator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
-{
- for (; __first != __last; ++__first)
- if (__pred(*__first))
- return true;
- return false;
-}
-
-// none_of
-
-template <class _InputIterator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
-{
- for (; __first != __last; ++__first)
- if (__pred(*__first))
- return false;
- return true;
-}
-
-// for_each
-
-template <class _InputIterator, class _Function>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_Function
-for_each(_InputIterator __first, _InputIterator __last, _Function __f)
-{
- for (; __first != __last; ++__first)
- __f(*__first);
- return __f;
-}
-
-#if _LIBCPP_STD_VER > 14
-// for_each_n
-
-template <class _InputIterator, class _Size, class _Function>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_InputIterator
-for_each_n(_InputIterator __first, _Size __orig_n, _Function __f)
-{
- typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
- _IntegralSize __n = __orig_n;
- while (__n > 0)
- {
- __f(*__first);
- ++__first;
- --__n;
- }
- return __first;
-}
-#endif
-
-// find
-
-template <class _InputIterator, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_InputIterator
-find(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
-{
- for (; __first != __last; ++__first)
- if (*__first == __value_)
- break;
- return __first;
-}
-
-// find_if
-
-template <class _InputIterator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_InputIterator
-find_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
-{
- for (; __first != __last; ++__first)
- if (__pred(*__first))
- break;
- return __first;
-}
-
-// find_if_not
-
-template<class _InputIterator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_InputIterator
-find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred)
-{
- for (; __first != __last; ++__first)
- if (!__pred(*__first))
- break;
- return __first;
-}
-
-// find_end
-
-template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator1
-__find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
- _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
- forward_iterator_tag, forward_iterator_tag)
-{
- // modeled after search algorithm
- _ForwardIterator1 __r = __last1; // __last1 is the "default" answer
- if (__first2 == __last2)
- return __r;
- while (true)
- {
- while (true)
- {
- if (__first1 == __last1) // if source exhausted return last correct answer
- return __r; // (or __last1 if never found)
- if (__pred(*__first1, *__first2))
- break;
- ++__first1;
- }
- // *__first1 matches *__first2, now match elements after here
- _ForwardIterator1 __m1 = __first1;
- _ForwardIterator2 __m2 = __first2;
- while (true)
- {
- if (++__m2 == __last2)
- { // Pattern exhaused, record answer and search for another one
- __r = __first1;
- ++__first1;
- break;
- }
- if (++__m1 == __last1) // Source exhausted, return last answer
- return __r;
- if (!__pred(*__m1, *__m2)) // mismatch, restart with a new __first
- {
- ++__first1;
- break;
- } // else there is a match, check next elements
- }
- }
-}
-
-template <class _BinaryPredicate, class _BidirectionalIterator1, class _BidirectionalIterator2>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 _BidirectionalIterator1
-__find_end(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1,
- _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _BinaryPredicate __pred,
- bidirectional_iterator_tag, bidirectional_iterator_tag)
-{
- // modeled after search algorithm (in reverse)
- if (__first2 == __last2)
- return __last1; // Everything matches an empty sequence
- _BidirectionalIterator1 __l1 = __last1;
- _BidirectionalIterator2 __l2 = __last2;
- --__l2;
- while (true)
- {
- // Find last element in sequence 1 that matchs *(__last2-1), with a mininum of loop checks
- while (true)
- {
- if (__first1 == __l1) // return __last1 if no element matches *__first2
- return __last1;
- if (__pred(*--__l1, *__l2))
- break;
- }
- // *__l1 matches *__l2, now match elements before here
- _BidirectionalIterator1 __m1 = __l1;
- _BidirectionalIterator2 __m2 = __l2;
- while (true)
- {
- if (__m2 == __first2) // If pattern exhausted, __m1 is the answer (works for 1 element pattern)
- return __m1;
- if (__m1 == __first1) // Otherwise if source exhaused, pattern not found
- return __last1;
- if (!__pred(*--__m1, *--__m2)) // if there is a mismatch, restart with a new __l1
- {
- break;
- } // else there is a match, check next elements
- }
- }
-}
-
-template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _RandomAccessIterator1
-__find_end(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
- _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
- random_access_iterator_tag, random_access_iterator_tag)
-{
- // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
- typename iterator_traits<_RandomAccessIterator2>::difference_type __len2 = __last2 - __first2;
- if (__len2 == 0)
- return __last1;
- typename iterator_traits<_RandomAccessIterator1>::difference_type __len1 = __last1 - __first1;
- if (__len1 < __len2)
- return __last1;
- const _RandomAccessIterator1 __s = __first1 + (__len2 - 1); // End of pattern match can't go before here
- _RandomAccessIterator1 __l1 = __last1;
- _RandomAccessIterator2 __l2 = __last2;
- --__l2;
- while (true)
- {
- while (true)
- {
- if (__s == __l1)
- return __last1;
- if (__pred(*--__l1, *__l2))
- break;
- }
- _RandomAccessIterator1 __m1 = __l1;
- _RandomAccessIterator2 __m2 = __l2;
- while (true)
- {
- if (__m2 == __first2)
- return __m1;
- // no need to check range on __m1 because __s guarantees we have enough source
- if (!__pred(*--__m1, *--__m2))
- {
- break;
- }
- }
- }
-}
-
-template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_ForwardIterator1
-find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
- _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
-{
- return _VSTD::__find_end<typename add_lvalue_reference<_BinaryPredicate>::type>
- (__first1, __last1, __first2, __last2, __pred,
- typename iterator_traits<_ForwardIterator1>::iterator_category(),
- typename iterator_traits<_ForwardIterator2>::iterator_category());
-}
-
-template <class _ForwardIterator1, class _ForwardIterator2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_ForwardIterator1
-find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
- _ForwardIterator2 __first2, _ForwardIterator2 __last2)
-{
- typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
- typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
- return _VSTD::find_end(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
-}
-
-// find_first_of
-
-template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _ForwardIterator1
-__find_first_of_ce(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
- _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
-{
- for (; __first1 != __last1; ++__first1)
- for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
- if (__pred(*__first1, *__j))
- return __first1;
- return __last1;
-}
-
-
-template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_ForwardIterator1
-find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
- _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
-{
- return _VSTD::__find_first_of_ce(__first1, __last1, __first2, __last2, __pred);
-}
-
-template <class _ForwardIterator1, class _ForwardIterator2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_ForwardIterator1
-find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
- _ForwardIterator2 __first2, _ForwardIterator2 __last2)
-{
- typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
- typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
- return _VSTD::__find_first_of_ce(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
-}
-
-// adjacent_find
-
-template <class _ForwardIterator, class _BinaryPredicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_ForwardIterator
-adjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
-{
- if (__first != __last)
- {
- _ForwardIterator __i = __first;
- while (++__i != __last)
- {
- if (__pred(*__first, *__i))
- return __first;
- __first = __i;
- }
- }
- return __last;
-}
-
-template <class _ForwardIterator>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_ForwardIterator
-adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
-{
- typedef typename iterator_traits<_ForwardIterator>::value_type __v;
- return _VSTD::adjacent_find(__first, __last, __equal_to<__v>());
-}
-
-// count
-
-template <class _InputIterator, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-typename iterator_traits<_InputIterator>::difference_type
-count(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
-{
- typename iterator_traits<_InputIterator>::difference_type __r(0);
- for (; __first != __last; ++__first)
- if (*__first == __value_)
- ++__r;
- return __r;
-}
-
-// count_if
-
-template <class _InputIterator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-typename iterator_traits<_InputIterator>::difference_type
-count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
-{
- typename iterator_traits<_InputIterator>::difference_type __r(0);
- for (; __first != __last; ++__first)
- if (__pred(*__first))
- ++__r;
- return __r;
-}
-
-// mismatch
-
-template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-pair<_InputIterator1, _InputIterator2>
-mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _BinaryPredicate __pred)
-{
- for (; __first1 != __last1; ++__first1, (void) ++__first2)
- if (!__pred(*__first1, *__first2))
- break;
- return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
-}
-
-template <class _InputIterator1, class _InputIterator2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-pair<_InputIterator1, _InputIterator2>
-mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
-{
- typedef typename iterator_traits<_InputIterator1>::value_type __v1;
- typedef typename iterator_traits<_InputIterator2>::value_type __v2;
- return _VSTD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>());
-}
-
-#if _LIBCPP_STD_VER > 11
-template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-pair<_InputIterator1, _InputIterator2>
-mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2,
- _BinaryPredicate __pred)
-{
- for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
- if (!__pred(*__first1, *__first2))
- break;
- return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
-}
-
-template <class _InputIterator1, class _InputIterator2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-pair<_InputIterator1, _InputIterator2>
-mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2)
-{
- typedef typename iterator_traits<_InputIterator1>::value_type __v1;
- typedef typename iterator_traits<_InputIterator2>::value_type __v2;
- return _VSTD::mismatch(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
-}
-#endif
-
-// equal
-
-template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred)
-{
- for (; __first1 != __last1; ++__first1, (void) ++__first2)
- if (!__pred(*__first1, *__first2))
- return false;
- return true;
-}
-
-template <class _InputIterator1, class _InputIterator2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
-{
- typedef typename iterator_traits<_InputIterator1>::value_type __v1;
- typedef typename iterator_traits<_InputIterator2>::value_type __v2;
- return _VSTD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>());
-}
-
-#if _LIBCPP_STD_VER > 11
-template <class _BinaryPredicate, class _InputIterator1, class _InputIterator2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-__equal(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred,
- input_iterator_tag, input_iterator_tag )
-{
- for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
- if (!__pred(*__first1, *__first2))
- return false;
- return __first1 == __last1 && __first2 == __last2;
-}
-
-template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-__equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
- _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
- random_access_iterator_tag, random_access_iterator_tag )
-{
- if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
- return false;
- return _VSTD::equal<_RandomAccessIterator1, _RandomAccessIterator2,
- typename add_lvalue_reference<_BinaryPredicate>::type>
- (__first1, __last1, __first2, __pred );
-}
-
-template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-equal(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred )
-{
- return _VSTD::__equal<typename add_lvalue_reference<_BinaryPredicate>::type>
- (__first1, __last1, __first2, __last2, __pred,
- typename iterator_traits<_InputIterator1>::iterator_category(),
- typename iterator_traits<_InputIterator2>::iterator_category());
-}
-
-template <class _InputIterator1, class _InputIterator2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-equal(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2)
-{
- typedef typename iterator_traits<_InputIterator1>::value_type __v1;
- typedef typename iterator_traits<_InputIterator2>::value_type __v2;
- return _VSTD::__equal(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>(),
- typename iterator_traits<_InputIterator1>::iterator_category(),
- typename iterator_traits<_InputIterator2>::iterator_category());
-}
-#endif
-
-// is_permutation
-
-template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
-is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
- _ForwardIterator2 __first2, _BinaryPredicate __pred)
-{
-// shorten sequences as much as possible by lopping of any equal prefix
- for (; __first1 != __last1; ++__first1, (void) ++__first2)
- if (!__pred(*__first1, *__first2))
- break;
- if (__first1 == __last1)
- return true;
-
-// __first1 != __last1 && *__first1 != *__first2
- typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
- _D1 __l1 = _VSTD::distance(__first1, __last1);
- if (__l1 == _D1(1))
- return false;
- _ForwardIterator2 __last2 = _VSTD::next(__first2, __l1);
- // For each element in [f1, l1) see if there are the same number of
- // equal elements in [f2, l2)
- for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
- {
- // Have we already counted the number of *__i in [f1, l1)?
- _ForwardIterator1 __match = __first1;
- for (; __match != __i; ++__match)
- if (__pred(*__match, *__i))
- break;
- if (__match == __i) {
- // Count number of *__i in [f2, l2)
- _D1 __c2 = 0;
- for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
- if (__pred(*__i, *__j))
- ++__c2;
- if (__c2 == 0)
- return false;
- // Count number of *__i in [__i, l1) (we can start with 1)
- _D1 __c1 = 1;
- for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
- if (__pred(*__i, *__j))
- ++__c1;
- if (__c1 != __c2)
- return false;
- }
- }
- return true;
-}
-
-template<class _ForwardIterator1, class _ForwardIterator2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
- _ForwardIterator2 __first2)
-{
- typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
- typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
- return _VSTD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>());
-}
-
-#if _LIBCPP_STD_VER > 11
-template<class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
-__is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
- _ForwardIterator2 __first2, _ForwardIterator2 __last2,
- _BinaryPredicate __pred,
- forward_iterator_tag, forward_iterator_tag )
-{
-// shorten sequences as much as possible by lopping of any equal prefix
- for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
- if (!__pred(*__first1, *__first2))
- break;
- if (__first1 == __last1)
- return __first2 == __last2;
- else if (__first2 == __last2)
- return false;
-
- typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
- _D1 __l1 = _VSTD::distance(__first1, __last1);
-
- typedef typename iterator_traits<_ForwardIterator2>::difference_type _D2;
- _D2 __l2 = _VSTD::distance(__first2, __last2);
- if (__l1 != __l2)
- return false;
-
- // For each element in [f1, l1) see if there are the same number of
- // equal elements in [f2, l2)
- for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
- {
- // Have we already counted the number of *__i in [f1, l1)?
- _ForwardIterator1 __match = __first1;
- for (; __match != __i; ++__match)
- if (__pred(*__match, *__i))
- break;
- if (__match == __i) {
- // Count number of *__i in [f2, l2)
- _D1 __c2 = 0;
- for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
- if (__pred(*__i, *__j))
- ++__c2;
- if (__c2 == 0)
- return false;
- // Count number of *__i in [__i, l1) (we can start with 1)
- _D1 __c1 = 1;
- for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
- if (__pred(*__i, *__j))
- ++__c1;
- if (__c1 != __c2)
- return false;
- }
- }
- return true;
-}
-
-template<class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
-__is_permutation(_RandomAccessIterator1 __first1, _RandomAccessIterator2 __last1,
- _RandomAccessIterator1 __first2, _RandomAccessIterator2 __last2,
- _BinaryPredicate __pred,
- random_access_iterator_tag, random_access_iterator_tag )
-{
- if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
- return false;
- return _VSTD::is_permutation<_RandomAccessIterator1, _RandomAccessIterator2,
- typename add_lvalue_reference<_BinaryPredicate>::type>
- (__first1, __last1, __first2, __pred );
-}
-
-template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
- _ForwardIterator2 __first2, _ForwardIterator2 __last2,
- _BinaryPredicate __pred )
-{
- return _VSTD::__is_permutation<typename add_lvalue_reference<_BinaryPredicate>::type>
- (__first1, __last1, __first2, __last2, __pred,
- typename iterator_traits<_ForwardIterator1>::iterator_category(),
- typename iterator_traits<_ForwardIterator2>::iterator_category());
-}
-
-template<class _ForwardIterator1, class _ForwardIterator2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
- _ForwardIterator2 __first2, _ForwardIterator2 __last2)
-{
- typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
- typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
- return _VSTD::__is_permutation(__first1, __last1, __first2, __last2,
- __equal_to<__v1, __v2>(),
- typename iterator_traits<_ForwardIterator1>::iterator_category(),
- typename iterator_traits<_ForwardIterator2>::iterator_category());
-}
-#endif
-
-// search
-// __search is in <functional>
-
-template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_ForwardIterator1
-search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
- _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
-{
- return _VSTD::__search<typename add_lvalue_reference<_BinaryPredicate>::type>
- (__first1, __last1, __first2, __last2, __pred,
- typename iterator_traits<_ForwardIterator1>::iterator_category(),
- typename iterator_traits<_ForwardIterator2>::iterator_category())
- .first;
-}
-
-template <class _ForwardIterator1, class _ForwardIterator2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_ForwardIterator1
-search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
- _ForwardIterator2 __first2, _ForwardIterator2 __last2)
-{
- typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
- typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
- return _VSTD::search(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
-}
-
-
-#if _LIBCPP_STD_VER > 14
-template <class _ForwardIterator, class _Searcher>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_ForwardIterator search(_ForwardIterator __f, _ForwardIterator __l, const _Searcher &__s)
-{ return __s(__f, __l).first; }
-#endif
-
-// search_n
-
-template <class _BinaryPredicate, class _ForwardIterator, class _Size, class _Tp>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
-__search_n(_ForwardIterator __first, _ForwardIterator __last,
- _Size __count, const _Tp& __value_, _BinaryPredicate __pred, forward_iterator_tag)
-{
- if (__count <= 0)
- return __first;
- while (true)
- {
- // Find first element in sequence that matchs __value_, with a mininum of loop checks
- while (true)
- {
- if (__first == __last) // return __last if no element matches __value_
- return __last;
- if (__pred(*__first, __value_))
- break;
- ++__first;
- }
- // *__first matches __value_, now match elements after here
- _ForwardIterator __m = __first;
- _Size __c(0);
- while (true)
- {
- if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
- return __first;
- if (++__m == __last) // Otherwise if source exhaused, pattern not found
- return __last;
- if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
- {
- __first = __m;
- ++__first;
- break;
- } // else there is a match, check next elements
- }
- }
-}
-
-template <class _BinaryPredicate, class _RandomAccessIterator, class _Size, class _Tp>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 _RandomAccessIterator
-__search_n(_RandomAccessIterator __first, _RandomAccessIterator __last,
- _Size __count, const _Tp& __value_, _BinaryPredicate __pred, random_access_iterator_tag)
-{
- if (__count <= 0)
- return __first;
- _Size __len = static_cast<_Size>(__last - __first);
- if (__len < __count)
- return __last;
- const _RandomAccessIterator __s = __last - (__count - 1); // Start of pattern match can't go beyond here
- while (true)
- {
- // Find first element in sequence that matchs __value_, with a mininum of loop checks
- while (true)
- {
- if (__first >= __s) // return __last if no element matches __value_
- return __last;
- if (__pred(*__first, __value_))
- break;
- ++__first;
- }
- // *__first matches __value_, now match elements after here
- _RandomAccessIterator __m = __first;
- _Size __c(0);
- while (true)
- {
- if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
- return __first;
- ++__m; // no need to check range on __m because __s guarantees we have enough source
- if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
- {
- __first = __m;
- ++__first;
- break;
- } // else there is a match, check next elements
- }
- }
-}
-
-template <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_ForwardIterator
-search_n(_ForwardIterator __first, _ForwardIterator __last,
- _Size __count, const _Tp& __value_, _BinaryPredicate __pred)
-{
- return _VSTD::__search_n<typename add_lvalue_reference<_BinaryPredicate>::type>
- (__first, __last, __convert_to_integral(__count), __value_, __pred,
- typename iterator_traits<_ForwardIterator>::iterator_category());
-}
-
-template <class _ForwardIterator, class _Size, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_ForwardIterator
-search_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const _Tp& __value_)
-{
- typedef typename iterator_traits<_ForwardIterator>::value_type __v;
- return _VSTD::search_n(__first, __last, __convert_to_integral(__count),
- __value_, __equal_to<__v, _Tp>());
-}
-
-// copy
-template <class _Iter>
-inline _LIBCPP_INLINE_VISIBILITY
-_Iter
-__unwrap_iter(_Iter __i)
-{
- return __i;
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_trivially_copy_assignable<_Tp>::value,
- _Tp*
->::type
-__unwrap_iter(move_iterator<_Tp*> __i)
-{
- return __i.base();
-}
-
-#if _LIBCPP_DEBUG_LEVEL < 2
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-typename enable_if
-<
- is_trivially_copy_assignable<_Tp>::value,
- _Tp*
->::type
-__unwrap_iter(__wrap_iter<_Tp*> __i)
-{
- return __i.base();
-}
-
-#else
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-typename enable_if
-<
- is_trivially_copy_assignable<_Tp>::value,
- __wrap_iter<_Tp*>
->::type
-__unwrap_iter(__wrap_iter<_Tp*> __i)
-{
- return __i;
-}
-
-#endif // _LIBCPP_DEBUG_LEVEL < 2
-
-template <class _InputIterator, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
-{
- for (; __first != __last; ++__first, (void) ++__result)
- *__result = *__first;
- return __result;
-}
-
-template <class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_same<typename remove_const<_Tp>::type, _Up>::value &&
- is_trivially_copy_assignable<_Up>::value,
- _Up*
->::type
-__copy(_Tp* __first, _Tp* __last, _Up* __result)
-{
- const size_t __n = static_cast<size_t>(__last - __first);
- if (__n > 0)
- _VSTD::memmove(__result, __first, __n * sizeof(_Up));
- return __result + __n;
-}
-
-template <class _InputIterator, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
-{
- return _VSTD::__copy(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
-}
-
-// copy_backward
-
-template <class _BidirectionalIterator, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-__copy_backward(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
-{
- while (__first != __last)
- *--__result = *--__last;
- return __result;
-}
-
-template <class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_same<typename remove_const<_Tp>::type, _Up>::value &&
- is_trivially_copy_assignable<_Up>::value,
- _Up*
->::type
-__copy_backward(_Tp* __first, _Tp* __last, _Up* __result)
-{
- const size_t __n = static_cast<size_t>(__last - __first);
- if (__n > 0)
- {
- __result -= __n;
- _VSTD::memmove(__result, __first, __n * sizeof(_Up));
- }
- return __result;
-}
-
-template <class _BidirectionalIterator1, class _BidirectionalIterator2>
-inline _LIBCPP_INLINE_VISIBILITY
-_BidirectionalIterator2
-copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
- _BidirectionalIterator2 __result)
-{
- return _VSTD::__copy_backward(__unwrap_iter(__first),
- __unwrap_iter(__last),
- __unwrap_iter(__result));
-}
-
-// copy_if
-
-template<class _InputIterator, class _OutputIterator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-copy_if(_InputIterator __first, _InputIterator __last,
- _OutputIterator __result, _Predicate __pred)
-{
- for (; __first != __last; ++__first)
- {
- if (__pred(*__first))
- {
- *__result = *__first;
- ++__result;
- }
- }
- return __result;
-}
-
-// copy_n
-
-template<class _InputIterator, class _Size, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_input_iterator<_InputIterator>::value &&
- !__is_random_access_iterator<_InputIterator>::value,
- _OutputIterator
->::type
-copy_n(_InputIterator __first, _Size __orig_n, _OutputIterator __result)
-{
- typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
- _IntegralSize __n = __orig_n;
- if (__n > 0)
- {
- *__result = *__first;
- ++__result;
- for (--__n; __n > 0; --__n)
- {
- ++__first;
- *__result = *__first;
- ++__result;
- }
- }
- return __result;
-}
-
-template<class _InputIterator, class _Size, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_random_access_iterator<_InputIterator>::value,
- _OutputIterator
->::type
-copy_n(_InputIterator __first, _Size __orig_n, _OutputIterator __result)
-{
- typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
- _IntegralSize __n = __orig_n;
- return _VSTD::copy(__first, __first + __n, __result);
-}
-
-// move
-
-template <class _InputIterator, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
-{
- for (; __first != __last; ++__first, (void) ++__result)
- *__result = _VSTD::move(*__first);
- return __result;
-}
-
-template <class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_same<typename remove_const<_Tp>::type, _Up>::value &&
- is_trivially_copy_assignable<_Up>::value,
- _Up*
->::type
-__move(_Tp* __first, _Tp* __last, _Up* __result)
-{
- const size_t __n = static_cast<size_t>(__last - __first);
- if (__n > 0)
- _VSTD::memmove(__result, __first, __n * sizeof(_Up));
- return __result + __n;
-}
-
-template <class _InputIterator, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
-{
- return _VSTD::__move(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
-}
-
-// move_backward
-
-template <class _InputIterator, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-__move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
-{
- while (__first != __last)
- *--__result = _VSTD::move(*--__last);
- return __result;
-}
-
-template <class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_same<typename remove_const<_Tp>::type, _Up>::value &&
- is_trivially_copy_assignable<_Up>::value,
- _Up*
->::type
-__move_backward(_Tp* __first, _Tp* __last, _Up* __result)
-{
- const size_t __n = static_cast<size_t>(__last - __first);
- if (__n > 0)
- {
- __result -= __n;
- _VSTD::memmove(__result, __first, __n * sizeof(_Up));
- }
- return __result;
-}
-
-template <class _BidirectionalIterator1, class _BidirectionalIterator2>
-inline _LIBCPP_INLINE_VISIBILITY
-_BidirectionalIterator2
-move_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
- _BidirectionalIterator2 __result)
-{
- return _VSTD::__move_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
-}
-
-// iter_swap
-
-// moved to <type_traits> for better swap / noexcept support
-
-// transform
-
-template <class _InputIterator, class _OutputIterator, class _UnaryOperation>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_OutputIterator
-transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)
-{
- for (; __first != __last; ++__first, (void) ++__result)
- *__result = __op(*__first);
- return __result;
-}
-
-template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _BinaryOperation>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_OutputIterator
-transform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
- _OutputIterator __result, _BinaryOperation __binary_op)
-{
- for (; __first1 != __last1; ++__first1, (void) ++__first2, ++__result)
- *__result = __binary_op(*__first1, *__first2);
- return __result;
-}
-
-// replace
-
-template <class _ForwardIterator, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-void
-replace(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_value, const _Tp& __new_value)
-{
- for (; __first != __last; ++__first)
- if (*__first == __old_value)
- *__first = __new_value;
-}
-
-// replace_if
-
-template <class _ForwardIterator, class _Predicate, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-void
-replace_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, const _Tp& __new_value)
-{
- for (; __first != __last; ++__first)
- if (__pred(*__first))
- *__first = __new_value;
-}
-
-// replace_copy
-
-template <class _InputIterator, class _OutputIterator, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_OutputIterator
-replace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
- const _Tp& __old_value, const _Tp& __new_value)
-{
- for (; __first != __last; ++__first, (void) ++__result)
- if (*__first == __old_value)
- *__result = __new_value;
- else
- *__result = *__first;
- return __result;
-}
-
-// replace_copy_if
-
-template <class _InputIterator, class _OutputIterator, class _Predicate, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_OutputIterator
-replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
- _Predicate __pred, const _Tp& __new_value)
-{
- for (; __first != __last; ++__first, (void) ++__result)
- if (__pred(*__first))
- *__result = __new_value;
- else
- *__result = *__first;
- return __result;
-}
-
-// fill_n
-
-template <class _OutputIterator, class _Size, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_OutputIterator
-__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
-{
- for (; __n > 0; ++__first, (void) --__n)
- *__first = __value_;
- return __first;
-}
-
-template <class _OutputIterator, class _Size, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_OutputIterator
-fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
-{
- return _VSTD::__fill_n(__first, __convert_to_integral(__n), __value_);
-}
-
-// fill
-
-template <class _ForwardIterator, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-void
-__fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, forward_iterator_tag)
-{
- for (; __first != __last; ++__first)
- *__first = __value_;
-}
-
-template <class _RandomAccessIterator, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-void
-__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value_, random_access_iterator_tag)
-{
- _VSTD::fill_n(__first, __last - __first, __value_);
-}
-
-template <class _ForwardIterator, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-void
-fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
-{
- _VSTD::__fill(__first, __last, __value_, typename iterator_traits<_ForwardIterator>::iterator_category());
-}
-
-// generate
-
-template <class _ForwardIterator, class _Generator>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-void
-generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen)
-{
- for (; __first != __last; ++__first)
- *__first = __gen();
-}
-
-// generate_n
-
-template <class _OutputIterator, class _Size, class _Generator>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_OutputIterator
-generate_n(_OutputIterator __first, _Size __orig_n, _Generator __gen)
-{
- typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
- _IntegralSize __n = __orig_n;
- for (; __n > 0; ++__first, (void) --__n)
- *__first = __gen();
- return __first;
-}
-
-// remove
-
-template <class _ForwardIterator, class _Tp>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
-remove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
-{
- __first = _VSTD::find(__first, __last, __value_);
- if (__first != __last)
- {
- _ForwardIterator __i = __first;
- while (++__i != __last)
- {
- if (!(*__i == __value_))
- {
- *__first = _VSTD::move(*__i);
- ++__first;
- }
- }
- }
- return __first;
-}
-
-// remove_if
-
-template <class _ForwardIterator, class _Predicate>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
-remove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
-{
- __first = _VSTD::find_if<_ForwardIterator, typename add_lvalue_reference<_Predicate>::type>
- (__first, __last, __pred);
- if (__first != __last)
- {
- _ForwardIterator __i = __first;
- while (++__i != __last)
- {
- if (!__pred(*__i))
- {
- *__first = _VSTD::move(*__i);
- ++__first;
- }
- }
- }
- return __first;
-}
-
-// remove_copy
-
-template <class _InputIterator, class _OutputIterator, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_OutputIterator
-remove_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, const _Tp& __value_)
-{
- for (; __first != __last; ++__first)
- {
- if (!(*__first == __value_))
- {
- *__result = *__first;
- ++__result;
- }
- }
- return __result;
-}
-
-// remove_copy_if
-
-template <class _InputIterator, class _OutputIterator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_OutputIterator
-remove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred)
-{
- for (; __first != __last; ++__first)
- {
- if (!__pred(*__first))
- {
- *__result = *__first;
- ++__result;
- }
- }
- return __result;
-}
-
-// unique
-
-template <class _ForwardIterator, class _BinaryPredicate>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
-unique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
-{
- __first = _VSTD::adjacent_find<_ForwardIterator, typename add_lvalue_reference<_BinaryPredicate>::type>
- (__first, __last, __pred);
- if (__first != __last)
- {
- // ... a a ? ...
- // f i
- _ForwardIterator __i = __first;
- for (++__i; ++__i != __last;)
- if (!__pred(*__first, *__i))
- *++__first = _VSTD::move(*__i);
- ++__first;
- }
- return __first;
-}
-
-template <class _ForwardIterator>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_ForwardIterator
-unique(_ForwardIterator __first, _ForwardIterator __last)
-{
- typedef typename iterator_traits<_ForwardIterator>::value_type __v;
- return _VSTD::unique(__first, __last, __equal_to<__v>());
-}
-
-// unique_copy
-
-template <class _BinaryPredicate, class _InputIterator, class _OutputIterator>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
-__unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
- input_iterator_tag, output_iterator_tag)
-{
- if (__first != __last)
- {
- typename iterator_traits<_InputIterator>::value_type __t(*__first);
- *__result = __t;
- ++__result;
- while (++__first != __last)
- {
- if (!__pred(__t, *__first))
- {
- __t = *__first;
- *__result = __t;
- ++__result;
- }
- }
- }
- return __result;
-}
-
-template <class _BinaryPredicate, class _ForwardIterator, class _OutputIterator>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
-__unique_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
- forward_iterator_tag, output_iterator_tag)
-{
- if (__first != __last)
- {
- _ForwardIterator __i = __first;
- *__result = *__i;
- ++__result;
- while (++__first != __last)
- {
- if (!__pred(*__i, *__first))
- {
- *__result = *__first;
- ++__result;
- __i = __first;
- }
- }
- }
- return __result;
-}
-
-template <class _BinaryPredicate, class _InputIterator, class _ForwardIterator>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
-__unique_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result, _BinaryPredicate __pred,
- input_iterator_tag, forward_iterator_tag)
-{
- if (__first != __last)
- {
- *__result = *__first;
- while (++__first != __last)
- if (!__pred(*__result, *__first))
- *++__result = *__first;
- ++__result;
- }
- return __result;
-}
-
-template <class _InputIterator, class _OutputIterator, class _BinaryPredicate>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_OutputIterator
-unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred)
-{
- return _VSTD::__unique_copy<typename add_lvalue_reference<_BinaryPredicate>::type>
- (__first, __last, __result, __pred,
- typename iterator_traits<_InputIterator>::iterator_category(),
- typename iterator_traits<_OutputIterator>::iterator_category());
-}
-
-template <class _InputIterator, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_OutputIterator
-unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
-{
- typedef typename iterator_traits<_InputIterator>::value_type __v;
- return _VSTD::unique_copy(__first, __last, __result, __equal_to<__v>());
-}
-
-// reverse
-
-template <class _BidirectionalIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-__reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
-{
- while (__first != __last)
- {
- if (__first == --__last)
- break;
- _VSTD::iter_swap(__first, __last);
- ++__first;
- }
-}
-
-template <class _RandomAccessIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-__reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag)
-{
- if (__first != __last)
- for (; __first < --__last; ++__first)
- _VSTD::iter_swap(__first, __last);
-}
-
-template <class _BidirectionalIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
-{
- _VSTD::__reverse(__first, __last, typename iterator_traits<_BidirectionalIterator>::iterator_category());
-}
-
-// reverse_copy
-
-template <class _BidirectionalIterator, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_OutputIterator
-reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
-{
- for (; __first != __last; ++__result)
- *__result = *--__last;
- return __result;
-}
-
-// rotate
-
-template <class _ForwardIterator>
-_ForwardIterator
-__rotate_left(_ForwardIterator __first, _ForwardIterator __last)
-{
- typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
- value_type __tmp = _VSTD::move(*__first);
- _ForwardIterator __lm1 = _VSTD::move(_VSTD::next(__first), __last, __first);
- *__lm1 = _VSTD::move(__tmp);
- return __lm1;
-}
-
-template <class _BidirectionalIterator>
-_BidirectionalIterator
-__rotate_right(_BidirectionalIterator __first, _BidirectionalIterator __last)
-{
- typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
- _BidirectionalIterator __lm1 = _VSTD::prev(__last);
- value_type __tmp = _VSTD::move(*__lm1);
- _BidirectionalIterator __fp1 = _VSTD::move_backward(__first, __lm1, __last);
- *__first = _VSTD::move(__tmp);
- return __fp1;
-}
-
-template <class _ForwardIterator>
-_ForwardIterator
-__rotate_forward(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
-{
- _ForwardIterator __i = __middle;
- while (true)
- {
- swap(*__first, *__i);
- ++__first;
- if (++__i == __last)
- break;
- if (__first == __middle)
- __middle = __i;
- }
- _ForwardIterator __r = __first;
- if (__first != __middle)
- {
- __i = __middle;
- while (true)
- {
- swap(*__first, *__i);
- ++__first;
- if (++__i == __last)
- {
- if (__first == __middle)
- break;
- __i = __middle;
- }
- else if (__first == __middle)
- __middle = __i;
- }
- }
- return __r;
-}
-
-template<typename _Integral>
-inline _LIBCPP_INLINE_VISIBILITY
-_Integral
-__algo_gcd(_Integral __x, _Integral __y)
-{
- do
- {
- _Integral __t = __x % __y;
- __x = __y;
- __y = __t;
- } while (__y);
- return __x;
-}
-
-template<typename _RandomAccessIterator>
-_RandomAccessIterator
-__rotate_gcd(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
-{
- typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
- typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
-
- const difference_type __m1 = __middle - __first;
- const difference_type __m2 = __last - __middle;
- if (__m1 == __m2)
- {
- _VSTD::swap_ranges(__first, __middle, __middle);
- return __middle;
- }
- const difference_type __g = _VSTD::__algo_gcd(__m1, __m2);
- for (_RandomAccessIterator __p = __first + __g; __p != __first;)
- {
- value_type __t(_VSTD::move(*--__p));
- _RandomAccessIterator __p1 = __p;
- _RandomAccessIterator __p2 = __p1 + __m1;
- do
- {
- *__p1 = _VSTD::move(*__p2);
- __p1 = __p2;
- const difference_type __d = __last - __p2;
- if (__m1 < __d)
- __p2 += __m1;
- else
- __p2 = __first + (__m1 - __d);
- } while (__p2 != __p);
- *__p1 = _VSTD::move(__t);
- }
- return __first + __m2;
-}
-
-template <class _ForwardIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_ForwardIterator
-__rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last,
- _VSTD::forward_iterator_tag)
-{
- typedef typename _VSTD::iterator_traits<_ForwardIterator>::value_type value_type;
- if (_VSTD::is_trivially_move_assignable<value_type>::value)
- {
- if (_VSTD::next(__first) == __middle)
- return _VSTD::__rotate_left(__first, __last);
- }
- return _VSTD::__rotate_forward(__first, __middle, __last);
-}
-
-template <class _BidirectionalIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_BidirectionalIterator
-__rotate(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
- _VSTD::bidirectional_iterator_tag)
-{
- typedef typename _VSTD::iterator_traits<_BidirectionalIterator>::value_type value_type;
- if (_VSTD::is_trivially_move_assignable<value_type>::value)
- {
- if (_VSTD::next(__first) == __middle)
- return _VSTD::__rotate_left(__first, __last);
- if (_VSTD::next(__middle) == __last)
- return _VSTD::__rotate_right(__first, __last);
- }
- return _VSTD::__rotate_forward(__first, __middle, __last);
-}
-
-template <class _RandomAccessIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_RandomAccessIterator
-__rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
- _VSTD::random_access_iterator_tag)
-{
- typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::value_type value_type;
- if (_VSTD::is_trivially_move_assignable<value_type>::value)
- {
- if (_VSTD::next(__first) == __middle)
- return _VSTD::__rotate_left(__first, __last);
- if (_VSTD::next(__middle) == __last)
- return _VSTD::__rotate_right(__first, __last);
- return _VSTD::__rotate_gcd(__first, __middle, __last);
- }
- return _VSTD::__rotate_forward(__first, __middle, __last);
-}
-
-template <class _ForwardIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_ForwardIterator
-rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
-{
- if (__first == __middle)
- return __last;
- if (__middle == __last)
- return __first;
- return _VSTD::__rotate(__first, __middle, __last,
- typename _VSTD::iterator_traits<_ForwardIterator>::iterator_category());
-}
-
-// rotate_copy
-
-template <class _ForwardIterator, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-rotate_copy(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, _OutputIterator __result)
-{
- return _VSTD::copy(__first, __middle, _VSTD::copy(__middle, __last, __result));
-}
-
-// min_element
-
-template <class _ForwardIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-_ForwardIterator
-min_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
-{
- static_assert(__is_forward_iterator<_ForwardIterator>::value,
- "std::min_element requires a ForwardIterator");
- if (__first != __last)
- {
- _ForwardIterator __i = __first;
- while (++__i != __last)
- if (__comp(*__i, *__first))
- __first = __i;
- }
- return __first;
-}
-
-template <class _ForwardIterator>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-_ForwardIterator
-min_element(_ForwardIterator __first, _ForwardIterator __last)
-{
- return _VSTD::min_element(__first, __last,
- __less<typename iterator_traits<_ForwardIterator>::value_type>());
-}
-
-// min
-
-template <class _Tp, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-const _Tp&
-min(const _Tp& __a, const _Tp& __b, _Compare __comp)
-{
- return __comp(__b, __a) ? __b : __a;
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-const _Tp&
-min(const _Tp& __a, const _Tp& __b)
-{
- return _VSTD::min(__a, __b, __less<_Tp>());
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template<class _Tp, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-_Tp
-min(initializer_list<_Tp> __t, _Compare __comp)
-{
- return *_VSTD::min_element(__t.begin(), __t.end(), __comp);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-_Tp
-min(initializer_list<_Tp> __t)
-{
- return *_VSTD::min_element(__t.begin(), __t.end(), __less<_Tp>());
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-// max_element
-
-template <class _ForwardIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-_ForwardIterator
-max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
-{
- static_assert(__is_forward_iterator<_ForwardIterator>::value,
- "std::max_element requires a ForwardIterator");
- if (__first != __last)
- {
- _ForwardIterator __i = __first;
- while (++__i != __last)
- if (__comp(*__first, *__i))
- __first = __i;
- }
- return __first;
-}
-
-
-template <class _ForwardIterator>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-_ForwardIterator
-max_element(_ForwardIterator __first, _ForwardIterator __last)
-{
- return _VSTD::max_element(__first, __last,
- __less<typename iterator_traits<_ForwardIterator>::value_type>());
-}
-
-// max
-
-template <class _Tp, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-const _Tp&
-max(const _Tp& __a, const _Tp& __b, _Compare __comp)
-{
- return __comp(__a, __b) ? __b : __a;
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-const _Tp&
-max(const _Tp& __a, const _Tp& __b)
-{
- return _VSTD::max(__a, __b, __less<_Tp>());
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template<class _Tp, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-_Tp
-max(initializer_list<_Tp> __t, _Compare __comp)
-{
- return *_VSTD::max_element(__t.begin(), __t.end(), __comp);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-_Tp
-max(initializer_list<_Tp> __t)
-{
- return *_VSTD::max_element(__t.begin(), __t.end(), __less<_Tp>());
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-#if _LIBCPP_STD_VER > 14
-// clamp
-template<class _Tp, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-const _Tp&
-clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi, _Compare __comp)
-{
- _LIBCPP_ASSERT(!__comp(__hi, __lo), "Bad bounds passed to std::clamp");
- return __comp(__v, __lo) ? __lo : __comp(__hi, __v) ? __hi : __v;
-
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-const _Tp&
-clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi)
-{
- return _VSTD::clamp(__v, __lo, __hi, __less<_Tp>());
-}
-#endif
-
-// minmax_element
-
-template <class _ForwardIterator, class _Compare>
-_LIBCPP_CONSTEXPR_AFTER_CXX11
-std::pair<_ForwardIterator, _ForwardIterator>
-minmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
-{
- static_assert(__is_forward_iterator<_ForwardIterator>::value,
- "std::minmax_element requires a ForwardIterator");
- std::pair<_ForwardIterator, _ForwardIterator> __result(__first, __first);
- if (__first != __last)
- {
- if (++__first != __last)
- {
- if (__comp(*__first, *__result.first))
- __result.first = __first;
- else
- __result.second = __first;
- while (++__first != __last)
- {
- _ForwardIterator __i = __first;
- if (++__first == __last)
- {
- if (__comp(*__i, *__result.first))
- __result.first = __i;
- else if (!__comp(*__i, *__result.second))
- __result.second = __i;
- break;
- }
- else
- {
- if (__comp(*__first, *__i))
- {
- if (__comp(*__first, *__result.first))
- __result.first = __first;
- if (!__comp(*__i, *__result.second))
- __result.second = __i;
- }
- else
- {
- if (__comp(*__i, *__result.first))
- __result.first = __i;
- if (!__comp(*__first, *__result.second))
- __result.second = __first;
- }
- }
- }
- }
- }
- return __result;
-}
-
-template <class _ForwardIterator>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-std::pair<_ForwardIterator, _ForwardIterator>
-minmax_element(_ForwardIterator __first, _ForwardIterator __last)
-{
- return _VSTD::minmax_element(__first, __last,
- __less<typename iterator_traits<_ForwardIterator>::value_type>());
-}
-
-// minmax
-
-template<class _Tp, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-pair<const _Tp&, const _Tp&>
-minmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
-{
- return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a) :
- pair<const _Tp&, const _Tp&>(__a, __b);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-pair<const _Tp&, const _Tp&>
-minmax(const _Tp& __a, const _Tp& __b)
-{
- return _VSTD::minmax(__a, __b, __less<_Tp>());
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template<class _Tp, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-pair<_Tp, _Tp>
-minmax(initializer_list<_Tp> __t, _Compare __comp)
-{
- typedef typename initializer_list<_Tp>::const_iterator _Iter;
- _Iter __first = __t.begin();
- _Iter __last = __t.end();
- std::pair<_Tp, _Tp> __result(*__first, *__first);
-
- ++__first;
- if (__t.size() % 2 == 0)
- {
- if (__comp(*__first, __result.first))
- __result.first = *__first;
- else
- __result.second = *__first;
- ++__first;
- }
-
- while (__first != __last)
- {
- _Tp __prev = *__first++;
- if (__comp(*__first, __prev)) {
- if ( __comp(*__first, __result.first)) __result.first = *__first;
- if (!__comp(__prev, __result.second)) __result.second = __prev;
- }
- else {
- if ( __comp(__prev, __result.first)) __result.first = __prev;
- if (!__comp(*__first, __result.second)) __result.second = *__first;
- }
-
- __first++;
- }
- return __result;
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-pair<_Tp, _Tp>
-minmax(initializer_list<_Tp> __t)
-{
- return _VSTD::minmax(__t, __less<_Tp>());
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-// random_shuffle
-
-// __independent_bits_engine
-
-template <unsigned long long _Xp, size_t _Rp>
-struct __log2_imp
-{
- static const size_t value = _Xp & ((unsigned long long)(1) << _Rp) ? _Rp
- : __log2_imp<_Xp, _Rp - 1>::value;
-};
-
-template <unsigned long long _Xp>
-struct __log2_imp<_Xp, 0>
-{
- static const size_t value = 0;
-};
-
-template <size_t _Rp>
-struct __log2_imp<0, _Rp>
-{
- static const size_t value = _Rp + 1;
-};
-
-template <class _UIntType, _UIntType _Xp>
-struct __log2
-{
- static const size_t value = __log2_imp<_Xp,
- sizeof(_UIntType) * __CHAR_BIT__ - 1>::value;
-};
-
-template<class _Engine, class _UIntType>
-class __independent_bits_engine
-{
-public:
- // types
- typedef _UIntType result_type;
-
-private:
- typedef typename _Engine::result_type _Engine_result_type;
- typedef typename conditional
- <
- sizeof(_Engine_result_type) <= sizeof(result_type),
- result_type,
- _Engine_result_type
- >::type _Working_result_type;
-
- _Engine& __e_;
- size_t __w_;
- size_t __w0_;
- size_t __n_;
- size_t __n0_;
- _Working_result_type __y0_;
- _Working_result_type __y1_;
- _Engine_result_type __mask0_;
- _Engine_result_type __mask1_;
-
-#ifdef _LIBCPP_CXX03_LANG
- static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min
- + _Working_result_type(1);
-#else
- static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min()
- + _Working_result_type(1);
-#endif
- static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value;
- static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits;
- static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits;
-
-public:
- // constructors and seeding functions
- __independent_bits_engine(_Engine& __e, size_t __w);
-
- // generating functions
- result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());}
-
-private:
- result_type __eval(false_type);
- result_type __eval(true_type);
-};
-
-template<class _Engine, class _UIntType>
-__independent_bits_engine<_Engine, _UIntType>
- ::__independent_bits_engine(_Engine& __e, size_t __w)
- : __e_(__e),
- __w_(__w)
-{
- __n_ = __w_ / __m + (__w_ % __m != 0);
- __w0_ = __w_ / __n_;
- if (_Rp == 0)
- __y0_ = _Rp;
- else if (__w0_ < _WDt)
- __y0_ = (_Rp >> __w0_) << __w0_;
- else
- __y0_ = 0;
- if (_Rp - __y0_ > __y0_ / __n_)
- {
- ++__n_;
- __w0_ = __w_ / __n_;
- if (__w0_ < _WDt)
- __y0_ = (_Rp >> __w0_) << __w0_;
- else
- __y0_ = 0;
- }
- __n0_ = __n_ - __w_ % __n_;
- if (__w0_ < _WDt - 1)
- __y1_ = (_Rp >> (__w0_ + 1)) << (__w0_ + 1);
- else
- __y1_ = 0;
- __mask0_ = __w0_ > 0 ? _Engine_result_type(~0) >> (_EDt - __w0_) :
- _Engine_result_type(0);
- __mask1_ = __w0_ < _EDt - 1 ?
- _Engine_result_type(~0) >> (_EDt - (__w0_ + 1)) :
- _Engine_result_type(~0);
-}
-
-template<class _Engine, class _UIntType>
-inline
-_UIntType
-__independent_bits_engine<_Engine, _UIntType>::__eval(false_type)
-{
- return static_cast<result_type>(__e_() & __mask0_);
-}
-
-template<class _Engine, class _UIntType>
-_UIntType
-__independent_bits_engine<_Engine, _UIntType>::__eval(true_type)
-{
- const size_t _WRt = numeric_limits<result_type>::digits;
- result_type _Sp = 0;
- for (size_t __k = 0; __k < __n0_; ++__k)
- {
- _Engine_result_type __u;
- do
- {
- __u = __e_() - _Engine::min();
- } while (__u >= __y0_);
- if (__w0_ < _WRt)
- _Sp <<= __w0_;
- else
- _Sp = 0;
- _Sp += __u & __mask0_;
- }
- for (size_t __k = __n0_; __k < __n_; ++__k)
- {
- _Engine_result_type __u;
- do
- {
- __u = __e_() - _Engine::min();
- } while (__u >= __y1_);
- if (__w0_ < _WRt - 1)
- _Sp <<= __w0_ + 1;
- else
- _Sp = 0;
- _Sp += __u & __mask1_;
- }
- return _Sp;
-}
-
-// uniform_int_distribution
-
-template<class _IntType = int>
-class uniform_int_distribution
-{
-public:
- // types
- typedef _IntType result_type;
-
- class param_type
- {
- result_type __a_;
- result_type __b_;
- public:
- typedef uniform_int_distribution distribution_type;
-
- explicit param_type(result_type __a = 0,
- result_type __b = numeric_limits<result_type>::max())
- : __a_(__a), __b_(__b) {}
-
- result_type a() const {return __a_;}
- result_type b() const {return __b_;}
-
- friend bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
- friend bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
-
-private:
- param_type __p_;
-
-public:
- // constructors and reset functions
- explicit uniform_int_distribution(result_type __a = 0,
- result_type __b = numeric_limits<result_type>::max())
- : __p_(param_type(__a, __b)) {}
- explicit uniform_int_distribution(const param_type& __p) : __p_(__p) {}
- void reset() {}
-
- // generating functions
- template<class _URNG> result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
-
- // property functions
- result_type a() const {return __p_.a();}
- result_type b() const {return __p_.b();}
-
- param_type param() const {return __p_;}
- void param(const param_type& __p) {__p_ = __p;}
-
- result_type min() const {return a();}
- result_type max() const {return b();}
-
- friend bool operator==(const uniform_int_distribution& __x,
- const uniform_int_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend bool operator!=(const uniform_int_distribution& __x,
- const uniform_int_distribution& __y)
- {return !(__x == __y);}
-};
-
-template<class _IntType>
-template<class _URNG>
-typename uniform_int_distribution<_IntType>::result_type
-uniform_int_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p)
-_LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
-{
- typedef typename conditional<sizeof(result_type) <= sizeof(uint32_t),
- uint32_t, uint64_t>::type _UIntType;
- const _UIntType _Rp = _UIntType(__p.b()) - _UIntType(__p.a()) + _UIntType(1);
- if (_Rp == 1)
- return __p.a();
- const size_t _Dt = numeric_limits<_UIntType>::digits;
- typedef __independent_bits_engine<_URNG, _UIntType> _Eng;
- if (_Rp == 0)
- return static_cast<result_type>(_Eng(__g, _Dt)());
- size_t __w = _Dt - __clz(_Rp) - 1;
- if ((_Rp & (std::numeric_limits<_UIntType>::max() >> (_Dt - __w))) != 0)
- ++__w;
- _Eng __e(__g, __w);
- _UIntType __u;
- do
- {
- __u = __e();
- } while (__u >= _Rp);
- return static_cast<result_type>(__u + __p.a());
-}
-
-#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE) \
- || defined(_LIBCPP_BUILDING_LIBRARY)
-class _LIBCPP_TYPE_VIS __rs_default;
-
-_LIBCPP_FUNC_VIS __rs_default __rs_get();
-
-class _LIBCPP_TYPE_VIS __rs_default
-{
- static unsigned __c_;
-
- __rs_default();
-public:
- typedef uint_fast32_t result_type;
-
- static const result_type _Min = 0;
- static const result_type _Max = 0xFFFFFFFF;
-
- __rs_default(const __rs_default&);
- ~__rs_default();
-
- result_type operator()();
-
- static _LIBCPP_CONSTEXPR result_type min() {return _Min;}
- static _LIBCPP_CONSTEXPR result_type max() {return _Max;}
-
- friend _LIBCPP_FUNC_VIS __rs_default __rs_get();
-};
-
-_LIBCPP_FUNC_VIS __rs_default __rs_get();
-
-template <class _RandomAccessIterator>
-_LIBCPP_DEPRECATED_IN_CXX14 void
-random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
-{
- typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
- typedef uniform_int_distribution<ptrdiff_t> _Dp;
- typedef typename _Dp::param_type _Pp;
- difference_type __d = __last - __first;
- if (__d > 1)
- {
- _Dp __uid;
- __rs_default __g = __rs_get();
- for (--__last, --__d; __first < __last; ++__first, --__d)
- {
- difference_type __i = __uid(__g, _Pp(0, __d));
- if (__i != difference_type(0))
- swap(*__first, *(__first + __i));
- }
- }
-}
-
-template <class _RandomAccessIterator, class _RandomNumberGenerator>
-_LIBCPP_DEPRECATED_IN_CXX14 void
-random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
-#ifndef _LIBCPP_CXX03_LANG
- _RandomNumberGenerator&& __rand)
-#else
- _RandomNumberGenerator& __rand)
-#endif
-{
- typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
- difference_type __d = __last - __first;
- if (__d > 1)
- {
- for (--__last; __first < __last; ++__first, --__d)
- {
- difference_type __i = __rand(__d);
- if (__i != difference_type(0))
- swap(*__first, *(__first + __i));
- }
- }
-}
-#endif
-
-template <class _PopulationIterator, class _SampleIterator, class _Distance,
- class _UniformRandomNumberGenerator>
-_LIBCPP_INLINE_VISIBILITY
-_SampleIterator __sample(_PopulationIterator __first,
- _PopulationIterator __last, _SampleIterator __output_iter,
- _Distance __n,
- _UniformRandomNumberGenerator & __g,
- input_iterator_tag) {
-
- _Distance __k = 0;
- for (; __first != __last && __k < __n; ++__first, (void)++__k)
- __output_iter[__k] = *__first;
- _Distance __sz = __k;
- for (; __first != __last; ++__first, (void)++__k) {
- _Distance __r = _VSTD::uniform_int_distribution<_Distance>(0, __k)(__g);
- if (__r < __sz)
- __output_iter[__r] = *__first;
- }
- return __output_iter + _VSTD::min(__n, __k);
-}
-
-template <class _PopulationIterator, class _SampleIterator, class _Distance,
- class _UniformRandomNumberGenerator>
-_LIBCPP_INLINE_VISIBILITY
-_SampleIterator __sample(_PopulationIterator __first,
- _PopulationIterator __last, _SampleIterator __output_iter,
- _Distance __n,
- _UniformRandomNumberGenerator& __g,
- forward_iterator_tag) {
- _Distance __unsampled_sz = _VSTD::distance(__first, __last);
- for (__n = _VSTD::min(__n, __unsampled_sz); __n != 0; ++__first) {
- _Distance __r =
- _VSTD::uniform_int_distribution<_Distance>(0, --__unsampled_sz)(__g);
- if (__r < __n) {
- *__output_iter++ = *__first;
- --__n;
- }
- }
- return __output_iter;
-}
-
-template <class _PopulationIterator, class _SampleIterator, class _Distance,
- class _UniformRandomNumberGenerator>
-_LIBCPP_INLINE_VISIBILITY
-_SampleIterator __sample(_PopulationIterator __first,
- _PopulationIterator __last, _SampleIterator __output_iter,
- _Distance __n, _UniformRandomNumberGenerator& __g) {
- typedef typename iterator_traits<_PopulationIterator>::iterator_category
- _PopCategory;
- typedef typename iterator_traits<_PopulationIterator>::difference_type
- _Difference;
- static_assert(__is_forward_iterator<_PopulationIterator>::value ||
- __is_random_access_iterator<_SampleIterator>::value,
- "SampleIterator must meet the requirements of RandomAccessIterator");
- typedef typename common_type<_Distance, _Difference>::type _CommonType;
- _LIBCPP_ASSERT(__n >= 0, "N must be a positive number.");
- return _VSTD::__sample(
- __first, __last, __output_iter, _CommonType(__n),
- __g, _PopCategory());
-}
-
-#if _LIBCPP_STD_VER > 14
-template <class _PopulationIterator, class _SampleIterator, class _Distance,
- class _UniformRandomNumberGenerator>
-inline _LIBCPP_INLINE_VISIBILITY
-_SampleIterator sample(_PopulationIterator __first,
- _PopulationIterator __last, _SampleIterator __output_iter,
- _Distance __n, _UniformRandomNumberGenerator&& __g) {
- return _VSTD::__sample(__first, __last, __output_iter, __n, __g);
-}
-#endif // _LIBCPP_STD_VER > 14
-
-template<class _RandomAccessIterator, class _UniformRandomNumberGenerator>
- void shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
-#ifndef _LIBCPP_CXX03_LANG
- _UniformRandomNumberGenerator&& __g)
-#else
- _UniformRandomNumberGenerator& __g)
-#endif
-{
- typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
- typedef uniform_int_distribution<ptrdiff_t> _Dp;
- typedef typename _Dp::param_type _Pp;
- difference_type __d = __last - __first;
- if (__d > 1)
- {
- _Dp __uid;
- for (--__last, --__d; __first < __last; ++__first, --__d)
- {
- difference_type __i = __uid(__g, _Pp(0, __d));
- if (__i != difference_type(0))
- swap(*__first, *(__first + __i));
- }
- }
-}
-
-template <class _InputIterator, class _Predicate>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
-is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred)
-{
- for (; __first != __last; ++__first)
- if (!__pred(*__first))
- break;
- if ( __first == __last )
- return true;
- ++__first;
- for (; __first != __last; ++__first)
- if (__pred(*__first))
- return false;
- return true;
-}
-
-// partition
-
-template <class _Predicate, class _ForwardIterator>
-_ForwardIterator
-__partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
-{
- while (true)
- {
- if (__first == __last)
- return __first;
- if (!__pred(*__first))
- break;
- ++__first;
- }
- for (_ForwardIterator __p = __first; ++__p != __last;)
- {
- if (__pred(*__p))
- {
- swap(*__first, *__p);
- ++__first;
- }
- }
- return __first;
-}
-
-template <class _Predicate, class _BidirectionalIterator>
-_BidirectionalIterator
-__partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
- bidirectional_iterator_tag)
-{
- while (true)
- {
- while (true)
- {
- if (__first == __last)
- return __first;
- if (!__pred(*__first))
- break;
- ++__first;
- }
- do
- {
- if (__first == --__last)
- return __first;
- } while (!__pred(*__last));
- swap(*__first, *__last);
- ++__first;
- }
-}
-
-template <class _ForwardIterator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY
-_ForwardIterator
-partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
-{
- return _VSTD::__partition<typename add_lvalue_reference<_Predicate>::type>
- (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
-}
-
-// partition_copy
-
-template <class _InputIterator, class _OutputIterator1,
- class _OutputIterator2, class _Predicate>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 pair<_OutputIterator1, _OutputIterator2>
-partition_copy(_InputIterator __first, _InputIterator __last,
- _OutputIterator1 __out_true, _OutputIterator2 __out_false,
- _Predicate __pred)
-{
- for (; __first != __last; ++__first)
- {
- if (__pred(*__first))
- {
- *__out_true = *__first;
- ++__out_true;
- }
- else
- {
- *__out_false = *__first;
- ++__out_false;
- }
- }
- return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
-}
-
-// partition_point
-
-template<class _ForwardIterator, class _Predicate>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
-partition_point(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
-{
- typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
- difference_type __len = _VSTD::distance(__first, __last);
- while (__len != 0)
- {
- difference_type __l2 = _VSTD::__half_positive(__len);
- _ForwardIterator __m = __first;
- _VSTD::advance(__m, __l2);
- if (__pred(*__m))
- {
- __first = ++__m;
- __len -= __l2 + 1;
- }
- else
- __len = __l2;
- }
- return __first;
-}
-
-// stable_partition
-
-template <class _Predicate, class _ForwardIterator, class _Distance, class _Pair>
-_ForwardIterator
-__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
- _Distance __len, _Pair __p, forward_iterator_tag __fit)
-{
- // *__first is known to be false
- // __len >= 1
- if (__len == 1)
- return __first;
- if (__len == 2)
- {
- _ForwardIterator __m = __first;
- if (__pred(*++__m))
- {
- swap(*__first, *__m);
- return __m;
- }
- return __first;
- }
- if (__len <= __p.second)
- { // The buffer is big enough to use
- typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
- __destruct_n __d(0);
- unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
- // Move the falses into the temporary buffer, and the trues to the front of the line
- // Update __first to always point to the end of the trues
- value_type* __t = __p.first;
- ::new(__t) value_type(_VSTD::move(*__first));
- __d.__incr((value_type*)0);
- ++__t;
- _ForwardIterator __i = __first;
- while (++__i != __last)
- {
- if (__pred(*__i))
- {
- *__first = _VSTD::move(*__i);
- ++__first;
- }
- else
- {
- ::new(__t) value_type(_VSTD::move(*__i));
- __d.__incr((value_type*)0);
- ++__t;
- }
- }
- // All trues now at start of range, all falses in buffer
- // Move falses back into range, but don't mess up __first which points to first false
- __i = __first;
- for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
- *__i = _VSTD::move(*__t2);
- // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
- return __first;
- }
- // Else not enough buffer, do in place
- // __len >= 3
- _ForwardIterator __m = __first;
- _Distance __len2 = __len / 2; // __len2 >= 2
- _VSTD::advance(__m, __len2);
- // recurse on [__first, __m), *__first know to be false
- // F?????????????????
- // f m l
- typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
- _ForwardIterator __first_false = __stable_partition<_PredRef>(__first, __m, __pred, __len2, __p, __fit);
- // TTTFFFFF??????????
- // f ff m l
- // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
- _ForwardIterator __m1 = __m;
- _ForwardIterator __second_false = __last;
- _Distance __len_half = __len - __len2;
- while (__pred(*__m1))
- {
- if (++__m1 == __last)
- goto __second_half_done;
- --__len_half;
- }
- // TTTFFFFFTTTF??????
- // f ff m m1 l
- __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __fit);
-__second_half_done:
- // TTTFFFFFTTTTTFFFFF
- // f ff m sf l
- return _VSTD::rotate(__first_false, __m, __second_false);
- // TTTTTTTTFFFFFFFFFF
- // |
-}
-
-struct __return_temporary_buffer
-{
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) const {_VSTD::return_temporary_buffer(__p);}
-};
-
-template <class _Predicate, class _ForwardIterator>
-_ForwardIterator
-__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
- forward_iterator_tag)
-{
- const unsigned __alloc_limit = 3; // might want to make this a function of trivial assignment
- // Either prove all true and return __first or point to first false
- while (true)
- {
- if (__first == __last)
- return __first;
- if (!__pred(*__first))
- break;
- ++__first;
- }
- // We now have a reduced range [__first, __last)
- // *__first is known to be false
- typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
- typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
- difference_type __len = _VSTD::distance(__first, __last);
- pair<value_type*, ptrdiff_t> __p(0, 0);
- unique_ptr<value_type, __return_temporary_buffer> __h;
- if (__len >= __alloc_limit)
- {
- __p = _VSTD::get_temporary_buffer<value_type>(__len);
- __h.reset(__p.first);
- }
- return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
- (__first, __last, __pred, __len, __p, forward_iterator_tag());
-}
-
-template <class _Predicate, class _BidirectionalIterator, class _Distance, class _Pair>
-_BidirectionalIterator
-__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
- _Distance __len, _Pair __p, bidirectional_iterator_tag __bit)
-{
- // *__first is known to be false
- // *__last is known to be true
- // __len >= 2
- if (__len == 2)
- {
- swap(*__first, *__last);
- return __last;
- }
- if (__len == 3)
- {
- _BidirectionalIterator __m = __first;
- if (__pred(*++__m))
- {
- swap(*__first, *__m);
- swap(*__m, *__last);
- return __last;
- }
- swap(*__m, *__last);
- swap(*__first, *__m);
- return __m;
- }
- if (__len <= __p.second)
- { // The buffer is big enough to use
- typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
- __destruct_n __d(0);
- unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
- // Move the falses into the temporary buffer, and the trues to the front of the line
- // Update __first to always point to the end of the trues
- value_type* __t = __p.first;
- ::new(__t) value_type(_VSTD::move(*__first));
- __d.__incr((value_type*)0);
- ++__t;
- _BidirectionalIterator __i = __first;
- while (++__i != __last)
- {
- if (__pred(*__i))
- {
- *__first = _VSTD::move(*__i);
- ++__first;
- }
- else
- {
- ::new(__t) value_type(_VSTD::move(*__i));
- __d.__incr((value_type*)0);
- ++__t;
- }
- }
- // move *__last, known to be true
- *__first = _VSTD::move(*__i);
- __i = ++__first;
- // All trues now at start of range, all falses in buffer
- // Move falses back into range, but don't mess up __first which points to first false
- for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
- *__i = _VSTD::move(*__t2);
- // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
- return __first;
- }
- // Else not enough buffer, do in place
- // __len >= 4
- _BidirectionalIterator __m = __first;
- _Distance __len2 = __len / 2; // __len2 >= 2
- _VSTD::advance(__m, __len2);
- // recurse on [__first, __m-1], except reduce __m-1 until *(__m-1) is true, *__first know to be false
- // F????????????????T
- // f m l
- _BidirectionalIterator __m1 = __m;
- _BidirectionalIterator __first_false = __first;
- _Distance __len_half = __len2;
- while (!__pred(*--__m1))
- {
- if (__m1 == __first)
- goto __first_half_done;
- --__len_half;
- }
- // F???TFFF?????????T
- // f m1 m l
- typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
- __first_false = __stable_partition<_PredRef>(__first, __m1, __pred, __len_half, __p, __bit);
-__first_half_done:
- // TTTFFFFF?????????T
- // f ff m l
- // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
- __m1 = __m;
- _BidirectionalIterator __second_false = __last;
- ++__second_false;
- __len_half = __len - __len2;
- while (__pred(*__m1))
- {
- if (++__m1 == __last)
- goto __second_half_done;
- --__len_half;
- }
- // TTTFFFFFTTTF?????T
- // f ff m m1 l
- __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __bit);
-__second_half_done:
- // TTTFFFFFTTTTTFFFFF
- // f ff m sf l
- return _VSTD::rotate(__first_false, __m, __second_false);
- // TTTTTTTTFFFFFFFFFF
- // |
-}
-
-template <class _Predicate, class _BidirectionalIterator>
-_BidirectionalIterator
-__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
- bidirectional_iterator_tag)
-{
- typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
- typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
- const difference_type __alloc_limit = 4; // might want to make this a function of trivial assignment
- // Either prove all true and return __first or point to first false
- while (true)
- {
- if (__first == __last)
- return __first;
- if (!__pred(*__first))
- break;
- ++__first;
- }
- // __first points to first false, everything prior to __first is already set.
- // Either prove [__first, __last) is all false and return __first, or point __last to last true
- do
- {
- if (__first == --__last)
- return __first;
- } while (!__pred(*__last));
- // We now have a reduced range [__first, __last]
- // *__first is known to be false
- // *__last is known to be true
- // __len >= 2
- difference_type __len = _VSTD::distance(__first, __last) + 1;
- pair<value_type*, ptrdiff_t> __p(0, 0);
- unique_ptr<value_type, __return_temporary_buffer> __h;
- if (__len >= __alloc_limit)
- {
- __p = _VSTD::get_temporary_buffer<value_type>(__len);
- __h.reset(__p.first);
- }
- return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
- (__first, __last, __pred, __len, __p, bidirectional_iterator_tag());
-}
-
-template <class _ForwardIterator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY
-_ForwardIterator
-stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
-{
- return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
- (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
-}
-
-// is_sorted_until
-
-template <class _ForwardIterator, class _Compare>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
-is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
-{
- if (__first != __last)
- {
- _ForwardIterator __i = __first;
- while (++__i != __last)
- {
- if (__comp(*__i, *__first))
- return __i;
- __first = __i;
- }
- }
- return __last;
-}
-
-template<class _ForwardIterator>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_ForwardIterator
-is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
-{
- return _VSTD::is_sorted_until(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
-}
-
-// is_sorted
-
-template <class _ForwardIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-is_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
-{
- return _VSTD::is_sorted_until(__first, __last, __comp) == __last;
-}
-
-template<class _ForwardIterator>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-is_sorted(_ForwardIterator __first, _ForwardIterator __last)
-{
- return _VSTD::is_sorted(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
-}
-
-// sort
-
-// stable, 2-3 compares, 0-2 swaps
-
-template <class _Compare, class _ForwardIterator>
-unsigned
-__sort3(_ForwardIterator __x, _ForwardIterator __y, _ForwardIterator __z, _Compare __c)
-{
- unsigned __r = 0;
- if (!__c(*__y, *__x)) // if x <= y
- {
- if (!__c(*__z, *__y)) // if y <= z
- return __r; // x <= y && y <= z
- // x <= y && y > z
- swap(*__y, *__z); // x <= z && y < z
- __r = 1;
- if (__c(*__y, *__x)) // if x > y
- {
- swap(*__x, *__y); // x < y && y <= z
- __r = 2;
- }
- return __r; // x <= y && y < z
- }
- if (__c(*__z, *__y)) // x > y, if y > z
- {
- swap(*__x, *__z); // x < y && y < z
- __r = 1;
- return __r;
- }
- swap(*__x, *__y); // x > y && y <= z
- __r = 1; // x < y && x <= z
- if (__c(*__z, *__y)) // if y > z
- {
- swap(*__y, *__z); // x <= y && y < z
- __r = 2;
- }
- return __r;
-} // x <= y && y <= z
-
-// stable, 3-6 compares, 0-5 swaps
-
-template <class _Compare, class _ForwardIterator>
-unsigned
-__sort4(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
- _ForwardIterator __x4, _Compare __c)
-{
- unsigned __r = __sort3<_Compare>(__x1, __x2, __x3, __c);
- if (__c(*__x4, *__x3))
- {
- swap(*__x3, *__x4);
- ++__r;
- if (__c(*__x3, *__x2))
- {
- swap(*__x2, *__x3);
- ++__r;
- if (__c(*__x2, *__x1))
- {
- swap(*__x1, *__x2);
- ++__r;
- }
- }
- }
- return __r;
-}
-
-// stable, 4-10 compares, 0-9 swaps
-
-template <class _Compare, class _ForwardIterator>
-_LIBCPP_HIDDEN
-unsigned
-__sort5(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
- _ForwardIterator __x4, _ForwardIterator __x5, _Compare __c)
-{
- unsigned __r = __sort4<_Compare>(__x1, __x2, __x3, __x4, __c);
- if (__c(*__x5, *__x4))
- {
- swap(*__x4, *__x5);
- ++__r;
- if (__c(*__x4, *__x3))
- {
- swap(*__x3, *__x4);
- ++__r;
- if (__c(*__x3, *__x2))
- {
- swap(*__x2, *__x3);
- ++__r;
- if (__c(*__x2, *__x1))
- {
- swap(*__x1, *__x2);
- ++__r;
- }
- }
- }
- }
- return __r;
-}
-
-// Assumes size > 0
-template <class _Compare, class _BirdirectionalIterator>
-void
-__selection_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
-{
- _BirdirectionalIterator __lm1 = __last;
- for (--__lm1; __first != __lm1; ++__first)
- {
- _BirdirectionalIterator __i = _VSTD::min_element<_BirdirectionalIterator,
- typename add_lvalue_reference<_Compare>::type>
- (__first, __last, __comp);
- if (__i != __first)
- swap(*__first, *__i);
- }
-}
-
-template <class _Compare, class _BirdirectionalIterator>
-void
-__insertion_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
-{
- typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
- if (__first != __last)
- {
- _BirdirectionalIterator __i = __first;
- for (++__i; __i != __last; ++__i)
- {
- _BirdirectionalIterator __j = __i;
- value_type __t(_VSTD::move(*__j));
- for (_BirdirectionalIterator __k = __i; __k != __first && __comp(__t, *--__k); --__j)
- *__j = _VSTD::move(*__k);
- *__j = _VSTD::move(__t);
- }
- }
-}
-
-template <class _Compare, class _RandomAccessIterator>
-void
-__insertion_sort_3(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
-{
- typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
- _RandomAccessIterator __j = __first+2;
- __sort3<_Compare>(__first, __first+1, __j, __comp);
- for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
- {
- if (__comp(*__i, *__j))
- {
- value_type __t(_VSTD::move(*__i));
- _RandomAccessIterator __k = __j;
- __j = __i;
- do
- {
- *__j = _VSTD::move(*__k);
- __j = __k;
- } while (__j != __first && __comp(__t, *--__k));
- *__j = _VSTD::move(__t);
- }
- __j = __i;
- }
-}
-
-template <class _Compare, class _RandomAccessIterator>
-bool
-__insertion_sort_incomplete(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
-{
- switch (__last - __first)
- {
- case 0:
- case 1:
- return true;
- case 2:
- if (__comp(*--__last, *__first))
- swap(*__first, *__last);
- return true;
- case 3:
- _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
- return true;
- case 4:
- _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
- return true;
- case 5:
- _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
- return true;
- }
- typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
- _RandomAccessIterator __j = __first+2;
- __sort3<_Compare>(__first, __first+1, __j, __comp);
- const unsigned __limit = 8;
- unsigned __count = 0;
- for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
- {
- if (__comp(*__i, *__j))
- {
- value_type __t(_VSTD::move(*__i));
- _RandomAccessIterator __k = __j;
- __j = __i;
- do
- {
- *__j = _VSTD::move(*__k);
- __j = __k;
- } while (__j != __first && __comp(__t, *--__k));
- *__j = _VSTD::move(__t);
- if (++__count == __limit)
- return ++__i == __last;
- }
- __j = __i;
- }
- return true;
-}
-
-template <class _Compare, class _BirdirectionalIterator>
-void
-__insertion_sort_move(_BirdirectionalIterator __first1, _BirdirectionalIterator __last1,
- typename iterator_traits<_BirdirectionalIterator>::value_type* __first2, _Compare __comp)
-{
- typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
- if (__first1 != __last1)
- {
- __destruct_n __d(0);
- unique_ptr<value_type, __destruct_n&> __h(__first2, __d);
- value_type* __last2 = __first2;
- ::new(__last2) value_type(_VSTD::move(*__first1));
- __d.__incr((value_type*)0);
- for (++__last2; ++__first1 != __last1; ++__last2)
- {
- value_type* __j2 = __last2;
- value_type* __i2 = __j2;
- if (__comp(*__first1, *--__i2))
- {
- ::new(__j2) value_type(_VSTD::move(*__i2));
- __d.__incr((value_type*)0);
- for (--__j2; __i2 != __first2 && __comp(*__first1, *--__i2); --__j2)
- *__j2 = _VSTD::move(*__i2);
- *__j2 = _VSTD::move(*__first1);
- }
- else
- {
- ::new(__j2) value_type(_VSTD::move(*__first1));
- __d.__incr((value_type*)0);
- }
- }
- __h.release();
- }
-}
-
-template <class _Compare, class _RandomAccessIterator>
-void
-__sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
-{
- // _Compare is known to be a reference type
- typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
- typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
- const difference_type __limit = is_trivially_copy_constructible<value_type>::value &&
- is_trivially_copy_assignable<value_type>::value ? 30 : 6;
- while (true)
- {
- __restart:
- difference_type __len = __last - __first;
- switch (__len)
- {
- case 0:
- case 1:
- return;
- case 2:
- if (__comp(*--__last, *__first))
- swap(*__first, *__last);
- return;
- case 3:
- _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
- return;
- case 4:
- _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
- return;
- case 5:
- _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
- return;
- }
- if (__len <= __limit)
- {
- _VSTD::__insertion_sort_3<_Compare>(__first, __last, __comp);
- return;
- }
- // __len > 5
- _RandomAccessIterator __m = __first;
- _RandomAccessIterator __lm1 = __last;
- --__lm1;
- unsigned __n_swaps;
- {
- difference_type __delta;
- if (__len >= 1000)
- {
- __delta = __len/2;
- __m += __delta;
- __delta /= 2;
- __n_swaps = _VSTD::__sort5<_Compare>(__first, __first + __delta, __m, __m+__delta, __lm1, __comp);
- }
- else
- {
- __delta = __len/2;
- __m += __delta;
- __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, __lm1, __comp);
- }
- }
- // *__m is median
- // partition [__first, __m) < *__m and *__m <= [__m, __last)
- // (this inhibits tossing elements equivalent to __m around unnecessarily)
- _RandomAccessIterator __i = __first;
- _RandomAccessIterator __j = __lm1;
- // j points beyond range to be tested, *__m is known to be <= *__lm1
- // The search going up is known to be guarded but the search coming down isn't.
- // Prime the downward search with a guard.
- if (!__comp(*__i, *__m)) // if *__first == *__m
- {
- // *__first == *__m, *__first doesn't go in first part
- // manually guard downward moving __j against __i
- while (true)
- {
- if (__i == --__j)
- {
- // *__first == *__m, *__m <= all other elements
- // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
- ++__i; // __first + 1
- __j = __last;
- if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
- {
- while (true)
- {
- if (__i == __j)
- return; // [__first, __last) all equivalent elements
- if (__comp(*__first, *__i))
- {
- swap(*__i, *__j);
- ++__n_swaps;
- ++__i;
- break;
- }
- ++__i;
- }
- }
- // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
- if (__i == __j)
- return;
- while (true)
- {
- while (!__comp(*__first, *__i))
- ++__i;
- while (__comp(*__first, *--__j))
- ;
- if (__i >= __j)
- break;
- swap(*__i, *__j);
- ++__n_swaps;
- ++__i;
- }
- // [__first, __i) == *__first and *__first < [__i, __last)
- // The first part is sorted, sort the secod part
- // _VSTD::__sort<_Compare>(__i, __last, __comp);
- __first = __i;
- goto __restart;
- }
- if (__comp(*__j, *__m))
- {
- swap(*__i, *__j);
- ++__n_swaps;
- break; // found guard for downward moving __j, now use unguarded partition
- }
- }
- }
- // It is known that *__i < *__m
- ++__i;
- // j points beyond range to be tested, *__m is known to be <= *__lm1
- // if not yet partitioned...
- if (__i < __j)
- {
- // known that *(__i - 1) < *__m
- // known that __i <= __m
- while (true)
- {
- // __m still guards upward moving __i
- while (__comp(*__i, *__m))
- ++__i;
- // It is now known that a guard exists for downward moving __j
- while (!__comp(*--__j, *__m))
- ;
- if (__i > __j)
- break;
- swap(*__i, *__j);
- ++__n_swaps;
- // It is known that __m != __j
- // If __m just moved, follow it
- if (__m == __i)
- __m = __j;
- ++__i;
- }
- }
- // [__first, __i) < *__m and *__m <= [__i, __last)
- if (__i != __m && __comp(*__m, *__i))
- {
- swap(*__i, *__m);
- ++__n_swaps;
- }
- // [__first, __i) < *__i and *__i <= [__i+1, __last)
- // If we were given a perfect partition, see if insertion sort is quick...
- if (__n_swaps == 0)
- {
- bool __fs = _VSTD::__insertion_sort_incomplete<_Compare>(__first, __i, __comp);
- if (_VSTD::__insertion_sort_incomplete<_Compare>(__i+1, __last, __comp))
- {
- if (__fs)
- return;
- __last = __i;
- continue;
- }
- else
- {
- if (__fs)
- {
- __first = ++__i;
- continue;
- }
- }
- }
- // sort smaller range with recursive call and larger with tail recursion elimination
- if (__i - __first < __last - __i)
- {
- _VSTD::__sort<_Compare>(__first, __i, __comp);
- // _VSTD::__sort<_Compare>(__i+1, __last, __comp);
- __first = ++__i;
- }
- else
- {
- _VSTD::__sort<_Compare>(__i+1, __last, __comp);
- // _VSTD::__sort<_Compare>(__first, __i, __comp);
- __last = __i;
- }
- }
-}
-
-// This forwarder keeps the top call and the recursive calls using the same instantiation, forcing a reference _Compare
-template <class _RandomAccessIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- __sort<_Comp_ref>(__first, __last, __c);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- __sort<_Comp_ref>(__first, __last, __comp);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _RandomAccessIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
-{
- _VSTD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-sort(_Tp** __first, _Tp** __last)
-{
- _VSTD::sort((size_t*)__first, (size_t*)__last, __less<size_t>());
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last)
-{
- _VSTD::sort(__first.base(), __last.base());
-}
-
-template <class _Tp, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last, _Compare __comp)
-{
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- _VSTD::sort<_Tp*, _Comp_ref>(__first.base(), __last.base(), __comp);
-}
-
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<char>&, char*>(char*, char*, __less<char>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<short>&, short*>(short*, short*, __less<short>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<int>&, int*>(int*, int*, __less<int>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long>&, long*>(long*, long*, __less<long>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<float>&, float*>(float*, float*, __less<float>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<double>&, double*>(double*, double*, __less<double>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&))
-
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long double>&, long double*>(long double*, long double*, __less<long double>&))
-
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS unsigned __sort5<__less<long double>&, long double*>(long double*, long double*, long double*, long double*, long double*, __less<long double>&))
-
-// lower_bound
-
-template <class _Compare, class _ForwardIterator, class _Tp>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
-__lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
-{
- typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
- difference_type __len = _VSTD::distance(__first, __last);
- while (__len != 0)
- {
- difference_type __l2 = _VSTD::__half_positive(__len);
- _ForwardIterator __m = __first;
- _VSTD::advance(__m, __l2);
- if (__comp(*__m, __value_))
- {
- __first = ++__m;
- __len -= __l2 + 1;
- }
- else
- __len = __l2;
- }
- return __first;
-}
-
-template <class _ForwardIterator, class _Tp, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_ForwardIterator
-lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
-{
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- return __lower_bound<_Comp_ref>(__first, __last, __value_, __comp);
-}
-
-template <class _ForwardIterator, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_ForwardIterator
-lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
-{
- return _VSTD::lower_bound(__first, __last, __value_,
- __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
-}
-
-// upper_bound
-
-template <class _Compare, class _ForwardIterator, class _Tp>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
-__upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
-{
- typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
- difference_type __len = _VSTD::distance(__first, __last);
- while (__len != 0)
- {
- difference_type __l2 = _VSTD::__half_positive(__len);
- _ForwardIterator __m = __first;
- _VSTD::advance(__m, __l2);
- if (__comp(__value_, *__m))
- __len = __l2;
- else
- {
- __first = ++__m;
- __len -= __l2 + 1;
- }
- }
- return __first;
-}
-
-template <class _ForwardIterator, class _Tp, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_ForwardIterator
-upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
-{
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- return __upper_bound<_Comp_ref>(__first, __last, __value_, __comp);
-}
-
-template <class _ForwardIterator, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_ForwardIterator
-upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
-{
- return _VSTD::upper_bound(__first, __last, __value_,
- __less<_Tp, typename iterator_traits<_ForwardIterator>::value_type>());
-}
-
-// equal_range
-
-template <class _Compare, class _ForwardIterator, class _Tp>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 pair<_ForwardIterator, _ForwardIterator>
-__equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
-{
- typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
- difference_type __len = _VSTD::distance(__first, __last);
- while (__len != 0)
- {
- difference_type __l2 = _VSTD::__half_positive(__len);
- _ForwardIterator __m = __first;
- _VSTD::advance(__m, __l2);
- if (__comp(*__m, __value_))
- {
- __first = ++__m;
- __len -= __l2 + 1;
- }
- else if (__comp(__value_, *__m))
- {
- __last = __m;
- __len = __l2;
- }
- else
- {
- _ForwardIterator __mp1 = __m;
- return pair<_ForwardIterator, _ForwardIterator>
- (
- __lower_bound<_Compare>(__first, __m, __value_, __comp),
- __upper_bound<_Compare>(++__mp1, __last, __value_, __comp)
- );
- }
- }
- return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
-}
-
-template <class _ForwardIterator, class _Tp, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-pair<_ForwardIterator, _ForwardIterator>
-equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- return __equal_range<_Comp_ref>(__first, __last, __value_, __c);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- return __equal_range<_Comp_ref>(__first, __last, __value_, __comp);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _ForwardIterator, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-pair<_ForwardIterator, _ForwardIterator>
-equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
-{
- return _VSTD::equal_range(__first, __last, __value_,
- __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
-}
-
-// binary_search
-
-template <class _Compare, class _ForwardIterator, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-__binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
-{
- __first = __lower_bound<_Compare>(__first, __last, __value_, __comp);
- return __first != __last && !__comp(__value_, *__first);
-}
-
-template <class _ForwardIterator, class _Tp, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- return __binary_search<_Comp_ref>(__first, __last, __value_, __c);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- return __binary_search<_Comp_ref>(__first, __last, __value_, __comp);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _ForwardIterator, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
-{
- return _VSTD::binary_search(__first, __last, __value_,
- __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
-}
-
-// merge
-
-template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
-_OutputIterator
-__merge(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
-{
- for (; __first1 != __last1; ++__result)
- {
- if (__first2 == __last2)
- return _VSTD::copy(__first1, __last1, __result);
- if (__comp(*__first2, *__first1))
- {
- *__result = *__first2;
- ++__first2;
- }
- else
- {
- *__result = *__first1;
- ++__first1;
- }
- }
- return _VSTD::copy(__first2, __last2, __result);
-}
-
-template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-merge(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-merge(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
-{
- typedef typename iterator_traits<_InputIterator1>::value_type __v1;
- typedef typename iterator_traits<_InputIterator2>::value_type __v2;
- return merge(__first1, __last1, __first2, __last2, __result, __less<__v1, __v2>());
-}
-
-// inplace_merge
-
-template <class _Compare, class _InputIterator1, class _InputIterator2,
- class _OutputIterator>
-void __half_inplace_merge(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2,
- _OutputIterator __result, _Compare __comp)
-{
- for (; __first1 != __last1; ++__result)
- {
- if (__first2 == __last2)
- {
- _VSTD::move(__first1, __last1, __result);
- return;
- }
-
- if (__comp(*__first2, *__first1))
- {
- *__result = _VSTD::move(*__first2);
- ++__first2;
- }
- else
- {
- *__result = _VSTD::move(*__first1);
- ++__first1;
- }
- }
- // __first2 through __last2 are already in the right spot.
-}
-
-template <class _Compare, class _BidirectionalIterator>
-void
-__buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
- _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
- typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
- typename iterator_traits<_BidirectionalIterator>::value_type* __buff)
-{
- typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
- __destruct_n __d(0);
- unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
- if (__len1 <= __len2)
- {
- value_type* __p = __buff;
- for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), (void) ++__i, ++__p)
- ::new(__p) value_type(_VSTD::move(*__i));
- __half_inplace_merge(__buff, __p, __middle, __last, __first, __comp);
- }
- else
- {
- value_type* __p = __buff;
- for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), (void) ++__i, ++__p)
- ::new(__p) value_type(_VSTD::move(*__i));
- typedef reverse_iterator<_BidirectionalIterator> _RBi;
- typedef reverse_iterator<value_type*> _Rv;
- __half_inplace_merge(_Rv(__p), _Rv(__buff),
- _RBi(__middle), _RBi(__first),
- _RBi(__last), __invert<_Compare>(__comp));
- }
-}
-
-template <class _Compare, class _BidirectionalIterator>
-void
-__inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
- _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
- typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
- typename iterator_traits<_BidirectionalIterator>::value_type* __buff, ptrdiff_t __buff_size)
-{
- typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
- while (true)
- {
- // if __middle == __last, we're done
- if (__len2 == 0)
- return;
- if (__len1 <= __buff_size || __len2 <= __buff_size)
- return __buffered_inplace_merge<_Compare>
- (__first, __middle, __last, __comp, __len1, __len2, __buff);
- // shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0
- for (; true; ++__first, (void) --__len1)
- {
- if (__len1 == 0)
- return;
- if (__comp(*__middle, *__first))
- break;
- }
- // __first < __middle < __last
- // *__first > *__middle
- // partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) such that
- // all elements in:
- // [__first, __m1) <= [__middle, __m2)
- // [__middle, __m2) < [__m1, __middle)
- // [__m1, __middle) <= [__m2, __last)
- // and __m1 or __m2 is in the middle of its range
- _BidirectionalIterator __m1; // "median" of [__first, __middle)
- _BidirectionalIterator __m2; // "median" of [__middle, __last)
- difference_type __len11; // distance(__first, __m1)
- difference_type __len21; // distance(__middle, __m2)
- // binary search smaller range
- if (__len1 < __len2)
- { // __len >= 1, __len2 >= 2
- __len21 = __len2 / 2;
- __m2 = __middle;
- _VSTD::advance(__m2, __len21);
- __m1 = __upper_bound<_Compare>(__first, __middle, *__m2, __comp);
- __len11 = _VSTD::distance(__first, __m1);
- }
- else
- {
- if (__len1 == 1)
- { // __len1 >= __len2 && __len2 > 0, therefore __len2 == 1
- // It is known *__first > *__middle
- swap(*__first, *__middle);
- return;
- }
- // __len1 >= 2, __len2 >= 1
- __len11 = __len1 / 2;
- __m1 = __first;
- _VSTD::advance(__m1, __len11);
- __m2 = __lower_bound<_Compare>(__middle, __last, *__m1, __comp);
- __len21 = _VSTD::distance(__middle, __m2);
- }
- difference_type __len12 = __len1 - __len11; // distance(__m1, __middle)
- difference_type __len22 = __len2 - __len21; // distance(__m2, __last)
- // [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last)
- // swap middle two partitions
- __middle = _VSTD::rotate(__m1, __middle, __m2);
- // __len12 and __len21 now have swapped meanings
- // merge smaller range with recurisve call and larger with tail recursion elimination
- if (__len11 + __len21 < __len12 + __len22)
- {
- __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
-// __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
- __first = __middle;
- __middle = __m2;
- __len1 = __len12;
- __len2 = __len22;
- }
- else
- {
- __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
-// __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
- __last = __middle;
- __middle = __m1;
- __len1 = __len11;
- __len2 = __len21;
- }
- }
-}
-
-template <class _BidirectionalIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
- _Compare __comp)
-{
- typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
- typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
- difference_type __len1 = _VSTD::distance(__first, __middle);
- difference_type __len2 = _VSTD::distance(__middle, __last);
- difference_type __buf_size = _VSTD::min(__len1, __len2);
- pair<value_type*, ptrdiff_t> __buf = _VSTD::get_temporary_buffer<value_type>(__buf_size);
- unique_ptr<value_type, __return_temporary_buffer> __h(__buf.first);
-
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __c, __len1, __len2,
- __buf.first, __buf.second);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __comp, __len1, __len2,
- __buf.first, __buf.second);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _BidirectionalIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last)
-{
- _VSTD::inplace_merge(__first, __middle, __last,
- __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
-}
-
-// stable_sort
-
-template <class _Compare, class _InputIterator1, class _InputIterator2>
-void
-__merge_move_construct(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2,
- typename iterator_traits<_InputIterator1>::value_type* __result, _Compare __comp)
-{
- typedef typename iterator_traits<_InputIterator1>::value_type value_type;
- __destruct_n __d(0);
- unique_ptr<value_type, __destruct_n&> __h(__result, __d);
- for (; true; ++__result)
- {
- if (__first1 == __last1)
- {
- for (; __first2 != __last2; ++__first2, ++__result, __d.__incr((value_type*)0))
- ::new (__result) value_type(_VSTD::move(*__first2));
- __h.release();
- return;
- }
- if (__first2 == __last2)
- {
- for (; __first1 != __last1; ++__first1, ++__result, __d.__incr((value_type*)0))
- ::new (__result) value_type(_VSTD::move(*__first1));
- __h.release();
- return;
- }
- if (__comp(*__first2, *__first1))
- {
- ::new (__result) value_type(_VSTD::move(*__first2));
- __d.__incr((value_type*)0);
- ++__first2;
- }
- else
- {
- ::new (__result) value_type(_VSTD::move(*__first1));
- __d.__incr((value_type*)0);
- ++__first1;
- }
- }
-}
-
-template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
-void
-__merge_move_assign(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2,
- _OutputIterator __result, _Compare __comp)
-{
- for (; __first1 != __last1; ++__result)
- {
- if (__first2 == __last2)
- {
- for (; __first1 != __last1; ++__first1, ++__result)
- *__result = _VSTD::move(*__first1);
- return;
- }
- if (__comp(*__first2, *__first1))
- {
- *__result = _VSTD::move(*__first2);
- ++__first2;
- }
- else
- {
- *__result = _VSTD::move(*__first1);
- ++__first1;
- }
- }
- for (; __first2 != __last2; ++__first2, ++__result)
- *__result = _VSTD::move(*__first2);
-}
-
-template <class _Compare, class _RandomAccessIterator>
-void
-__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
- typename iterator_traits<_RandomAccessIterator>::difference_type __len,
- typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size);
-
-template <class _Compare, class _RandomAccessIterator>
-void
-__stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1, _Compare __comp,
- typename iterator_traits<_RandomAccessIterator>::difference_type __len,
- typename iterator_traits<_RandomAccessIterator>::value_type* __first2)
-{
- typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
- switch (__len)
- {
- case 0:
- return;
- case 1:
- ::new(__first2) value_type(_VSTD::move(*__first1));
- return;
- case 2:
- __destruct_n __d(0);
- unique_ptr<value_type, __destruct_n&> __h2(__first2, __d);
- if (__comp(*--__last1, *__first1))
- {
- ::new(__first2) value_type(_VSTD::move(*__last1));
- __d.__incr((value_type*)0);
- ++__first2;
- ::new(__first2) value_type(_VSTD::move(*__first1));
- }
- else
- {
- ::new(__first2) value_type(_VSTD::move(*__first1));
- __d.__incr((value_type*)0);
- ++__first2;
- ::new(__first2) value_type(_VSTD::move(*__last1));
- }
- __h2.release();
- return;
- }
- if (__len <= 8)
- {
- __insertion_sort_move<_Compare>(__first1, __last1, __first2, __comp);
- return;
- }
- typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
- _RandomAccessIterator __m = __first1 + __l2;
- __stable_sort<_Compare>(__first1, __m, __comp, __l2, __first2, __l2);
- __stable_sort<_Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2);
- __merge_move_construct<_Compare>(__first1, __m, __m, __last1, __first2, __comp);
-}
-
-template <class _Tp>
-struct __stable_sort_switch
-{
- static const unsigned value = 128*is_trivially_copy_assignable<_Tp>::value;
-};
-
-template <class _Compare, class _RandomAccessIterator>
-void
-__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
- typename iterator_traits<_RandomAccessIterator>::difference_type __len,
- typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size)
-{
- typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
- typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
- switch (__len)
- {
- case 0:
- case 1:
- return;
- case 2:
- if (__comp(*--__last, *__first))
- swap(*__first, *__last);
- return;
- }
- if (__len <= static_cast<difference_type>(__stable_sort_switch<value_type>::value))
- {
- __insertion_sort<_Compare>(__first, __last, __comp);
- return;
- }
- typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
- _RandomAccessIterator __m = __first + __l2;
- if (__len <= __buff_size)
- {
- __destruct_n __d(0);
- unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
- __stable_sort_move<_Compare>(__first, __m, __comp, __l2, __buff);
- __d.__set(__l2, (value_type*)0);
- __stable_sort_move<_Compare>(__m, __last, __comp, __len - __l2, __buff + __l2);
- __d.__set(__len, (value_type*)0);
- __merge_move_assign<_Compare>(__buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp);
-// __merge<_Compare>(move_iterator<value_type*>(__buff),
-// move_iterator<value_type*>(__buff + __l2),
-// move_iterator<_RandomAccessIterator>(__buff + __l2),
-// move_iterator<_RandomAccessIterator>(__buff + __len),
-// __first, __comp);
- return;
- }
- __stable_sort<_Compare>(__first, __m, __comp, __l2, __buff, __buff_size);
- __stable_sort<_Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size);
- __inplace_merge<_Compare>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size);
-}
-
-template <class _RandomAccessIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
-{
- typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
- typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
- difference_type __len = __last - __first;
- pair<value_type*, ptrdiff_t> __buf(0, 0);
- unique_ptr<value_type, __return_temporary_buffer> __h;
- if (__len > static_cast<difference_type>(__stable_sort_switch<value_type>::value))
- {
- __buf = _VSTD::get_temporary_buffer<value_type>(__len);
- __h.reset(__buf.first);
- }
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- __stable_sort<_Comp_ref>(__first, __last, __c, __len, __buf.first, __buf.second);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- __stable_sort<_Comp_ref>(__first, __last, __comp, __len, __buf.first, __buf.second);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _RandomAccessIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
-{
- _VSTD::stable_sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
-}
-
-// is_heap_until
-
-template <class _RandomAccessIterator, class _Compare>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 _RandomAccessIterator
-is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
-{
- typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::difference_type difference_type;
- difference_type __len = __last - __first;
- difference_type __p = 0;
- difference_type __c = 1;
- _RandomAccessIterator __pp = __first;
- while (__c < __len)
- {
- _RandomAccessIterator __cp = __first + __c;
- if (__comp(*__pp, *__cp))
- return __cp;
- ++__c;
- ++__cp;
- if (__c == __len)
- return __last;
- if (__comp(*__pp, *__cp))
- return __cp;
- ++__p;
- ++__pp;
- __c = 2 * __p + 1;
- }
- return __last;
-}
-
-template<class _RandomAccessIterator>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_RandomAccessIterator
-is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last)
-{
- return _VSTD::is_heap_until(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
-}
-
-// is_heap
-
-template <class _RandomAccessIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
-{
- return _VSTD::is_heap_until(__first, __last, __comp) == __last;
-}
-
-template<class _RandomAccessIterator>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
-{
- return _VSTD::is_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
-}
-
-// push_heap
-
-template <class _Compare, class _RandomAccessIterator>
-void
-__sift_up(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
- typename iterator_traits<_RandomAccessIterator>::difference_type __len)
-{
- typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
- if (__len > 1)
- {
- __len = (__len - 2) / 2;
- _RandomAccessIterator __ptr = __first + __len;
- if (__comp(*__ptr, *--__last))
- {
- value_type __t(_VSTD::move(*__last));
- do
- {
- *__last = _VSTD::move(*__ptr);
- __last = __ptr;
- if (__len == 0)
- break;
- __len = (__len - 1) / 2;
- __ptr = __first + __len;
- } while (__comp(*__ptr, __t));
- *__last = _VSTD::move(__t);
- }
- }
-}
-
-template <class _RandomAccessIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- __sift_up<_Comp_ref>(__first, __last, __c, __last - __first);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- __sift_up<_Comp_ref>(__first, __last, __comp, __last - __first);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _RandomAccessIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
-{
- _VSTD::push_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
-}
-
-// pop_heap
-
-template <class _Compare, class _RandomAccessIterator>
-void
-__sift_down(_RandomAccessIterator __first, _RandomAccessIterator /*__last*/,
- _Compare __comp,
- typename iterator_traits<_RandomAccessIterator>::difference_type __len,
- _RandomAccessIterator __start)
-{
- typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
- typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
- // left-child of __start is at 2 * __start + 1
- // right-child of __start is at 2 * __start + 2
- difference_type __child = __start - __first;
-
- if (__len < 2 || (__len - 2) / 2 < __child)
- return;
-
- __child = 2 * __child + 1;
- _RandomAccessIterator __child_i = __first + __child;
-
- if ((__child + 1) < __len && __comp(*__child_i, *(__child_i + 1))) {
- // right-child exists and is greater than left-child
- ++__child_i;
- ++__child;
- }
-
- // check if we are in heap-order
- if (__comp(*__child_i, *__start))
- // we are, __start is larger than it's largest child
- return;
-
- value_type __top(_VSTD::move(*__start));
- do
- {
- // we are not in heap-order, swap the parent with it's largest child
- *__start = _VSTD::move(*__child_i);
- __start = __child_i;
-
- if ((__len - 2) / 2 < __child)
- break;
-
- // recompute the child based off of the updated parent
- __child = 2 * __child + 1;
- __child_i = __first + __child;
-
- if ((__child + 1) < __len && __comp(*__child_i, *(__child_i + 1))) {
- // right-child exists and is greater than left-child
- ++__child_i;
- ++__child;
- }
-
- // check if we are in heap-order
- } while (!__comp(*__child_i, __top));
- *__start = _VSTD::move(__top);
-}
-
-template <class _Compare, class _RandomAccessIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
- typename iterator_traits<_RandomAccessIterator>::difference_type __len)
-{
- if (__len > 1)
- {
- swap(*__first, *--__last);
- __sift_down<_Compare>(__first, __last, __comp, __len - 1, __first);
- }
-}
-
-template <class _RandomAccessIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- __pop_heap<_Comp_ref>(__first, __last, __c, __last - __first);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- __pop_heap<_Comp_ref>(__first, __last, __comp, __last - __first);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _RandomAccessIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
-{
- _VSTD::pop_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
-}
-
-// make_heap
-
-template <class _Compare, class _RandomAccessIterator>
-void
-__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
-{
- typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
- difference_type __n = __last - __first;
- if (__n > 1)
- {
- // start from the first parent, there is no need to consider children
- for (difference_type __start = (__n - 2) / 2; __start >= 0; --__start)
- {
- __sift_down<_Compare>(__first, __last, __comp, __n, __first + __start);
- }
- }
-}
-
-template <class _RandomAccessIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- __make_heap<_Comp_ref>(__first, __last, __c);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- __make_heap<_Comp_ref>(__first, __last, __comp);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _RandomAccessIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
-{
- _VSTD::make_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
-}
-
-// sort_heap
-
-template <class _Compare, class _RandomAccessIterator>
-void
-__sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
-{
- typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
- for (difference_type __n = __last - __first; __n > 1; --__last, --__n)
- __pop_heap<_Compare>(__first, __last, __comp, __n);
-}
-
-template <class _RandomAccessIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- __sort_heap<_Comp_ref>(__first, __last, __c);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- __sort_heap<_Comp_ref>(__first, __last, __comp);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _RandomAccessIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
-{
- _VSTD::sort_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
-}
-
-// partial_sort
-
-template <class _Compare, class _RandomAccessIterator>
-void
-__partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
- _Compare __comp)
-{
- __make_heap<_Compare>(__first, __middle, __comp);
- typename iterator_traits<_RandomAccessIterator>::difference_type __len = __middle - __first;
- for (_RandomAccessIterator __i = __middle; __i != __last; ++__i)
- {
- if (__comp(*__i, *__first))
- {
- swap(*__i, *__first);
- __sift_down<_Compare>(__first, __middle, __comp, __len, __first);
- }
- }
- __sort_heap<_Compare>(__first, __middle, __comp);
-}
-
-template <class _RandomAccessIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
- _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- __partial_sort<_Comp_ref>(__first, __middle, __last, __c);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- __partial_sort<_Comp_ref>(__first, __middle, __last, __comp);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _RandomAccessIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
-{
- _VSTD::partial_sort(__first, __middle, __last,
- __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
-}
-
-// partial_sort_copy
-
-template <class _Compare, class _InputIterator, class _RandomAccessIterator>
-_RandomAccessIterator
-__partial_sort_copy(_InputIterator __first, _InputIterator __last,
- _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
-{
- _RandomAccessIterator __r = __result_first;
- if (__r != __result_last)
- {
- for (; __first != __last && __r != __result_last; (void) ++__first, ++__r)
- *__r = *__first;
- __make_heap<_Compare>(__result_first, __r, __comp);
- typename iterator_traits<_RandomAccessIterator>::difference_type __len = __r - __result_first;
- for (; __first != __last; ++__first)
- if (__comp(*__first, *__result_first))
- {
- *__result_first = *__first;
- __sift_down<_Compare>(__result_first, __r, __comp, __len, __result_first);
- }
- __sort_heap<_Compare>(__result_first, __r, __comp);
- }
- return __r;
-}
-
-template <class _InputIterator, class _RandomAccessIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-_RandomAccessIterator
-partial_sort_copy(_InputIterator __first, _InputIterator __last,
- _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __c);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __comp);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _InputIterator, class _RandomAccessIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_RandomAccessIterator
-partial_sort_copy(_InputIterator __first, _InputIterator __last,
- _RandomAccessIterator __result_first, _RandomAccessIterator __result_last)
-{
- return _VSTD::partial_sort_copy(__first, __last, __result_first, __result_last,
- __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
-}
-
-// nth_element
-
-template <class _Compare, class _RandomAccessIterator>
-void
-__nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
-{
- // _Compare is known to be a reference type
- typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
- const difference_type __limit = 7;
- while (true)
- {
- __restart:
- if (__nth == __last)
- return;
- difference_type __len = __last - __first;
- switch (__len)
- {
- case 0:
- case 1:
- return;
- case 2:
- if (__comp(*--__last, *__first))
- swap(*__first, *__last);
- return;
- case 3:
- {
- _RandomAccessIterator __m = __first;
- _VSTD::__sort3<_Compare>(__first, ++__m, --__last, __comp);
- return;
- }
- }
- if (__len <= __limit)
- {
- __selection_sort<_Compare>(__first, __last, __comp);
- return;
- }
- // __len > __limit >= 3
- _RandomAccessIterator __m = __first + __len/2;
- _RandomAccessIterator __lm1 = __last;
- unsigned __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, --__lm1, __comp);
- // *__m is median
- // partition [__first, __m) < *__m and *__m <= [__m, __last)
- // (this inhibits tossing elements equivalent to __m around unnecessarily)
- _RandomAccessIterator __i = __first;
- _RandomAccessIterator __j = __lm1;
- // j points beyond range to be tested, *__lm1 is known to be <= *__m
- // The search going up is known to be guarded but the search coming down isn't.
- // Prime the downward search with a guard.
- if (!__comp(*__i, *__m)) // if *__first == *__m
- {
- // *__first == *__m, *__first doesn't go in first part
- // manually guard downward moving __j against __i
- while (true)
- {
- if (__i == --__j)
- {
- // *__first == *__m, *__m <= all other elements
- // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
- ++__i; // __first + 1
- __j = __last;
- if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
- {
- while (true)
- {
- if (__i == __j)
- return; // [__first, __last) all equivalent elements
- if (__comp(*__first, *__i))
- {
- swap(*__i, *__j);
- ++__n_swaps;
- ++__i;
- break;
- }
- ++__i;
- }
- }
- // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
- if (__i == __j)
- return;
- while (true)
- {
- while (!__comp(*__first, *__i))
- ++__i;
- while (__comp(*__first, *--__j))
- ;
- if (__i >= __j)
- break;
- swap(*__i, *__j);
- ++__n_swaps;
- ++__i;
- }
- // [__first, __i) == *__first and *__first < [__i, __last)
- // The first part is sorted,
- if (__nth < __i)
- return;
- // __nth_element the secod part
- // __nth_element<_Compare>(__i, __nth, __last, __comp);
- __first = __i;
- goto __restart;
- }
- if (__comp(*__j, *__m))
- {
- swap(*__i, *__j);
- ++__n_swaps;
- break; // found guard for downward moving __j, now use unguarded partition
- }
- }
- }
- ++__i;
- // j points beyond range to be tested, *__lm1 is known to be <= *__m
- // if not yet partitioned...
- if (__i < __j)
- {
- // known that *(__i - 1) < *__m
- while (true)
- {
- // __m still guards upward moving __i
- while (__comp(*__i, *__m))
- ++__i;
- // It is now known that a guard exists for downward moving __j
- while (!__comp(*--__j, *__m))
- ;
- if (__i >= __j)
- break;
- swap(*__i, *__j);
- ++__n_swaps;
- // It is known that __m != __j
- // If __m just moved, follow it
- if (__m == __i)
- __m = __j;
- ++__i;
- }
- }
- // [__first, __i) < *__m and *__m <= [__i, __last)
- if (__i != __m && __comp(*__m, *__i))
- {
- swap(*__i, *__m);
- ++__n_swaps;
- }
- // [__first, __i) < *__i and *__i <= [__i+1, __last)
- if (__nth == __i)
- return;
- if (__n_swaps == 0)
- {
- // We were given a perfectly partitioned sequence. Coincidence?
- if (__nth < __i)
- {
- // Check for [__first, __i) already sorted
- __j = __m = __first;
- while (++__j != __i)
- {
- if (__comp(*__j, *__m))
- // not yet sorted, so sort
- goto not_sorted;
- __m = __j;
- }
- // [__first, __i) sorted
- return;
- }
- else
- {
- // Check for [__i, __last) already sorted
- __j = __m = __i;
- while (++__j != __last)
- {
- if (__comp(*__j, *__m))
- // not yet sorted, so sort
- goto not_sorted;
- __m = __j;
- }
- // [__i, __last) sorted
- return;
- }
- }
-not_sorted:
- // __nth_element on range containing __nth
- if (__nth < __i)
- {
- // __nth_element<_Compare>(__first, __nth, __i, __comp);
- __last = __i;
- }
- else
- {
- // __nth_element<_Compare>(__i+1, __nth, __last, __comp);
- __first = ++__i;
- }
- }
-}
-
-template <class _RandomAccessIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- __nth_element<_Comp_ref>(__first, __nth, __last, __c);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- __nth_element<_Comp_ref>(__first, __nth, __last, __comp);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _RandomAccessIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last)
-{
- _VSTD::nth_element(__first, __nth, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
-}
-
-// includes
-
-template <class _Compare, class _InputIterator1, class _InputIterator2>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
-__includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
- _Compare __comp)
-{
- for (; __first2 != __last2; ++__first1)
- {
- if (__first1 == __last1 || __comp(*__first2, *__first1))
- return false;
- if (!__comp(*__first1, *__first2))
- ++__first2;
- }
- return true;
-}
-
-template <class _InputIterator1, class _InputIterator2, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
- _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _InputIterator1, class _InputIterator2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2)
-{
- return _VSTD::includes(__first1, __last1, __first2, __last2,
- __less<typename iterator_traits<_InputIterator1>::value_type,
- typename iterator_traits<_InputIterator2>::value_type>());
-}
-
-// set_union
-
-template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
-_OutputIterator
-__set_union(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
-{
- for (; __first1 != __last1; ++__result)
- {
- if (__first2 == __last2)
- return _VSTD::copy(__first1, __last1, __result);
- if (__comp(*__first2, *__first1))
- {
- *__result = *__first2;
- ++__first2;
- }
- else
- {
- if (!__comp(*__first1, *__first2))
- ++__first2;
- *__result = *__first1;
- ++__first1;
- }
- }
- return _VSTD::copy(__first2, __last2, __result);
-}
-
-template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-set_union(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-set_union(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
-{
- return _VSTD::set_union(__first1, __last1, __first2, __last2, __result,
- __less<typename iterator_traits<_InputIterator1>::value_type,
- typename iterator_traits<_InputIterator2>::value_type>());
-}
-
-// set_intersection
-
-template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
-__set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
-{
- while (__first1 != __last1 && __first2 != __last2)
- {
- if (__comp(*__first1, *__first2))
- ++__first1;
- else
- {
- if (!__comp(*__first2, *__first1))
- {
- *__result = *__first1;
- ++__result;
- ++__first1;
- }
- ++__first2;
- }
- }
- return __result;
-}
-
-template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_OutputIterator
-set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_OutputIterator
-set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
-{
- return _VSTD::set_intersection(__first1, __last1, __first2, __last2, __result,
- __less<typename iterator_traits<_InputIterator1>::value_type,
- typename iterator_traits<_InputIterator2>::value_type>());
-}
-
-// set_difference
-
-template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
-_OutputIterator
-__set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
-{
- while (__first1 != __last1)
- {
- if (__first2 == __last2)
- return _VSTD::copy(__first1, __last1, __result);
- if (__comp(*__first1, *__first2))
- {
- *__result = *__first1;
- ++__result;
- ++__first1;
- }
- else
- {
- if (!__comp(*__first2, *__first1))
- ++__first1;
- ++__first2;
- }
- }
- return __result;
-}
-
-template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
-{
- return _VSTD::set_difference(__first1, __last1, __first2, __last2, __result,
- __less<typename iterator_traits<_InputIterator1>::value_type,
- typename iterator_traits<_InputIterator2>::value_type>());
-}
-
-// set_symmetric_difference
-
-template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
-_OutputIterator
-__set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
-{
- while (__first1 != __last1)
- {
- if (__first2 == __last2)
- return _VSTD::copy(__first1, __last1, __result);
- if (__comp(*__first1, *__first2))
- {
- *__result = *__first1;
- ++__result;
- ++__first1;
- }
- else
- {
- if (__comp(*__first2, *__first1))
- {
- *__result = *__first2;
- ++__result;
- }
- else
- ++__first1;
- ++__first2;
- }
- }
- return _VSTD::copy(__first2, __last2, __result);
-}
-
-template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
-{
- return _VSTD::set_symmetric_difference(__first1, __last1, __first2, __last2, __result,
- __less<typename iterator_traits<_InputIterator1>::value_type,
- typename iterator_traits<_InputIterator2>::value_type>());
-}
-
-// lexicographical_compare
-
-template <class _Compare, class _InputIterator1, class _InputIterator2>
-_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
-__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
-{
- for (; __first2 != __last2; ++__first1, (void) ++__first2)
- {
- if (__first1 == __last1 || __comp(*__first1, *__first2))
- return true;
- if (__comp(*__first2, *__first1))
- return false;
- }
- return false;
-}
-
-template <class _InputIterator1, class _InputIterator2, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _InputIterator1, class _InputIterator2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-bool
-lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _InputIterator2 __last2)
-{
- return _VSTD::lexicographical_compare(__first1, __last1, __first2, __last2,
- __less<typename iterator_traits<_InputIterator1>::value_type,
- typename iterator_traits<_InputIterator2>::value_type>());
-}
-
-// next_permutation
-
-template <class _Compare, class _BidirectionalIterator>
-bool
-__next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
-{
- _BidirectionalIterator __i = __last;
- if (__first == __last || __first == --__i)
- return false;
- while (true)
- {
- _BidirectionalIterator __ip1 = __i;
- if (__comp(*--__i, *__ip1))
- {
- _BidirectionalIterator __j = __last;
- while (!__comp(*__i, *--__j))
- ;
- swap(*__i, *__j);
- _VSTD::reverse(__ip1, __last);
- return true;
- }
- if (__i == __first)
- {
- _VSTD::reverse(__first, __last);
- return false;
- }
- }
-}
-
-template <class _BidirectionalIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- return __next_permutation<_Comp_ref>(__first, __last, __c);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- return __next_permutation<_Comp_ref>(__first, __last, __comp);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _BidirectionalIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
-{
- return _VSTD::next_permutation(__first, __last,
- __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
-}
-
-// prev_permutation
-
-template <class _Compare, class _BidirectionalIterator>
-bool
-__prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
-{
- _BidirectionalIterator __i = __last;
- if (__first == __last || __first == --__i)
- return false;
- while (true)
- {
- _BidirectionalIterator __ip1 = __i;
- if (__comp(*__ip1, *--__i))
- {
- _BidirectionalIterator __j = __last;
- while (!__comp(*--__j, *__i))
- ;
- swap(*__i, *__j);
- _VSTD::reverse(__ip1, __last);
- return true;
- }
- if (__i == __first)
- {
- _VSTD::reverse(__first, __last);
- return false;
- }
- }
-}
-
-template <class _BidirectionalIterator, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
-{
-#ifdef _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
- __debug_less<_Compare> __c(__comp);
- return __prev_permutation<_Comp_ref>(__first, __last, __c);
-#else // _LIBCPP_DEBUG
- typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
- return __prev_permutation<_Comp_ref>(__first, __last, __comp);
-#endif // _LIBCPP_DEBUG
-}
-
-template <class _BidirectionalIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
-{
- return _VSTD::prev_permutation(__first, __last,
- __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_ALGORITHM
diff --git a/lib/libcxx/include/any b/lib/libcxx/include/any
deleted file mode 100644
index 781eee7869c..00000000000
--- a/lib/libcxx/include/any
+++ /dev/null
@@ -1,672 +0,0 @@
-// -*- C++ -*-
-//===------------------------------ any -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_ANY
-#define _LIBCPP_ANY
-
-/*
- any synopsis
-
-namespace std {
-
- class bad_any_cast : public bad_cast
- {
- public:
- virtual const char* what() const noexcept;
- };
-
- class any
- {
- public:
-
- // 6.3.1 any construct/destruct
- any() noexcept;
-
- any(const any& other);
- any(any&& other) noexcept;
-
- template <class ValueType>
- any(ValueType&& value);
-
- ~any();
-
- // 6.3.2 any assignments
- any& operator=(const any& rhs);
- any& operator=(any&& rhs) noexcept;
-
- template <class ValueType>
- any& operator=(ValueType&& rhs);
-
- // 6.3.3 any modifiers
- template <class ValueType, class... Args>
- decay_t<ValueType>& emplace(Args&&... args);
- template <class ValueType, class U, class... Args>
- decay_t<ValueType>& emplace(initializer_list<U>, Args&&...);
- void reset() noexcept;
- void swap(any& rhs) noexcept;
-
- // 6.3.4 any observers
- bool has_value() const noexcept;
- const type_info& type() const noexcept;
- };
-
- // 6.4 Non-member functions
- void swap(any& x, any& y) noexcept;
-
- template <class T, class ...Args>
- any make_any(Args&& ...args);
- template <class T, class U, class ...Args>
- any make_any(initializer_list<U>, Args&& ...args);
-
- template<class ValueType>
- ValueType any_cast(const any& operand);
- template<class ValueType>
- ValueType any_cast(any& operand);
- template<class ValueType>
- ValueType any_cast(any&& operand);
-
- template<class ValueType>
- const ValueType* any_cast(const any* operand) noexcept;
- template<class ValueType>
- ValueType* any_cast(any* operand) noexcept;
-
-} // namespace std
-
-*/
-
-#include <experimental/__config>
-#include <memory>
-#include <new>
-#include <typeinfo>
-#include <type_traits>
-#include <cstdlib>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-namespace std {
-class _LIBCPP_EXCEPTION_ABI _LIBCPP_AVAILABILITY_BAD_ANY_CAST bad_any_cast : public bad_cast
-{
-public:
- virtual const char* what() const _NOEXCEPT;
-};
-} // namespace std
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-#if _LIBCPP_STD_VER > 14
-
-_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST
-void __throw_bad_any_cast()
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- throw bad_any_cast();
-#else
- _VSTD::abort();
-#endif
-}
-
-// Forward declarations
-class _LIBCPP_TEMPLATE_VIS any;
-
-template <class _ValueType>
-_LIBCPP_INLINE_VISIBILITY
-add_pointer_t<add_const_t<_ValueType>>
-any_cast(any const *) _NOEXCEPT;
-
-template <class _ValueType>
-_LIBCPP_INLINE_VISIBILITY
-add_pointer_t<_ValueType> any_cast(any *) _NOEXCEPT;
-
-namespace __any_imp
-{
- using _Buffer = aligned_storage_t<3*sizeof(void*), alignment_of<void*>::value>;
-
- template <class _Tp>
- using _IsSmallObject = integral_constant<bool
- , sizeof(_Tp) <= sizeof(_Buffer)
- && alignment_of<_Buffer>::value
- % alignment_of<_Tp>::value == 0
- && is_nothrow_move_constructible<_Tp>::value
- >;
-
- enum class _Action {
- _Destroy,
- _Copy,
- _Move,
- _Get,
- _TypeInfo
- };
-
- template <class _Tp> struct _SmallHandler;
- template <class _Tp> struct _LargeHandler;
-
- template <class _Tp>
- struct _LIBCPP_TEMPLATE_VIS __unique_typeinfo { static constexpr int __id = 0; };
- template <class _Tp> constexpr int __unique_typeinfo<_Tp>::__id;
-
- template <class _Tp>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr const void* __get_fallback_typeid() {
- return &__unique_typeinfo<decay_t<_Tp>>::__id;
- }
-
- template <class _Tp>
- inline _LIBCPP_INLINE_VISIBILITY
- bool __compare_typeid(type_info const* __id, const void* __fallback_id)
- {
-#if !defined(_LIBCPP_NO_RTTI)
- if (__id && *__id == typeid(_Tp))
- return true;
-#endif
- if (!__id && __fallback_id == __any_imp::__get_fallback_typeid<_Tp>())
- return true;
- return false;
- }
-
- template <class _Tp>
- using _Handler = conditional_t<
- _IsSmallObject<_Tp>::value, _SmallHandler<_Tp>, _LargeHandler<_Tp>>;
-
-} // namespace __any_imp
-
-class _LIBCPP_TEMPLATE_VIS any
-{
-public:
- // construct/destruct
- _LIBCPP_INLINE_VISIBILITY
- constexpr any() _NOEXCEPT : __h(nullptr) {}
-
- _LIBCPP_INLINE_VISIBILITY
- any(any const & __other) : __h(nullptr)
- {
- if (__other.__h) __other.__call(_Action::_Copy, this);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- any(any && __other) _NOEXCEPT : __h(nullptr)
- {
- if (__other.__h) __other.__call(_Action::_Move, this);
- }
-
- template <
- class _ValueType
- , class _Tp = decay_t<_ValueType>
- , class = enable_if_t<
- !is_same<_Tp, any>::value &&
- !__is_inplace_type<_ValueType>::value &&
- is_copy_constructible<_Tp>::value>
- >
- _LIBCPP_INLINE_VISIBILITY
- any(_ValueType && __value);
-
- template <class _ValueType, class ..._Args,
- class _Tp = decay_t<_ValueType>,
- class = enable_if_t<
- is_constructible<_Tp, _Args...>::value &&
- is_copy_constructible<_Tp>::value
- >
- >
- _LIBCPP_INLINE_VISIBILITY
- explicit any(in_place_type_t<_ValueType>, _Args&&... __args);
-
- template <class _ValueType, class _Up, class ..._Args,
- class _Tp = decay_t<_ValueType>,
- class = enable_if_t<
- is_constructible<_Tp, initializer_list<_Up>&, _Args...>::value &&
- is_copy_constructible<_Tp>::value>
- >
- _LIBCPP_INLINE_VISIBILITY
- explicit any(in_place_type_t<_ValueType>, initializer_list<_Up>, _Args&&... __args);
-
- _LIBCPP_INLINE_VISIBILITY
- ~any() { this->reset(); }
-
- // assignments
- _LIBCPP_INLINE_VISIBILITY
- any & operator=(any const & __rhs) {
- any(__rhs).swap(*this);
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- any & operator=(any && __rhs) _NOEXCEPT {
- any(_VSTD::move(__rhs)).swap(*this);
- return *this;
- }
-
- template <
- class _ValueType
- , class _Tp = decay_t<_ValueType>
- , class = enable_if_t<
- !is_same<_Tp, any>::value
- && is_copy_constructible<_Tp>::value>
- >
- _LIBCPP_INLINE_VISIBILITY
- any & operator=(_ValueType && __rhs);
-
- template <class _ValueType, class ..._Args,
- class _Tp = decay_t<_ValueType>,
- class = enable_if_t<
- is_constructible<_Tp, _Args...>::value &&
- is_copy_constructible<_Tp>::value>
- >
- _LIBCPP_INLINE_VISIBILITY
- _Tp& emplace(_Args&&... args);
-
- template <class _ValueType, class _Up, class ..._Args,
- class _Tp = decay_t<_ValueType>,
- class = enable_if_t<
- is_constructible<_Tp, initializer_list<_Up>&, _Args...>::value &&
- is_copy_constructible<_Tp>::value>
- >
- _LIBCPP_INLINE_VISIBILITY
- _Tp& emplace(initializer_list<_Up>, _Args&&...);
-
- // 6.3.3 any modifiers
- _LIBCPP_INLINE_VISIBILITY
- void reset() _NOEXCEPT { if (__h) this->__call(_Action::_Destroy); }
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(any & __rhs) _NOEXCEPT;
-
- // 6.3.4 any observers
- _LIBCPP_INLINE_VISIBILITY
- bool has_value() const _NOEXCEPT { return __h != nullptr; }
-
-#if !defined(_LIBCPP_NO_RTTI)
- _LIBCPP_INLINE_VISIBILITY
- const type_info & type() const _NOEXCEPT {
- if (__h) {
- return *static_cast<type_info const *>(this->__call(_Action::_TypeInfo));
- } else {
- return typeid(void);
- }
- }
-#endif
-
-private:
- typedef __any_imp::_Action _Action;
- using _HandleFuncPtr = void* (*)(_Action, any const *, any *, const type_info *,
- const void* __fallback_info);
-
- union _Storage {
- constexpr _Storage() : __ptr(nullptr) {}
- void * __ptr;
- __any_imp::_Buffer __buf;
- };
-
- _LIBCPP_INLINE_VISIBILITY
- void * __call(_Action __a, any * __other = nullptr,
- type_info const * __info = nullptr,
- const void* __fallback_info = nullptr) const
- {
- return __h(__a, this, __other, __info, __fallback_info);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void * __call(_Action __a, any * __other = nullptr,
- type_info const * __info = nullptr,
- const void* __fallback_info = nullptr)
- {
- return __h(__a, this, __other, __info, __fallback_info);
- }
-
- template <class>
- friend struct __any_imp::_SmallHandler;
- template <class>
- friend struct __any_imp::_LargeHandler;
-
- template <class _ValueType>
- friend add_pointer_t<add_const_t<_ValueType>>
- any_cast(any const *) _NOEXCEPT;
-
- template <class _ValueType>
- friend add_pointer_t<_ValueType>
- any_cast(any *) _NOEXCEPT;
-
- _HandleFuncPtr __h = nullptr;
- _Storage __s;
-};
-
-namespace __any_imp
-{
- template <class _Tp>
- struct _LIBCPP_TEMPLATE_VIS _SmallHandler
- {
- _LIBCPP_INLINE_VISIBILITY
- static void* __handle(_Action __act, any const * __this, any * __other,
- type_info const * __info, const void* __fallback_info)
- {
- switch (__act)
- {
- case _Action::_Destroy:
- __destroy(const_cast<any &>(*__this));
- return nullptr;
- case _Action::_Copy:
- __copy(*__this, *__other);
- return nullptr;
- case _Action::_Move:
- __move(const_cast<any &>(*__this), *__other);
- return nullptr;
- case _Action::_Get:
- return __get(const_cast<any &>(*__this), __info, __fallback_info);
- case _Action::_TypeInfo:
- return __type_info();
- }
- }
-
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- static _Tp& __create(any & __dest, _Args&&... __args) {
- _Tp* __ret = ::new (static_cast<void*>(&__dest.__s.__buf)) _Tp(_VSTD::forward<_Args>(__args)...);
- __dest.__h = &_SmallHandler::__handle;
- return *__ret;
- }
-
- private:
- _LIBCPP_INLINE_VISIBILITY
- static void __destroy(any & __this) {
- _Tp & __value = *static_cast<_Tp *>(static_cast<void*>(&__this.__s.__buf));
- __value.~_Tp();
- __this.__h = nullptr;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- static void __copy(any const & __this, any & __dest) {
- _SmallHandler::__create(__dest, *static_cast<_Tp const *>(
- static_cast<void const *>(&__this.__s.__buf)));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- static void __move(any & __this, any & __dest) {
- _SmallHandler::__create(__dest, _VSTD::move(
- *static_cast<_Tp*>(static_cast<void*>(&__this.__s.__buf))));
- __destroy(__this);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- static void* __get(any & __this,
- type_info const * __info,
- const void* __fallback_id)
- {
- if (__any_imp::__compare_typeid<_Tp>(__info, __fallback_id))
- return static_cast<void*>(&__this.__s.__buf);
- return nullptr;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- static void* __type_info()
- {
-#if !defined(_LIBCPP_NO_RTTI)
- return const_cast<void*>(static_cast<void const *>(&typeid(_Tp)));
-#else
- return nullptr;
-#endif
- }
- };
-
- template <class _Tp>
- struct _LIBCPP_TEMPLATE_VIS _LargeHandler
- {
- _LIBCPP_INLINE_VISIBILITY
- static void* __handle(_Action __act, any const * __this,
- any * __other, type_info const * __info,
- void const* __fallback_info)
- {
- switch (__act)
- {
- case _Action::_Destroy:
- __destroy(const_cast<any &>(*__this));
- return nullptr;
- case _Action::_Copy:
- __copy(*__this, *__other);
- return nullptr;
- case _Action::_Move:
- __move(const_cast<any &>(*__this), *__other);
- return nullptr;
- case _Action::_Get:
- return __get(const_cast<any &>(*__this), __info, __fallback_info);
- case _Action::_TypeInfo:
- return __type_info();
- }
- }
-
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- static _Tp& __create(any & __dest, _Args&&... __args) {
- typedef allocator<_Tp> _Alloc;
- typedef __allocator_destructor<_Alloc> _Dp;
- _Alloc __a;
- unique_ptr<_Tp, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- _Tp* __ret = ::new ((void*)__hold.get()) _Tp(_VSTD::forward<_Args>(__args)...);
- __dest.__s.__ptr = __hold.release();
- __dest.__h = &_LargeHandler::__handle;
- return *__ret;
- }
-
- private:
-
- _LIBCPP_INLINE_VISIBILITY
- static void __destroy(any & __this){
- delete static_cast<_Tp*>(__this.__s.__ptr);
- __this.__h = nullptr;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- static void __copy(any const & __this, any & __dest) {
- _LargeHandler::__create(__dest, *static_cast<_Tp const *>(__this.__s.__ptr));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- static void __move(any & __this, any & __dest) {
- __dest.__s.__ptr = __this.__s.__ptr;
- __dest.__h = &_LargeHandler::__handle;
- __this.__h = nullptr;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- static void* __get(any & __this, type_info const * __info,
- void const* __fallback_info)
- {
- if (__any_imp::__compare_typeid<_Tp>(__info, __fallback_info))
- return static_cast<void*>(__this.__s.__ptr);
- return nullptr;
-
- }
-
- _LIBCPP_INLINE_VISIBILITY
- static void* __type_info()
- {
-#if !defined(_LIBCPP_NO_RTTI)
- return const_cast<void*>(static_cast<void const *>(&typeid(_Tp)));
-#else
- return nullptr;
-#endif
- }
- };
-
-} // namespace __any_imp
-
-
-template <class _ValueType, class _Tp, class>
-any::any(_ValueType && __v) : __h(nullptr)
-{
- __any_imp::_Handler<_Tp>::__create(*this, _VSTD::forward<_ValueType>(__v));
-}
-
-template <class _ValueType, class ..._Args, class _Tp, class>
-any::any(in_place_type_t<_ValueType>, _Args&&... __args) {
- __any_imp::_Handler<_Tp>::__create(*this, _VSTD::forward<_Args>(__args)...);
-};
-
-template <class _ValueType, class _Up, class ..._Args, class _Tp, class>
-any::any(in_place_type_t<_ValueType>, initializer_list<_Up> __il, _Args&&... __args) {
- __any_imp::_Handler<_Tp>::__create(*this, __il, _VSTD::forward<_Args>(__args)...);
-}
-
-template <class _ValueType, class, class>
-inline _LIBCPP_INLINE_VISIBILITY
-any & any::operator=(_ValueType && __v)
-{
- any(_VSTD::forward<_ValueType>(__v)).swap(*this);
- return *this;
-}
-
-template <class _ValueType, class ..._Args, class _Tp, class>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp& any::emplace(_Args&&... __args) {
- reset();
- return __any_imp::_Handler<_Tp>::__create(*this, _VSTD::forward<_Args>(__args)...);
-}
-
-template <class _ValueType, class _Up, class ..._Args, class _Tp, class>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp& any::emplace(initializer_list<_Up> __il, _Args&&... __args) {
- reset();
- return __any_imp::_Handler<_Tp>::__create(*this, __il, _VSTD::forward<_Args>(__args)...);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-void any::swap(any & __rhs) _NOEXCEPT
-{
- if (this == &__rhs)
- return;
- if (__h && __rhs.__h) {
- any __tmp;
- __rhs.__call(_Action::_Move, &__tmp);
- this->__call(_Action::_Move, &__rhs);
- __tmp.__call(_Action::_Move, this);
- }
- else if (__h) {
- this->__call(_Action::_Move, &__rhs);
- }
- else if (__rhs.__h) {
- __rhs.__call(_Action::_Move, this);
- }
-}
-
-// 6.4 Non-member functions
-
-inline _LIBCPP_INLINE_VISIBILITY
-void swap(any & __lhs, any & __rhs) _NOEXCEPT
-{
- __lhs.swap(__rhs);
-}
-
-template <class _Tp, class ..._Args>
-inline _LIBCPP_INLINE_VISIBILITY
-any make_any(_Args&&... __args) {
- return any(in_place_type<_Tp>, _VSTD::forward<_Args>(__args)...);
-}
-
-template <class _Tp, class _Up, class ..._Args>
-inline _LIBCPP_INLINE_VISIBILITY
-any make_any(initializer_list<_Up> __il, _Args&&... __args) {
- return any(in_place_type<_Tp>, __il, _VSTD::forward<_Args>(__args)...);
-}
-
-template <class _ValueType>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST
-_ValueType any_cast(any const & __v)
-{
- using _RawValueType = __uncvref_t<_ValueType>;
- static_assert(is_constructible<_ValueType, _RawValueType const &>::value,
- "ValueType is required to be a const lvalue reference "
- "or a CopyConstructible type");
- auto __tmp = _VSTD::any_cast<add_const_t<_RawValueType>>(&__v);
- if (__tmp == nullptr)
- __throw_bad_any_cast();
- return static_cast<_ValueType>(*__tmp);
-}
-
-template <class _ValueType>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST
-_ValueType any_cast(any & __v)
-{
- using _RawValueType = __uncvref_t<_ValueType>;
- static_assert(is_constructible<_ValueType, _RawValueType &>::value,
- "ValueType is required to be an lvalue reference "
- "or a CopyConstructible type");
- auto __tmp = _VSTD::any_cast<_RawValueType>(&__v);
- if (__tmp == nullptr)
- __throw_bad_any_cast();
- return static_cast<_ValueType>(*__tmp);
-}
-
-template <class _ValueType>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST
-_ValueType any_cast(any && __v)
-{
- using _RawValueType = __uncvref_t<_ValueType>;
- static_assert(is_constructible<_ValueType, _RawValueType>::value,
- "ValueType is required to be an rvalue reference "
- "or a CopyConstructible type");
- auto __tmp = _VSTD::any_cast<_RawValueType>(&__v);
- if (__tmp == nullptr)
- __throw_bad_any_cast();
- return static_cast<_ValueType>(_VSTD::move(*__tmp));
-}
-
-template <class _ValueType>
-inline _LIBCPP_INLINE_VISIBILITY
-add_pointer_t<add_const_t<_ValueType>>
-any_cast(any const * __any) _NOEXCEPT
-{
- static_assert(!is_reference<_ValueType>::value,
- "_ValueType may not be a reference.");
- return _VSTD::any_cast<_ValueType>(const_cast<any *>(__any));
-}
-
-template <class _RetType>
-inline _LIBCPP_INLINE_VISIBILITY
-_RetType __pointer_or_func_cast(void* __p, /*IsFunction*/false_type) noexcept {
- return static_cast<_RetType>(__p);
-}
-
-template <class _RetType>
-inline _LIBCPP_INLINE_VISIBILITY
-_RetType __pointer_or_func_cast(void*, /*IsFunction*/true_type) noexcept {
- return nullptr;
-}
-
-template <class _ValueType>
-add_pointer_t<_ValueType>
-any_cast(any * __any) _NOEXCEPT
-{
- using __any_imp::_Action;
- static_assert(!is_reference<_ValueType>::value,
- "_ValueType may not be a reference.");
- typedef typename add_pointer<_ValueType>::type _ReturnType;
- if (__any && __any->__h) {
- void *__p = __any->__call(_Action::_Get, nullptr,
-#if !defined(_LIBCPP_NO_RTTI)
- &typeid(_ValueType),
-#else
- nullptr,
-#endif
- __any_imp::__get_fallback_typeid<_ValueType>());
- return _VSTD::__pointer_or_func_cast<_ReturnType>(
- __p, is_function<_ValueType>{});
- }
- return nullptr;
-}
-
-#endif // _LIBCPP_STD_VER > 14
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_ANY
diff --git a/lib/libcxx/include/array b/lib/libcxx/include/array
deleted file mode 100644
index 56f6887655a..00000000000
--- a/lib/libcxx/include/array
+++ /dev/null
@@ -1,486 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- array -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_ARRAY
-#define _LIBCPP_ARRAY
-
-/*
- array synopsis
-
-namespace std
-{
-template <class T, size_t N >
-struct array
-{
- // types:
- typedef T & reference;
- typedef const T & const_reference;
- typedef implementation defined iterator;
- typedef implementation defined const_iterator;
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- typedef T value_type;
- typedef T* pointer;
- typedef const T* const_pointer;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
-
- // No explicit construct/copy/destroy for aggregate type
- void fill(const T& u);
- void swap(array& a) noexcept(is_nothrow_swappable_v<T>);
-
- // iterators:
- iterator begin() noexcept;
- const_iterator begin() const noexcept;
- iterator end() noexcept;
- const_iterator end() const noexcept;
-
- reverse_iterator rbegin() noexcept;
- const_reverse_iterator rbegin() const noexcept;
- reverse_iterator rend() noexcept;
- const_reverse_iterator rend() const noexcept;
-
- const_iterator cbegin() const noexcept;
- const_iterator cend() const noexcept;
- const_reverse_iterator crbegin() const noexcept;
- const_reverse_iterator crend() const noexcept;
-
- // capacity:
- constexpr size_type size() const noexcept;
- constexpr size_type max_size() const noexcept;
- constexpr bool empty() const noexcept;
-
- // element access:
- reference operator[](size_type n);
- const_reference operator[](size_type n) const; // constexpr in C++14
- const_reference at(size_type n) const; // constexpr in C++14
- reference at(size_type n);
-
- reference front();
- const_reference front() const; // constexpr in C++14
- reference back();
- const_reference back() const; // constexpr in C++14
-
- T* data() noexcept;
- const T* data() const noexcept;
-};
-
- template <class T, class... U>
- array(T, U...) -> array<T, 1 + sizeof...(U)>;
-
-template <class T, size_t N>
- bool operator==(const array<T,N>& x, const array<T,N>& y);
-template <class T, size_t N>
- bool operator!=(const array<T,N>& x, const array<T,N>& y);
-template <class T, size_t N>
- bool operator<(const array<T,N>& x, const array<T,N>& y);
-template <class T, size_t N>
- bool operator>(const array<T,N>& x, const array<T,N>& y);
-template <class T, size_t N>
- bool operator<=(const array<T,N>& x, const array<T,N>& y);
-template <class T, size_t N>
- bool operator>=(const array<T,N>& x, const array<T,N>& y);
-
-template <class T, size_t N >
- void swap(array<T,N>& x, array<T,N>& y) noexcept(noexcept(x.swap(y))); // C++17
-
-template <class T> struct tuple_size;
-template <size_t I, class T> class tuple_element;
-template <class T, size_t N> struct tuple_size<array<T, N>>;
-template <size_t I, class T, size_t N> struct tuple_element<I, array<T, N>>;
-template <size_t I, class T, size_t N> T& get(array<T, N>&) noexcept; // constexpr in C++14
-template <size_t I, class T, size_t N> const T& get(const array<T, N>&) noexcept; // constexpr in C++14
-template <size_t I, class T, size_t N> T&& get(array<T, N>&&) noexcept; // constexpr in C++14
-template <size_t I, class T, size_t N> const T&& get(const array<T, N>&&) noexcept; // constexpr in C++14
-
-} // std
-
-*/
-
-#include <__config>
-#include <__tuple>
-#include <type_traits>
-#include <utility>
-#include <iterator>
-#include <algorithm>
-#include <stdexcept>
-#include <cstdlib> // for _LIBCPP_UNREACHABLE
-#include <version>
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-
-template <class _Tp, size_t _Size>
-struct _LIBCPP_TEMPLATE_VIS array
-{
- // types:
- typedef array __self;
- typedef _Tp value_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef value_type* iterator;
- typedef const value_type* const_iterator;
- typedef value_type* pointer;
- typedef const value_type* const_pointer;
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
-
- _Tp __elems_[_Size];
-
- // No explicit construct/copy/destroy for aggregate type
- _LIBCPP_INLINE_VISIBILITY void fill(const value_type& __u) {
- _VSTD::fill_n(__elems_, _Size, __u);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(array& __a) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) {
- std::swap_ranges(__elems_, __elems_ + _Size, __a.__elems_);
- }
-
- // iterators:
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- iterator begin() _NOEXCEPT {return iterator(data());}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- const_iterator begin() const _NOEXCEPT {return const_iterator(data());}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- iterator end() _NOEXCEPT {return iterator(data() + _Size);}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- const_iterator end() const _NOEXCEPT {return const_iterator(data() + _Size);}
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());}
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- const_iterator cbegin() const _NOEXCEPT {return begin();}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- const_iterator cend() const _NOEXCEPT {return end();}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- const_reverse_iterator crend() const _NOEXCEPT {return rend();}
-
- // capacity:
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT {return _Size;}
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT {return _Size;}
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return false; }
-
- // element access:
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reference operator[](size_type __n) {return __elems_[__n];}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- const_reference operator[](size_type __n) const {return __elems_[__n];}
-
- _LIBCPP_CONSTEXPR_AFTER_CXX14 reference at(size_type __n);
- _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference at(size_type __n) const;
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference front() {return __elems_[0];}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference front() const {return __elems_[0];}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference back() {return __elems_[_Size - 1];}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference back() const {return __elems_[_Size - 1];}
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- value_type* data() _NOEXCEPT {return __elems_;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- const value_type* data() const _NOEXCEPT {return __elems_;}
-};
-
-
-template <class _Tp, size_t _Size>
-_LIBCPP_CONSTEXPR_AFTER_CXX14
-typename array<_Tp, _Size>::reference
-array<_Tp, _Size>::at(size_type __n)
-{
- if (__n >= _Size)
- __throw_out_of_range("array::at");
-
- return __elems_[__n];
-}
-
-template <class _Tp, size_t _Size>
-_LIBCPP_CONSTEXPR_AFTER_CXX11
-typename array<_Tp, _Size>::const_reference
-array<_Tp, _Size>::at(size_type __n) const
-{
- if (__n >= _Size)
- __throw_out_of_range("array::at");
- return __elems_[__n];
-}
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS array<_Tp, 0>
-{
- // types:
- typedef array __self;
- typedef _Tp value_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef value_type* iterator;
- typedef const value_type* const_iterator;
- typedef value_type* pointer;
- typedef const value_type* const_pointer;
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
-
- typedef typename conditional<is_const<_Tp>::value, const char,
- char>::type _CharType;
-
- struct _ArrayInStructT { _Tp __data_[1]; };
- _ALIGNAS_TYPE(_ArrayInStructT) _CharType __elems_[sizeof(_ArrayInStructT)];
-
- // No explicit construct/copy/destroy for aggregate type
- _LIBCPP_INLINE_VISIBILITY void fill(const value_type&) {
- static_assert(!is_const<_Tp>::value,
- "cannot fill zero-sized array of type 'const T'");
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(array&) _NOEXCEPT {
- static_assert(!is_const<_Tp>::value,
- "cannot swap zero-sized array of type 'const T'");
- }
-
- // iterators:
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT {return iterator(data());}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT {return const_iterator(data());}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT {return iterator(data());}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT {return const_iterator(data());}
-
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());}
-
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const _NOEXCEPT {return begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const _NOEXCEPT {return end();}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crend() const _NOEXCEPT {return rend();}
-
- // capacity:
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT {return 0; }
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT {return 0;}
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return true;}
-
- // element access:
- _LIBCPP_INLINE_VISIBILITY
- reference operator[](size_type) {
- _LIBCPP_ASSERT(false, "cannot call array<T, 0>::operator[] on a zero-sized array");
- _LIBCPP_UNREACHABLE();
- }
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- const_reference operator[](size_type) const {
- _LIBCPP_ASSERT(false, "cannot call array<T, 0>::operator[] on a zero-sized array");
- _LIBCPP_UNREACHABLE();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- reference at(size_type) {
- __throw_out_of_range("array<T, 0>::at");
- _LIBCPP_UNREACHABLE();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const_reference at(size_type) const {
- __throw_out_of_range("array<T, 0>::at");
- _LIBCPP_UNREACHABLE();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- reference front() {
- _LIBCPP_ASSERT(false, "cannot call array<T, 0>::front() on a zero-sized array");
- _LIBCPP_UNREACHABLE();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const_reference front() const {
- _LIBCPP_ASSERT(false, "cannot call array<T, 0>::front() on a zero-sized array");
- _LIBCPP_UNREACHABLE();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- reference back() {
- _LIBCPP_ASSERT(false, "cannot call array<T, 0>::back() on a zero-sized array");
- _LIBCPP_UNREACHABLE();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const_reference back() const {
- _LIBCPP_ASSERT(false, "cannot call array<T, 0>::back() on a zero-sized array");
- _LIBCPP_UNREACHABLE();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- value_type* data() _NOEXCEPT {return reinterpret_cast<value_type*>(__elems_);}
- _LIBCPP_INLINE_VISIBILITY
- const value_type* data() const _NOEXCEPT {return reinterpret_cast<const value_type*>(__elems_);}
-};
-
-
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-template<class _Tp, class... _Args,
- class = typename enable_if<(is_same_v<_Tp, _Args> && ...), void>::type
- >
-array(_Tp, _Args...)
- -> array<_Tp, 1 + sizeof...(_Args)>;
-#endif
-
-template <class _Tp, size_t _Size>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
-operator==(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
-{
- return _VSTD::equal(__x.begin(), __x.end(), __y.begin());
-}
-
-template <class _Tp, size_t _Size>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
-operator!=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _Tp, size_t _Size>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
-operator<(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
-{
- return _VSTD::lexicographical_compare(__x.begin(), __x.end(),
- __y.begin(), __y.end());
-}
-
-template <class _Tp, size_t _Size>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
-operator>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
-{
- return __y < __x;
-}
-
-template <class _Tp, size_t _Size>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
-operator<=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
-{
- return !(__y < __x);
-}
-
-template <class _Tp, size_t _Size>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
-operator>=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
-{
- return !(__x < __y);
-}
-
-template <class _Tp, size_t _Size>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- _Size == 0 ||
- __is_swappable<_Tp>::value,
- void
->::type
-swap(array<_Tp, _Size>& __x, array<_Tp, _Size>& __y)
- _NOEXCEPT_(noexcept(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-template <class _Tp, size_t _Size>
-struct _LIBCPP_TEMPLATE_VIS tuple_size<array<_Tp, _Size> >
- : public integral_constant<size_t, _Size> {};
-
-template <size_t _Ip, class _Tp, size_t _Size>
-class _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, array<_Tp, _Size> >
-{
- static_assert(_Ip < _Size, "Index out of bounds in std::tuple_element<> (std::array)");
-public:
- typedef _Tp type;
-};
-
-template <size_t _Ip, class _Tp, size_t _Size>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-_Tp&
-get(array<_Tp, _Size>& __a) _NOEXCEPT
-{
- static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array)");
- return __a.__elems_[_Ip];
-}
-
-template <size_t _Ip, class _Tp, size_t _Size>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-const _Tp&
-get(const array<_Tp, _Size>& __a) _NOEXCEPT
-{
- static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array)");
- return __a.__elems_[_Ip];
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <size_t _Ip, class _Tp, size_t _Size>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-_Tp&&
-get(array<_Tp, _Size>&& __a) _NOEXCEPT
-{
- static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array &&)");
- return _VSTD::move(__a.__elems_[_Ip]);
-}
-
-template <size_t _Ip, class _Tp, size_t _Size>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-const _Tp&&
-get(const array<_Tp, _Size>&& __a) _NOEXCEPT
-{
- static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array &&)");
- return _VSTD::move(__a.__elems_[_Ip]);
-}
-
-#endif // !_LIBCPP_CXX03_LANG
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_ARRAY
diff --git a/lib/libcxx/include/atomic b/lib/libcxx/include/atomic
deleted file mode 100644
index d37e7b4b035..00000000000
--- a/lib/libcxx/include/atomic
+++ /dev/null
@@ -1,1888 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- atomic -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_ATOMIC
-#define _LIBCPP_ATOMIC
-
-/*
- atomic synopsis
-
-namespace std
-{
-
-// feature test macro
-
-#define __cpp_lib_atomic_is_always_lock_free // as specified by SG10
-
-// order and consistency
-
-typedef enum memory_order
-{
- memory_order_relaxed,
- memory_order_consume, // load-consume
- memory_order_acquire, // load-acquire
- memory_order_release, // store-release
- memory_order_acq_rel, // store-release load-acquire
- memory_order_seq_cst // store-release load-acquire
-} memory_order;
-
-template <class T> T kill_dependency(T y) noexcept;
-
-// lock-free property
-
-#define ATOMIC_BOOL_LOCK_FREE unspecified
-#define ATOMIC_CHAR_LOCK_FREE unspecified
-#define ATOMIC_CHAR16_T_LOCK_FREE unspecified
-#define ATOMIC_CHAR32_T_LOCK_FREE unspecified
-#define ATOMIC_WCHAR_T_LOCK_FREE unspecified
-#define ATOMIC_SHORT_LOCK_FREE unspecified
-#define ATOMIC_INT_LOCK_FREE unspecified
-#define ATOMIC_LONG_LOCK_FREE unspecified
-#define ATOMIC_LLONG_LOCK_FREE unspecified
-#define ATOMIC_POINTER_LOCK_FREE unspecified
-
-// flag type and operations
-
-typedef struct atomic_flag
-{
- bool test_and_set(memory_order m = memory_order_seq_cst) volatile noexcept;
- bool test_and_set(memory_order m = memory_order_seq_cst) noexcept;
- void clear(memory_order m = memory_order_seq_cst) volatile noexcept;
- void clear(memory_order m = memory_order_seq_cst) noexcept;
- atomic_flag() noexcept = default;
- atomic_flag(const atomic_flag&) = delete;
- atomic_flag& operator=(const atomic_flag&) = delete;
- atomic_flag& operator=(const atomic_flag&) volatile = delete;
-} atomic_flag;
-
-bool
- atomic_flag_test_and_set(volatile atomic_flag* obj) noexcept;
-
-bool
- atomic_flag_test_and_set(atomic_flag* obj) noexcept;
-
-bool
- atomic_flag_test_and_set_explicit(volatile atomic_flag* obj,
- memory_order m) noexcept;
-
-bool
- atomic_flag_test_and_set_explicit(atomic_flag* obj, memory_order m) noexcept;
-
-void
- atomic_flag_clear(volatile atomic_flag* obj) noexcept;
-
-void
- atomic_flag_clear(atomic_flag* obj) noexcept;
-
-void
- atomic_flag_clear_explicit(volatile atomic_flag* obj, memory_order m) noexcept;
-
-void
- atomic_flag_clear_explicit(atomic_flag* obj, memory_order m) noexcept;
-
-#define ATOMIC_FLAG_INIT see below
-#define ATOMIC_VAR_INIT(value) see below
-
-template <class T>
-struct atomic
-{
- static constexpr bool is_always_lock_free;
- bool is_lock_free() const volatile noexcept;
- bool is_lock_free() const noexcept;
- void store(T desr, memory_order m = memory_order_seq_cst) volatile noexcept;
- void store(T desr, memory_order m = memory_order_seq_cst) noexcept;
- T load(memory_order m = memory_order_seq_cst) const volatile noexcept;
- T load(memory_order m = memory_order_seq_cst) const noexcept;
- operator T() const volatile noexcept;
- operator T() const noexcept;
- T exchange(T desr, memory_order m = memory_order_seq_cst) volatile noexcept;
- T exchange(T desr, memory_order m = memory_order_seq_cst) noexcept;
- bool compare_exchange_weak(T& expc, T desr,
- memory_order s, memory_order f) volatile noexcept;
- bool compare_exchange_weak(T& expc, T desr, memory_order s, memory_order f) noexcept;
- bool compare_exchange_strong(T& expc, T desr,
- memory_order s, memory_order f) volatile noexcept;
- bool compare_exchange_strong(T& expc, T desr,
- memory_order s, memory_order f) noexcept;
- bool compare_exchange_weak(T& expc, T desr,
- memory_order m = memory_order_seq_cst) volatile noexcept;
- bool compare_exchange_weak(T& expc, T desr,
- memory_order m = memory_order_seq_cst) noexcept;
- bool compare_exchange_strong(T& expc, T desr,
- memory_order m = memory_order_seq_cst) volatile noexcept;
- bool compare_exchange_strong(T& expc, T desr,
- memory_order m = memory_order_seq_cst) noexcept;
-
- atomic() noexcept = default;
- constexpr atomic(T desr) noexcept;
- atomic(const atomic&) = delete;
- atomic& operator=(const atomic&) = delete;
- atomic& operator=(const atomic&) volatile = delete;
- T operator=(T) volatile noexcept;
- T operator=(T) noexcept;
-};
-
-template <>
-struct atomic<integral>
-{
- static constexpr bool is_always_lock_free;
- bool is_lock_free() const volatile noexcept;
- bool is_lock_free() const noexcept;
- void store(integral desr, memory_order m = memory_order_seq_cst) volatile noexcept;
- void store(integral desr, memory_order m = memory_order_seq_cst) noexcept;
- integral load(memory_order m = memory_order_seq_cst) const volatile noexcept;
- integral load(memory_order m = memory_order_seq_cst) const noexcept;
- operator integral() const volatile noexcept;
- operator integral() const noexcept;
- integral exchange(integral desr,
- memory_order m = memory_order_seq_cst) volatile noexcept;
- integral exchange(integral desr, memory_order m = memory_order_seq_cst) noexcept;
- bool compare_exchange_weak(integral& expc, integral desr,
- memory_order s, memory_order f) volatile noexcept;
- bool compare_exchange_weak(integral& expc, integral desr,
- memory_order s, memory_order f) noexcept;
- bool compare_exchange_strong(integral& expc, integral desr,
- memory_order s, memory_order f) volatile noexcept;
- bool compare_exchange_strong(integral& expc, integral desr,
- memory_order s, memory_order f) noexcept;
- bool compare_exchange_weak(integral& expc, integral desr,
- memory_order m = memory_order_seq_cst) volatile noexcept;
- bool compare_exchange_weak(integral& expc, integral desr,
- memory_order m = memory_order_seq_cst) noexcept;
- bool compare_exchange_strong(integral& expc, integral desr,
- memory_order m = memory_order_seq_cst) volatile noexcept;
- bool compare_exchange_strong(integral& expc, integral desr,
- memory_order m = memory_order_seq_cst) noexcept;
-
- integral
- fetch_add(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
- integral fetch_add(integral op, memory_order m = memory_order_seq_cst) noexcept;
- integral
- fetch_sub(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
- integral fetch_sub(integral op, memory_order m = memory_order_seq_cst) noexcept;
- integral
- fetch_and(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
- integral fetch_and(integral op, memory_order m = memory_order_seq_cst) noexcept;
- integral
- fetch_or(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
- integral fetch_or(integral op, memory_order m = memory_order_seq_cst) noexcept;
- integral
- fetch_xor(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
- integral fetch_xor(integral op, memory_order m = memory_order_seq_cst) noexcept;
-
- atomic() noexcept = default;
- constexpr atomic(integral desr) noexcept;
- atomic(const atomic&) = delete;
- atomic& operator=(const atomic&) = delete;
- atomic& operator=(const atomic&) volatile = delete;
- integral operator=(integral desr) volatile noexcept;
- integral operator=(integral desr) noexcept;
-
- integral operator++(int) volatile noexcept;
- integral operator++(int) noexcept;
- integral operator--(int) volatile noexcept;
- integral operator--(int) noexcept;
- integral operator++() volatile noexcept;
- integral operator++() noexcept;
- integral operator--() volatile noexcept;
- integral operator--() noexcept;
- integral operator+=(integral op) volatile noexcept;
- integral operator+=(integral op) noexcept;
- integral operator-=(integral op) volatile noexcept;
- integral operator-=(integral op) noexcept;
- integral operator&=(integral op) volatile noexcept;
- integral operator&=(integral op) noexcept;
- integral operator|=(integral op) volatile noexcept;
- integral operator|=(integral op) noexcept;
- integral operator^=(integral op) volatile noexcept;
- integral operator^=(integral op) noexcept;
-};
-
-template <class T>
-struct atomic<T*>
-{
- static constexpr bool is_always_lock_free;
- bool is_lock_free() const volatile noexcept;
- bool is_lock_free() const noexcept;
- void store(T* desr, memory_order m = memory_order_seq_cst) volatile noexcept;
- void store(T* desr, memory_order m = memory_order_seq_cst) noexcept;
- T* load(memory_order m = memory_order_seq_cst) const volatile noexcept;
- T* load(memory_order m = memory_order_seq_cst) const noexcept;
- operator T*() const volatile noexcept;
- operator T*() const noexcept;
- T* exchange(T* desr, memory_order m = memory_order_seq_cst) volatile noexcept;
- T* exchange(T* desr, memory_order m = memory_order_seq_cst) noexcept;
- bool compare_exchange_weak(T*& expc, T* desr,
- memory_order s, memory_order f) volatile noexcept;
- bool compare_exchange_weak(T*& expc, T* desr,
- memory_order s, memory_order f) noexcept;
- bool compare_exchange_strong(T*& expc, T* desr,
- memory_order s, memory_order f) volatile noexcept;
- bool compare_exchange_strong(T*& expc, T* desr,
- memory_order s, memory_order f) noexcept;
- bool compare_exchange_weak(T*& expc, T* desr,
- memory_order m = memory_order_seq_cst) volatile noexcept;
- bool compare_exchange_weak(T*& expc, T* desr,
- memory_order m = memory_order_seq_cst) noexcept;
- bool compare_exchange_strong(T*& expc, T* desr,
- memory_order m = memory_order_seq_cst) volatile noexcept;
- bool compare_exchange_strong(T*& expc, T* desr,
- memory_order m = memory_order_seq_cst) noexcept;
- T* fetch_add(ptrdiff_t op, memory_order m = memory_order_seq_cst) volatile noexcept;
- T* fetch_add(ptrdiff_t op, memory_order m = memory_order_seq_cst) noexcept;
- T* fetch_sub(ptrdiff_t op, memory_order m = memory_order_seq_cst) volatile noexcept;
- T* fetch_sub(ptrdiff_t op, memory_order m = memory_order_seq_cst) noexcept;
-
- atomic() noexcept = default;
- constexpr atomic(T* desr) noexcept;
- atomic(const atomic&) = delete;
- atomic& operator=(const atomic&) = delete;
- atomic& operator=(const atomic&) volatile = delete;
-
- T* operator=(T*) volatile noexcept;
- T* operator=(T*) noexcept;
- T* operator++(int) volatile noexcept;
- T* operator++(int) noexcept;
- T* operator--(int) volatile noexcept;
- T* operator--(int) noexcept;
- T* operator++() volatile noexcept;
- T* operator++() noexcept;
- T* operator--() volatile noexcept;
- T* operator--() noexcept;
- T* operator+=(ptrdiff_t op) volatile noexcept;
- T* operator+=(ptrdiff_t op) noexcept;
- T* operator-=(ptrdiff_t op) volatile noexcept;
- T* operator-=(ptrdiff_t op) noexcept;
-};
-
-
-template <class T>
- bool
- atomic_is_lock_free(const volatile atomic<T>* obj) noexcept;
-
-template <class T>
- bool
- atomic_is_lock_free(const atomic<T>* obj) noexcept;
-
-template <class T>
- void
- atomic_init(volatile atomic<T>* obj, T desr) noexcept;
-
-template <class T>
- void
- atomic_init(atomic<T>* obj, T desr) noexcept;
-
-template <class T>
- void
- atomic_store(volatile atomic<T>* obj, T desr) noexcept;
-
-template <class T>
- void
- atomic_store(atomic<T>* obj, T desr) noexcept;
-
-template <class T>
- void
- atomic_store_explicit(volatile atomic<T>* obj, T desr, memory_order m) noexcept;
-
-template <class T>
- void
- atomic_store_explicit(atomic<T>* obj, T desr, memory_order m) noexcept;
-
-template <class T>
- T
- atomic_load(const volatile atomic<T>* obj) noexcept;
-
-template <class T>
- T
- atomic_load(const atomic<T>* obj) noexcept;
-
-template <class T>
- T
- atomic_load_explicit(const volatile atomic<T>* obj, memory_order m) noexcept;
-
-template <class T>
- T
- atomic_load_explicit(const atomic<T>* obj, memory_order m) noexcept;
-
-template <class T>
- T
- atomic_exchange(volatile atomic<T>* obj, T desr) noexcept;
-
-template <class T>
- T
- atomic_exchange(atomic<T>* obj, T desr) noexcept;
-
-template <class T>
- T
- atomic_exchange_explicit(volatile atomic<T>* obj, T desr, memory_order m) noexcept;
-
-template <class T>
- T
- atomic_exchange_explicit(atomic<T>* obj, T desr, memory_order m) noexcept;
-
-template <class T>
- bool
- atomic_compare_exchange_weak(volatile atomic<T>* obj, T* expc, T desr) noexcept;
-
-template <class T>
- bool
- atomic_compare_exchange_weak(atomic<T>* obj, T* expc, T desr) noexcept;
-
-template <class T>
- bool
- atomic_compare_exchange_strong(volatile atomic<T>* obj, T* expc, T desr) noexcept;
-
-template <class T>
- bool
- atomic_compare_exchange_strong(atomic<T>* obj, T* expc, T desr) noexcept;
-
-template <class T>
- bool
- atomic_compare_exchange_weak_explicit(volatile atomic<T>* obj, T* expc,
- T desr,
- memory_order s, memory_order f) noexcept;
-
-template <class T>
- bool
- atomic_compare_exchange_weak_explicit(atomic<T>* obj, T* expc, T desr,
- memory_order s, memory_order f) noexcept;
-
-template <class T>
- bool
- atomic_compare_exchange_strong_explicit(volatile atomic<T>* obj,
- T* expc, T desr,
- memory_order s, memory_order f) noexcept;
-
-template <class T>
- bool
- atomic_compare_exchange_strong_explicit(atomic<T>* obj, T* expc,
- T desr,
- memory_order s, memory_order f) noexcept;
-
-template <class Integral>
- Integral
- atomic_fetch_add(volatile atomic<Integral>* obj, Integral op) noexcept;
-
-template <class Integral>
- Integral
- atomic_fetch_add(atomic<Integral>* obj, Integral op) noexcept;
-
-template <class Integral>
- Integral
- atomic_fetch_add_explicit(volatile atomic<Integral>* obj, Integral op,
- memory_order m) noexcept;
-template <class Integral>
- Integral
- atomic_fetch_add_explicit(atomic<Integral>* obj, Integral op,
- memory_order m) noexcept;
-template <class Integral>
- Integral
- atomic_fetch_sub(volatile atomic<Integral>* obj, Integral op) noexcept;
-
-template <class Integral>
- Integral
- atomic_fetch_sub(atomic<Integral>* obj, Integral op) noexcept;
-
-template <class Integral>
- Integral
- atomic_fetch_sub_explicit(volatile atomic<Integral>* obj, Integral op,
- memory_order m) noexcept;
-template <class Integral>
- Integral
- atomic_fetch_sub_explicit(atomic<Integral>* obj, Integral op,
- memory_order m) noexcept;
-template <class Integral>
- Integral
- atomic_fetch_and(volatile atomic<Integral>* obj, Integral op) noexcept;
-
-template <class Integral>
- Integral
- atomic_fetch_and(atomic<Integral>* obj, Integral op) noexcept;
-
-template <class Integral>
- Integral
- atomic_fetch_and_explicit(volatile atomic<Integral>* obj, Integral op,
- memory_order m) noexcept;
-template <class Integral>
- Integral
- atomic_fetch_and_explicit(atomic<Integral>* obj, Integral op,
- memory_order m) noexcept;
-template <class Integral>
- Integral
- atomic_fetch_or(volatile atomic<Integral>* obj, Integral op) noexcept;
-
-template <class Integral>
- Integral
- atomic_fetch_or(atomic<Integral>* obj, Integral op) noexcept;
-
-template <class Integral>
- Integral
- atomic_fetch_or_explicit(volatile atomic<Integral>* obj, Integral op,
- memory_order m) noexcept;
-template <class Integral>
- Integral
- atomic_fetch_or_explicit(atomic<Integral>* obj, Integral op,
- memory_order m) noexcept;
-template <class Integral>
- Integral
- atomic_fetch_xor(volatile atomic<Integral>* obj, Integral op) noexcept;
-
-template <class Integral>
- Integral
- atomic_fetch_xor(atomic<Integral>* obj, Integral op) noexcept;
-
-template <class Integral>
- Integral
- atomic_fetch_xor_explicit(volatile atomic<Integral>* obj, Integral op,
- memory_order m) noexcept;
-template <class Integral>
- Integral
- atomic_fetch_xor_explicit(atomic<Integral>* obj, Integral op,
- memory_order m) noexcept;
-
-template <class T>
- T*
- atomic_fetch_add(volatile atomic<T*>* obj, ptrdiff_t op) noexcept;
-
-template <class T>
- T*
- atomic_fetch_add(atomic<T*>* obj, ptrdiff_t op) noexcept;
-
-template <class T>
- T*
- atomic_fetch_add_explicit(volatile atomic<T*>* obj, ptrdiff_t op,
- memory_order m) noexcept;
-template <class T>
- T*
- atomic_fetch_add_explicit(atomic<T*>* obj, ptrdiff_t op, memory_order m) noexcept;
-
-template <class T>
- T*
- atomic_fetch_sub(volatile atomic<T*>* obj, ptrdiff_t op) noexcept;
-
-template <class T>
- T*
- atomic_fetch_sub(atomic<T*>* obj, ptrdiff_t op) noexcept;
-
-template <class T>
- T*
- atomic_fetch_sub_explicit(volatile atomic<T*>* obj, ptrdiff_t op,
- memory_order m) noexcept;
-template <class T>
- T*
- atomic_fetch_sub_explicit(atomic<T*>* obj, ptrdiff_t op, memory_order m) noexcept;
-
-// Atomics for standard typedef types
-
-typedef atomic<bool> atomic_bool;
-typedef atomic<char> atomic_char;
-typedef atomic<signed char> atomic_schar;
-typedef atomic<unsigned char> atomic_uchar;
-typedef atomic<short> atomic_short;
-typedef atomic<unsigned short> atomic_ushort;
-typedef atomic<int> atomic_int;
-typedef atomic<unsigned int> atomic_uint;
-typedef atomic<long> atomic_long;
-typedef atomic<unsigned long> atomic_ulong;
-typedef atomic<long long> atomic_llong;
-typedef atomic<unsigned long long> atomic_ullong;
-typedef atomic<char16_t> atomic_char16_t;
-typedef atomic<char32_t> atomic_char32_t;
-typedef atomic<wchar_t> atomic_wchar_t;
-
-typedef atomic<int_least8_t> atomic_int_least8_t;
-typedef atomic<uint_least8_t> atomic_uint_least8_t;
-typedef atomic<int_least16_t> atomic_int_least16_t;
-typedef atomic<uint_least16_t> atomic_uint_least16_t;
-typedef atomic<int_least32_t> atomic_int_least32_t;
-typedef atomic<uint_least32_t> atomic_uint_least32_t;
-typedef atomic<int_least64_t> atomic_int_least64_t;
-typedef atomic<uint_least64_t> atomic_uint_least64_t;
-
-typedef atomic<int_fast8_t> atomic_int_fast8_t;
-typedef atomic<uint_fast8_t> atomic_uint_fast8_t;
-typedef atomic<int_fast16_t> atomic_int_fast16_t;
-typedef atomic<uint_fast16_t> atomic_uint_fast16_t;
-typedef atomic<int_fast32_t> atomic_int_fast32_t;
-typedef atomic<uint_fast32_t> atomic_uint_fast32_t;
-typedef atomic<int_fast64_t> atomic_int_fast64_t;
-typedef atomic<uint_fast64_t> atomic_uint_fast64_t;
-
-typedef atomic<int8_t> atomic_int8_t;
-typedef atomic<uint8_t> atomic_uint8_t;
-typedef atomic<int16_t> atomic_int16_t;
-typedef atomic<uint16_t> atomic_uint16_t;
-typedef atomic<int32_t> atomic_int32_t;
-typedef atomic<uint32_t> atomic_uint32_t;
-typedef atomic<int64_t> atomic_int64_t;
-typedef atomic<uint64_t> atomic_uint64_t;
-
-typedef atomic<intptr_t> atomic_intptr_t;
-typedef atomic<uintptr_t> atomic_uintptr_t;
-typedef atomic<size_t> atomic_size_t;
-typedef atomic<ptrdiff_t> atomic_ptrdiff_t;
-typedef atomic<intmax_t> atomic_intmax_t;
-typedef atomic<uintmax_t> atomic_uintmax_t;
-
-// fences
-
-void atomic_thread_fence(memory_order m) noexcept;
-void atomic_signal_fence(memory_order m) noexcept;
-
-} // std
-
-*/
-
-#include <__config>
-#include <cstddef>
-#include <cstdint>
-#include <type_traits>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#ifdef _LIBCPP_HAS_NO_THREADS
-#error <atomic> is not supported on this single threaded system
-#endif
-#if !defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_GCC_ATOMIC_IMP)
-#error <atomic> is not implemented
-#endif
-#ifdef kill_dependency
-#error C++ standard library is incompatible with <stdatomic.h>
-#endif
-
-#define _LIBCPP_CHECK_STORE_MEMORY_ORDER(__m) \
- _LIBCPP_DIAGNOSE_WARNING(__m == memory_order_consume || \
- __m == memory_order_acquire || \
- __m == memory_order_acq_rel, \
- "memory order argument to atomic operation is invalid")
-
-#define _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m) \
- _LIBCPP_DIAGNOSE_WARNING(__m == memory_order_release || \
- __m == memory_order_acq_rel, \
- "memory order argument to atomic operation is invalid")
-
-#define _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__m, __f) \
- _LIBCPP_DIAGNOSE_WARNING(__f == memory_order_release || \
- __f == memory_order_acq_rel, \
- "memory order argument to atomic operation is invalid")
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-typedef enum memory_order
-{
- memory_order_relaxed, memory_order_consume, memory_order_acquire,
- memory_order_release, memory_order_acq_rel, memory_order_seq_cst
-} memory_order;
-
-#if defined(_LIBCPP_HAS_GCC_ATOMIC_IMP)
-namespace __gcc_atomic {
-template <typename _Tp>
-struct __gcc_atomic_t {
-
-#if _GNUC_VER >= 501
- static_assert(is_trivially_copyable<_Tp>::value,
- "std::atomic<Tp> requires that 'Tp' be a trivially copyable type");
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
-#ifndef _LIBCPP_CXX03_LANG
- __gcc_atomic_t() _NOEXCEPT = default;
-#else
- __gcc_atomic_t() _NOEXCEPT : __a_value() {}
-#endif // _LIBCPP_CXX03_LANG
- _LIBCPP_CONSTEXPR explicit __gcc_atomic_t(_Tp value) _NOEXCEPT
- : __a_value(value) {}
- _Tp __a_value;
-};
-#define _Atomic(x) __gcc_atomic::__gcc_atomic_t<x>
-
-template <typename _Tp> _Tp __create();
-
-template <typename _Tp, typename _Td>
-typename enable_if<sizeof(_Tp()->__a_value = __create<_Td>()), char>::type
- __test_atomic_assignable(int);
-template <typename _Tp, typename _Up>
-__two __test_atomic_assignable(...);
-
-template <typename _Tp, typename _Td>
-struct __can_assign {
- static const bool value =
- sizeof(__test_atomic_assignable<_Tp, _Td>(1)) == sizeof(char);
-};
-
-static inline _LIBCPP_CONSTEXPR int __to_gcc_order(memory_order __order) {
- // Avoid switch statement to make this a constexpr.
- return __order == memory_order_relaxed ? __ATOMIC_RELAXED:
- (__order == memory_order_acquire ? __ATOMIC_ACQUIRE:
- (__order == memory_order_release ? __ATOMIC_RELEASE:
- (__order == memory_order_seq_cst ? __ATOMIC_SEQ_CST:
- (__order == memory_order_acq_rel ? __ATOMIC_ACQ_REL:
- __ATOMIC_CONSUME))));
-}
-
-static inline _LIBCPP_CONSTEXPR int __to_gcc_failure_order(memory_order __order) {
- // Avoid switch statement to make this a constexpr.
- return __order == memory_order_relaxed ? __ATOMIC_RELAXED:
- (__order == memory_order_acquire ? __ATOMIC_ACQUIRE:
- (__order == memory_order_release ? __ATOMIC_RELAXED:
- (__order == memory_order_seq_cst ? __ATOMIC_SEQ_CST:
- (__order == memory_order_acq_rel ? __ATOMIC_ACQUIRE:
- __ATOMIC_CONSUME))));
-}
-
-} // namespace __gcc_atomic
-
-template <typename _Tp>
-static inline
-typename enable_if<
- __gcc_atomic::__can_assign<volatile _Atomic(_Tp)*, _Tp>::value>::type
-__c11_atomic_init(volatile _Atomic(_Tp)* __a, _Tp __val) {
- __a->__a_value = __val;
-}
-
-template <typename _Tp>
-static inline
-typename enable_if<
- !__gcc_atomic::__can_assign<volatile _Atomic(_Tp)*, _Tp>::value &&
- __gcc_atomic::__can_assign< _Atomic(_Tp)*, _Tp>::value>::type
-__c11_atomic_init(volatile _Atomic(_Tp)* __a, _Tp __val) {
- // [atomics.types.generic]p1 guarantees _Tp is trivially copyable. Because
- // the default operator= in an object is not volatile, a byte-by-byte copy
- // is required.
- volatile char* to = reinterpret_cast<volatile char*>(&__a->__a_value);
- volatile char* end = to + sizeof(_Tp);
- char* from = reinterpret_cast<char*>(&__val);
- while (to != end) {
- *to++ = *from++;
- }
-}
-
-template <typename _Tp>
-static inline void __c11_atomic_init(_Atomic(_Tp)* __a, _Tp __val) {
- __a->__a_value = __val;
-}
-
-static inline void __c11_atomic_thread_fence(memory_order __order) {
- __atomic_thread_fence(__gcc_atomic::__to_gcc_order(__order));
-}
-
-static inline void __c11_atomic_signal_fence(memory_order __order) {
- __atomic_signal_fence(__gcc_atomic::__to_gcc_order(__order));
-}
-
-template <typename _Tp>
-static inline void __c11_atomic_store(volatile _Atomic(_Tp)* __a, _Tp __val,
- memory_order __order) {
- return __atomic_store(&__a->__a_value, &__val,
- __gcc_atomic::__to_gcc_order(__order));
-}
-
-template <typename _Tp>
-static inline void __c11_atomic_store(_Atomic(_Tp)* __a, _Tp __val,
- memory_order __order) {
- __atomic_store(&__a->__a_value, &__val,
- __gcc_atomic::__to_gcc_order(__order));
-}
-
-template <typename _Tp>
-static inline _Tp __c11_atomic_load(const volatile _Atomic(_Tp)* __a,
- memory_order __order) {
- _Tp __ret;
- __atomic_load(&__a->__a_value, &__ret,
- __gcc_atomic::__to_gcc_order(__order));
- return __ret;
-}
-
-template <typename _Tp>
-static inline _Tp __c11_atomic_load(const _Atomic(_Tp)* __a, memory_order __order) {
- _Tp __ret;
- __atomic_load(&__a->__a_value, &__ret,
- __gcc_atomic::__to_gcc_order(__order));
- return __ret;
-}
-
-template <typename _Tp>
-static inline _Tp __c11_atomic_exchange(volatile _Atomic(_Tp)* __a,
- _Tp __value, memory_order __order) {
- _Tp __ret;
- __atomic_exchange(&__a->__a_value, &__value, &__ret,
- __gcc_atomic::__to_gcc_order(__order));
- return __ret;
-}
-
-template <typename _Tp>
-static inline _Tp __c11_atomic_exchange(_Atomic(_Tp)* __a, _Tp __value,
- memory_order __order) {
- _Tp __ret;
- __atomic_exchange(&__a->__a_value, &__value, &__ret,
- __gcc_atomic::__to_gcc_order(__order));
- return __ret;
-}
-
-template <typename _Tp>
-static inline bool __c11_atomic_compare_exchange_strong(
- volatile _Atomic(_Tp)* __a, _Tp* __expected, _Tp __value,
- memory_order __success, memory_order __failure) {
- return __atomic_compare_exchange(&__a->__a_value, __expected, &__value,
- false,
- __gcc_atomic::__to_gcc_order(__success),
- __gcc_atomic::__to_gcc_failure_order(__failure));
-}
-
-template <typename _Tp>
-static inline bool __c11_atomic_compare_exchange_strong(
- _Atomic(_Tp)* __a, _Tp* __expected, _Tp __value, memory_order __success,
- memory_order __failure) {
- return __atomic_compare_exchange(&__a->__a_value, __expected, &__value,
- false,
- __gcc_atomic::__to_gcc_order(__success),
- __gcc_atomic::__to_gcc_failure_order(__failure));
-}
-
-template <typename _Tp>
-static inline bool __c11_atomic_compare_exchange_weak(
- volatile _Atomic(_Tp)* __a, _Tp* __expected, _Tp __value,
- memory_order __success, memory_order __failure) {
- return __atomic_compare_exchange(&__a->__a_value, __expected, &__value,
- true,
- __gcc_atomic::__to_gcc_order(__success),
- __gcc_atomic::__to_gcc_failure_order(__failure));
-}
-
-template <typename _Tp>
-static inline bool __c11_atomic_compare_exchange_weak(
- _Atomic(_Tp)* __a, _Tp* __expected, _Tp __value, memory_order __success,
- memory_order __failure) {
- return __atomic_compare_exchange(&__a->__a_value, __expected, &__value,
- true,
- __gcc_atomic::__to_gcc_order(__success),
- __gcc_atomic::__to_gcc_failure_order(__failure));
-}
-
-template <typename _Tp>
-struct __skip_amt { enum {value = 1}; };
-
-template <typename _Tp>
-struct __skip_amt<_Tp*> { enum {value = sizeof(_Tp)}; };
-
-// FIXME: Haven't figured out what the spec says about using arrays with
-// atomic_fetch_add. Force a failure rather than creating bad behavior.
-template <typename _Tp>
-struct __skip_amt<_Tp[]> { };
-template <typename _Tp, int n>
-struct __skip_amt<_Tp[n]> { };
-
-template <typename _Tp, typename _Td>
-static inline _Tp __c11_atomic_fetch_add(volatile _Atomic(_Tp)* __a,
- _Td __delta, memory_order __order) {
- return __atomic_fetch_add(&__a->__a_value, __delta * __skip_amt<_Tp>::value,
- __gcc_atomic::__to_gcc_order(__order));
-}
-
-template <typename _Tp, typename _Td>
-static inline _Tp __c11_atomic_fetch_add(_Atomic(_Tp)* __a, _Td __delta,
- memory_order __order) {
- return __atomic_fetch_add(&__a->__a_value, __delta * __skip_amt<_Tp>::value,
- __gcc_atomic::__to_gcc_order(__order));
-}
-
-template <typename _Tp, typename _Td>
-static inline _Tp __c11_atomic_fetch_sub(volatile _Atomic(_Tp)* __a,
- _Td __delta, memory_order __order) {
- return __atomic_fetch_sub(&__a->__a_value, __delta * __skip_amt<_Tp>::value,
- __gcc_atomic::__to_gcc_order(__order));
-}
-
-template <typename _Tp, typename _Td>
-static inline _Tp __c11_atomic_fetch_sub(_Atomic(_Tp)* __a, _Td __delta,
- memory_order __order) {
- return __atomic_fetch_sub(&__a->__a_value, __delta * __skip_amt<_Tp>::value,
- __gcc_atomic::__to_gcc_order(__order));
-}
-
-template <typename _Tp>
-static inline _Tp __c11_atomic_fetch_and(volatile _Atomic(_Tp)* __a,
- _Tp __pattern, memory_order __order) {
- return __atomic_fetch_and(&__a->__a_value, __pattern,
- __gcc_atomic::__to_gcc_order(__order));
-}
-
-template <typename _Tp>
-static inline _Tp __c11_atomic_fetch_and(_Atomic(_Tp)* __a,
- _Tp __pattern, memory_order __order) {
- return __atomic_fetch_and(&__a->__a_value, __pattern,
- __gcc_atomic::__to_gcc_order(__order));
-}
-
-template <typename _Tp>
-static inline _Tp __c11_atomic_fetch_or(volatile _Atomic(_Tp)* __a,
- _Tp __pattern, memory_order __order) {
- return __atomic_fetch_or(&__a->__a_value, __pattern,
- __gcc_atomic::__to_gcc_order(__order));
-}
-
-template <typename _Tp>
-static inline _Tp __c11_atomic_fetch_or(_Atomic(_Tp)* __a, _Tp __pattern,
- memory_order __order) {
- return __atomic_fetch_or(&__a->__a_value, __pattern,
- __gcc_atomic::__to_gcc_order(__order));
-}
-
-template <typename _Tp>
-static inline _Tp __c11_atomic_fetch_xor(volatile _Atomic(_Tp)* __a,
- _Tp __pattern, memory_order __order) {
- return __atomic_fetch_xor(&__a->__a_value, __pattern,
- __gcc_atomic::__to_gcc_order(__order));
-}
-
-template <typename _Tp>
-static inline _Tp __c11_atomic_fetch_xor(_Atomic(_Tp)* __a, _Tp __pattern,
- memory_order __order) {
- return __atomic_fetch_xor(&__a->__a_value, __pattern,
- __gcc_atomic::__to_gcc_order(__order));
-}
-#endif // _LIBCPP_HAS_GCC_ATOMIC_IMP
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-kill_dependency(_Tp __y) _NOEXCEPT
-{
- return __y;
-}
-
-#if defined(__CLANG_ATOMIC_BOOL_LOCK_FREE)
-# define ATOMIC_BOOL_LOCK_FREE __CLANG_ATOMIC_BOOL_LOCK_FREE
-# define ATOMIC_CHAR_LOCK_FREE __CLANG_ATOMIC_CHAR_LOCK_FREE
-# define ATOMIC_CHAR16_T_LOCK_FREE __CLANG_ATOMIC_CHAR16_T_LOCK_FREE
-# define ATOMIC_CHAR32_T_LOCK_FREE __CLANG_ATOMIC_CHAR32_T_LOCK_FREE
-# define ATOMIC_WCHAR_T_LOCK_FREE __CLANG_ATOMIC_WCHAR_T_LOCK_FREE
-# define ATOMIC_SHORT_LOCK_FREE __CLANG_ATOMIC_SHORT_LOCK_FREE
-# define ATOMIC_INT_LOCK_FREE __CLANG_ATOMIC_INT_LOCK_FREE
-# define ATOMIC_LONG_LOCK_FREE __CLANG_ATOMIC_LONG_LOCK_FREE
-# define ATOMIC_LLONG_LOCK_FREE __CLANG_ATOMIC_LLONG_LOCK_FREE
-# define ATOMIC_POINTER_LOCK_FREE __CLANG_ATOMIC_POINTER_LOCK_FREE
-#else
-# define ATOMIC_BOOL_LOCK_FREE __GCC_ATOMIC_BOOL_LOCK_FREE
-# define ATOMIC_CHAR_LOCK_FREE __GCC_ATOMIC_CHAR_LOCK_FREE
-# define ATOMIC_CHAR16_T_LOCK_FREE __GCC_ATOMIC_CHAR16_T_LOCK_FREE
-# define ATOMIC_CHAR32_T_LOCK_FREE __GCC_ATOMIC_CHAR32_T_LOCK_FREE
-# define ATOMIC_WCHAR_T_LOCK_FREE __GCC_ATOMIC_WCHAR_T_LOCK_FREE
-# define ATOMIC_SHORT_LOCK_FREE __GCC_ATOMIC_SHORT_LOCK_FREE
-# define ATOMIC_INT_LOCK_FREE __GCC_ATOMIC_INT_LOCK_FREE
-# define ATOMIC_LONG_LOCK_FREE __GCC_ATOMIC_LONG_LOCK_FREE
-# define ATOMIC_LLONG_LOCK_FREE __GCC_ATOMIC_LLONG_LOCK_FREE
-# define ATOMIC_POINTER_LOCK_FREE __GCC_ATOMIC_POINTER_LOCK_FREE
-#endif
-
-// general atomic<T>
-
-template <class _Tp, bool = is_integral<_Tp>::value && !is_same<_Tp, bool>::value>
-struct __atomic_base // false
-{
- mutable _Atomic(_Tp) __a_;
-
-#if defined(__cpp_lib_atomic_is_always_lock_free)
- static _LIBCPP_CONSTEXPR bool is_always_lock_free = __atomic_always_lock_free(sizeof(__a_), 0);
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_lock_free() const volatile _NOEXCEPT
- {
-#if defined(_LIBCPP_HAS_C_ATOMIC_IMP)
- return __c11_atomic_is_lock_free(sizeof(_Tp));
-#else
- return __atomic_is_lock_free(sizeof(_Tp), 0);
-#endif
- }
- _LIBCPP_INLINE_VISIBILITY
- bool is_lock_free() const _NOEXCEPT
- {return static_cast<__atomic_base const volatile*>(this)->is_lock_free();}
- _LIBCPP_INLINE_VISIBILITY
- void store(_Tp __d, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
- _LIBCPP_CHECK_STORE_MEMORY_ORDER(__m)
- {__c11_atomic_store(&__a_, __d, __m);}
- _LIBCPP_INLINE_VISIBILITY
- void store(_Tp __d, memory_order __m = memory_order_seq_cst) _NOEXCEPT
- _LIBCPP_CHECK_STORE_MEMORY_ORDER(__m)
- {__c11_atomic_store(&__a_, __d, __m);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp load(memory_order __m = memory_order_seq_cst) const volatile _NOEXCEPT
- _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m)
- {return __c11_atomic_load(&__a_, __m);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp load(memory_order __m = memory_order_seq_cst) const _NOEXCEPT
- _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m)
- {return __c11_atomic_load(&__a_, __m);}
- _LIBCPP_INLINE_VISIBILITY
- operator _Tp() const volatile _NOEXCEPT {return load();}
- _LIBCPP_INLINE_VISIBILITY
- operator _Tp() const _NOEXCEPT {return load();}
- _LIBCPP_INLINE_VISIBILITY
- _Tp exchange(_Tp __d, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
- {return __c11_atomic_exchange(&__a_, __d, __m);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp exchange(_Tp __d, memory_order __m = memory_order_seq_cst) _NOEXCEPT
- {return __c11_atomic_exchange(&__a_, __d, __m);}
- _LIBCPP_INLINE_VISIBILITY
- bool compare_exchange_weak(_Tp& __e, _Tp __d,
- memory_order __s, memory_order __f) volatile _NOEXCEPT
- _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f)
- {return __c11_atomic_compare_exchange_weak(&__a_, &__e, __d, __s, __f);}
- _LIBCPP_INLINE_VISIBILITY
- bool compare_exchange_weak(_Tp& __e, _Tp __d,
- memory_order __s, memory_order __f) _NOEXCEPT
- _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f)
- {return __c11_atomic_compare_exchange_weak(&__a_, &__e, __d, __s, __f);}
- _LIBCPP_INLINE_VISIBILITY
- bool compare_exchange_strong(_Tp& __e, _Tp __d,
- memory_order __s, memory_order __f) volatile _NOEXCEPT
- _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f)
- {return __c11_atomic_compare_exchange_strong(&__a_, &__e, __d, __s, __f);}
- _LIBCPP_INLINE_VISIBILITY
- bool compare_exchange_strong(_Tp& __e, _Tp __d,
- memory_order __s, memory_order __f) _NOEXCEPT
- _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f)
- {return __c11_atomic_compare_exchange_strong(&__a_, &__e, __d, __s, __f);}
- _LIBCPP_INLINE_VISIBILITY
- bool compare_exchange_weak(_Tp& __e, _Tp __d,
- memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
- {return __c11_atomic_compare_exchange_weak(&__a_, &__e, __d, __m, __m);}
- _LIBCPP_INLINE_VISIBILITY
- bool compare_exchange_weak(_Tp& __e, _Tp __d,
- memory_order __m = memory_order_seq_cst) _NOEXCEPT
- {return __c11_atomic_compare_exchange_weak(&__a_, &__e, __d, __m, __m);}
- _LIBCPP_INLINE_VISIBILITY
- bool compare_exchange_strong(_Tp& __e, _Tp __d,
- memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
- {return __c11_atomic_compare_exchange_strong(&__a_, &__e, __d, __m, __m);}
- _LIBCPP_INLINE_VISIBILITY
- bool compare_exchange_strong(_Tp& __e, _Tp __d,
- memory_order __m = memory_order_seq_cst) _NOEXCEPT
- {return __c11_atomic_compare_exchange_strong(&__a_, &__e, __d, __m, __m);}
-
- _LIBCPP_INLINE_VISIBILITY
-#ifndef _LIBCPP_CXX03_LANG
- __atomic_base() _NOEXCEPT = default;
-#else
- __atomic_base() _NOEXCEPT : __a_() {}
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR __atomic_base(_Tp __d) _NOEXCEPT : __a_(__d) {}
-#ifndef _LIBCPP_CXX03_LANG
- __atomic_base(const __atomic_base&) = delete;
- __atomic_base& operator=(const __atomic_base&) = delete;
- __atomic_base& operator=(const __atomic_base&) volatile = delete;
-#else
-private:
- __atomic_base(const __atomic_base&);
- __atomic_base& operator=(const __atomic_base&);
- __atomic_base& operator=(const __atomic_base&) volatile;
-#endif
-};
-
-#if defined(__cpp_lib_atomic_is_always_lock_free)
-template <class _Tp, bool __b>
-_LIBCPP_CONSTEXPR bool __atomic_base<_Tp, __b>::is_always_lock_free;
-#endif
-
-// atomic<Integral>
-
-template <class _Tp>
-struct __atomic_base<_Tp, true>
- : public __atomic_base<_Tp, false>
-{
- typedef __atomic_base<_Tp, false> __base;
- _LIBCPP_INLINE_VISIBILITY
- __atomic_base() _NOEXCEPT _LIBCPP_DEFAULT
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR __atomic_base(_Tp __d) _NOEXCEPT : __base(__d) {}
-
- _LIBCPP_INLINE_VISIBILITY
- _Tp fetch_add(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
- {return __c11_atomic_fetch_add(&this->__a_, __op, __m);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp fetch_add(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
- {return __c11_atomic_fetch_add(&this->__a_, __op, __m);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp fetch_sub(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
- {return __c11_atomic_fetch_sub(&this->__a_, __op, __m);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp fetch_sub(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
- {return __c11_atomic_fetch_sub(&this->__a_, __op, __m);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp fetch_and(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
- {return __c11_atomic_fetch_and(&this->__a_, __op, __m);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp fetch_and(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
- {return __c11_atomic_fetch_and(&this->__a_, __op, __m);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp fetch_or(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
- {return __c11_atomic_fetch_or(&this->__a_, __op, __m);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp fetch_or(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
- {return __c11_atomic_fetch_or(&this->__a_, __op, __m);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp fetch_xor(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
- {return __c11_atomic_fetch_xor(&this->__a_, __op, __m);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp fetch_xor(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
- {return __c11_atomic_fetch_xor(&this->__a_, __op, __m);}
-
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator++(int) volatile _NOEXCEPT {return fetch_add(_Tp(1));}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator++(int) _NOEXCEPT {return fetch_add(_Tp(1));}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator--(int) volatile _NOEXCEPT {return fetch_sub(_Tp(1));}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator--(int) _NOEXCEPT {return fetch_sub(_Tp(1));}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator++() volatile _NOEXCEPT {return fetch_add(_Tp(1)) + _Tp(1);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator++() _NOEXCEPT {return fetch_add(_Tp(1)) + _Tp(1);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator--() volatile _NOEXCEPT {return fetch_sub(_Tp(1)) - _Tp(1);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator--() _NOEXCEPT {return fetch_sub(_Tp(1)) - _Tp(1);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator+=(_Tp __op) volatile _NOEXCEPT {return fetch_add(__op) + __op;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator+=(_Tp __op) _NOEXCEPT {return fetch_add(__op) + __op;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator-=(_Tp __op) volatile _NOEXCEPT {return fetch_sub(__op) - __op;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator-=(_Tp __op) _NOEXCEPT {return fetch_sub(__op) - __op;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator&=(_Tp __op) volatile _NOEXCEPT {return fetch_and(__op) & __op;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator&=(_Tp __op) _NOEXCEPT {return fetch_and(__op) & __op;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator|=(_Tp __op) volatile _NOEXCEPT {return fetch_or(__op) | __op;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator|=(_Tp __op) _NOEXCEPT {return fetch_or(__op) | __op;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator^=(_Tp __op) volatile _NOEXCEPT {return fetch_xor(__op) ^ __op;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator^=(_Tp __op) _NOEXCEPT {return fetch_xor(__op) ^ __op;}
-};
-
-// atomic<T>
-
-template <class _Tp>
-struct atomic
- : public __atomic_base<_Tp>
-{
- typedef __atomic_base<_Tp> __base;
- _LIBCPP_INLINE_VISIBILITY
- atomic() _NOEXCEPT _LIBCPP_DEFAULT
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR atomic(_Tp __d) _NOEXCEPT : __base(__d) {}
-
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator=(_Tp __d) volatile _NOEXCEPT
- {__base::store(__d); return __d;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator=(_Tp __d) _NOEXCEPT
- {__base::store(__d); return __d;}
-};
-
-// atomic<T*>
-
-template <class _Tp>
-struct atomic<_Tp*>
- : public __atomic_base<_Tp*>
-{
- typedef __atomic_base<_Tp*> __base;
- _LIBCPP_INLINE_VISIBILITY
- atomic() _NOEXCEPT _LIBCPP_DEFAULT
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR atomic(_Tp* __d) _NOEXCEPT : __base(__d) {}
-
- _LIBCPP_INLINE_VISIBILITY
- _Tp* operator=(_Tp* __d) volatile _NOEXCEPT
- {__base::store(__d); return __d;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp* operator=(_Tp* __d) _NOEXCEPT
- {__base::store(__d); return __d;}
-
- _LIBCPP_INLINE_VISIBILITY
- _Tp* fetch_add(ptrdiff_t __op, memory_order __m = memory_order_seq_cst)
- volatile _NOEXCEPT
- {return __c11_atomic_fetch_add(&this->__a_, __op, __m);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp* fetch_add(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
- {return __c11_atomic_fetch_add(&this->__a_, __op, __m);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp* fetch_sub(ptrdiff_t __op, memory_order __m = memory_order_seq_cst)
- volatile _NOEXCEPT
- {return __c11_atomic_fetch_sub(&this->__a_, __op, __m);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp* fetch_sub(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
- {return __c11_atomic_fetch_sub(&this->__a_, __op, __m);}
-
- _LIBCPP_INLINE_VISIBILITY
- _Tp* operator++(int) volatile _NOEXCEPT {return fetch_add(1);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp* operator++(int) _NOEXCEPT {return fetch_add(1);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp* operator--(int) volatile _NOEXCEPT {return fetch_sub(1);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp* operator--(int) _NOEXCEPT {return fetch_sub(1);}
- _LIBCPP_INLINE_VISIBILITY
- _Tp* operator++() volatile _NOEXCEPT {return fetch_add(1) + 1;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp* operator++() _NOEXCEPT {return fetch_add(1) + 1;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp* operator--() volatile _NOEXCEPT {return fetch_sub(1) - 1;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp* operator--() _NOEXCEPT {return fetch_sub(1) - 1;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp* operator+=(ptrdiff_t __op) volatile _NOEXCEPT {return fetch_add(__op) + __op;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp* operator+=(ptrdiff_t __op) _NOEXCEPT {return fetch_add(__op) + __op;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp* operator-=(ptrdiff_t __op) volatile _NOEXCEPT {return fetch_sub(__op) - __op;}
- _LIBCPP_INLINE_VISIBILITY
- _Tp* operator-=(ptrdiff_t __op) _NOEXCEPT {return fetch_sub(__op) - __op;}
-};
-
-// atomic_is_lock_free
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-atomic_is_lock_free(const volatile atomic<_Tp>* __o) _NOEXCEPT
-{
- return __o->is_lock_free();
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-atomic_is_lock_free(const atomic<_Tp>* __o) _NOEXCEPT
-{
- return __o->is_lock_free();
-}
-
-// atomic_init
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-atomic_init(volatile atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
-{
- __c11_atomic_init(&__o->__a_, __d);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-atomic_init(atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
-{
- __c11_atomic_init(&__o->__a_, __d);
-}
-
-// atomic_store
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-atomic_store(volatile atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
-{
- __o->store(__d);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-atomic_store(atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
-{
- __o->store(__d);
-}
-
-// atomic_store_explicit
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-atomic_store_explicit(volatile atomic<_Tp>* __o, _Tp __d, memory_order __m) _NOEXCEPT
- _LIBCPP_CHECK_STORE_MEMORY_ORDER(__m)
-{
- __o->store(__d, __m);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-atomic_store_explicit(atomic<_Tp>* __o, _Tp __d, memory_order __m) _NOEXCEPT
- _LIBCPP_CHECK_STORE_MEMORY_ORDER(__m)
-{
- __o->store(__d, __m);
-}
-
-// atomic_load
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-atomic_load(const volatile atomic<_Tp>* __o) _NOEXCEPT
-{
- return __o->load();
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-atomic_load(const atomic<_Tp>* __o) _NOEXCEPT
-{
- return __o->load();
-}
-
-// atomic_load_explicit
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-atomic_load_explicit(const volatile atomic<_Tp>* __o, memory_order __m) _NOEXCEPT
- _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m)
-{
- return __o->load(__m);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-atomic_load_explicit(const atomic<_Tp>* __o, memory_order __m) _NOEXCEPT
- _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m)
-{
- return __o->load(__m);
-}
-
-// atomic_exchange
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-atomic_exchange(volatile atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
-{
- return __o->exchange(__d);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-atomic_exchange(atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
-{
- return __o->exchange(__d);
-}
-
-// atomic_exchange_explicit
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-atomic_exchange_explicit(volatile atomic<_Tp>* __o, _Tp __d, memory_order __m) _NOEXCEPT
-{
- return __o->exchange(__d, __m);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-atomic_exchange_explicit(atomic<_Tp>* __o, _Tp __d, memory_order __m) _NOEXCEPT
-{
- return __o->exchange(__d, __m);
-}
-
-// atomic_compare_exchange_weak
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-atomic_compare_exchange_weak(volatile atomic<_Tp>* __o, _Tp* __e, _Tp __d) _NOEXCEPT
-{
- return __o->compare_exchange_weak(*__e, __d);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-atomic_compare_exchange_weak(atomic<_Tp>* __o, _Tp* __e, _Tp __d) _NOEXCEPT
-{
- return __o->compare_exchange_weak(*__e, __d);
-}
-
-// atomic_compare_exchange_strong
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-atomic_compare_exchange_strong(volatile atomic<_Tp>* __o, _Tp* __e, _Tp __d) _NOEXCEPT
-{
- return __o->compare_exchange_strong(*__e, __d);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-atomic_compare_exchange_strong(atomic<_Tp>* __o, _Tp* __e, _Tp __d) _NOEXCEPT
-{
- return __o->compare_exchange_strong(*__e, __d);
-}
-
-// atomic_compare_exchange_weak_explicit
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-atomic_compare_exchange_weak_explicit(volatile atomic<_Tp>* __o, _Tp* __e,
- _Tp __d,
- memory_order __s, memory_order __f) _NOEXCEPT
- _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f)
-{
- return __o->compare_exchange_weak(*__e, __d, __s, __f);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-atomic_compare_exchange_weak_explicit(atomic<_Tp>* __o, _Tp* __e, _Tp __d,
- memory_order __s, memory_order __f) _NOEXCEPT
- _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f)
-{
- return __o->compare_exchange_weak(*__e, __d, __s, __f);
-}
-
-// atomic_compare_exchange_strong_explicit
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-atomic_compare_exchange_strong_explicit(volatile atomic<_Tp>* __o,
- _Tp* __e, _Tp __d,
- memory_order __s, memory_order __f) _NOEXCEPT
- _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f)
-{
- return __o->compare_exchange_strong(*__e, __d, __s, __f);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-atomic_compare_exchange_strong_explicit(atomic<_Tp>* __o, _Tp* __e,
- _Tp __d,
- memory_order __s, memory_order __f) _NOEXCEPT
- _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f)
-{
- return __o->compare_exchange_strong(*__e, __d, __s, __f);
-}
-
-// atomic_fetch_add
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_add(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
-{
- return __o->fetch_add(__op);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_add(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
-{
- return __o->fetch_add(__op);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp*
-atomic_fetch_add(volatile atomic<_Tp*>* __o, ptrdiff_t __op) _NOEXCEPT
-{
- return __o->fetch_add(__op);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp*
-atomic_fetch_add(atomic<_Tp*>* __o, ptrdiff_t __op) _NOEXCEPT
-{
- return __o->fetch_add(__op);
-}
-
-// atomic_fetch_add_explicit
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_add_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
-{
- return __o->fetch_add(__op, __m);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_add_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
-{
- return __o->fetch_add(__op, __m);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp*
-atomic_fetch_add_explicit(volatile atomic<_Tp*>* __o, ptrdiff_t __op,
- memory_order __m) _NOEXCEPT
-{
- return __o->fetch_add(__op, __m);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp*
-atomic_fetch_add_explicit(atomic<_Tp*>* __o, ptrdiff_t __op, memory_order __m) _NOEXCEPT
-{
- return __o->fetch_add(__op, __m);
-}
-
-// atomic_fetch_sub
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_sub(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
-{
- return __o->fetch_sub(__op);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_sub(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
-{
- return __o->fetch_sub(__op);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp*
-atomic_fetch_sub(volatile atomic<_Tp*>* __o, ptrdiff_t __op) _NOEXCEPT
-{
- return __o->fetch_sub(__op);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp*
-atomic_fetch_sub(atomic<_Tp*>* __o, ptrdiff_t __op) _NOEXCEPT
-{
- return __o->fetch_sub(__op);
-}
-
-// atomic_fetch_sub_explicit
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_sub_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
-{
- return __o->fetch_sub(__op, __m);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_sub_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
-{
- return __o->fetch_sub(__op, __m);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp*
-atomic_fetch_sub_explicit(volatile atomic<_Tp*>* __o, ptrdiff_t __op,
- memory_order __m) _NOEXCEPT
-{
- return __o->fetch_sub(__op, __m);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp*
-atomic_fetch_sub_explicit(atomic<_Tp*>* __o, ptrdiff_t __op, memory_order __m) _NOEXCEPT
-{
- return __o->fetch_sub(__op, __m);
-}
-
-// atomic_fetch_and
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_and(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
-{
- return __o->fetch_and(__op);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_and(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
-{
- return __o->fetch_and(__op);
-}
-
-// atomic_fetch_and_explicit
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_and_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
-{
- return __o->fetch_and(__op, __m);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_and_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
-{
- return __o->fetch_and(__op, __m);
-}
-
-// atomic_fetch_or
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_or(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
-{
- return __o->fetch_or(__op);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_or(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
-{
- return __o->fetch_or(__op);
-}
-
-// atomic_fetch_or_explicit
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_or_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
-{
- return __o->fetch_or(__op, __m);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_or_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
-{
- return __o->fetch_or(__op, __m);
-}
-
-// atomic_fetch_xor
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_xor(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
-{
- return __o->fetch_xor(__op);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_xor(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
-{
- return __o->fetch_xor(__op);
-}
-
-// atomic_fetch_xor_explicit
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_xor_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
-{
- return __o->fetch_xor(__op, __m);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
- _Tp
->::type
-atomic_fetch_xor_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
-{
- return __o->fetch_xor(__op, __m);
-}
-
-// flag type and operations
-
-typedef struct atomic_flag
-{
- _Atomic(bool) __a_;
-
- _LIBCPP_INLINE_VISIBILITY
- bool test_and_set(memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
- {return __c11_atomic_exchange(&__a_, true, __m);}
- _LIBCPP_INLINE_VISIBILITY
- bool test_and_set(memory_order __m = memory_order_seq_cst) _NOEXCEPT
- {return __c11_atomic_exchange(&__a_, true, __m);}
- _LIBCPP_INLINE_VISIBILITY
- void clear(memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
- {__c11_atomic_store(&__a_, false, __m);}
- _LIBCPP_INLINE_VISIBILITY
- void clear(memory_order __m = memory_order_seq_cst) _NOEXCEPT
- {__c11_atomic_store(&__a_, false, __m);}
-
- _LIBCPP_INLINE_VISIBILITY
-#ifndef _LIBCPP_CXX03_LANG
- atomic_flag() _NOEXCEPT = default;
-#else
- atomic_flag() _NOEXCEPT : __a_() {}
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- atomic_flag(bool __b) _NOEXCEPT : __a_(__b) {} // EXTENSION
-
-#ifndef _LIBCPP_CXX03_LANG
- atomic_flag(const atomic_flag&) = delete;
- atomic_flag& operator=(const atomic_flag&) = delete;
- atomic_flag& operator=(const atomic_flag&) volatile = delete;
-#else
-private:
- atomic_flag(const atomic_flag&);
- atomic_flag& operator=(const atomic_flag&);
- atomic_flag& operator=(const atomic_flag&) volatile;
-#endif
-} atomic_flag;
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-atomic_flag_test_and_set(volatile atomic_flag* __o) _NOEXCEPT
-{
- return __o->test_and_set();
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-atomic_flag_test_and_set(atomic_flag* __o) _NOEXCEPT
-{
- return __o->test_and_set();
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-atomic_flag_test_and_set_explicit(volatile atomic_flag* __o, memory_order __m) _NOEXCEPT
-{
- return __o->test_and_set(__m);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-atomic_flag_test_and_set_explicit(atomic_flag* __o, memory_order __m) _NOEXCEPT
-{
- return __o->test_and_set(__m);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-void
-atomic_flag_clear(volatile atomic_flag* __o) _NOEXCEPT
-{
- __o->clear();
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-void
-atomic_flag_clear(atomic_flag* __o) _NOEXCEPT
-{
- __o->clear();
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-void
-atomic_flag_clear_explicit(volatile atomic_flag* __o, memory_order __m) _NOEXCEPT
-{
- __o->clear(__m);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-void
-atomic_flag_clear_explicit(atomic_flag* __o, memory_order __m) _NOEXCEPT
-{
- __o->clear(__m);
-}
-
-// fences
-
-inline _LIBCPP_INLINE_VISIBILITY
-void
-atomic_thread_fence(memory_order __m) _NOEXCEPT
-{
- __c11_atomic_thread_fence(__m);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-void
-atomic_signal_fence(memory_order __m) _NOEXCEPT
-{
- __c11_atomic_signal_fence(__m);
-}
-
-// Atomics for standard typedef types
-
-typedef atomic<bool> atomic_bool;
-typedef atomic<char> atomic_char;
-typedef atomic<signed char> atomic_schar;
-typedef atomic<unsigned char> atomic_uchar;
-typedef atomic<short> atomic_short;
-typedef atomic<unsigned short> atomic_ushort;
-typedef atomic<int> atomic_int;
-typedef atomic<unsigned int> atomic_uint;
-typedef atomic<long> atomic_long;
-typedef atomic<unsigned long> atomic_ulong;
-typedef atomic<long long> atomic_llong;
-typedef atomic<unsigned long long> atomic_ullong;
-typedef atomic<char16_t> atomic_char16_t;
-typedef atomic<char32_t> atomic_char32_t;
-typedef atomic<wchar_t> atomic_wchar_t;
-
-typedef atomic<int_least8_t> atomic_int_least8_t;
-typedef atomic<uint_least8_t> atomic_uint_least8_t;
-typedef atomic<int_least16_t> atomic_int_least16_t;
-typedef atomic<uint_least16_t> atomic_uint_least16_t;
-typedef atomic<int_least32_t> atomic_int_least32_t;
-typedef atomic<uint_least32_t> atomic_uint_least32_t;
-typedef atomic<int_least64_t> atomic_int_least64_t;
-typedef atomic<uint_least64_t> atomic_uint_least64_t;
-
-typedef atomic<int_fast8_t> atomic_int_fast8_t;
-typedef atomic<uint_fast8_t> atomic_uint_fast8_t;
-typedef atomic<int_fast16_t> atomic_int_fast16_t;
-typedef atomic<uint_fast16_t> atomic_uint_fast16_t;
-typedef atomic<int_fast32_t> atomic_int_fast32_t;
-typedef atomic<uint_fast32_t> atomic_uint_fast32_t;
-typedef atomic<int_fast64_t> atomic_int_fast64_t;
-typedef atomic<uint_fast64_t> atomic_uint_fast64_t;
-
-typedef atomic< int8_t> atomic_int8_t;
-typedef atomic<uint8_t> atomic_uint8_t;
-typedef atomic< int16_t> atomic_int16_t;
-typedef atomic<uint16_t> atomic_uint16_t;
-typedef atomic< int32_t> atomic_int32_t;
-typedef atomic<uint32_t> atomic_uint32_t;
-typedef atomic< int64_t> atomic_int64_t;
-typedef atomic<uint64_t> atomic_uint64_t;
-
-typedef atomic<intptr_t> atomic_intptr_t;
-typedef atomic<uintptr_t> atomic_uintptr_t;
-typedef atomic<size_t> atomic_size_t;
-typedef atomic<ptrdiff_t> atomic_ptrdiff_t;
-typedef atomic<intmax_t> atomic_intmax_t;
-typedef atomic<uintmax_t> atomic_uintmax_t;
-
-#define ATOMIC_FLAG_INIT {false}
-#define ATOMIC_VAR_INIT(__v) {__v}
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_ATOMIC
diff --git a/lib/libcxx/include/bit b/lib/libcxx/include/bit
deleted file mode 100644
index db3812e5b5b..00000000000
--- a/lib/libcxx/include/bit
+++ /dev/null
@@ -1,158 +0,0 @@
-// -*- C++ -*-
-//===------------------------------ bit ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===---------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_BIT
-#define _LIBCPP_BIT
-
-/*
- bit synopsis
-
-namespace std {
-
-} // namespace std
-
-*/
-
-#include <__config>
-#include <version>
-
-#if defined(__IBMCPP__)
-#include "support/ibm/support.h"
-#endif
-#if defined(_LIBCPP_COMPILER_MSVC)
-#include <intrin.h>
-#endif
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-#ifndef _LIBCPP_COMPILER_MSVC
-
-inline _LIBCPP_INLINE_VISIBILITY
-int __ctz(unsigned __x) { return __builtin_ctz(__x); }
-
-inline _LIBCPP_INLINE_VISIBILITY
-int __ctz(unsigned long __x) { return __builtin_ctzl(__x); }
-
-inline _LIBCPP_INLINE_VISIBILITY
-int __ctz(unsigned long long __x) { return __builtin_ctzll(__x); }
-
-
-inline _LIBCPP_INLINE_VISIBILITY
-int __clz(unsigned __x) { return __builtin_clz(__x); }
-
-inline _LIBCPP_INLINE_VISIBILITY
-int __clz(unsigned long __x) { return __builtin_clzl(__x); }
-
-inline _LIBCPP_INLINE_VISIBILITY
-int __clz(unsigned long long __x) { return __builtin_clzll(__x); }
-
-
-inline _LIBCPP_INLINE_VISIBILITY
-int __popcount(unsigned __x) { return __builtin_popcount(__x); }
-
-inline _LIBCPP_INLINE_VISIBILITY
-int __popcount(unsigned long __x) { return __builtin_popcountl(__x); }
-
-inline _LIBCPP_INLINE_VISIBILITY
-int __popcount(unsigned long long __x) { return __builtin_popcountll(__x); }
-
-#else // _LIBCPP_COMPILER_MSVC
-
-// Precondition: __x != 0
-inline _LIBCPP_INLINE_VISIBILITY
-int __ctz(unsigned __x) {
- static_assert(sizeof(unsigned) == sizeof(unsigned long), "");
- static_assert(sizeof(unsigned long) == 4, "");
- unsigned long __where;
- if (_BitScanForward(&__where, __x))
- return static_cast<int>(__where);
- return 32;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-int __ctz(unsigned long __x) {
- static_assert(sizeof(unsigned long) == sizeof(unsigned), "");
- return __ctz(static_cast<unsigned>(__x));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-int __ctz(unsigned long long __x) {
- unsigned long __where;
-#if defined(_LIBCPP_HAS_BITSCAN64)
- (defined(_M_AMD64) || defined(__x86_64__))
- if (_BitScanForward64(&__where, __x))
- return static_cast<int>(__where);
-#else
- // Win32 doesn't have _BitScanForward64 so emulate it with two 32 bit calls.
- if (_BitScanForward(&__where, static_cast<unsigned long>(__x)))
- return static_cast<int>(__where);
- if (_BitScanForward(&__where, static_cast<unsigned long>(__x >> 32)))
- return static_cast<int>(__where + 32);
-#endif
- return 64;
-}
-
-// Precondition: __x != 0
-inline _LIBCPP_INLINE_VISIBILITY
-int __clz(unsigned __x) {
- static_assert(sizeof(unsigned) == sizeof(unsigned long), "");
- static_assert(sizeof(unsigned long) == 4, "");
- unsigned long __where;
- if (_BitScanReverse(&__where, __x))
- return static_cast<int>(31 - __where);
- return 32; // Undefined Behavior.
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-int __clz(unsigned long __x) {
- static_assert(sizeof(unsigned) == sizeof(unsigned long), "");
- return __clz(static_cast<unsigned>(__x));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-int __clz(unsigned long long __x) {
- unsigned long __where;
-#if defined(_LIBCPP_HAS_BITSCAN64)
- if (_BitScanReverse64(&__where, __x))
- return static_cast<int>(63 - __where);
-#else
- // Win32 doesn't have _BitScanReverse64 so emulate it with two 32 bit calls.
- if (_BitScanReverse(&__where, static_cast<unsigned long>(__x >> 32)))
- return static_cast<int>(63 - (__where + 32));
- if (_BitScanReverse(&__where, static_cast<unsigned long>(__x)))
- return static_cast<int>(63 - __where);
-#endif
- return 64; // Undefined Behavior.
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int __popcount(unsigned __x) {
- static_assert(sizeof(unsigned) == 4, "");
- return __popcnt(__x);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int __popcount(unsigned long __x) {
- static_assert(sizeof(unsigned long) == 4, "");
- return __popcnt(__x);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int __popcount(unsigned long long __x) {
- static_assert(sizeof(unsigned long long) == 8, "");
- return __popcnt64(__x);
-}
-
-#endif // _LIBCPP_COMPILER_MSVC
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_BIT
diff --git a/lib/libcxx/include/bitset b/lib/libcxx/include/bitset
deleted file mode 100644
index 98947e027c1..00000000000
--- a/lib/libcxx/include/bitset
+++ /dev/null
@@ -1,1110 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- bitset ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_BITSET
-#define _LIBCPP_BITSET
-
-/*
- bitset synopsis
-
-namespace std
-{
-
-namespace std {
-
-template <size_t N>
-class bitset
-{
-public:
- // bit reference:
- class reference
- {
- friend class bitset;
- reference() noexcept;
- public:
- ~reference() noexcept;
- reference& operator=(bool x) noexcept; // for b[i] = x;
- reference& operator=(const reference&) noexcept; // for b[i] = b[j];
- bool operator~() const noexcept; // flips the bit
- operator bool() const noexcept; // for x = b[i];
- reference& flip() noexcept; // for b[i].flip();
- };
-
- // 23.3.5.1 constructors:
- constexpr bitset() noexcept;
- constexpr bitset(unsigned long long val) noexcept;
- template <class charT>
- explicit bitset(const charT* str,
- typename basic_string<charT>::size_type n = basic_string<charT>::npos,
- charT zero = charT('0'), charT one = charT('1'));
- template<class charT, class traits, class Allocator>
- explicit bitset(const basic_string<charT,traits,Allocator>& str,
- typename basic_string<charT,traits,Allocator>::size_type pos = 0,
- typename basic_string<charT,traits,Allocator>::size_type n =
- basic_string<charT,traits,Allocator>::npos,
- charT zero = charT('0'), charT one = charT('1'));
-
- // 23.3.5.2 bitset operations:
- bitset& operator&=(const bitset& rhs) noexcept;
- bitset& operator|=(const bitset& rhs) noexcept;
- bitset& operator^=(const bitset& rhs) noexcept;
- bitset& operator<<=(size_t pos) noexcept;
- bitset& operator>>=(size_t pos) noexcept;
- bitset& set() noexcept;
- bitset& set(size_t pos, bool val = true);
- bitset& reset() noexcept;
- bitset& reset(size_t pos);
- bitset operator~() const noexcept;
- bitset& flip() noexcept;
- bitset& flip(size_t pos);
-
- // element access:
- constexpr bool operator[](size_t pos) const; // for b[i];
- reference operator[](size_t pos); // for b[i];
- unsigned long to_ulong() const;
- unsigned long long to_ullong() const;
- template <class charT, class traits, class Allocator>
- basic_string<charT, traits, Allocator> to_string(charT zero = charT('0'), charT one = charT('1')) const;
- template <class charT, class traits>
- basic_string<charT, traits, allocator<charT> > to_string(charT zero = charT('0'), charT one = charT('1')) const;
- template <class charT>
- basic_string<charT, char_traits<charT>, allocator<charT> > to_string(charT zero = charT('0'), charT one = charT('1')) const;
- basic_string<char, char_traits<char>, allocator<char> > to_string(char zero = '0', char one = '1') const;
- size_t count() const noexcept;
- constexpr size_t size() const noexcept;
- bool operator==(const bitset& rhs) const noexcept;
- bool operator!=(const bitset& rhs) const noexcept;
- bool test(size_t pos) const;
- bool all() const noexcept;
- bool any() const noexcept;
- bool none() const noexcept;
- bitset operator<<(size_t pos) const noexcept;
- bitset operator>>(size_t pos) const noexcept;
-};
-
-// 23.3.5.3 bitset operators:
-template <size_t N>
-bitset<N> operator&(const bitset<N>&, const bitset<N>&) noexcept;
-
-template <size_t N>
-bitset<N> operator|(const bitset<N>&, const bitset<N>&) noexcept;
-
-template <size_t N>
-bitset<N> operator^(const bitset<N>&, const bitset<N>&) noexcept;
-
-template <class charT, class traits, size_t N>
-basic_istream<charT, traits>&
-operator>>(basic_istream<charT, traits>& is, bitset<N>& x);
-
-template <class charT, class traits, size_t N>
-basic_ostream<charT, traits>&
-operator<<(basic_ostream<charT, traits>& os, const bitset<N>& x);
-
-template <size_t N> struct hash<std::bitset<N>>;
-
-} // std
-
-*/
-
-#include <__config>
-#include <__bit_reference>
-#include <cstddef>
-#include <climits>
-#include <string>
-#include <stdexcept>
-#include <iosfwd>
-#include <__functional_base>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <size_t _N_words, size_t _Size>
-class __bitset;
-
-template <size_t _N_words, size_t _Size>
-struct __has_storage_type<__bitset<_N_words, _Size> >
-{
- static const bool value = true;
-};
-
-template <size_t _N_words, size_t _Size>
-class __bitset
-{
-public:
- typedef ptrdiff_t difference_type;
- typedef size_t size_type;
- typedef size_type __storage_type;
-protected:
- typedef __bitset __self;
- typedef __storage_type* __storage_pointer;
- typedef const __storage_type* __const_storage_pointer;
- static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
-
- friend class __bit_reference<__bitset>;
- friend class __bit_const_reference<__bitset>;
- friend class __bit_iterator<__bitset, false>;
- friend class __bit_iterator<__bitset, true>;
- friend struct __bit_array<__bitset>;
-
- __storage_type __first_[_N_words];
-
- typedef __bit_reference<__bitset> reference;
- typedef __bit_const_reference<__bitset> const_reference;
- typedef __bit_iterator<__bitset, false> iterator;
- typedef __bit_iterator<__bitset, true> const_iterator;
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR __bitset() _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long __v) _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t __pos) _NOEXCEPT
- {return reference(__first_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR const_reference __make_ref(size_t __pos) const _NOEXCEPT
- {return const_reference(__first_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
- _LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_t __pos) _NOEXCEPT
- {return iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word);}
- _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t __pos) const _NOEXCEPT
- {return const_iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word);}
-
- _LIBCPP_INLINE_VISIBILITY
- void operator&=(const __bitset& __v) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- void operator|=(const __bitset& __v) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- void operator^=(const __bitset& __v) _NOEXCEPT;
-
- void flip() _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY unsigned long to_ulong() const
- {return to_ulong(integral_constant<bool, _Size < sizeof(unsigned long) * CHAR_BIT>());}
- _LIBCPP_INLINE_VISIBILITY unsigned long long to_ullong() const
- {return to_ullong(integral_constant<bool, _Size < sizeof(unsigned long long) * CHAR_BIT>());}
-
- bool all() const _NOEXCEPT;
- bool any() const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- size_t __hash_code() const _NOEXCEPT;
-private:
-#ifdef _LIBCPP_CXX03_LANG
- void __init(unsigned long long __v, false_type) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- void __init(unsigned long long __v, true_type) _NOEXCEPT;
-#endif // _LIBCPP_CXX03_LANG
- unsigned long to_ulong(false_type) const;
- _LIBCPP_INLINE_VISIBILITY
- unsigned long to_ulong(true_type) const;
- unsigned long long to_ullong(false_type) const;
- _LIBCPP_INLINE_VISIBILITY
- unsigned long long to_ullong(true_type) const;
- _LIBCPP_INLINE_VISIBILITY
- unsigned long long to_ullong(true_type, false_type) const;
- unsigned long long to_ullong(true_type, true_type) const;
-};
-
-template <size_t _N_words, size_t _Size>
-inline
-_LIBCPP_CONSTEXPR
-__bitset<_N_words, _Size>::__bitset() _NOEXCEPT
-#ifndef _LIBCPP_CXX03_LANG
- : __first_{0}
-#endif
-{
-#ifdef _LIBCPP_CXX03_LANG
- _VSTD::fill_n(__first_, _N_words, __storage_type(0));
-#endif
-}
-
-#ifdef _LIBCPP_CXX03_LANG
-
-template <size_t _N_words, size_t _Size>
-void
-__bitset<_N_words, _Size>::__init(unsigned long long __v, false_type) _NOEXCEPT
-{
- __storage_type __t[sizeof(unsigned long long) / sizeof(__storage_type)];
- size_t __sz = _Size;
- for (size_t __i = 0; __i < sizeof(__t)/sizeof(__t[0]); ++__i, __v >>= __bits_per_word, __sz -= __bits_per_word )
- if ( __sz < __bits_per_word)
- __t[__i] = static_cast<__storage_type>(__v) & ( 1ULL << __sz ) - 1;
- else
- __t[__i] = static_cast<__storage_type>(__v);
-
- _VSTD::copy(__t, __t + sizeof(__t)/sizeof(__t[0]), __first_);
- _VSTD::fill(__first_ + sizeof(__t)/sizeof(__t[0]), __first_ + sizeof(__first_)/sizeof(__first_[0]),
- __storage_type(0));
-}
-
-template <size_t _N_words, size_t _Size>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-__bitset<_N_words, _Size>::__init(unsigned long long __v, true_type) _NOEXCEPT
-{
- __first_[0] = __v;
- if (_Size < __bits_per_word)
- __first_[0] &= ( 1ULL << _Size ) - 1;
-
- _VSTD::fill(__first_ + 1, __first_ + sizeof(__first_)/sizeof(__first_[0]), __storage_type(0));
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <size_t _N_words, size_t _Size>
-inline
-_LIBCPP_CONSTEXPR
-__bitset<_N_words, _Size>::__bitset(unsigned long long __v) _NOEXCEPT
-#ifndef _LIBCPP_CXX03_LANG
-#if __SIZEOF_SIZE_T__ == 8
- : __first_{__v}
-#elif __SIZEOF_SIZE_T__ == 4
- : __first_{static_cast<__storage_type>(__v),
- _Size >= 2 * __bits_per_word ? static_cast<__storage_type>(__v >> __bits_per_word)
- : static_cast<__storage_type>((__v >> __bits_per_word) & (__storage_type(1) << (_Size - __bits_per_word)) - 1)}
-#else
-#error This constructor has not been ported to this platform
-#endif
-#endif
-{
-#ifdef _LIBCPP_CXX03_LANG
- __init(__v, integral_constant<bool, sizeof(unsigned long long) == sizeof(__storage_type)>());
-#endif
-}
-
-template <size_t _N_words, size_t _Size>
-inline
-void
-__bitset<_N_words, _Size>::operator&=(const __bitset& __v) _NOEXCEPT
-{
- for (size_type __i = 0; __i < _N_words; ++__i)
- __first_[__i] &= __v.__first_[__i];
-}
-
-template <size_t _N_words, size_t _Size>
-inline
-void
-__bitset<_N_words, _Size>::operator|=(const __bitset& __v) _NOEXCEPT
-{
- for (size_type __i = 0; __i < _N_words; ++__i)
- __first_[__i] |= __v.__first_[__i];
-}
-
-template <size_t _N_words, size_t _Size>
-inline
-void
-__bitset<_N_words, _Size>::operator^=(const __bitset& __v) _NOEXCEPT
-{
- for (size_type __i = 0; __i < _N_words; ++__i)
- __first_[__i] ^= __v.__first_[__i];
-}
-
-template <size_t _N_words, size_t _Size>
-void
-__bitset<_N_words, _Size>::flip() _NOEXCEPT
-{
- // do middle whole words
- size_type __n = _Size;
- __storage_pointer __p = __first_;
- for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
- *__p = ~*__p;
- // do last partial word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __storage_type __b = *__p & __m;
- *__p &= ~__m;
- *__p |= ~__b & __m;
- }
-}
-
-template <size_t _N_words, size_t _Size>
-unsigned long
-__bitset<_N_words, _Size>::to_ulong(false_type) const
-{
- const_iterator __e = __make_iter(_Size);
- const_iterator __i = _VSTD::find(__make_iter(sizeof(unsigned long) * CHAR_BIT), __e, true);
- if (__i != __e)
- __throw_overflow_error("bitset to_ulong overflow error");
-
- return __first_[0];
-}
-
-template <size_t _N_words, size_t _Size>
-inline
-unsigned long
-__bitset<_N_words, _Size>::to_ulong(true_type) const
-{
- return __first_[0];
-}
-
-template <size_t _N_words, size_t _Size>
-unsigned long long
-__bitset<_N_words, _Size>::to_ullong(false_type) const
-{
- const_iterator __e = __make_iter(_Size);
- const_iterator __i = _VSTD::find(__make_iter(sizeof(unsigned long long) * CHAR_BIT), __e, true);
- if (__i != __e)
- __throw_overflow_error("bitset to_ullong overflow error");
-
- return to_ullong(true_type());
-}
-
-template <size_t _N_words, size_t _Size>
-inline
-unsigned long long
-__bitset<_N_words, _Size>::to_ullong(true_type) const
-{
- return to_ullong(true_type(), integral_constant<bool, sizeof(__storage_type) < sizeof(unsigned long long)>());
-}
-
-template <size_t _N_words, size_t _Size>
-inline
-unsigned long long
-__bitset<_N_words, _Size>::to_ullong(true_type, false_type) const
-{
- return __first_[0];
-}
-
-template <size_t _N_words, size_t _Size>
-unsigned long long
-__bitset<_N_words, _Size>::to_ullong(true_type, true_type) const
-{
- unsigned long long __r = __first_[0];
- for (std::size_t __i = 1; __i < sizeof(unsigned long long) / sizeof(__storage_type); ++__i)
- __r |= static_cast<unsigned long long>(__first_[__i]) << (sizeof(__storage_type) * CHAR_BIT);
- return __r;
-}
-
-template <size_t _N_words, size_t _Size>
-bool
-__bitset<_N_words, _Size>::all() const _NOEXCEPT
-{
- // do middle whole words
- size_type __n = _Size;
- __const_storage_pointer __p = __first_;
- for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
- if (~*__p)
- return false;
- // do last partial word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- if (~*__p & __m)
- return false;
- }
- return true;
-}
-
-template <size_t _N_words, size_t _Size>
-bool
-__bitset<_N_words, _Size>::any() const _NOEXCEPT
-{
- // do middle whole words
- size_type __n = _Size;
- __const_storage_pointer __p = __first_;
- for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
- if (*__p)
- return true;
- // do last partial word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- if (*__p & __m)
- return true;
- }
- return false;
-}
-
-template <size_t _N_words, size_t _Size>
-inline
-size_t
-__bitset<_N_words, _Size>::__hash_code() const _NOEXCEPT
-{
- size_t __h = 0;
- for (size_type __i = 0; __i < _N_words; ++__i)
- __h ^= __first_[__i];
- return __h;
-}
-
-template <size_t _Size>
-class __bitset<1, _Size>
-{
-public:
- typedef ptrdiff_t difference_type;
- typedef size_t size_type;
- typedef size_type __storage_type;
-protected:
- typedef __bitset __self;
- typedef __storage_type* __storage_pointer;
- typedef const __storage_type* __const_storage_pointer;
- static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
-
- friend class __bit_reference<__bitset>;
- friend class __bit_const_reference<__bitset>;
- friend class __bit_iterator<__bitset, false>;
- friend class __bit_iterator<__bitset, true>;
- friend struct __bit_array<__bitset>;
-
- __storage_type __first_;
-
- typedef __bit_reference<__bitset> reference;
- typedef __bit_const_reference<__bitset> const_reference;
- typedef __bit_iterator<__bitset, false> iterator;
- typedef __bit_iterator<__bitset, true> const_iterator;
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR __bitset() _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long __v) _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t __pos) _NOEXCEPT
- {return reference(&__first_, __storage_type(1) << __pos);}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR const_reference __make_ref(size_t __pos) const _NOEXCEPT
- {return const_reference(&__first_, __storage_type(1) << __pos);}
- _LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_t __pos) _NOEXCEPT
- {return iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word);}
- _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t __pos) const _NOEXCEPT
- {return const_iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word);}
-
- _LIBCPP_INLINE_VISIBILITY
- void operator&=(const __bitset& __v) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- void operator|=(const __bitset& __v) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- void operator^=(const __bitset& __v) _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- void flip() _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- unsigned long to_ulong() const;
- _LIBCPP_INLINE_VISIBILITY
- unsigned long long to_ullong() const;
-
- _LIBCPP_INLINE_VISIBILITY
- bool all() const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- bool any() const _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- size_t __hash_code() const _NOEXCEPT;
-};
-
-template <size_t _Size>
-inline
-_LIBCPP_CONSTEXPR
-__bitset<1, _Size>::__bitset() _NOEXCEPT
- : __first_(0)
-{
-}
-
-template <size_t _Size>
-inline
-_LIBCPP_CONSTEXPR
-__bitset<1, _Size>::__bitset(unsigned long long __v) _NOEXCEPT
- : __first_(
- _Size == __bits_per_word ? static_cast<__storage_type>(__v)
- : static_cast<__storage_type>(__v) & ((__storage_type(1) << _Size) - 1)
- )
-{
-}
-
-template <size_t _Size>
-inline
-void
-__bitset<1, _Size>::operator&=(const __bitset& __v) _NOEXCEPT
-{
- __first_ &= __v.__first_;
-}
-
-template <size_t _Size>
-inline
-void
-__bitset<1, _Size>::operator|=(const __bitset& __v) _NOEXCEPT
-{
- __first_ |= __v.__first_;
-}
-
-template <size_t _Size>
-inline
-void
-__bitset<1, _Size>::operator^=(const __bitset& __v) _NOEXCEPT
-{
- __first_ ^= __v.__first_;
-}
-
-template <size_t _Size>
-inline
-void
-__bitset<1, _Size>::flip() _NOEXCEPT
-{
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - _Size);
- __first_ = ~__first_;
- __first_ &= __m;
-}
-
-template <size_t _Size>
-inline
-unsigned long
-__bitset<1, _Size>::to_ulong() const
-{
- return __first_;
-}
-
-template <size_t _Size>
-inline
-unsigned long long
-__bitset<1, _Size>::to_ullong() const
-{
- return __first_;
-}
-
-template <size_t _Size>
-inline
-bool
-__bitset<1, _Size>::all() const _NOEXCEPT
-{
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - _Size);
- return !(~__first_ & __m);
-}
-
-template <size_t _Size>
-inline
-bool
-__bitset<1, _Size>::any() const _NOEXCEPT
-{
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - _Size);
- return __first_ & __m;
-}
-
-template <size_t _Size>
-inline
-size_t
-__bitset<1, _Size>::__hash_code() const _NOEXCEPT
-{
- return __first_;
-}
-
-template <>
-class __bitset<0, 0>
-{
-public:
- typedef ptrdiff_t difference_type;
- typedef size_t size_type;
- typedef size_type __storage_type;
-protected:
- typedef __bitset __self;
- typedef __storage_type* __storage_pointer;
- typedef const __storage_type* __const_storage_pointer;
- static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
-
- friend class __bit_reference<__bitset>;
- friend class __bit_const_reference<__bitset>;
- friend class __bit_iterator<__bitset, false>;
- friend class __bit_iterator<__bitset, true>;
- friend struct __bit_array<__bitset>;
-
- typedef __bit_reference<__bitset> reference;
- typedef __bit_const_reference<__bitset> const_reference;
- typedef __bit_iterator<__bitset, false> iterator;
- typedef __bit_iterator<__bitset, true> const_iterator;
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR __bitset() _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long) _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t) _NOEXCEPT
- {return reference(0, 1);}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR const_reference __make_ref(size_t) const _NOEXCEPT
- {return const_reference(0, 1);}
- _LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_t) _NOEXCEPT
- {return iterator(0, 0);}
- _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t) const _NOEXCEPT
- {return const_iterator(0, 0);}
-
- _LIBCPP_INLINE_VISIBILITY void operator&=(const __bitset&) _NOEXCEPT {}
- _LIBCPP_INLINE_VISIBILITY void operator|=(const __bitset&) _NOEXCEPT {}
- _LIBCPP_INLINE_VISIBILITY void operator^=(const __bitset&) _NOEXCEPT {}
-
- _LIBCPP_INLINE_VISIBILITY void flip() _NOEXCEPT {}
-
- _LIBCPP_INLINE_VISIBILITY unsigned long to_ulong() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY unsigned long long to_ullong() const {return 0;}
-
- _LIBCPP_INLINE_VISIBILITY bool all() const _NOEXCEPT {return true;}
- _LIBCPP_INLINE_VISIBILITY bool any() const _NOEXCEPT {return false;}
-
- _LIBCPP_INLINE_VISIBILITY size_t __hash_code() const _NOEXCEPT {return 0;}
-};
-
-inline
-_LIBCPP_CONSTEXPR
-__bitset<0, 0>::__bitset() _NOEXCEPT
-{
-}
-
-inline
-_LIBCPP_CONSTEXPR
-__bitset<0, 0>::__bitset(unsigned long long) _NOEXCEPT
-{
-}
-
-template <size_t _Size> class _LIBCPP_TEMPLATE_VIS bitset;
-template <size_t _Size> struct hash<bitset<_Size> >;
-
-template <size_t _Size>
-class _LIBCPP_TEMPLATE_VIS bitset
- : private __bitset<_Size == 0 ? 0 : (_Size - 1) / (sizeof(size_t) * CHAR_BIT) + 1, _Size>
-{
-public:
- static const unsigned __n_words = _Size == 0 ? 0 : (_Size - 1) / (sizeof(size_t) * CHAR_BIT) + 1;
- typedef __bitset<__n_words, _Size> base;
-
-public:
- typedef typename base::reference reference;
- typedef typename base::const_reference const_reference;
-
- // 23.3.5.1 constructors:
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR bitset() _NOEXCEPT {}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- bitset(unsigned long long __v) _NOEXCEPT : base(__v) {}
- template<class _CharT>
- explicit bitset(const _CharT* __str,
- typename basic_string<_CharT>::size_type __n = basic_string<_CharT>::npos,
- _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'));
- template<class _CharT, class _Traits, class _Allocator>
- explicit bitset(const basic_string<_CharT,_Traits,_Allocator>& __str,
- typename basic_string<_CharT,_Traits,_Allocator>::size_type __pos = 0,
- typename basic_string<_CharT,_Traits,_Allocator>::size_type __n =
- (basic_string<_CharT,_Traits,_Allocator>::npos),
- _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'));
-
- // 23.3.5.2 bitset operations:
- _LIBCPP_INLINE_VISIBILITY
- bitset& operator&=(const bitset& __rhs) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- bitset& operator|=(const bitset& __rhs) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- bitset& operator^=(const bitset& __rhs) _NOEXCEPT;
- bitset& operator<<=(size_t __pos) _NOEXCEPT;
- bitset& operator>>=(size_t __pos) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- bitset& set() _NOEXCEPT;
- bitset& set(size_t __pos, bool __val = true);
- _LIBCPP_INLINE_VISIBILITY
- bitset& reset() _NOEXCEPT;
- bitset& reset(size_t __pos);
- _LIBCPP_INLINE_VISIBILITY
- bitset operator~() const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- bitset& flip() _NOEXCEPT;
- bitset& flip(size_t __pos);
-
- // element access:
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- const_reference operator[](size_t __p) const {return base::__make_ref(__p);}
- _LIBCPP_INLINE_VISIBILITY reference operator[](size_t __p) {return base::__make_ref(__p);}
- _LIBCPP_INLINE_VISIBILITY
- unsigned long to_ulong() const;
- _LIBCPP_INLINE_VISIBILITY
- unsigned long long to_ullong() const;
- template <class _CharT, class _Traits, class _Allocator>
- basic_string<_CharT, _Traits, _Allocator> to_string(_CharT __zero = _CharT('0'),
- _CharT __one = _CharT('1')) const;
- template <class _CharT, class _Traits>
- _LIBCPP_INLINE_VISIBILITY
- basic_string<_CharT, _Traits, allocator<_CharT> > to_string(_CharT __zero = _CharT('0'),
- _CharT __one = _CharT('1')) const;
- template <class _CharT>
- _LIBCPP_INLINE_VISIBILITY
- basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > to_string(_CharT __zero = _CharT('0'),
- _CharT __one = _CharT('1')) const;
- _LIBCPP_INLINE_VISIBILITY
- basic_string<char, char_traits<char>, allocator<char> > to_string(char __zero = '0',
- char __one = '1') const;
- _LIBCPP_INLINE_VISIBILITY
- size_t count() const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR size_t size() const _NOEXCEPT {return _Size;}
- _LIBCPP_INLINE_VISIBILITY
- bool operator==(const bitset& __rhs) const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const bitset& __rhs) const _NOEXCEPT;
- bool test(size_t __pos) const;
- _LIBCPP_INLINE_VISIBILITY
- bool all() const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- bool any() const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY bool none() const _NOEXCEPT {return !any();}
- _LIBCPP_INLINE_VISIBILITY
- bitset operator<<(size_t __pos) const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- bitset operator>>(size_t __pos) const _NOEXCEPT;
-
-private:
-
- _LIBCPP_INLINE_VISIBILITY
- size_t __hash_code() const _NOEXCEPT {return base::__hash_code();}
-
- friend struct hash<bitset>;
-};
-
-template <size_t _Size>
-template<class _CharT>
-bitset<_Size>::bitset(const _CharT* __str,
- typename basic_string<_CharT>::size_type __n,
- _CharT __zero, _CharT __one)
-{
- size_t __rlen = _VSTD::min(__n, char_traits<_CharT>::length(__str));
- for (size_t __i = 0; __i < __rlen; ++__i)
- if (__str[__i] != __zero && __str[__i] != __one)
- __throw_invalid_argument("bitset string ctor has invalid argument");
-
- size_t _Mp = _VSTD::min(__rlen, _Size);
- size_t __i = 0;
- for (; __i < _Mp; ++__i)
- {
- _CharT __c = __str[_Mp - 1 - __i];
- if (__c == __zero)
- (*this)[__i] = false;
- else
- (*this)[__i] = true;
- }
- _VSTD::fill(base::__make_iter(__i), base::__make_iter(_Size), false);
-}
-
-template <size_t _Size>
-template<class _CharT, class _Traits, class _Allocator>
-bitset<_Size>::bitset(const basic_string<_CharT,_Traits,_Allocator>& __str,
- typename basic_string<_CharT,_Traits,_Allocator>::size_type __pos,
- typename basic_string<_CharT,_Traits,_Allocator>::size_type __n,
- _CharT __zero, _CharT __one)
-{
- if (__pos > __str.size())
- __throw_out_of_range("bitset string pos out of range");
-
- size_t __rlen = _VSTD::min(__n, __str.size() - __pos);
- for (size_t __i = __pos; __i < __pos + __rlen; ++__i)
- if (!_Traits::eq(__str[__i], __zero) && !_Traits::eq(__str[__i], __one))
- __throw_invalid_argument("bitset string ctor has invalid argument");
-
- size_t _Mp = _VSTD::min(__rlen, _Size);
- size_t __i = 0;
- for (; __i < _Mp; ++__i)
- {
- _CharT __c = __str[__pos + _Mp - 1 - __i];
- if (_Traits::eq(__c, __zero))
- (*this)[__i] = false;
- else
- (*this)[__i] = true;
- }
- _VSTD::fill(base::__make_iter(__i), base::__make_iter(_Size), false);
-}
-
-template <size_t _Size>
-inline
-bitset<_Size>&
-bitset<_Size>::operator&=(const bitset& __rhs) _NOEXCEPT
-{
- base::operator&=(__rhs);
- return *this;
-}
-
-template <size_t _Size>
-inline
-bitset<_Size>&
-bitset<_Size>::operator|=(const bitset& __rhs) _NOEXCEPT
-{
- base::operator|=(__rhs);
- return *this;
-}
-
-template <size_t _Size>
-inline
-bitset<_Size>&
-bitset<_Size>::operator^=(const bitset& __rhs) _NOEXCEPT
-{
- base::operator^=(__rhs);
- return *this;
-}
-
-template <size_t _Size>
-bitset<_Size>&
-bitset<_Size>::operator<<=(size_t __pos) _NOEXCEPT
-{
- __pos = _VSTD::min(__pos, _Size);
- _VSTD::copy_backward(base::__make_iter(0), base::__make_iter(_Size - __pos), base::__make_iter(_Size));
- _VSTD::fill_n(base::__make_iter(0), __pos, false);
- return *this;
-}
-
-template <size_t _Size>
-bitset<_Size>&
-bitset<_Size>::operator>>=(size_t __pos) _NOEXCEPT
-{
- __pos = _VSTD::min(__pos, _Size);
- _VSTD::copy(base::__make_iter(__pos), base::__make_iter(_Size), base::__make_iter(0));
- _VSTD::fill_n(base::__make_iter(_Size - __pos), __pos, false);
- return *this;
-}
-
-template <size_t _Size>
-inline
-bitset<_Size>&
-bitset<_Size>::set() _NOEXCEPT
-{
- _VSTD::fill_n(base::__make_iter(0), _Size, true);
- return *this;
-}
-
-template <size_t _Size>
-bitset<_Size>&
-bitset<_Size>::set(size_t __pos, bool __val)
-{
- if (__pos >= _Size)
- __throw_out_of_range("bitset set argument out of range");
-
- (*this)[__pos] = __val;
- return *this;
-}
-
-template <size_t _Size>
-inline
-bitset<_Size>&
-bitset<_Size>::reset() _NOEXCEPT
-{
- _VSTD::fill_n(base::__make_iter(0), _Size, false);
- return *this;
-}
-
-template <size_t _Size>
-bitset<_Size>&
-bitset<_Size>::reset(size_t __pos)
-{
- if (__pos >= _Size)
- __throw_out_of_range("bitset reset argument out of range");
-
- (*this)[__pos] = false;
- return *this;
-}
-
-template <size_t _Size>
-inline
-bitset<_Size>
-bitset<_Size>::operator~() const _NOEXCEPT
-{
- bitset __x(*this);
- __x.flip();
- return __x;
-}
-
-template <size_t _Size>
-inline
-bitset<_Size>&
-bitset<_Size>::flip() _NOEXCEPT
-{
- base::flip();
- return *this;
-}
-
-template <size_t _Size>
-bitset<_Size>&
-bitset<_Size>::flip(size_t __pos)
-{
- if (__pos >= _Size)
- __throw_out_of_range("bitset flip argument out of range");
-
- reference r = base::__make_ref(__pos);
- r = ~r;
- return *this;
-}
-
-template <size_t _Size>
-inline
-unsigned long
-bitset<_Size>::to_ulong() const
-{
- return base::to_ulong();
-}
-
-template <size_t _Size>
-inline
-unsigned long long
-bitset<_Size>::to_ullong() const
-{
- return base::to_ullong();
-}
-
-template <size_t _Size>
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>
-bitset<_Size>::to_string(_CharT __zero, _CharT __one) const
-{
- basic_string<_CharT, _Traits, _Allocator> __r(_Size, __zero);
- for (size_t __i = 0; __i < _Size; ++__i)
- {
- if ((*this)[__i])
- __r[_Size - 1 - __i] = __one;
- }
- return __r;
-}
-
-template <size_t _Size>
-template <class _CharT, class _Traits>
-inline
-basic_string<_CharT, _Traits, allocator<_CharT> >
-bitset<_Size>::to_string(_CharT __zero, _CharT __one) const
-{
- return to_string<_CharT, _Traits, allocator<_CharT> >(__zero, __one);
-}
-
-template <size_t _Size>
-template <class _CharT>
-inline
-basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> >
-bitset<_Size>::to_string(_CharT __zero, _CharT __one) const
-{
- return to_string<_CharT, char_traits<_CharT>, allocator<_CharT> >(__zero, __one);
-}
-
-template <size_t _Size>
-inline
-basic_string<char, char_traits<char>, allocator<char> >
-bitset<_Size>::to_string(char __zero, char __one) const
-{
- return to_string<char, char_traits<char>, allocator<char> >(__zero, __one);
-}
-
-template <size_t _Size>
-inline
-size_t
-bitset<_Size>::count() const _NOEXCEPT
-{
- return static_cast<size_t>(__count_bool_true(base::__make_iter(0), _Size));
-}
-
-template <size_t _Size>
-inline
-bool
-bitset<_Size>::operator==(const bitset& __rhs) const _NOEXCEPT
-{
- return _VSTD::equal(base::__make_iter(0), base::__make_iter(_Size), __rhs.__make_iter(0));
-}
-
-template <size_t _Size>
-inline
-bool
-bitset<_Size>::operator!=(const bitset& __rhs) const _NOEXCEPT
-{
- return !(*this == __rhs);
-}
-
-template <size_t _Size>
-bool
-bitset<_Size>::test(size_t __pos) const
-{
- if (__pos >= _Size)
- __throw_out_of_range("bitset test argument out of range");
-
- return (*this)[__pos];
-}
-
-template <size_t _Size>
-inline
-bool
-bitset<_Size>::all() const _NOEXCEPT
-{
- return base::all();
-}
-
-template <size_t _Size>
-inline
-bool
-bitset<_Size>::any() const _NOEXCEPT
-{
- return base::any();
-}
-
-template <size_t _Size>
-inline
-bitset<_Size>
-bitset<_Size>::operator<<(size_t __pos) const _NOEXCEPT
-{
- bitset __r = *this;
- __r <<= __pos;
- return __r;
-}
-
-template <size_t _Size>
-inline
-bitset<_Size>
-bitset<_Size>::operator>>(size_t __pos) const _NOEXCEPT
-{
- bitset __r = *this;
- __r >>= __pos;
- return __r;
-}
-
-template <size_t _Size>
-inline _LIBCPP_INLINE_VISIBILITY
-bitset<_Size>
-operator&(const bitset<_Size>& __x, const bitset<_Size>& __y) _NOEXCEPT
-{
- bitset<_Size> __r = __x;
- __r &= __y;
- return __r;
-}
-
-template <size_t _Size>
-inline _LIBCPP_INLINE_VISIBILITY
-bitset<_Size>
-operator|(const bitset<_Size>& __x, const bitset<_Size>& __y) _NOEXCEPT
-{
- bitset<_Size> __r = __x;
- __r |= __y;
- return __r;
-}
-
-template <size_t _Size>
-inline _LIBCPP_INLINE_VISIBILITY
-bitset<_Size>
-operator^(const bitset<_Size>& __x, const bitset<_Size>& __y) _NOEXCEPT
-{
- bitset<_Size> __r = __x;
- __r ^= __y;
- return __r;
-}
-
-template <size_t _Size>
-struct _LIBCPP_TEMPLATE_VIS hash<bitset<_Size> >
- : public unary_function<bitset<_Size>, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(const bitset<_Size>& __bs) const _NOEXCEPT
- {return __bs.__hash_code();}
-};
-
-template <class _CharT, class _Traits, size_t _Size>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x);
-
-template <class _CharT, class _Traits, size_t _Size>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x);
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_BITSET
diff --git a/lib/libcxx/include/cassert b/lib/libcxx/include/cassert
deleted file mode 100644
index 3775990640a..00000000000
--- a/lib/libcxx/include/cassert
+++ /dev/null
@@ -1,25 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- cassert -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-/*
- cassert synopsis
-
-Macros:
-
- assert
-
-*/
-
-#include <__config>
-#include <assert.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
diff --git a/lib/libcxx/include/ccomplex b/lib/libcxx/include/ccomplex
deleted file mode 100644
index 6ed116445e6..00000000000
--- a/lib/libcxx/include/ccomplex
+++ /dev/null
@@ -1,29 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- ccomplex ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CCOMPLEX
-#define _LIBCPP_CCOMPLEX
-
-/*
- ccomplex synopsis
-
-#include <complex>
-
-*/
-
-#include <complex>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-// hh 080623 Created
-
-#endif // _LIBCPP_CCOMPLEX
diff --git a/lib/libcxx/include/cctype b/lib/libcxx/include/cctype
deleted file mode 100644
index 7fc81344696..00000000000
--- a/lib/libcxx/include/cctype
+++ /dev/null
@@ -1,121 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- cctype ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CCTYPE
-#define _LIBCPP_CCTYPE
-
-/*
- cctype synopsis
-
-namespace std
-{
-
-int isalnum(int c);
-int isalpha(int c);
-int isblank(int c); // C99
-int iscntrl(int c);
-int isdigit(int c);
-int isgraph(int c);
-int islower(int c);
-int isprint(int c);
-int ispunct(int c);
-int isspace(int c);
-int isupper(int c);
-int isxdigit(int c);
-int tolower(int c);
-int toupper(int c);
-
-} // std
-*/
-
-#include <__config>
-#include <ctype.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-#ifdef isalnum
-#undef isalnum
-#endif
-
-#ifdef isalpha
-#undef isalpha
-#endif
-
-#ifdef isblank
-#undef isblank
-#endif
-
-#ifdef iscntrl
-#undef iscntrl
-#endif
-
-#ifdef isdigit
-#undef isdigit
-#endif
-
-#ifdef isgraph
-#undef isgraph
-#endif
-
-#ifdef islower
-#undef islower
-#endif
-
-#ifdef isprint
-#undef isprint
-#endif
-
-#ifdef ispunct
-#undef ispunct
-#endif
-
-#ifdef isspace
-#undef isspace
-#endif
-
-#ifdef isupper
-#undef isupper
-#endif
-
-#ifdef isxdigit
-#undef isxdigit
-#endif
-
-#ifdef tolower
-#undef tolower
-#endif
-
-#ifdef toupper
-#undef toupper
-#endif
-
-
-using ::isalnum;
-using ::isalpha;
-using ::isblank;
-using ::iscntrl;
-using ::isdigit;
-using ::isgraph;
-using ::islower;
-using ::isprint;
-using ::ispunct;
-using ::isspace;
-using ::isupper;
-using ::isxdigit;
-using ::tolower;
-using ::toupper;
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_CCTYPE
diff --git a/lib/libcxx/include/cerrno b/lib/libcxx/include/cerrno
deleted file mode 100644
index bab13b8aa86..00000000000
--- a/lib/libcxx/include/cerrno
+++ /dev/null
@@ -1,33 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- cerrno ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CERRNO
-#define _LIBCPP_CERRNO
-
-/*
- cerrno synopsis
-
-Macros:
-
- EDOM
- EILSEQ // C99
- ERANGE
- errno
-
-*/
-
-#include <__config>
-#include <errno.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#endif // _LIBCPP_CERRNO
diff --git a/lib/libcxx/include/cfenv b/lib/libcxx/include/cfenv
deleted file mode 100644
index 4fc630419bd..00000000000
--- a/lib/libcxx/include/cfenv
+++ /dev/null
@@ -1,82 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- cfenv -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CFENV
-#define _LIBCPP_CFENV
-
-/*
- cfenv synopsis
-
-This entire header is C99 / C++0X
-
-Macros:
-
- FE_DIVBYZERO
- FE_INEXACT
- FE_INVALID
- FE_OVERFLOW
- FE_UNDERFLOW
- FE_ALL_EXCEPT
- FE_DOWNWARD
- FE_TONEAREST
- FE_TOWARDZERO
- FE_UPWARD
- FE_DFL_ENV
-
-namespace std
-{
-
-Types:
-
- fenv_t
- fexcept_t
-
-int feclearexcept(int excepts);
-int fegetexceptflag(fexcept_t* flagp, int excepts);
-int feraiseexcept(int excepts);
-int fesetexceptflag(const fexcept_t* flagp, int excepts);
-int fetestexcept(int excepts);
-int fegetround();
-int fesetround(int round);
-int fegetenv(fenv_t* envp);
-int feholdexcept(fenv_t* envp);
-int fesetenv(const fenv_t* envp);
-int feupdateenv(const fenv_t* envp);
-
-} // std
-*/
-
-#include <__config>
-#include <fenv.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-using ::fenv_t;
-using ::fexcept_t;
-
-using ::feclearexcept;
-using ::fegetexceptflag;
-using ::feraiseexcept;
-using ::fesetexceptflag;
-using ::fetestexcept;
-using ::fegetround;
-using ::fesetround;
-using ::fegetenv;
-using ::feholdexcept;
-using ::fesetenv;
-using ::feupdateenv;
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_CFENV
diff --git a/lib/libcxx/include/cfloat b/lib/libcxx/include/cfloat
deleted file mode 100644
index 0abe84bf175..00000000000
--- a/lib/libcxx/include/cfloat
+++ /dev/null
@@ -1,80 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- cfloat -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CFLOAT
-#define _LIBCPP_CFLOAT
-
-/*
- cfloat synopsis
-
-Macros:
-
- FLT_ROUNDS
- FLT_EVAL_METHOD // C99
- FLT_RADIX
-
- FLT_HAS_SUBNORM // C11
- DBL_HAS_SUBNORM // C11
- LDBL_HAS_SUBNORM // C11
-
- FLT_MANT_DIG
- DBL_MANT_DIG
- LDBL_MANT_DIG
-
- DECIMAL_DIG // C99
- FLT_DECIMAL_DIG // C11
- DBL_DECIMAL_DIG // C11
- LDBL_DECIMAL_DIG // C11
-
- FLT_DIG
- DBL_DIG
- LDBL_DIG
-
- FLT_MIN_EXP
- DBL_MIN_EXP
- LDBL_MIN_EXP
-
- FLT_MIN_10_EXP
- DBL_MIN_10_EXP
- LDBL_MIN_10_EXP
-
- FLT_MAX_EXP
- DBL_MAX_EXP
- LDBL_MAX_EXP
-
- FLT_MAX_10_EXP
- DBL_MAX_10_EXP
- LDBL_MAX_10_EXP
-
- FLT_MAX
- DBL_MAX
- LDBL_MAX
-
- FLT_EPSILON
- DBL_EPSILON
- LDBL_EPSILON
-
- FLT_MIN
- DBL_MIN
- LDBL_MIN
-
- FLT_TRUE_MIN // C11
- DBL_TRUE_MIN // C11
- LDBL_TRUE_MIN // C11
-*/
-
-#include <__config>
-#include <float.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#endif // _LIBCPP_CFLOAT
diff --git a/lib/libcxx/include/charconv b/lib/libcxx/include/charconv
deleted file mode 100644
index 064f2e11c3f..00000000000
--- a/lib/libcxx/include/charconv
+++ /dev/null
@@ -1,617 +0,0 @@
-// -*- C++ -*-
-//===------------------------------ charconv ------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CHARCONV
-#define _LIBCPP_CHARCONV
-
-/*
- charconv synopsis
-
-namespace std {
-
- // floating-point format for primitive numerical conversion
- enum class chars_format {
- scientific = unspecified,
- fixed = unspecified,
- hex = unspecified,
- general = fixed | scientific
- };
-
- // 23.20.2, primitive numerical output conversion
- struct to_chars_result {
- char* ptr;
- errc ec;
- };
-
- to_chars_result to_chars(char* first, char* last, see below value,
- int base = 10);
-
- to_chars_result to_chars(char* first, char* last, float value);
- to_chars_result to_chars(char* first, char* last, double value);
- to_chars_result to_chars(char* first, char* last, long double value);
-
- to_chars_result to_chars(char* first, char* last, float value,
- chars_format fmt);
- to_chars_result to_chars(char* first, char* last, double value,
- chars_format fmt);
- to_chars_result to_chars(char* first, char* last, long double value,
- chars_format fmt);
-
- to_chars_result to_chars(char* first, char* last, float value,
- chars_format fmt, int precision);
- to_chars_result to_chars(char* first, char* last, double value,
- chars_format fmt, int precision);
- to_chars_result to_chars(char* first, char* last, long double value,
- chars_format fmt, int precision);
-
- // 23.20.3, primitive numerical input conversion
- struct from_chars_result {
- const char* ptr;
- errc ec;
- };
-
- from_chars_result from_chars(const char* first, const char* last,
- see below& value, int base = 10);
-
- from_chars_result from_chars(const char* first, const char* last,
- float& value,
- chars_format fmt = chars_format::general);
- from_chars_result from_chars(const char* first, const char* last,
- double& value,
- chars_format fmt = chars_format::general);
- from_chars_result from_chars(const char* first, const char* last,
- long double& value,
- chars_format fmt = chars_format::general);
-
-} // namespace std
-
-*/
-
-#include <__errc>
-#include <type_traits>
-#include <limits>
-#include <stdint.h>
-#include <string.h>
-#include <math.h>
-
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-namespace __itoa {
-_LIBCPP_FUNC_VIS char* __u64toa(uint64_t __value, char* __buffer);
-_LIBCPP_FUNC_VIS char* __u32toa(uint32_t __value, char* __buffer);
-}
-
-#if _LIBCPP_STD_VER > 11
-
-enum class _LIBCPP_ENUM_VIS chars_format
-{
- scientific = 0x1,
- fixed = 0x2,
- hex = 0x4,
- general = fixed | scientific
-};
-
-struct _LIBCPP_TYPE_VIS to_chars_result
-{
- char* ptr;
- errc ec;
-};
-
-struct _LIBCPP_TYPE_VIS from_chars_result
-{
- const char* ptr;
- errc ec;
-};
-
-void to_chars(char*, char*, bool, int = 10) = delete;
-void from_chars(const char*, const char*, bool, int = 10) = delete;
-
-namespace __itoa
-{
-
-static constexpr uint64_t __pow10_64[] = {
- UINT64_C(0),
- UINT64_C(10),
- UINT64_C(100),
- UINT64_C(1000),
- UINT64_C(10000),
- UINT64_C(100000),
- UINT64_C(1000000),
- UINT64_C(10000000),
- UINT64_C(100000000),
- UINT64_C(1000000000),
- UINT64_C(10000000000),
- UINT64_C(100000000000),
- UINT64_C(1000000000000),
- UINT64_C(10000000000000),
- UINT64_C(100000000000000),
- UINT64_C(1000000000000000),
- UINT64_C(10000000000000000),
- UINT64_C(100000000000000000),
- UINT64_C(1000000000000000000),
- UINT64_C(10000000000000000000),
-};
-
-static constexpr uint32_t __pow10_32[] = {
- UINT32_C(0), UINT32_C(10), UINT32_C(100),
- UINT32_C(1000), UINT32_C(10000), UINT32_C(100000),
- UINT32_C(1000000), UINT32_C(10000000), UINT32_C(100000000),
- UINT32_C(1000000000),
-};
-
-template <typename _Tp, typename = void>
-struct _LIBCPP_HIDDEN __traits_base
-{
- using type = uint64_t;
-
-#if !defined(_LIBCPP_COMPILER_MSVC)
- static _LIBCPP_INLINE_VISIBILITY int __width(_Tp __v)
- {
- auto __t = (64 - __builtin_clzll(__v | 1)) * 1233 >> 12;
- return __t - (__v < __pow10_64[__t]) + 1;
- }
-#endif
-
- static _LIBCPP_INLINE_VISIBILITY char* __convert(_Tp __v, char* __p)
- {
- return __u64toa(__v, __p);
- }
-
- static _LIBCPP_INLINE_VISIBILITY auto& __pow() { return __pow10_64; }
-};
-
-template <typename _Tp>
-struct _LIBCPP_HIDDEN
- __traits_base<_Tp, decltype(void(uint32_t{declval<_Tp>()}))>
-{
- using type = uint32_t;
-
-#if !defined(_LIBCPP_COMPILER_MSVC)
- static _LIBCPP_INLINE_VISIBILITY int __width(_Tp __v)
- {
- auto __t = (32 - __builtin_clz(__v | 1)) * 1233 >> 12;
- return __t - (__v < __pow10_32[__t]) + 1;
- }
-#endif
-
- static _LIBCPP_INLINE_VISIBILITY char* __convert(_Tp __v, char* __p)
- {
- return __u32toa(__v, __p);
- }
-
- static _LIBCPP_INLINE_VISIBILITY auto& __pow() { return __pow10_32; }
-};
-
-template <typename _Tp>
-inline _LIBCPP_INLINE_VISIBILITY bool
-__mul_overflowed(unsigned char __a, _Tp __b, unsigned char& __r)
-{
- auto __c = __a * __b;
- __r = __c;
- return __c > (numeric_limits<unsigned char>::max)();
-}
-
-template <typename _Tp>
-inline _LIBCPP_INLINE_VISIBILITY bool
-__mul_overflowed(unsigned short __a, _Tp __b, unsigned short& __r)
-{
- auto __c = __a * __b;
- __r = __c;
- return __c > (numeric_limits<unsigned short>::max)();
-}
-
-template <typename _Tp>
-inline _LIBCPP_INLINE_VISIBILITY bool
-__mul_overflowed(_Tp __a, _Tp __b, _Tp& __r)
-{
- static_assert(is_unsigned<_Tp>::value, "");
-#if !defined(_LIBCPP_COMPILER_MSVC)
- return __builtin_mul_overflow(__a, __b, &__r);
-#else
- bool __did = __b && ((numeric_limits<_Tp>::max)() / __b) < __a;
- __r = __a * __b;
- return __did;
-#endif
-}
-
-template <typename _Tp, typename _Up>
-inline _LIBCPP_INLINE_VISIBILITY bool
-__mul_overflowed(_Tp __a, _Up __b, _Tp& __r)
-{
- return __mul_overflowed(__a, static_cast<_Tp>(__b), __r);
-}
-
-template <typename _Tp>
-struct _LIBCPP_HIDDEN __traits : __traits_base<_Tp>
-{
- static constexpr int digits = numeric_limits<_Tp>::digits10 + 1;
- using __traits_base<_Tp>::__pow;
- using typename __traits_base<_Tp>::type;
-
- // precondition: at least one non-zero character available
- static _LIBCPP_INLINE_VISIBILITY char const*
- __read(char const* __p, char const* __ep, type& __a, type& __b)
- {
- type __cprod[digits];
- int __j = digits - 1;
- int __i = digits;
- do
- {
- if (!('0' <= *__p && *__p <= '9'))
- break;
- __cprod[--__i] = *__p++ - '0';
- } while (__p != __ep && __i != 0);
-
- __a = __inner_product(__cprod + __i + 1, __cprod + __j, __pow() + 1,
- __cprod[__i]);
- if (__mul_overflowed(__cprod[__j], __pow()[__j - __i], __b))
- --__p;
- return __p;
- }
-
- template <typename _It1, typename _It2, class _Up>
- static _LIBCPP_INLINE_VISIBILITY _Up
- __inner_product(_It1 __first1, _It1 __last1, _It2 __first2, _Up __init)
- {
- for (; __first1 < __last1; ++__first1, ++__first2)
- __init = __init + *__first1 * *__first2;
- return __init;
- }
-};
-
-} // namespace __itoa
-
-template <typename _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _Tp
-__complement(_Tp __x)
-{
- static_assert(is_unsigned<_Tp>::value, "cast to unsigned first");
- return _Tp(~__x + 1);
-}
-
-template <typename _Tp>
-inline _LIBCPP_INLINE_VISIBILITY auto
-__to_unsigned(_Tp __x)
-{
- return static_cast<make_unsigned_t<_Tp>>(__x);
-}
-
-template <typename _Tp>
-inline _LIBCPP_INLINE_VISIBILITY to_chars_result
-__to_chars_itoa(char* __first, char* __last, _Tp __value, true_type)
-{
- auto __x = __to_unsigned(__value);
- if (__value < 0 && __first != __last)
- {
- *__first++ = '-';
- __x = __complement(__x);
- }
-
- return __to_chars_itoa(__first, __last, __x, false_type());
-}
-
-template <typename _Tp>
-inline _LIBCPP_INLINE_VISIBILITY to_chars_result
-__to_chars_itoa(char* __first, char* __last, _Tp __value, false_type)
-{
- using __tx = __itoa::__traits<_Tp>;
- auto __diff = __last - __first;
-
-#if !defined(_LIBCPP_COMPILER_MSVC)
- if (__tx::digits <= __diff || __tx::__width(__value) <= __diff)
- return {__tx::__convert(__value, __first), {}};
- else
- return {__last, errc::value_too_large};
-#else
- if (__tx::digits <= __diff)
- return {__tx::__convert(__value, __first), {}};
- else
- {
- char __buf[__tx::digits];
- auto __p = __tx::__convert(__value, __buf);
- auto __len = __p - __buf;
- if (__len <= __diff)
- {
- memcpy(__first, __buf, __len);
- return {__first + __len, {}};
- }
- else
- return {__last, errc::value_too_large};
- }
-#endif
-}
-
-template <typename _Tp>
-inline _LIBCPP_INLINE_VISIBILITY to_chars_result
-__to_chars_integral(char* __first, char* __last, _Tp __value, int __base,
- true_type)
-{
- auto __x = __to_unsigned(__value);
- if (__value < 0 && __first != __last)
- {
- *__first++ = '-';
- __x = __complement(__x);
- }
-
- return __to_chars_integral(__first, __last, __x, __base, false_type());
-}
-
-template <typename _Tp>
-inline _LIBCPP_INLINE_VISIBILITY to_chars_result
-__to_chars_integral(char* __first, char* __last, _Tp __value, int __base,
- false_type)
-{
- if (__base == 10)
- return __to_chars_itoa(__first, __last, __value, false_type());
-
- auto __p = __last;
- while (__p != __first)
- {
- auto __c = __value % __base;
- __value /= __base;
- *--__p = "0123456789abcdefghijklmnopqrstuvwxyz"[__c];
- if (__value == 0)
- break;
- }
-
- auto __len = __last - __p;
- if (__value != 0 || !__len)
- return {__last, errc::value_too_large};
- else
- {
- memmove(__first, __p, __len);
- return {__first + __len, {}};
- }
-}
-
-template <typename _Tp, enable_if_t<is_integral<_Tp>::value, int> = 0>
-inline _LIBCPP_INLINE_VISIBILITY to_chars_result
-to_chars(char* __first, char* __last, _Tp __value)
-{
- return __to_chars_itoa(__first, __last, __value, is_signed<_Tp>());
-}
-
-template <typename _Tp, enable_if_t<is_integral<_Tp>::value, int> = 0>
-inline _LIBCPP_INLINE_VISIBILITY to_chars_result
-to_chars(char* __first, char* __last, _Tp __value, int __base)
-{
- _LIBCPP_ASSERT(2 <= __base && __base <= 36, "base not in [2, 36]");
- return __to_chars_integral(__first, __last, __value, __base,
- is_signed<_Tp>());
-}
-
-template <typename _It, typename _Tp, typename _Fn, typename... _Ts>
-inline _LIBCPP_INLINE_VISIBILITY from_chars_result
-__sign_combinator(_It __first, _It __last, _Tp& __value, _Fn __f, _Ts... __args)
-{
- using __tl = numeric_limits<_Tp>;
- decltype(__to_unsigned(__value)) __x;
-
- bool __neg = (__first != __last && *__first == '-');
- auto __r = __f(__neg ? __first + 1 : __first, __last, __x, __args...);
- switch (__r.ec)
- {
- case errc::invalid_argument:
- return {__first, __r.ec};
- case errc::result_out_of_range:
- return __r;
- default:
- break;
- }
-
- if (__neg)
- {
- if (__x <= __complement(__to_unsigned(__tl::min())))
- {
- __x = __complement(__x);
- memcpy(&__value, &__x, sizeof(__x));
- return __r;
- }
- }
- else
- {
- if (__x <= (__tl::max)())
- {
- __value = __x;
- return __r;
- }
- }
-
- return {__r.ptr, errc::result_out_of_range};
-}
-
-template <typename _Tp>
-inline _LIBCPP_INLINE_VISIBILITY bool
-__in_pattern(_Tp __c)
-{
- return '0' <= __c && __c <= '9';
-}
-
-struct _LIBCPP_HIDDEN __in_pattern_result
-{
- bool __ok;
- int __val;
-
- explicit _LIBCPP_INLINE_VISIBILITY operator bool() const { return __ok; }
-};
-
-template <typename _Tp>
-inline _LIBCPP_INLINE_VISIBILITY __in_pattern_result
-__in_pattern(_Tp __c, int __base)
-{
- if (__base <= 10)
- return {'0' <= __c && __c < '0' + __base, __c - '0'};
- else if (__in_pattern(__c))
- return {true, __c - '0'};
- else if ('a' <= __c && __c < 'a' + __base - 10)
- return {true, __c - 'a' + 10};
- else
- return {'A' <= __c && __c < 'A' + __base - 10, __c - 'A' + 10};
-}
-
-template <typename _It, typename _Tp, typename _Fn, typename... _Ts>
-inline _LIBCPP_INLINE_VISIBILITY from_chars_result
-__subject_seq_combinator(_It __first, _It __last, _Tp& __value, _Fn __f,
- _Ts... __args)
-{
- auto __find_non_zero = [](_It __first, _It __last) {
- for (; __first != __last; ++__first)
- if (*__first != '0')
- break;
- return __first;
- };
-
- auto __p = __find_non_zero(__first, __last);
- if (__p == __last || !__in_pattern(*__p, __args...))
- {
- if (__p == __first)
- return {__first, errc::invalid_argument};
- else
- {
- __value = 0;
- return {__p, {}};
- }
- }
-
- auto __r = __f(__p, __last, __value, __args...);
- if (__r.ec == errc::result_out_of_range)
- {
- for (; __r.ptr != __last; ++__r.ptr)
- {
- if (!__in_pattern(*__r.ptr, __args...))
- break;
- }
- }
-
- return __r;
-}
-
-template <typename _Tp, enable_if_t<is_unsigned<_Tp>::value, int> = 0>
-inline _LIBCPP_INLINE_VISIBILITY from_chars_result
-__from_chars_atoi(const char* __first, const char* __last, _Tp& __value)
-{
- using __tx = __itoa::__traits<_Tp>;
- using __output_type = typename __tx::type;
-
- return __subject_seq_combinator(
- __first, __last, __value,
- [](const char* __first, const char* __last,
- _Tp& __value) -> from_chars_result {
- __output_type __a, __b;
- auto __p = __tx::__read(__first, __last, __a, __b);
- if (__p == __last || !__in_pattern(*__p))
- {
- __output_type __m = (numeric_limits<_Tp>::max)();
- if (__m >= __a && __m - __a >= __b)
- {
- __value = __a + __b;
- return {__p, {}};
- }
- }
- return {__p, errc::result_out_of_range};
- });
-}
-
-template <typename _Tp, enable_if_t<is_signed<_Tp>::value, int> = 0>
-inline _LIBCPP_INLINE_VISIBILITY from_chars_result
-__from_chars_atoi(const char* __first, const char* __last, _Tp& __value)
-{
- using __t = decltype(__to_unsigned(__value));
- return __sign_combinator(__first, __last, __value, __from_chars_atoi<__t>);
-}
-
-template <typename _Tp, enable_if_t<is_unsigned<_Tp>::value, int> = 0>
-inline _LIBCPP_INLINE_VISIBILITY from_chars_result
-__from_chars_integral(const char* __first, const char* __last, _Tp& __value,
- int __base)
-{
- if (__base == 10)
- return __from_chars_atoi(__first, __last, __value);
-
- return __subject_seq_combinator(
- __first, __last, __value,
- [](const char* __p, const char* __last, _Tp& __value,
- int __base) -> from_chars_result {
- using __tl = numeric_limits<_Tp>;
- auto __digits = __tl::digits / log2f(float(__base));
- _Tp __a = __in_pattern(*__p++, __base).__val, __b = 0;
-
- for (int __i = 1; __p != __last; ++__i, ++__p)
- {
- if (auto __c = __in_pattern(*__p, __base))
- {
- if (__i < __digits - 1)
- __a = __a * __base + __c.__val;
- else
- {
- if (!__itoa::__mul_overflowed(__a, __base, __a))
- ++__p;
- __b = __c.__val;
- break;
- }
- }
- else
- break;
- }
-
- if (__p == __last || !__in_pattern(*__p, __base))
- {
- if ((__tl::max)() - __a >= __b)
- {
- __value = __a + __b;
- return {__p, {}};
- }
- }
- return {__p, errc::result_out_of_range};
- },
- __base);
-}
-
-template <typename _Tp, enable_if_t<is_signed<_Tp>::value, int> = 0>
-inline _LIBCPP_INLINE_VISIBILITY from_chars_result
-__from_chars_integral(const char* __first, const char* __last, _Tp& __value,
- int __base)
-{
- using __t = decltype(__to_unsigned(__value));
- return __sign_combinator(__first, __last, __value,
- __from_chars_integral<__t>, __base);
-}
-
-template <typename _Tp, enable_if_t<is_integral<_Tp>::value, int> = 0>
-inline _LIBCPP_INLINE_VISIBILITY from_chars_result
-from_chars(const char* __first, const char* __last, _Tp& __value)
-{
- return __from_chars_atoi(__first, __last, __value);
-}
-
-template <typename _Tp, enable_if_t<is_integral<_Tp>::value, int> = 0>
-inline _LIBCPP_INLINE_VISIBILITY from_chars_result
-from_chars(const char* __first, const char* __last, _Tp& __value, int __base)
-{
- _LIBCPP_ASSERT(2 <= __base && __base <= 36, "base not in [2, 36]");
- return __from_chars_integral(__first, __last, __value, __base);
-}
-
-#endif // _LIBCPP_STD_VER > 11
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_CHARCONV
diff --git a/lib/libcxx/include/chrono b/lib/libcxx/include/chrono
deleted file mode 100644
index 96759f9860e..00000000000
--- a/lib/libcxx/include/chrono
+++ /dev/null
@@ -1,2865 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- chrono ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CHRONO
-#define _LIBCPP_CHRONO
-
-/*
- chrono synopsis
-
-namespace std
-{
-namespace chrono
-{
-
-template <class ToDuration, class Rep, class Period>
-constexpr
-ToDuration
-duration_cast(const duration<Rep, Period>& fd);
-
-template <class Rep> struct treat_as_floating_point : is_floating_point<Rep> {};
-
-template <class Rep> inline constexpr bool treat_as_floating_point_v
- = treat_as_floating_point<Rep>::value; // C++17
-
-template <class Rep>
-struct duration_values
-{
-public:
- static constexpr Rep zero(); // noexcept in C++20
- static constexpr Rep max(); // noexcept in C++20
- static constexpr Rep min(); // noexcept in C++20
-};
-
-// duration
-
-template <class Rep, class Period = ratio<1>>
-class duration
-{
- static_assert(!__is_duration<Rep>::value, "A duration representation can not be a duration");
- static_assert(__is_ratio<Period>::value, "Second template parameter of duration must be a std::ratio");
- static_assert(Period::num > 0, "duration period must be positive");
-public:
- typedef Rep rep;
- typedef typename _Period::type period;
-
- constexpr duration() = default;
- template <class Rep2>
- constexpr explicit duration(const Rep2& r,
- typename enable_if
- <
- is_convertible<Rep2, rep>::value &&
- (treat_as_floating_point<rep>::value ||
- !treat_as_floating_point<rep>::value && !treat_as_floating_point<Rep2>::value)
- >::type* = 0);
-
- // conversions
- template <class Rep2, class Period2>
- constexpr duration(const duration<Rep2, Period2>& d,
- typename enable_if
- <
- treat_as_floating_point<rep>::value ||
- ratio_divide<Period2, period>::type::den == 1
- >::type* = 0);
-
- // observer
-
- constexpr rep count() const;
-
- // arithmetic
-
- constexpr common_type<duration>::type operator+() const;
- constexpr common_type<duration>::type operator-() const;
- constexpr duration& operator++(); // constexpr in C++17
- constexpr duration operator++(int); // constexpr in C++17
- constexpr duration& operator--(); // constexpr in C++17
- constexpr duration operator--(int); // constexpr in C++17
-
- constexpr duration& operator+=(const duration& d); // constexpr in C++17
- constexpr duration& operator-=(const duration& d); // constexpr in C++17
-
- duration& operator*=(const rep& rhs); // constexpr in C++17
- duration& operator/=(const rep& rhs); // constexpr in C++17
- duration& operator%=(const rep& rhs); // constexpr in C++17
- duration& operator%=(const duration& rhs); // constexpr in C++17
-
- // special values
-
- static constexpr duration zero(); // noexcept in C++20
- static constexpr duration min(); // noexcept in C++20
- static constexpr duration max(); // noexcept in C++20
-};
-
-typedef duration<long long, nano> nanoseconds;
-typedef duration<long long, micro> microseconds;
-typedef duration<long long, milli> milliseconds;
-typedef duration<long long > seconds;
-typedef duration< long, ratio< 60> > minutes;
-typedef duration< long, ratio<3600> > hours;
-
-template <class Clock, class Duration = typename Clock::duration>
-class time_point
-{
-public:
- typedef Clock clock;
- typedef Duration duration;
- typedef typename duration::rep rep;
- typedef typename duration::period period;
-private:
- duration d_; // exposition only
-
-public:
- time_point(); // has value "epoch" // constexpr in C++14
- explicit time_point(const duration& d); // same as time_point() + d // constexpr in C++14
-
- // conversions
- template <class Duration2>
- time_point(const time_point<clock, Duration2>& t); // constexpr in C++14
-
- // observer
-
- duration time_since_epoch() const; // constexpr in C++14
-
- // arithmetic
-
- time_point& operator+=(const duration& d); // constexpr in C++17
- time_point& operator-=(const duration& d); // constexpr in C++17
-
- // special values
-
- static constexpr time_point min(); // noexcept in C++20
- static constexpr time_point max(); // noexcept in C++20
-};
-
-} // chrono
-
-// common_type traits
-template <class Rep1, class Period1, class Rep2, class Period2>
- struct common_type<chrono::duration<Rep1, Period1>, chrono::duration<Rep2, Period2>>;
-
-template <class Clock, class Duration1, class Duration2>
- struct common_type<chrono::time_point<Clock, Duration1>, chrono::time_point<Clock, Duration2>>;
-
-namespace chrono {
-
-
-template<class T> struct is_clock; // C++20
-template<class T> inline constexpr bool is_clock_v = is_clock<T>::value; // C++20
-
-
-// duration arithmetic
-template <class Rep1, class Period1, class Rep2, class Period2>
- constexpr
- typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
- operator+(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
-template <class Rep1, class Period1, class Rep2, class Period2>
- constexpr
- typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
- operator-(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
-template <class Rep1, class Period, class Rep2>
- constexpr
- duration<typename common_type<Rep1, Rep2>::type, Period>
- operator*(const duration<Rep1, Period>& d, const Rep2& s);
-template <class Rep1, class Period, class Rep2>
- constexpr
- duration<typename common_type<Rep1, Rep2>::type, Period>
- operator*(const Rep1& s, const duration<Rep2, Period>& d);
-template <class Rep1, class Period, class Rep2>
- constexpr
- duration<typename common_type<Rep1, Rep2>::type, Period>
- operator/(const duration<Rep1, Period>& d, const Rep2& s);
-template <class Rep1, class Period1, class Rep2, class Period2>
- constexpr
- typename common_type<Rep1, Rep2>::type
- operator/(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
-
-// duration comparisons
-template <class Rep1, class Period1, class Rep2, class Period2>
- constexpr
- bool operator==(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
-template <class Rep1, class Period1, class Rep2, class Period2>
- constexpr
- bool operator!=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
-template <class Rep1, class Period1, class Rep2, class Period2>
- constexpr
- bool operator< (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
-template <class Rep1, class Period1, class Rep2, class Period2>
- constexpr
- bool operator<=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
-template <class Rep1, class Period1, class Rep2, class Period2>
- constexpr
- bool operator> (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
-template <class Rep1, class Period1, class Rep2, class Period2>
- constexpr
- bool operator>=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
-
-// duration_cast
-template <class ToDuration, class Rep, class Period>
- ToDuration duration_cast(const duration<Rep, Period>& d);
-
-template <class ToDuration, class Rep, class Period>
- constexpr ToDuration floor(const duration<Rep, Period>& d); // C++17
-template <class ToDuration, class Rep, class Period>
- constexpr ToDuration ceil(const duration<Rep, Period>& d); // C++17
-template <class ToDuration, class Rep, class Period>
- constexpr ToDuration round(const duration<Rep, Period>& d); // C++17
-
-// duration I/O is elsewhere
-
-// time_point arithmetic (all constexpr in C++14)
-template <class Clock, class Duration1, class Rep2, class Period2>
- time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type>
- operator+(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs);
-template <class Rep1, class Period1, class Clock, class Duration2>
- time_point<Clock, typename common_type<duration<Rep1, Period1>, Duration2>::type>
- operator+(const duration<Rep1, Period1>& lhs, const time_point<Clock, Duration2>& rhs);
-template <class Clock, class Duration1, class Rep2, class Period2>
- time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type>
- operator-(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs);
-template <class Clock, class Duration1, class Duration2>
- typename common_type<Duration1, Duration2>::type
- operator-(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
-
-// time_point comparisons (all constexpr in C++14)
-template <class Clock, class Duration1, class Duration2>
- bool operator==(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
-template <class Clock, class Duration1, class Duration2>
- bool operator!=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
-template <class Clock, class Duration1, class Duration2>
- bool operator< (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
-template <class Clock, class Duration1, class Duration2>
- bool operator<=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
-template <class Clock, class Duration1, class Duration2>
- bool operator> (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
-template <class Clock, class Duration1, class Duration2>
- bool operator>=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
-
-// time_point_cast (constexpr in C++14)
-
-template <class ToDuration, class Clock, class Duration>
- time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration>& t);
-
-template <class ToDuration, class Clock, class Duration>
- constexpr time_point<Clock, ToDuration>
- floor(const time_point<Clock, Duration>& tp); // C++17
-
-template <class ToDuration, class Clock, class Duration>
- constexpr time_point<Clock, ToDuration>
- ceil(const time_point<Clock, Duration>& tp); // C++17
-
-template <class ToDuration, class Clock, class Duration>
- constexpr time_point<Clock, ToDuration>
- round(const time_point<Clock, Duration>& tp); // C++17
-
-template <class Rep, class Period>
- constexpr duration<Rep, Period> abs(duration<Rep, Period> d); // C++17
-
-// Clocks
-
-class system_clock
-{
-public:
- typedef microseconds duration;
- typedef duration::rep rep;
- typedef duration::period period;
- typedef chrono::time_point<system_clock> time_point;
- static const bool is_steady = false; // constexpr in C++14
-
- static time_point now() noexcept;
- static time_t to_time_t (const time_point& __t) noexcept;
- static time_point from_time_t(time_t __t) noexcept;
-};
-
-template <class Duration>
- using sys_time = time_point<system_clock, Duration>; // C++20
-using sys_seconds = sys_time<seconds>; // C++20
-using sys_days = sys_time<days>; // C++20
-
-class utc_clock; // C++20
-
-template <class Duration>
- using utc_time = time_point<utc_clock, Duration>; // C++20
-using utc_seconds = utc_time<seconds>; // C++20
-
-class tai_clock; // C++20
-
-template <class Duration>
- using tai_time = time_point<tai_clock, Duration>; // C++20
-using tai_seconds = tai_time<seconds>; // C++20
-
-class file_clock; // C++20
-
-template<class Duration>
- using file_time = time_point<file_clock, Duration>; // C++20
-
-class steady_clock
-{
-public:
- typedef nanoseconds duration;
- typedef duration::rep rep;
- typedef duration::period period;
- typedef chrono::time_point<steady_clock, duration> time_point;
- static const bool is_steady = true; // constexpr in C++14
-
- static time_point now() noexcept;
-};
-
-typedef steady_clock high_resolution_clock;
-
-// 25.7.8, local time // C++20
-struct local_t {};
-template<class Duration>
- using local_time = time_point<local_t, Duration>;
-using local_seconds = local_time<seconds>;
-using local_days = local_time<days>;
-
-// 25.7.9, time_point conversions template<class DestClock, class SourceClock> // C++20
-struct clock_time_conversion;
-
-template<class DestClock, class SourceClock, class Duration>
- auto clock_cast(const time_point<SourceClock, Duration>& t);
-
-// 25.8.2, class last_spec // C++20
-struct last_spec;
-
-// 25.8.3, class day // C++20
-
-class day;
-constexpr bool operator==(const day& x, const day& y) noexcept;
-constexpr bool operator!=(const day& x, const day& y) noexcept;
-constexpr bool operator< (const day& x, const day& y) noexcept;
-constexpr bool operator> (const day& x, const day& y) noexcept;
-constexpr bool operator<=(const day& x, const day& y) noexcept;
-constexpr bool operator>=(const day& x, const day& y) noexcept;
-constexpr day operator+(const day& x, const days& y) noexcept;
-constexpr day operator+(const days& x, const day& y) noexcept;
-constexpr day operator-(const day& x, const days& y) noexcept;
-constexpr days operator-(const day& x, const day& y) noexcept;
-
-// 25.8.4, class month // C++20
-class month;
-constexpr bool operator==(const month& x, const month& y) noexcept;
-constexpr bool operator!=(const month& x, const month& y) noexcept;
-constexpr bool operator< (const month& x, const month& y) noexcept;
-constexpr bool operator> (const month& x, const month& y) noexcept;
-constexpr bool operator<=(const month& x, const month& y) noexcept;
-constexpr bool operator>=(const month& x, const month& y) noexcept;
-constexpr month operator+(const month& x, const months& y) noexcept;
-constexpr month operator+(const months& x, const month& y) noexcept;
-constexpr month operator-(const month& x, const months& y) noexcept;
-constexpr months operator-(const month& x, const month& y) noexcept;
-
-// 25.8.5, class year // C++20
-class year;
-constexpr bool operator==(const year& x, const year& y) noexcept;
-constexpr bool operator!=(const year& x, const year& y) noexcept;
-constexpr bool operator< (const year& x, const year& y) noexcept;
-constexpr bool operator> (const year& x, const year& y) noexcept;
-constexpr bool operator<=(const year& x, const year& y) noexcept;
-constexpr bool operator>=(const year& x, const year& y) noexcept;
-constexpr year operator+(const year& x, const years& y) noexcept;
-constexpr year operator+(const years& x, const year& y) noexcept;
-constexpr year operator-(const year& x, const years& y) noexcept;
-constexpr years operator-(const year& x, const year& y) noexcept;
-
-// 25.8.6, class weekday // C++20
-class weekday;
-
-constexpr bool operator==(const weekday& x, const weekday& y) noexcept;
-constexpr bool operator!=(const weekday& x, const weekday& y) noexcept;
-constexpr weekday operator+(const weekday& x, const days& y) noexcept;
-constexpr weekday operator+(const days& x, const weekday& y) noexcept;
-constexpr weekday operator-(const weekday& x, const days& y) noexcept;
-constexpr days operator-(const weekday& x, const weekday& y) noexcept;
-
-// 25.8.7, class weekday_indexed // C++20
-
-class weekday_indexed;
-constexpr bool operator==(const weekday_indexed& x, const weekday_indexed& y) noexcept;
-constexpr bool operator!=(const weekday_indexed& x, const weekday_indexed& y) noexcept;
-
-// 25.8.8, class weekday_last // C++20
-class weekday_last;
-
-constexpr bool operator==(const weekday_last& x, const weekday_last& y) noexcept;
-constexpr bool operator!=(const weekday_last& x, const weekday_last& y) noexcept;
-
-// 25.8.9, class month_day // C++20
-class month_day;
-
-constexpr bool operator==(const month_day& x, const month_day& y) noexcept;
-constexpr bool operator!=(const month_day& x, const month_day& y) noexcept;
-constexpr bool operator< (const month_day& x, const month_day& y) noexcept;
-constexpr bool operator> (const month_day& x, const month_day& y) noexcept;
-constexpr bool operator<=(const month_day& x, const month_day& y) noexcept;
-constexpr bool operator>=(const month_day& x, const month_day& y) noexcept;
-
-
-// 25.8.10, class month_day_last // C++20
-class month_day_last;
-
-constexpr bool operator==(const month_day_last& x, const month_day_last& y) noexcept;
-constexpr bool operator!=(const month_day_last& x, const month_day_last& y) noexcept;
-constexpr bool operator< (const month_day_last& x, const month_day_last& y) noexcept;
-constexpr bool operator> (const month_day_last& x, const month_day_last& y) noexcept;
-constexpr bool operator<=(const month_day_last& x, const month_day_last& y) noexcept;
-constexpr bool operator>=(const month_day_last& x, const month_day_last& y) noexcept;
-
-// 25.8.11, class month_weekday // C++20
-class month_weekday;
-
-constexpr bool operator==(const month_weekday& x, const month_weekday& y) noexcept;
-constexpr bool operator!=(const month_weekday& x, const month_weekday& y) noexcept;
-
-// 25.8.12, class month_weekday_last // C++20
-class month_weekday_last;
-
-constexpr bool operator==(const month_weekday_last& x, const month_weekday_last& y) noexcept;
-constexpr bool operator!=(const month_weekday_last& x, const month_weekday_last& y) noexcept;
-
-
-// 25.8.13, class year_month // C++20
-class year_month;
-
-constexpr bool operator==(const year_month& x, const year_month& y) noexcept;
-constexpr bool operator!=(const year_month& x, const year_month& y) noexcept;
-constexpr bool operator< (const year_month& x, const year_month& y) noexcept;
-constexpr bool operator> (const year_month& x, const year_month& y) noexcept;
-constexpr bool operator<=(const year_month& x, const year_month& y) noexcept;
-constexpr bool operator>=(const year_month& x, const year_month& y) noexcept;
-
-constexpr year_month operator+(const year_month& ym, const months& dm) noexcept;
-constexpr year_month operator+(const months& dm, const year_month& ym) noexcept;
-constexpr year_month operator-(const year_month& ym, const months& dm) noexcept;
-constexpr months operator-(const year_month& x, const year_month& y) noexcept;
-constexpr year_month operator+(const year_month& ym, const years& dy) noexcept;
-constexpr year_month operator+(const years& dy, const year_month& ym) noexcept;
-constexpr year_month operator-(const year_month& ym, const years& dy) noexcept;
-
-// 25.8.14, class year_month_day class // C++20
-year_month_day;
-
-constexpr bool operator==(const year_month_day& x, const year_month_day& y) noexcept;
-constexpr bool operator!=(const year_month_day& x, const year_month_day& y) noexcept;
-constexpr bool operator< (const year_month_day& x, const year_month_day& y) noexcept;
-constexpr bool operator> (const year_month_day& x, const year_month_day& y) noexcept;
-constexpr bool operator<=(const year_month_day& x, const year_month_day& y) noexcept;
-constexpr bool operator>=(const year_month_day& x, const year_month_day& y) noexcept;
-
-constexpr year_month_day operator+(const year_month_day& ymd, const months& dm) noexcept;
-constexpr year_month_day operator+(const months& dm, const year_month_day& ymd) noexcept;
-constexpr year_month_day operator+(const year_month_day& ymd, const years& dy) noexcept;
-constexpr year_month_day operator+(const years& dy, const year_month_day& ymd) noexcept;
-constexpr year_month_day operator-(const year_month_day& ymd, const months& dm) noexcept;
-constexpr year_month_day operator-(const year_month_day& ymd, const years& dy) noexcept;
-
-
-// 25.8.15, class year_month_day_last // C++20
-class year_month_day_last;
-
-constexpr bool operator==(const year_month_day_last& x,
- const year_month_day_last& y) noexcept;
-constexpr bool operator!=(const year_month_day_last& x,
- const year_month_day_last& y) noexcept;
-constexpr bool operator< (const year_month_day_last& x,
- const year_month_day_last& y) noexcept;
-constexpr bool operator> (const year_month_day_last& x,
- const year_month_day_last& y) noexcept;
-constexpr bool operator<=(const year_month_day_last& x,
- const year_month_day_last& y) noexcept;
-constexpr bool operator>=(const year_month_day_last& x,
- const year_month_day_last& y) noexcept;
-
-constexpr year_month_day_last
- operator+(const year_month_day_last& ymdl, const months& dm) noexcept;
-constexpr year_month_day_last
- operator+(const months& dm, const year_month_day_last& ymdl) noexcept;
-constexpr year_month_day_last
- operator+(const year_month_day_last& ymdl, const years& dy) noexcept;
-constexpr year_month_day_last
- operator+(const years& dy, const year_month_day_last& ymdl) noexcept;
-constexpr year_month_day_last
- operator-(const year_month_day_last& ymdl, const months& dm) noexcept;
-constexpr year_month_day_last
- operator-(const year_month_day_last& ymdl, const years& dy) noexcept;
-
-// 25.8.16, class year_month_weekday // C++20
-class year_month_weekday;
-
-constexpr bool operator==(const year_month_weekday& x,
- const year_month_weekday& y) noexcept;
-constexpr bool operator!=(const year_month_weekday& x,
- const year_month_weekday& y) noexcept;
-
-constexpr year_month_weekday
- operator+(const year_month_weekday& ymwd, const months& dm) noexcept;
-constexpr year_month_weekday
- operator+(const months& dm, const year_month_weekday& ymwd) noexcept;
-constexpr year_month_weekday
- operator+(const year_month_weekday& ymwd, const years& dy) noexcept;
-constexpr year_month_weekday
- operator+(const years& dy, const year_month_weekday& ymwd) noexcept;
-constexpr year_month_weekday
- operator-(const year_month_weekday& ymwd, const months& dm) noexcept;
-constexpr year_month_weekday
- operator-(const year_month_weekday& ymwd, const years& dy) noexcept;
-
-// 25.8.17, class year_month_weekday_last // C++20
-class year_month_weekday_last;
-
-constexpr bool operator==(const year_month_weekday_last& x,
- const year_month_weekday_last& y) noexcept;
-constexpr bool operator!=(const year_month_weekday_last& x,
- const year_month_weekday_last& y) noexcept;
-constexpr year_month_weekday_last
- operator+(const year_month_weekday_last& ymwdl, const months& dm) noexcept;
-constexpr year_month_weekday_last
- operator+(const months& dm, const year_month_weekday_last& ymwdl) noexcept;
-constexpr year_month_weekday_last
- operator+(const year_month_weekday_last& ymwdl, const years& dy) noexcept;
-constexpr year_month_weekday_last
- operator+(const years& dy, const year_month_weekday_last& ymwdl) noexcept;
-constexpr year_month_weekday_last
- operator-(const year_month_weekday_last& ymwdl, const months& dm) noexcept;
-constexpr year_month_weekday_last
- operator-(const year_month_weekday_last& ymwdl, const years& dy) noexcept;
-
-// 25.8.18, civil calendar conventional syntax operators // C++20
-constexpr year_month
- operator/(const year& y, const month& m) noexcept;
-constexpr year_month
- operator/(const year& y, int m) noexcept;
-constexpr month_day
- operator/(const month& m, const day& d) noexcept;
-constexpr month_day
- operator/(const month& m, int d) noexcept;
-constexpr month_day
- operator/(int m, const day& d) noexcept;
-constexpr month_day
- operator/(const day& d, const month& m) noexcept;
-constexpr month_day
- operator/(const day& d, int m) noexcept;
-constexpr month_day_last
- operator/(const month& m, last_spec) noexcept;
-constexpr month_day_last
- operator/(int m, last_spec) noexcept;
-constexpr month_day_last
- operator/(last_spec, const month& m) noexcept;
-constexpr month_day_last
- operator/(last_spec, int m) noexcept;
-constexpr month_weekday
- operator/(const month& m, const weekday_indexed& wdi) noexcept;
-constexpr month_weekday
- operator/(int m, const weekday_indexed& wdi) noexcept;
-constexpr month_weekday
- operator/(const weekday_indexed& wdi, const month& m) noexcept;
-constexpr month_weekday
- operator/(const weekday_indexed& wdi, int m) noexcept;
-constexpr month_weekday_last
- operator/(const month& m, const weekday_last& wdl) noexcept;
-constexpr month_weekday_last
- operator/(int m, const weekday_last& wdl) noexcept;
-constexpr month_weekday_last
- operator/(const weekday_last& wdl, const month& m) noexcept;
-constexpr month_weekday_last
- operator/(const weekday_last& wdl, int m) noexcept;
-constexpr year_month_day
- operator/(const year_month& ym, const day& d) noexcept;
-constexpr year_month_day
- operator/(const year_month& ym, int d) noexcept;
-constexpr year_month_day
- operator/(const year& y, const month_day& md) noexcept;
-constexpr year_month_day
- operator/(int y, const month_day& md) noexcept;
-constexpr year_month_day
- operator/(const month_day& md, const year& y) noexcept;
-constexpr year_month_day
- operator/(const month_day& md, int y) noexcept;
-constexpr year_month_day_last
- operator/(const year_month& ym, last_spec) noexcept;
-constexpr year_month_day_last
- operator/(const year& y, const month_day_last& mdl) noexcept;
-constexpr year_month_day_last
- operator/(int y, const month_day_last& mdl) noexcept;
-constexpr year_month_day_last
- operator/(const month_day_last& mdl, const year& y) noexcept;
-constexpr year_month_day_last
- operator/(const month_day_last& mdl, int y) noexcept;
-constexpr year_month_weekday
- operator/(const year_month& ym, const weekday_indexed& wdi) noexcept;
-constexpr year_month_weekday
- operator/(const year& y, const month_weekday& mwd) noexcept;
-constexpr year_month_weekday
- operator/(int y, const month_weekday& mwd) noexcept;
-constexpr year_month_weekday
- operator/(const month_weekday& mwd, const year& y) noexcept;
-constexpr year_month_weekday
- operator/(const month_weekday& mwd, int y) noexcept;
-constexpr year_month_weekday_last
- operator/(const year_month& ym, const weekday_last& wdl) noexcept;
-constexpr year_month_weekday_last
- operator/(const year& y, const month_weekday_last& mwdl) noexcept;
-constexpr year_month_weekday_last
- operator/(int y, const month_weekday_last& mwdl) noexcept;
-constexpr year_month_weekday_last
- operator/(const month_weekday_last& mwdl, const year& y) noexcept;
-constexpr year_month_weekday_last
- operator/(const month_weekday_last& mwdl, int y) noexcept;
-
-// 25.9, class template time_of_day // C++20
-template<class Duration> class time_of_day;
-
-template<> class time_of_day<hours>;
-template<> class time_of_day<minutes>;
-template<> class time_of_day<seconds>;
-template<class Rep, class Period> class time_of_day<duration<Rep, Period>>;
-
-// 25.10.2, time zone database // C++20
-struct tzdb;
-class tzdb_list;
-
-// 25.10.2.3, time zone database access // C++20
-const tzdb& get_tzdb();
-tzdb_list& get_tzdb_list();
-const time_zone* locate_zone(string_view tz_name);
-const time_zone* current_zone();
-
-// 25.10.2.4, remote time zone database support // C++20
-const tzdb& reload_tzdb();
-string remote_version();
-
-// 25.10.3, exception classes // C++20
-class nonexistent_local_time;
-class ambiguous_local_time;
-
-// 25.10.4, information classes // C++20
-struct sys_info;
-struct local_info;
-
-// 25.10.5, class time_zone // C++20
-enum class choose {earliest, latest};
-class time_zone;
-bool operator==(const time_zone& x, const time_zone& y) noexcept;
-bool operator!=(const time_zone& x, const time_zone& y) noexcept;
-bool operator<(const time_zone& x, const time_zone& y) noexcept;
-bool operator>(const time_zone& x, const time_zone& y) noexcept;
-bool operator<=(const time_zone& x, const time_zone& y) noexcept;
-bool operator>=(const time_zone& x, const time_zone& y) noexcept;
-
-// 25.10.6, class template zoned_traits // C++20
-template<class T> struct zoned_traits;
-
-// 25.10.7, class template zoned_time // C++20
-template<class Duration, class TimeZonePtr = const time_zone*> class zoned_time;
-using zoned_seconds = zoned_time<seconds>;
-
-template<class Duration1, class Duration2, class TimeZonePtr>
- bool operator==(const zoned_time<Duration1, TimeZonePtr>& x,
- const zoned_time<Duration2, TimeZonePtr>& y);
-template<class Duration1, class Duration2, class TimeZonePtr>
- bool operator!=(const zoned_time<Duration1, TimeZonePtr>& x,
- const zoned_time<Duration2, TimeZonePtr>& y);
-
-// 25.10.8, leap second support // C++20
-class leap;
-
-bool operator==(const leap& x, const leap& y);
-bool operator!=(const leap& x, const leap& y);
-bool operator< (const leap& x, const leap& y);
-bool operator> (const leap& x, const leap& y);
-bool operator<=(const leap& x, const leap& y);
-bool operator>=(const leap& x, const leap& y);
-template<class Duration>
- bool operator==(const leap& x, const sys_time<Duration>& y);
-template<class Duration>
- bool operator==(const sys_time<Duration>& x, const leap& y);
-template<class Duration>
- bool operator!=(const leap& x, const sys_time<Duration>& y);
-template<class Duration>
- bool operator!=(const sys_time<Duration>& x, const leap& y);
-template<class Duration>
- bool operator< (const leap& x, const sys_time<Duration>& y);
-template<class Duration>
- bool operator< (const sys_time<Duration>& x, const leap& y);
-template<class Duration>
- bool operator> (const leap& x, const sys_time<Duration>& y);
-template<class Duration>
- bool operator> (const sys_time<Duration>& x, const leap& y);
-template<class Duration>
- bool operator<=(const leap& x, const sys_time<Duration>& y);
-template<class Duration>
- bool operator<=(const sys_time<Duration>& x, const leap& y);
-template<class Duration>
- bool operator>=(const leap& x, const sys_time<Duration>& y);
-template<class Duration>
- bool operator>=(const sys_time<Duration>& x, const leap& y);
-
-// 25.10.9, class link // C++20
-class link;
-bool operator==(const link& x, const link& y);
-bool operator!=(const link& x, const link& y);
-bool operator< (const link& x, const link& y);
-bool operator> (const link& x, const link& y);
-bool operator<=(const link& x, const link& y);
-bool operator>=(const link& x, const link& y);
-
-// 25.11, formatting // C++20
-template<class charT, class Streamable>
- basic_string<charT>
- format(const charT* fmt, const Streamable& s);
-
-template<class charT, class Streamable>
- basic_string<charT>
- format(const locale& loc, const charT* fmt, const Streamable& s);
-
-template<class charT, class traits, class Alloc, class Streamable>
- basic_string<charT, traits, Alloc>
- format(const basic_string<charT, traits, Alloc>& fmt, const Streamable& s);
-
-template<class charT, class traits, class Alloc, class Streamable>
- basic_string<charT, traits, Alloc>
- format(const locale& loc, const basic_string<charT, traits, Alloc>& fmt,
- const Streamable& s);
-
-// 25.12, parsing // C++20
-template<class charT, class traits, class Alloc, class Parsable>
-unspecified
- parse(const basic_string<charT, traits, Alloc>& format, Parsable& tp);
-
-template<class charT, class traits, class Alloc, class Parsable>
-unspecified
- parse(const basic_string<charT, traits, Alloc>& format, Parsable& tp,
- basic_string<charT, traits, Alloc>& abbrev);
-
-template<class charT, class traits, class Alloc, class Parsable>
-unspecified
- parse(const basic_string<charT, traits, Alloc>& format, Parsable& tp,
- minutes& offset);
-
-template<class charT, class traits, class Alloc, class Parsable>
-unspecified
- parse(const basic_string<charT, traits, Alloc>& format, Parsable& tp,
- basic_string<charT, traits, Alloc>& abbrev, minutes& offset);
-
-// calendrical constants
-inline constexpr last_spec last{}; // C++20
-inline constexpr chrono::weekday Sunday{0}; // C++20
-inline constexpr chrono::weekday Monday{1}; // C++20
-inline constexpr chrono::weekday Tuesday{2}; // C++20
-inline constexpr chrono::weekday Wednesday{3}; // C++20
-inline constexpr chrono::weekday Thursday{4}; // C++20
-inline constexpr chrono::weekday Friday{5}; // C++20
-inline constexpr chrono::weekday Saturday{6}; // C++20
-
-inline constexpr chrono::month January{1}; // C++20
-inline constexpr chrono::month February{2}; // C++20
-inline constexpr chrono::month March{3}; // C++20
-inline constexpr chrono::month April{4}; // C++20
-inline constexpr chrono::month May{5}; // C++20
-inline constexpr chrono::month June{6}; // C++20
-inline constexpr chrono::month July{7}; // C++20
-inline constexpr chrono::month August{8}; // C++20
-inline constexpr chrono::month September{9}; // C++20
-inline constexpr chrono::month October{10}; // C++20
-inline constexpr chrono::month November{11}; // C++20
-inline constexpr chrono::month December{12}; // C++20
-} // chrono
-
-inline namespace literals {
- inline namespace chrono_literals {
-constexpr chrono::hours operator ""h(unsigned long long); // C++14
-constexpr chrono::duration<unspecified , ratio<3600,1>> operator ""h(long double); // C++14
-constexpr chrono::minutes operator ""min(unsigned long long); // C++14
-constexpr chrono::duration<unspecified , ratio<60,1>> operator ""min(long double); // C++14
-constexpr chrono::seconds operator ""s(unsigned long long); // C++14
-constexpr chrono::duration<unspecified > operator ""s(long double); // C++14
-constexpr chrono::milliseconds operator ""ms(unsigned long long); // C++14
-constexpr chrono::duration<unspecified , milli> operator ""ms(long double); // C++14
-constexpr chrono::microseconds operator ""us(unsigned long long); // C++14
-constexpr chrono::duration<unspecified , micro> operator ""us(long double); // C++14
-constexpr chrono::nanoseconds operator ""ns(unsigned long long); // C++14
-constexpr chrono::duration<unspecified , nano> operator ""ns(long double); // C++14
-constexpr chrono::day operator ""d(unsigned long long d) noexcept; // C++20
-constexpr chrono::year operator ""y(unsigned long long y) noexcept; // C++20
-} // chrono_literals
-} // literals
-
-} // std
-*/
-
-#include <__config>
-#include <ctime>
-#include <type_traits>
-#include <ratio>
-#include <limits>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-#ifndef _LIBCPP_CXX03_LANG
-_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM
-struct _FilesystemClock;
-_LIBCPP_END_NAMESPACE_FILESYSTEM
-#endif // !_LIBCPP_CXX03_LANG
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-namespace chrono
-{
-
-template <class _Rep, class _Period = ratio<1> > class _LIBCPP_TEMPLATE_VIS duration;
-
-template <class _Tp>
-struct __is_duration : false_type {};
-
-template <class _Rep, class _Period>
-struct __is_duration<duration<_Rep, _Period> > : true_type {};
-
-template <class _Rep, class _Period>
-struct __is_duration<const duration<_Rep, _Period> > : true_type {};
-
-template <class _Rep, class _Period>
-struct __is_duration<volatile duration<_Rep, _Period> > : true_type {};
-
-template <class _Rep, class _Period>
-struct __is_duration<const volatile duration<_Rep, _Period> > : true_type {};
-
-} // chrono
-
-template <class _Rep1, class _Period1, class _Rep2, class _Period2>
-struct _LIBCPP_TEMPLATE_VIS common_type<chrono::duration<_Rep1, _Period1>,
- chrono::duration<_Rep2, _Period2> >
-{
- typedef chrono::duration<typename common_type<_Rep1, _Rep2>::type,
- typename __ratio_gcd<_Period1, _Period2>::type> type;
-};
-
-namespace chrono {
-
-// duration_cast
-
-template <class _FromDuration, class _ToDuration,
- class _Period = typename ratio_divide<typename _FromDuration::period, typename _ToDuration::period>::type,
- bool = _Period::num == 1,
- bool = _Period::den == 1>
-struct __duration_cast;
-
-template <class _FromDuration, class _ToDuration, class _Period>
-struct __duration_cast<_FromDuration, _ToDuration, _Period, true, true>
-{
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- _ToDuration operator()(const _FromDuration& __fd) const
- {
- return _ToDuration(static_cast<typename _ToDuration::rep>(__fd.count()));
- }
-};
-
-template <class _FromDuration, class _ToDuration, class _Period>
-struct __duration_cast<_FromDuration, _ToDuration, _Period, true, false>
-{
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- _ToDuration operator()(const _FromDuration& __fd) const
- {
- typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct;
- return _ToDuration(static_cast<typename _ToDuration::rep>(
- static_cast<_Ct>(__fd.count()) / static_cast<_Ct>(_Period::den)));
- }
-};
-
-template <class _FromDuration, class _ToDuration, class _Period>
-struct __duration_cast<_FromDuration, _ToDuration, _Period, false, true>
-{
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- _ToDuration operator()(const _FromDuration& __fd) const
- {
- typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct;
- return _ToDuration(static_cast<typename _ToDuration::rep>(
- static_cast<_Ct>(__fd.count()) * static_cast<_Ct>(_Period::num)));
- }
-};
-
-template <class _FromDuration, class _ToDuration, class _Period>
-struct __duration_cast<_FromDuration, _ToDuration, _Period, false, false>
-{
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- _ToDuration operator()(const _FromDuration& __fd) const
- {
- typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct;
- return _ToDuration(static_cast<typename _ToDuration::rep>(
- static_cast<_Ct>(__fd.count()) * static_cast<_Ct>(_Period::num)
- / static_cast<_Ct>(_Period::den)));
- }
-};
-
-template <class _ToDuration, class _Rep, class _Period>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-typename enable_if
-<
- __is_duration<_ToDuration>::value,
- _ToDuration
->::type
-duration_cast(const duration<_Rep, _Period>& __fd)
-{
- return __duration_cast<duration<_Rep, _Period>, _ToDuration>()(__fd);
-}
-
-template <class _Rep>
-struct _LIBCPP_TEMPLATE_VIS treat_as_floating_point : is_floating_point<_Rep> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Rep>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool treat_as_floating_point_v
- = treat_as_floating_point<_Rep>::value;
-#endif
-
-template <class _Rep>
-struct _LIBCPP_TEMPLATE_VIS duration_values
-{
-public:
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep zero() _NOEXCEPT {return _Rep(0);}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep max() _NOEXCEPT {return numeric_limits<_Rep>::max();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep min() _NOEXCEPT {return numeric_limits<_Rep>::lowest();}
-};
-
-#if _LIBCPP_STD_VER > 14
-template <class _ToDuration, class _Rep, class _Period>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-typename enable_if
-<
- __is_duration<_ToDuration>::value,
- _ToDuration
->::type
-floor(const duration<_Rep, _Period>& __d)
-{
- _ToDuration __t = duration_cast<_ToDuration>(__d);
- if (__t > __d)
- __t = __t - _ToDuration{1};
- return __t;
-}
-
-template <class _ToDuration, class _Rep, class _Period>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-typename enable_if
-<
- __is_duration<_ToDuration>::value,
- _ToDuration
->::type
-ceil(const duration<_Rep, _Period>& __d)
-{
- _ToDuration __t = duration_cast<_ToDuration>(__d);
- if (__t < __d)
- __t = __t + _ToDuration{1};
- return __t;
-}
-
-template <class _ToDuration, class _Rep, class _Period>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-typename enable_if
-<
- __is_duration<_ToDuration>::value,
- _ToDuration
->::type
-round(const duration<_Rep, _Period>& __d)
-{
- _ToDuration __lower = floor<_ToDuration>(__d);
- _ToDuration __upper = __lower + _ToDuration{1};
- auto __lowerDiff = __d - __lower;
- auto __upperDiff = __upper - __d;
- if (__lowerDiff < __upperDiff)
- return __lower;
- if (__lowerDiff > __upperDiff)
- return __upper;
- return __lower.count() & 1 ? __upper : __lower;
-}
-#endif
-
-// duration
-
-template <class _Rep, class _Period>
-class _LIBCPP_TEMPLATE_VIS duration
-{
- static_assert(!__is_duration<_Rep>::value, "A duration representation can not be a duration");
- static_assert(__is_ratio<_Period>::value, "Second template parameter of duration must be a std::ratio");
- static_assert(_Period::num > 0, "duration period must be positive");
-
- template <class _R1, class _R2>
- struct __no_overflow
- {
- private:
- static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value;
- static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value;
- static const intmax_t __n1 = _R1::num / __gcd_n1_n2;
- static const intmax_t __d1 = _R1::den / __gcd_d1_d2;
- static const intmax_t __n2 = _R2::num / __gcd_n1_n2;
- static const intmax_t __d2 = _R2::den / __gcd_d1_d2;
- static const intmax_t max = -((intmax_t(1) << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1);
-
- template <intmax_t _Xp, intmax_t _Yp, bool __overflow>
- struct __mul // __overflow == false
- {
- static const intmax_t value = _Xp * _Yp;
- };
-
- template <intmax_t _Xp, intmax_t _Yp>
- struct __mul<_Xp, _Yp, true>
- {
- static const intmax_t value = 1;
- };
-
- public:
- static const bool value = (__n1 <= max / __d2) && (__n2 <= max / __d1);
- typedef ratio<__mul<__n1, __d2, !value>::value,
- __mul<__n2, __d1, !value>::value> type;
- };
-
-public:
- typedef _Rep rep;
- typedef typename _Period::type period;
-private:
- rep __rep_;
-public:
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-#ifndef _LIBCPP_CXX03_LANG
- duration() = default;
-#else
- duration() {}
-#endif
-
- template <class _Rep2>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- explicit duration(const _Rep2& __r,
- typename enable_if
- <
- is_convertible<_Rep2, rep>::value &&
- (treat_as_floating_point<rep>::value ||
- !treat_as_floating_point<_Rep2>::value)
- >::type* = 0)
- : __rep_(__r) {}
-
- // conversions
- template <class _Rep2, class _Period2>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- duration(const duration<_Rep2, _Period2>& __d,
- typename enable_if
- <
- __no_overflow<_Period2, period>::value && (
- treat_as_floating_point<rep>::value ||
- (__no_overflow<_Period2, period>::type::den == 1 &&
- !treat_as_floating_point<_Rep2>::value))
- >::type* = 0)
- : __rep_(_VSTD::chrono::duration_cast<duration>(__d).count()) {}
-
- // observer
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR rep count() const {return __rep_;}
-
- // arithmetic
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR typename common_type<duration>::type operator+() const {return typename common_type<duration>::type(*this);}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR typename common_type<duration>::type operator-() const {return typename common_type<duration>::type(-__rep_);}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator++() {++__rep_; return *this;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration operator++(int) {return duration(__rep_++);}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator--() {--__rep_; return *this;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration operator--(int) {return duration(__rep_--);}
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator+=(const duration& __d) {__rep_ += __d.count(); return *this;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator-=(const duration& __d) {__rep_ -= __d.count(); return *this;}
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator*=(const rep& rhs) {__rep_ *= rhs; return *this;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator/=(const rep& rhs) {__rep_ /= rhs; return *this;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator%=(const rep& rhs) {__rep_ %= rhs; return *this;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator%=(const duration& rhs) {__rep_ %= rhs.count(); return *this;}
-
- // special values
-
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration zero() _NOEXCEPT {return duration(duration_values<rep>::zero());}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration min() _NOEXCEPT {return duration(duration_values<rep>::min());}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration max() _NOEXCEPT {return duration(duration_values<rep>::max());}
-};
-
-typedef duration<long long, nano> nanoseconds;
-typedef duration<long long, micro> microseconds;
-typedef duration<long long, milli> milliseconds;
-typedef duration<long long > seconds;
-typedef duration< long, ratio< 60> > minutes;
-typedef duration< long, ratio<3600> > hours;
-#if _LIBCPP_STD_VER > 17
-typedef duration< int, ratio_multiply<ratio<24>, hours::period>> days;
-typedef duration< int, ratio_multiply<ratio<7>, days::period>> weeks;
-typedef duration< int, ratio_multiply<ratio<146097, 400>, days::period>> years;
-typedef duration< int, ratio_divide<years::period, ratio<12>>> months;
-#endif
-// Duration ==
-
-template <class _LhsDuration, class _RhsDuration>
-struct __duration_eq
-{
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const
- {
- typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct;
- return _Ct(__lhs).count() == _Ct(__rhs).count();
- }
-};
-
-template <class _LhsDuration>
-struct __duration_eq<_LhsDuration, _LhsDuration>
-{
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const
- {return __lhs.count() == __rhs.count();}
-};
-
-template <class _Rep1, class _Period1, class _Rep2, class _Period2>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-bool
-operator==(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
-{
- return __duration_eq<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs);
-}
-
-// Duration !=
-
-template <class _Rep1, class _Period1, class _Rep2, class _Period2>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-bool
-operator!=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
-{
- return !(__lhs == __rhs);
-}
-
-// Duration <
-
-template <class _LhsDuration, class _RhsDuration>
-struct __duration_lt
-{
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const
- {
- typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct;
- return _Ct(__lhs).count() < _Ct(__rhs).count();
- }
-};
-
-template <class _LhsDuration>
-struct __duration_lt<_LhsDuration, _LhsDuration>
-{
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const
- {return __lhs.count() < __rhs.count();}
-};
-
-template <class _Rep1, class _Period1, class _Rep2, class _Period2>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-bool
-operator< (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
-{
- return __duration_lt<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs);
-}
-
-// Duration >
-
-template <class _Rep1, class _Period1, class _Rep2, class _Period2>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-bool
-operator> (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
-{
- return __rhs < __lhs;
-}
-
-// Duration <=
-
-template <class _Rep1, class _Period1, class _Rep2, class _Period2>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-bool
-operator<=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
-{
- return !(__rhs < __lhs);
-}
-
-// Duration >=
-
-template <class _Rep1, class _Period1, class _Rep2, class _Period2>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-bool
-operator>=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
-{
- return !(__lhs < __rhs);
-}
-
-// Duration +
-
-template <class _Rep1, class _Period1, class _Rep2, class _Period2>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type
-operator+(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
-{
- typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd;
- return _Cd(_Cd(__lhs).count() + _Cd(__rhs).count());
-}
-
-// Duration -
-
-template <class _Rep1, class _Period1, class _Rep2, class _Period2>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type
-operator-(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
-{
- typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd;
- return _Cd(_Cd(__lhs).count() - _Cd(__rhs).count());
-}
-
-// Duration *
-
-template <class _Rep1, class _Period, class _Rep2>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-typename enable_if
-<
- is_convertible<_Rep2, typename common_type<_Rep1, _Rep2>::type>::value,
- duration<typename common_type<_Rep1, _Rep2>::type, _Period>
->::type
-operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
-{
- typedef typename common_type<_Rep1, _Rep2>::type _Cr;
- typedef duration<_Cr, _Period> _Cd;
- return _Cd(_Cd(__d).count() * static_cast<_Cr>(__s));
-}
-
-template <class _Rep1, class _Period, class _Rep2>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-typename enable_if
-<
- is_convertible<_Rep1, typename common_type<_Rep1, _Rep2>::type>::value,
- duration<typename common_type<_Rep1, _Rep2>::type, _Period>
->::type
-operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d)
-{
- return __d * __s;
-}
-
-// Duration /
-
-template <class _Duration, class _Rep, bool = __is_duration<_Rep>::value>
-struct __duration_divide_result
-{
-};
-
-template <class _Duration, class _Rep2,
- bool = is_convertible<_Rep2,
- typename common_type<typename _Duration::rep, _Rep2>::type>::value>
-struct __duration_divide_imp
-{
-};
-
-template <class _Rep1, class _Period, class _Rep2>
-struct __duration_divide_imp<duration<_Rep1, _Period>, _Rep2, true>
-{
- typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period> type;
-};
-
-template <class _Rep1, class _Period, class _Rep2>
-struct __duration_divide_result<duration<_Rep1, _Period>, _Rep2, false>
- : __duration_divide_imp<duration<_Rep1, _Period>, _Rep2>
-{
-};
-
-template <class _Rep1, class _Period, class _Rep2>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type
-operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
-{
- typedef typename common_type<_Rep1, _Rep2>::type _Cr;
- typedef duration<_Cr, _Period> _Cd;
- return _Cd(_Cd(__d).count() / static_cast<_Cr>(__s));
-}
-
-template <class _Rep1, class _Period1, class _Rep2, class _Period2>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-typename common_type<_Rep1, _Rep2>::type
-operator/(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
-{
- typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Ct;
- return _Ct(__lhs).count() / _Ct(__rhs).count();
-}
-
-// Duration %
-
-template <class _Rep1, class _Period, class _Rep2>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type
-operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
-{
- typedef typename common_type<_Rep1, _Rep2>::type _Cr;
- typedef duration<_Cr, _Period> _Cd;
- return _Cd(_Cd(__d).count() % static_cast<_Cr>(__s));
-}
-
-template <class _Rep1, class _Period1, class _Rep2, class _Period2>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type
-operator%(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
-{
- typedef typename common_type<_Rep1, _Rep2>::type _Cr;
- typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd;
- return _Cd(static_cast<_Cr>(_Cd(__lhs).count()) % static_cast<_Cr>(_Cd(__rhs).count()));
-}
-
-//////////////////////////////////////////////////////////
-///////////////////// time_point /////////////////////////
-//////////////////////////////////////////////////////////
-
-template <class _Clock, class _Duration = typename _Clock::duration>
-class _LIBCPP_TEMPLATE_VIS time_point
-{
- static_assert(__is_duration<_Duration>::value,
- "Second template parameter of time_point must be a std::chrono::duration");
-public:
- typedef _Clock clock;
- typedef _Duration duration;
- typedef typename duration::rep rep;
- typedef typename duration::period period;
-private:
- duration __d_;
-
-public:
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 time_point() : __d_(duration::zero()) {}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 explicit time_point(const duration& __d) : __d_(__d) {}
-
- // conversions
- template <class _Duration2>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- time_point(const time_point<clock, _Duration2>& t,
- typename enable_if
- <
- is_convertible<_Duration2, duration>::value
- >::type* = 0)
- : __d_(t.time_since_epoch()) {}
-
- // observer
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 duration time_since_epoch() const {return __d_;}
-
- // arithmetic
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 time_point& operator+=(const duration& __d) {__d_ += __d; return *this;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 time_point& operator-=(const duration& __d) {__d_ -= __d; return *this;}
-
- // special values
-
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point min() _NOEXCEPT {return time_point(duration::min());}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point max() _NOEXCEPT {return time_point(duration::max());}
-};
-
-} // chrono
-
-template <class _Clock, class _Duration1, class _Duration2>
-struct _LIBCPP_TEMPLATE_VIS common_type<chrono::time_point<_Clock, _Duration1>,
- chrono::time_point<_Clock, _Duration2> >
-{
- typedef chrono::time_point<_Clock, typename common_type<_Duration1, _Duration2>::type> type;
-};
-
-namespace chrono {
-
-template <class _ToDuration, class _Clock, class _Duration>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-time_point<_Clock, _ToDuration>
-time_point_cast(const time_point<_Clock, _Duration>& __t)
-{
- return time_point<_Clock, _ToDuration>(_VSTD::chrono::duration_cast<_ToDuration>(__t.time_since_epoch()));
-}
-
-#if _LIBCPP_STD_VER > 14
-template <class _ToDuration, class _Clock, class _Duration>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-typename enable_if
-<
- __is_duration<_ToDuration>::value,
- time_point<_Clock, _ToDuration>
->::type
-floor(const time_point<_Clock, _Duration>& __t)
-{
- return time_point<_Clock, _ToDuration>{floor<_ToDuration>(__t.time_since_epoch())};
-}
-
-template <class _ToDuration, class _Clock, class _Duration>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-typename enable_if
-<
- __is_duration<_ToDuration>::value,
- time_point<_Clock, _ToDuration>
->::type
-ceil(const time_point<_Clock, _Duration>& __t)
-{
- return time_point<_Clock, _ToDuration>{ceil<_ToDuration>(__t.time_since_epoch())};
-}
-
-template <class _ToDuration, class _Clock, class _Duration>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-typename enable_if
-<
- __is_duration<_ToDuration>::value,
- time_point<_Clock, _ToDuration>
->::type
-round(const time_point<_Clock, _Duration>& __t)
-{
- return time_point<_Clock, _ToDuration>{round<_ToDuration>(__t.time_since_epoch())};
-}
-
-template <class _Rep, class _Period>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-typename enable_if
-<
- numeric_limits<_Rep>::is_signed,
- duration<_Rep, _Period>
->::type
-abs(duration<_Rep, _Period> __d)
-{
- return __d >= __d.zero() ? __d : -__d;
-}
-#endif
-
-// time_point ==
-
-template <class _Clock, class _Duration1, class _Duration2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator==(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
-{
- return __lhs.time_since_epoch() == __rhs.time_since_epoch();
-}
-
-// time_point !=
-
-template <class _Clock, class _Duration1, class _Duration2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator!=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
-{
- return !(__lhs == __rhs);
-}
-
-// time_point <
-
-template <class _Clock, class _Duration1, class _Duration2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator<(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
-{
- return __lhs.time_since_epoch() < __rhs.time_since_epoch();
-}
-
-// time_point >
-
-template <class _Clock, class _Duration1, class _Duration2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator>(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
-{
- return __rhs < __lhs;
-}
-
-// time_point <=
-
-template <class _Clock, class _Duration1, class _Duration2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator<=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
-{
- return !(__rhs < __lhs);
-}
-
-// time_point >=
-
-template <class _Clock, class _Duration1, class _Duration2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator>=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
-{
- return !(__lhs < __rhs);
-}
-
-// time_point operator+(time_point x, duration y);
-
-template <class _Clock, class _Duration1, class _Rep2, class _Period2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type>
-operator+(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
-{
- typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Tr;
- return _Tr (__lhs.time_since_epoch() + __rhs);
-}
-
-// time_point operator+(duration x, time_point y);
-
-template <class _Rep1, class _Period1, class _Clock, class _Duration2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-time_point<_Clock, typename common_type<duration<_Rep1, _Period1>, _Duration2>::type>
-operator+(const duration<_Rep1, _Period1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
-{
- return __rhs + __lhs;
-}
-
-// time_point operator-(time_point x, duration y);
-
-template <class _Clock, class _Duration1, class _Rep2, class _Period2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type>
-operator-(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
-{
- typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Ret;
- return _Ret(__lhs.time_since_epoch() -__rhs);
-}
-
-// duration operator-(time_point x, time_point y);
-
-template <class _Clock, class _Duration1, class _Duration2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-typename common_type<_Duration1, _Duration2>::type
-operator-(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
-{
- return __lhs.time_since_epoch() - __rhs.time_since_epoch();
-}
-
-//////////////////////////////////////////////////////////
-/////////////////////// clocks ///////////////////////////
-//////////////////////////////////////////////////////////
-
-class _LIBCPP_TYPE_VIS system_clock
-{
-public:
- typedef microseconds duration;
- typedef duration::rep rep;
- typedef duration::period period;
- typedef chrono::time_point<system_clock> time_point;
- static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = false;
-
- static time_point now() _NOEXCEPT;
- static time_t to_time_t (const time_point& __t) _NOEXCEPT;
- static time_point from_time_t(time_t __t) _NOEXCEPT;
-};
-
-#ifndef _LIBCPP_HAS_NO_MONOTONIC_CLOCK
-class _LIBCPP_TYPE_VIS steady_clock
-{
-public:
- typedef nanoseconds duration;
- typedef duration::rep rep;
- typedef duration::period period;
- typedef chrono::time_point<steady_clock, duration> time_point;
- static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = true;
-
- static time_point now() _NOEXCEPT;
-};
-
-typedef steady_clock high_resolution_clock;
-#else
-typedef system_clock high_resolution_clock;
-#endif
-
-#if _LIBCPP_STD_VER > 17
-// [time.clock.file], type file_clock
-using file_clock = _VSTD_FS::_FilesystemClock;
-
-template<class _Duration>
-using file_time = time_point<file_clock, _Duration>;
-
-
-template <class _Duration>
-using sys_time = time_point<system_clock, _Duration>;
-using sys_seconds = sys_time<seconds>;
-using sys_days = sys_time<days>;
-
-struct local_t {};
-template<class Duration>
-using local_time = time_point<local_t, Duration>;
-using local_seconds = local_time<seconds>;
-using local_days = local_time<days>;
-
-
-struct _LIBCPP_TYPE_VIS last_spec { explicit last_spec() = default; };
-
-class _LIBCPP_TYPE_VIS day {
-private:
- unsigned char __d;
-public:
- day() = default;
- explicit inline constexpr day(unsigned __val) noexcept : __d(static_cast<unsigned char>(__val)) {}
- inline constexpr day& operator++() noexcept { ++__d; return *this; }
- inline constexpr day operator++(int) noexcept { day __tmp = *this; ++(*this); return __tmp; }
- inline constexpr day& operator--() noexcept { --__d; return *this; }
- inline constexpr day operator--(int) noexcept { day __tmp = *this; --(*this); return __tmp; }
- constexpr day& operator+=(const days& __dd) noexcept;
- constexpr day& operator-=(const days& __dd) noexcept;
- explicit inline constexpr operator unsigned() const noexcept { return __d; }
- inline constexpr bool ok() const noexcept { return __d >= 1 && __d <= 31; }
- };
-
-
-inline constexpr
-bool operator==(const day& __lhs, const day& __rhs) noexcept
-{ return static_cast<unsigned>(__lhs) == static_cast<unsigned>(__rhs); }
-
-inline constexpr
-bool operator!=(const day& __lhs, const day& __rhs) noexcept
-{ return !(__lhs == __rhs); }
-
-inline constexpr
-bool operator< (const day& __lhs, const day& __rhs) noexcept
-{ return static_cast<unsigned>(__lhs) < static_cast<unsigned>(__rhs); }
-
-inline constexpr
-bool operator> (const day& __lhs, const day& __rhs) noexcept
-{ return __rhs < __lhs; }
-
-inline constexpr
-bool operator<=(const day& __lhs, const day& __rhs) noexcept
-{ return !(__rhs < __lhs);}
-
-inline constexpr
-bool operator>=(const day& __lhs, const day& __rhs) noexcept
-{ return !(__lhs < __rhs); }
-
-inline constexpr
-day operator+ (const day& __lhs, const days& __rhs) noexcept
-{ return day(static_cast<unsigned>(__lhs) + __rhs.count()); }
-
-inline constexpr
-day operator+ (const days& __lhs, const day& __rhs) noexcept
-{ return __rhs + __lhs; }
-
-inline constexpr
-day operator- (const day& __lhs, const days& __rhs) noexcept
-{ return __lhs + -__rhs; }
-
-inline constexpr
-days operator-(const day& __lhs, const day& __rhs) noexcept
-{ return days(static_cast<int>(static_cast<unsigned>(__lhs)) -
- static_cast<int>(static_cast<unsigned>(__rhs))); }
-
-inline constexpr day& day::operator+=(const days& __dd) noexcept
-{ *this = *this + __dd; return *this; }
-
-inline constexpr day& day::operator-=(const days& __dd) noexcept
-{ *this = *this - __dd; return *this; }
-
-
-class _LIBCPP_TYPE_VIS month {
-private:
- unsigned char __m;
-public:
- month() = default;
- explicit inline constexpr month(unsigned __val) noexcept : __m(static_cast<unsigned char>(__val)) {}
- inline constexpr month& operator++() noexcept { ++__m; return *this; }
- inline constexpr month operator++(int) noexcept { month __tmp = *this; ++(*this); return __tmp; }
- inline constexpr month& operator--() noexcept { --__m; return *this; }
- inline constexpr month operator--(int) noexcept { month __tmp = *this; --(*this); return __tmp; }
- constexpr month& operator+=(const months& __m1) noexcept;
- constexpr month& operator-=(const months& __m1) noexcept;
- explicit inline constexpr operator unsigned() const noexcept { return __m; }
- inline constexpr bool ok() const noexcept { return __m >= 1 && __m <= 12; }
-};
-
-
-inline constexpr
-bool operator==(const month& __lhs, const month& __rhs) noexcept
-{ return static_cast<unsigned>(__lhs) == static_cast<unsigned>(__rhs); }
-
-inline constexpr
-bool operator!=(const month& __lhs, const month& __rhs) noexcept
-{ return !(__lhs == __rhs); }
-
-inline constexpr
-bool operator< (const month& __lhs, const month& __rhs) noexcept
-{ return static_cast<unsigned>(__lhs) < static_cast<unsigned>(__rhs); }
-
-inline constexpr
-bool operator> (const month& __lhs, const month& __rhs) noexcept
-{ return __rhs < __lhs; }
-
-inline constexpr
-bool operator<=(const month& __lhs, const month& __rhs) noexcept
-{ return !(__rhs < __lhs); }
-
-inline constexpr
-bool operator>=(const month& __lhs, const month& __rhs) noexcept
-{ return !(__lhs < __rhs); }
-
-inline constexpr
-month operator+ (const month& __lhs, const months& __rhs) noexcept
-{
- auto const __mu = static_cast<long long>(static_cast<unsigned>(__lhs)) + (__rhs.count() - 1);
- auto const __yr = (__mu >= 0 ? __mu : __mu - 11) / 12;
- return month{static_cast<unsigned>(__mu - __yr * 12 + 1)};
-}
-
-inline constexpr
-month operator+ (const months& __lhs, const month& __rhs) noexcept
-{ return __rhs + __lhs; }
-
-inline constexpr
-month operator- (const month& __lhs, const months& __rhs) noexcept
-{ return __lhs + -__rhs; }
-
-inline constexpr
-months operator-(const month& __lhs, const month& __rhs) noexcept
-{
- auto const __dm = static_cast<unsigned>(__lhs) - static_cast<unsigned>(__rhs);
- return months(__dm <= 11 ? __dm : __dm + 12);
-}
-
-inline constexpr month& month::operator+=(const months& __dm) noexcept
-{ *this = *this + __dm; return *this; }
-
-inline constexpr month& month::operator-=(const months& __dm) noexcept
-{ *this = *this - __dm; return *this; }
-
-
-class _LIBCPP_TYPE_VIS year {
-private:
- short __y;
-public:
- year() = default;
- explicit inline constexpr year(int __val) noexcept : __y(static_cast<short>(__val)) {}
-
- inline constexpr year& operator++() noexcept { ++__y; return *this; };
- inline constexpr year operator++(int) noexcept { year __tmp = *this; ++(*this); return __tmp; };
- inline constexpr year& operator--() noexcept { --__y; return *this; };
- inline constexpr year operator--(int) noexcept { year __tmp = *this; --(*this); return __tmp; };
- constexpr year& operator+=(const years& __dy) noexcept;
- constexpr year& operator-=(const years& __dy) noexcept;
- inline constexpr year operator+() const noexcept { return *this; }
- inline constexpr year operator-() const noexcept { return year{-__y}; };
-
- inline constexpr bool is_leap() const noexcept { return __y % 4 == 0 && (__y % 100 != 0 || __y % 400 == 0); }
- explicit inline constexpr operator int() const noexcept { return __y; }
- constexpr bool ok() const noexcept;
- static inline constexpr year min() noexcept { return year{-32767}; }
- static inline constexpr year max() noexcept { return year{ 32767}; }
-};
-
-
-inline constexpr
-bool operator==(const year& __lhs, const year& __rhs) noexcept
-{ return static_cast<int>(__lhs) == static_cast<int>(__rhs); }
-
-inline constexpr
-bool operator!=(const year& __lhs, const year& __rhs) noexcept
-{ return !(__lhs == __rhs); }
-
-inline constexpr
-bool operator< (const year& __lhs, const year& __rhs) noexcept
-{ return static_cast<int>(__lhs) < static_cast<int>(__rhs); }
-
-inline constexpr
-bool operator> (const year& __lhs, const year& __rhs) noexcept
-{ return __rhs < __lhs; }
-
-inline constexpr
-bool operator<=(const year& __lhs, const year& __rhs) noexcept
-{ return !(__rhs < __lhs); }
-
-inline constexpr
-bool operator>=(const year& __lhs, const year& __rhs) noexcept
-{ return !(__lhs < __rhs); }
-
-inline constexpr
-year operator+ (const year& __lhs, const years& __rhs) noexcept
-{ return year(static_cast<int>(__lhs) + __rhs.count()); }
-
-inline constexpr
-year operator+ (const years& __lhs, const year& __rhs) noexcept
-{ return __rhs + __lhs; }
-
-inline constexpr
-year operator- (const year& __lhs, const years& __rhs) noexcept
-{ return __lhs + -__rhs; }
-
-inline constexpr
-years operator-(const year& __lhs, const year& __rhs) noexcept
-{ return years{static_cast<int>(__lhs) - static_cast<int>(__rhs)}; }
-
-
-inline constexpr year& year::operator+=(const years& __dy) noexcept
-{ *this = *this + __dy; return *this; }
-
-inline constexpr year& year::operator-=(const years& __dy) noexcept
-{ *this = *this - __dy; return *this; }
-
-inline constexpr bool year::ok() const noexcept
-{ return static_cast<int>(min()) <= __y && __y <= static_cast<int>(max()); }
-
-class _LIBCPP_TYPE_VIS weekday_indexed;
-class _LIBCPP_TYPE_VIS weekday_last;
-
-class _LIBCPP_TYPE_VIS weekday {
-private:
- unsigned char __wd;
-public:
- weekday() = default;
- inline explicit constexpr weekday(unsigned __val) noexcept : __wd(static_cast<unsigned char>(__val)) {}
- inline constexpr weekday(const sys_days& __sysd) noexcept
- : __wd(__weekday_from_days(__sysd.time_since_epoch().count())) {}
- inline explicit constexpr weekday(const local_days& __locd) noexcept
- : __wd(__weekday_from_days(__locd.time_since_epoch().count())) {}
-
- inline constexpr weekday& operator++() noexcept { __wd = (__wd == 6 ? 0 : __wd + 1); return *this; }
- inline constexpr weekday operator++(int) noexcept { weekday __tmp = *this; ++(*this); return __tmp; }
- inline constexpr weekday& operator--() noexcept { __wd = (__wd == 0 ? 6 : __wd - 1); return *this; }
- inline constexpr weekday operator--(int) noexcept { weekday __tmp = *this; --(*this); return __tmp; }
- constexpr weekday& operator+=(const days& __dd) noexcept;
- constexpr weekday& operator-=(const days& __dd) noexcept;
- inline explicit constexpr operator unsigned() const noexcept { return __wd; }
- inline constexpr bool ok() const noexcept { return __wd <= 6; }
- constexpr weekday_indexed operator[](unsigned __index) const noexcept;
- constexpr weekday_last operator[](last_spec) const noexcept;
-
- static constexpr unsigned char __weekday_from_days(int __days) noexcept;
-};
-
-
-// https://howardhinnant.github.io/date_algorithms.html#weekday_from_days
-inline constexpr
-unsigned char weekday::__weekday_from_days(int __days) noexcept
-{
- return static_cast<unsigned char>(
- static_cast<unsigned>(__days >= -4 ? (__days+4) % 7 : (__days+5) % 7 + 6)
- );
-}
-
-inline constexpr
-bool operator==(const weekday& __lhs, const weekday& __rhs) noexcept
-{ return static_cast<unsigned>(__lhs) == static_cast<unsigned>(__rhs); }
-
-inline constexpr
-bool operator!=(const weekday& __lhs, const weekday& __rhs) noexcept
-{ return !(__lhs == __rhs); }
-
-inline constexpr
-bool operator< (const weekday& __lhs, const weekday& __rhs) noexcept
-{ return static_cast<unsigned>(__lhs) < static_cast<unsigned>(__rhs); }
-
-inline constexpr
-bool operator> (const weekday& __lhs, const weekday& __rhs) noexcept
-{ return __rhs < __lhs; }
-
-inline constexpr
-bool operator<=(const weekday& __lhs, const weekday& __rhs) noexcept
-{ return !(__rhs < __lhs);}
-
-inline constexpr
-bool operator>=(const weekday& __lhs, const weekday& __rhs) noexcept
-{ return !(__lhs < __rhs); }
-
-constexpr weekday operator+(const weekday& __lhs, const days& __rhs) noexcept
-{
- auto const __mu = static_cast<long long>(static_cast<unsigned>(__lhs)) + __rhs.count();
- auto const __yr = (__mu >= 0 ? __mu : __mu - 6) / 7;
- return weekday{static_cast<unsigned>(__mu - __yr * 7)};
-}
-
-constexpr weekday operator+(const days& __lhs, const weekday& __rhs) noexcept
-{ return __rhs + __lhs; }
-
-constexpr weekday operator-(const weekday& __lhs, const days& __rhs) noexcept
-{ return __lhs + -__rhs; }
-
-constexpr days operator-(const weekday& __lhs, const weekday& __rhs) noexcept
-{
- const int __wdu = static_cast<unsigned>(__lhs) - static_cast<unsigned>(__rhs);
- const int __wk = (__wdu >= 0 ? __wdu : __wdu-6) / 7;
- return days{__wdu - __wk * 7};
-}
-
-inline constexpr weekday& weekday::operator+=(const days& __dd) noexcept
-{ *this = *this + __dd; return *this; }
-
-inline constexpr weekday& weekday::operator-=(const days& __dd) noexcept
-{ *this = *this - __dd; return *this; }
-
-
-class _LIBCPP_TYPE_VIS weekday_indexed {
-private:
- _VSTD::chrono::weekday __wd;
- unsigned char __idx;
-public:
- weekday_indexed() = default;
- inline constexpr weekday_indexed(const _VSTD::chrono::weekday& __wdval, unsigned __idxval) noexcept
- : __wd{__wdval}, __idx(__idxval) {}
- inline constexpr _VSTD::chrono::weekday weekday() const noexcept { return __wd; }
- inline constexpr unsigned index() const noexcept { return __idx; }
- inline constexpr bool ok() const noexcept { return __wd.ok() && __idx >= 1 && __idx <= 5; }
-};
-
-inline constexpr
-bool operator==(const weekday_indexed& __lhs, const weekday_indexed& __rhs) noexcept
-{ return __lhs.weekday() == __rhs.weekday() && __lhs.index() == __rhs.index(); }
-
-inline constexpr
-bool operator!=(const weekday_indexed& __lhs, const weekday_indexed& __rhs) noexcept
-{ return !(__lhs == __rhs); }
-
-
-class _LIBCPP_TYPE_VIS weekday_last {
-private:
- _VSTD::chrono::weekday __wd;
-public:
- explicit constexpr weekday_last(const _VSTD::chrono::weekday& __val) noexcept
- : __wd{__val} {}
- constexpr _VSTD::chrono::weekday weekday() const noexcept { return __wd; }
- constexpr bool ok() const noexcept { return __wd.ok(); }
-};
-
-inline constexpr
-bool operator==(const weekday_last& __lhs, const weekday_last& __rhs) noexcept
-{ return __lhs.weekday() == __rhs.weekday(); }
-
-inline constexpr
-bool operator!=(const weekday_last& __lhs, const weekday_last& __rhs) noexcept
-{ return !(__lhs == __rhs); }
-
-inline constexpr
-weekday_indexed weekday::operator[](unsigned __index) const noexcept { return weekday_indexed{*this, __index}; }
-
-inline constexpr
-weekday_last weekday::operator[](last_spec) const noexcept { return weekday_last{*this}; }
-
-
-inline constexpr last_spec last{};
-inline constexpr weekday Sunday{0};
-inline constexpr weekday Monday{1};
-inline constexpr weekday Tuesday{2};
-inline constexpr weekday Wednesday{3};
-inline constexpr weekday Thursday{4};
-inline constexpr weekday Friday{5};
-inline constexpr weekday Saturday{6};
-
-inline constexpr month January{1};
-inline constexpr month February{2};
-inline constexpr month March{3};
-inline constexpr month April{4};
-inline constexpr month May{5};
-inline constexpr month June{6};
-inline constexpr month July{7};
-inline constexpr month August{8};
-inline constexpr month September{9};
-inline constexpr month October{10};
-inline constexpr month November{11};
-inline constexpr month December{12};
-
-
-class _LIBCPP_TYPE_VIS month_day {
-private:
- chrono::month __m;
- chrono::day __d;
-public:
- month_day() = default;
- constexpr month_day(const chrono::month& __mval, const chrono::day& __dval) noexcept
- : __m{__mval}, __d{__dval} {}
- inline constexpr chrono::month month() const noexcept { return __m; }
- inline constexpr chrono::day day() const noexcept { return __d; }
- constexpr bool ok() const noexcept;
-};
-
-inline constexpr
-bool month_day::ok() const noexcept
-{
- if (!__m.ok()) return false;
- const unsigned __dval = static_cast<unsigned>(__d);
- if (__dval < 1 || __dval > 31) return false;
- if (__dval <= 29) return true;
-// Now we've got either 30 or 31
- const unsigned __mval = static_cast<unsigned>(__m);
- if (__mval == 2) return false;
- if (__mval == 4 || __mval == 6 || __mval == 9 || __mval == 11)
- return __dval == 30;
- return true;
-}
-
-inline constexpr
-bool operator==(const month_day& __lhs, const month_day& __rhs) noexcept
-{ return __lhs.month() == __rhs.month() && __lhs.day() == __rhs.day(); }
-
-inline constexpr
-bool operator!=(const month_day& __lhs, const month_day& __rhs) noexcept
-{ return !(__lhs == __rhs); }
-
-inline constexpr
-month_day operator/(const month& __lhs, const day& __rhs) noexcept
-{ return month_day{__lhs, __rhs}; }
-
-constexpr
-month_day operator/(const day& __lhs, const month& __rhs) noexcept
-{ return __rhs / __lhs; }
-
-inline constexpr
-month_day operator/(const month& __lhs, int __rhs) noexcept
-{ return __lhs / day(__rhs); }
-
-constexpr
-month_day operator/(int __lhs, const day& __rhs) noexcept
-{ return month(__lhs) / __rhs; }
-
-constexpr
-month_day operator/(const day& __lhs, int __rhs) noexcept
-{ return month(__rhs) / __lhs; }
-
-
-inline constexpr
-bool operator< (const month_day& __lhs, const month_day& __rhs) noexcept
-{ return __lhs.month() != __rhs.month() ? __lhs.month() < __rhs.month() : __lhs.day() < __rhs.day(); }
-
-inline constexpr
-bool operator> (const month_day& __lhs, const month_day& __rhs) noexcept
-{ return __rhs < __lhs; }
-
-inline constexpr
-bool operator<=(const month_day& __lhs, const month_day& __rhs) noexcept
-{ return !(__rhs < __lhs);}
-
-inline constexpr
-bool operator>=(const month_day& __lhs, const month_day& __rhs) noexcept
-{ return !(__lhs < __rhs); }
-
-
-
-class _LIBCPP_TYPE_VIS month_day_last {
-private:
- chrono::month __m;
-public:
- explicit constexpr month_day_last(const chrono::month& __val) noexcept
- : __m{__val} {}
- inline constexpr chrono::month month() const noexcept { return __m; }
- inline constexpr bool ok() const noexcept { return __m.ok(); }
-};
-
-inline constexpr
-bool operator==(const month_day_last& __lhs, const month_day_last& __rhs) noexcept
-{ return __lhs.month() == __rhs.month(); }
-
-inline constexpr
-bool operator!=(const month_day_last& __lhs, const month_day_last& __rhs) noexcept
-{ return !(__lhs == __rhs); }
-
-inline constexpr
-bool operator< (const month_day_last& __lhs, const month_day_last& __rhs) noexcept
-{ return __lhs.month() < __rhs.month(); }
-
-inline constexpr
-bool operator> (const month_day_last& __lhs, const month_day_last& __rhs) noexcept
-{ return __rhs < __lhs; }
-
-inline constexpr
-bool operator<=(const month_day_last& __lhs, const month_day_last& __rhs) noexcept
-{ return !(__rhs < __lhs);}
-
-inline constexpr
-bool operator>=(const month_day_last& __lhs, const month_day_last& __rhs) noexcept
-{ return !(__lhs < __rhs); }
-
-inline constexpr
-month_day_last operator/(const month& __lhs, last_spec) noexcept
-{ return month_day_last{__lhs}; }
-
-inline constexpr
-month_day_last operator/(last_spec, const month& __rhs) noexcept
-{ return month_day_last{__rhs}; }
-
-inline constexpr
-month_day_last operator/(int __lhs, last_spec) noexcept
-{ return month_day_last{month(__lhs)}; }
-
-inline constexpr
-month_day_last operator/(last_spec, int __rhs) noexcept
-{ return month_day_last{month(__rhs)}; }
-
-
-class _LIBCPP_TYPE_VIS month_weekday {
-private:
- chrono::month __m;
- chrono::weekday_indexed __wdi;
-public:
- month_weekday() = default;
- constexpr month_weekday(const chrono::month& __mval, const chrono::weekday_indexed& __wdival) noexcept
- : __m{__mval}, __wdi{__wdival} {}
- inline constexpr chrono::month month() const noexcept { return __m; }
- inline constexpr chrono::weekday_indexed weekday_indexed() const noexcept { return __wdi; }
- inline constexpr bool ok() const noexcept { return __m.ok() && __wdi.ok(); }
-};
-
-inline constexpr
-bool operator==(const month_weekday& __lhs, const month_weekday& __rhs) noexcept
-{ return __lhs.month() == __rhs.month() && __lhs.weekday_indexed() == __rhs.weekday_indexed(); }
-
-inline constexpr
-bool operator!=(const month_weekday& __lhs, const month_weekday& __rhs) noexcept
-{ return !(__lhs == __rhs); }
-
-inline constexpr
-month_weekday operator/(const month& __lhs, const weekday_indexed& __rhs) noexcept
-{ return month_weekday{__lhs, __rhs}; }
-
-inline constexpr
-month_weekday operator/(int __lhs, const weekday_indexed& __rhs) noexcept
-{ return month_weekday{month(__lhs), __rhs}; }
-
-inline constexpr
-month_weekday operator/(const weekday_indexed& __lhs, const month& __rhs) noexcept
-{ return month_weekday{__rhs, __lhs}; }
-
-inline constexpr
-month_weekday operator/(const weekday_indexed& __lhs, int __rhs) noexcept
-{ return month_weekday{month(__rhs), __lhs}; }
-
-
-class _LIBCPP_TYPE_VIS month_weekday_last {
- chrono::month __m;
- chrono::weekday_last __wdl;
- public:
- constexpr month_weekday_last(const chrono::month& __mval, const chrono::weekday_last& __wdlval) noexcept
- : __m{__mval}, __wdl{__wdlval} {}
- inline constexpr chrono::month month() const noexcept { return __m; }
- inline constexpr chrono::weekday_last weekday_last() const noexcept { return __wdl; }
- inline constexpr bool ok() const noexcept { return __m.ok() && __wdl.ok(); }
-};
-
-inline constexpr
-bool operator==(const month_weekday_last& __lhs, const month_weekday_last& __rhs) noexcept
-{ return __lhs.month() == __rhs.month() && __lhs.weekday_last() == __rhs.weekday_last(); }
-
-inline constexpr
-bool operator!=(const month_weekday_last& __lhs, const month_weekday_last& __rhs) noexcept
-{ return !(__lhs == __rhs); }
-
-
-inline constexpr
-month_weekday_last operator/(const month& __lhs, const weekday_last& __rhs) noexcept
-{ return month_weekday_last{__lhs, __rhs}; }
-
-inline constexpr
-month_weekday_last operator/(int __lhs, const weekday_last& __rhs) noexcept
-{ return month_weekday_last{month(__lhs), __rhs}; }
-
-inline constexpr
-month_weekday_last operator/(const weekday_last& __lhs, const month& __rhs) noexcept
-{ return month_weekday_last{__rhs, __lhs}; }
-
-inline constexpr
-month_weekday_last operator/(const weekday_last& __lhs, int __rhs) noexcept
-{ return month_weekday_last{month(__rhs), __lhs}; }
-
-
-class _LIBCPP_TYPE_VIS year_month {
- chrono::year __y;
- chrono::month __m;
-public:
- year_month() = default;
- constexpr year_month(const chrono::year& __yval, const chrono::month& __mval) noexcept
- : __y{__yval}, __m{__mval} {}
- inline constexpr chrono::year year() const noexcept { return __y; }
- inline constexpr chrono::month month() const noexcept { return __m; }
- inline constexpr year_month& operator+=(const months& __dm) noexcept { this->__m += __dm; return *this; }
- inline constexpr year_month& operator-=(const months& __dm) noexcept { this->__m -= __dm; return *this; }
- inline constexpr year_month& operator+=(const years& __dy) noexcept { this->__y += __dy; return *this; }
- inline constexpr year_month& operator-=(const years& __dy) noexcept { this->__y -= __dy; return *this; }
- inline constexpr bool ok() const noexcept { return __y.ok() && __m.ok(); }
-};
-
-inline constexpr
-year_month operator/(const year& __y, const month& __m) noexcept { return year_month{__y, __m}; }
-
-inline constexpr
-year_month operator/(const year& __y, int __m) noexcept { return year_month{__y, month(__m)}; }
-
-inline constexpr
-bool operator==(const year_month& __lhs, const year_month& __rhs) noexcept
-{ return __lhs.year() == __rhs.year() && __lhs.month() == __rhs.month(); }
-
-inline constexpr
-bool operator!=(const year_month& __lhs, const year_month& __rhs) noexcept
-{ return !(__lhs == __rhs); }
-
-inline constexpr
-bool operator< (const year_month& __lhs, const year_month& __rhs) noexcept
-{ return __lhs.year() != __rhs.year() ? __lhs.year() < __rhs.year() : __lhs.month() < __rhs.month(); }
-
-inline constexpr
-bool operator> (const year_month& __lhs, const year_month& __rhs) noexcept
-{ return __rhs < __lhs; }
-
-inline constexpr
-bool operator<=(const year_month& __lhs, const year_month& __rhs) noexcept
-{ return !(__rhs < __lhs);}
-
-inline constexpr
-bool operator>=(const year_month& __lhs, const year_month& __rhs) noexcept
-{ return !(__lhs < __rhs); }
-
-constexpr year_month operator+(const year_month& __lhs, const months& __rhs) noexcept
-{
- int __dmi = static_cast<int>(static_cast<unsigned>(__lhs.month())) - 1 + __rhs.count();
- const int __dy = (__dmi >= 0 ? __dmi : __dmi-11) / 12;
- __dmi = __dmi - __dy * 12 + 1;
- return (__lhs.year() + years(__dy)) / month(static_cast<unsigned>(__dmi));
-}
-
-constexpr year_month operator+(const months& __lhs, const year_month& __rhs) noexcept
-{ return __rhs + __lhs; }
-
-constexpr year_month operator+(const year_month& __lhs, const years& __rhs) noexcept
-{ return (__lhs.year() + __rhs) / __lhs.month(); }
-
-constexpr year_month operator+(const years& __lhs, const year_month& __rhs) noexcept
-{ return __rhs + __lhs; }
-
-constexpr months operator-(const year_month& __lhs, const year_month& __rhs) noexcept
-{ return (__lhs.year() - __rhs.year()) + months(static_cast<unsigned>(__lhs.month()) - static_cast<unsigned>(__rhs.month())); }
-
-constexpr year_month operator-(const year_month& __lhs, const months& __rhs) noexcept
-{ return __lhs + -__rhs; }
-
-constexpr year_month operator-(const year_month& __lhs, const years& __rhs) noexcept
-{ return __lhs + -__rhs; }
-
-class year_month_day_last;
-
-class _LIBCPP_TYPE_VIS year_month_day {
-private:
- chrono::year __y;
- chrono::month __m;
- chrono::day __d;
-public:
- year_month_day() = default;
- inline constexpr year_month_day(
- const chrono::year& __yval, const chrono::month& __mval, const chrono::day& __dval) noexcept
- : __y{__yval}, __m{__mval}, __d{__dval} {}
- constexpr year_month_day(const year_month_day_last& __ymdl) noexcept;
- inline constexpr year_month_day(const sys_days& __sysd) noexcept
- : year_month_day(__from_days(__sysd.time_since_epoch())) {}
- inline explicit constexpr year_month_day(const local_days& __locd) noexcept
- : year_month_day(__from_days(__locd.time_since_epoch())) {}
-
- constexpr year_month_day& operator+=(const months& __dm) noexcept;
- constexpr year_month_day& operator-=(const months& __dm) noexcept;
- constexpr year_month_day& operator+=(const years& __dy) noexcept;
- constexpr year_month_day& operator-=(const years& __dy) noexcept;
-
- inline constexpr chrono::year year() const noexcept { return __y; }
- inline constexpr chrono::month month() const noexcept { return __m; }
- inline constexpr chrono::day day() const noexcept { return __d; }
- inline constexpr operator sys_days() const noexcept { return sys_days{__to_days()}; }
- inline explicit constexpr operator local_days() const noexcept { return local_days{__to_days()}; }
-
- constexpr bool ok() const noexcept;
-
- static constexpr year_month_day __from_days(days __d) noexcept;
- constexpr days __to_days() const noexcept;
-};
-
-
-// https://howardhinnant.github.io/date_algorithms.html#civil_from_days
-inline constexpr
-year_month_day
-year_month_day::__from_days(days __d) noexcept
-{
- static_assert(std::numeric_limits<unsigned>::digits >= 18, "");
- static_assert(std::numeric_limits<int>::digits >= 20 , "");
- const int __z = __d.count() + 719468;
- const int __era = (__z >= 0 ? __z : __z - 146096) / 146097;
- const unsigned __doe = static_cast<unsigned>(__z - __era * 146097); // [0, 146096]
- const unsigned __yoe = (__doe - __doe/1460 + __doe/36524 - __doe/146096) / 365; // [0, 399]
- const int __yr = static_cast<int>(__yoe) + __era * 400;
- const unsigned __doy = __doe - (365 * __yoe + __yoe/4 - __yoe/100); // [0, 365]
- const unsigned __mp = (5 * __doy + 2)/153; // [0, 11]
- const unsigned __dy = __doy - (153 * __mp + 2)/5 + 1; // [1, 31]
- const unsigned __mth = __mp + (__mp < 10 ? 3 : -9); // [1, 12]
- return year_month_day{chrono::year{__yr + (__mth <= 2)}, chrono::month{__mth}, chrono::day{__dy}};
-}
-
-// https://howardhinnant.github.io/date_algorithms.html#days_from_civil
-inline constexpr days year_month_day::__to_days() const noexcept
-{
- static_assert(std::numeric_limits<unsigned>::digits >= 18, "");
- static_assert(std::numeric_limits<int>::digits >= 20 , "");
-
- const int __yr = static_cast<int>(__y) - (__m <= February);
- const unsigned __mth = static_cast<unsigned>(__m);
- const unsigned __dy = static_cast<unsigned>(__d);
-
- const int __era = (__yr >= 0 ? __yr : __yr - 399) / 400;
- const unsigned __yoe = static_cast<unsigned>(__yr - __era * 400); // [0, 399]
- const unsigned __doy = (153 * (__mth + (__mth > 2 ? -3 : 9)) + 2) / 5 + __dy-1; // [0, 365]
- const unsigned __doe = __yoe * 365 + __yoe/4 - __yoe/100 + __doy; // [0, 146096]
- return days{__era * 146097 + static_cast<int>(__doe) - 719468};
-}
-
-inline constexpr
-bool operator==(const year_month_day& __lhs, const year_month_day& __rhs) noexcept
-{ return __lhs.year() == __rhs.year() && __lhs.month() == __rhs.month() && __lhs.day() == __rhs.day(); }
-
-inline constexpr
-bool operator!=(const year_month_day& __lhs, const year_month_day& __rhs) noexcept
-{ return !(__lhs == __rhs); }
-
-inline constexpr
-bool operator< (const year_month_day& __lhs, const year_month_day& __rhs) noexcept
-{
- if (__lhs.year() < __rhs.year()) return true;
- if (__lhs.year() > __rhs.year()) return false;
- if (__lhs.month() < __rhs.month()) return true;
- if (__lhs.month() > __rhs.month()) return false;
- return __lhs.day() < __rhs.day();
-}
-
-inline constexpr
-bool operator> (const year_month_day& __lhs, const year_month_day& __rhs) noexcept
-{ return __rhs < __lhs; }
-
-inline constexpr
-bool operator<=(const year_month_day& __lhs, const year_month_day& __rhs) noexcept
-{ return !(__rhs < __lhs);}
-
-inline constexpr
-bool operator>=(const year_month_day& __lhs, const year_month_day& __rhs) noexcept
-{ return !(__lhs < __rhs); }
-
-inline constexpr
-year_month_day operator/(const year_month& __lhs, const day& __rhs) noexcept
-{ return year_month_day{__lhs.year(), __lhs.month(), __rhs}; }
-
-inline constexpr
-year_month_day operator/(const year_month& __lhs, int __rhs) noexcept
-{ return __lhs / day(__rhs); }
-
-inline constexpr
-year_month_day operator/(const year& __lhs, const month_day& __rhs) noexcept
-{ return __lhs / __rhs.month() / __rhs.day(); }
-
-inline constexpr
-year_month_day operator/(int __lhs, const month_day& __rhs) noexcept
-{ return year(__lhs) / __rhs; }
-
-inline constexpr
-year_month_day operator/(const month_day& __lhs, const year& __rhs) noexcept
-{ return __rhs / __lhs; }
-
-inline constexpr
-year_month_day operator/(const month_day& __lhs, int __rhs) noexcept
-{ return year(__rhs) / __lhs; }
-
-
-inline constexpr
-year_month_day operator+(const year_month_day& __lhs, const months& __rhs) noexcept
-{ return (__lhs.year()/__lhs.month() + __rhs)/__lhs.day(); }
-
-inline constexpr
-year_month_day operator+(const months& __lhs, const year_month_day& __rhs) noexcept
-{ return __rhs + __lhs; }
-
-inline constexpr
-year_month_day operator-(const year_month_day& __lhs, const months& __rhs) noexcept
-{ return __lhs + -__rhs; }
-
-inline constexpr
-year_month_day operator+(const year_month_day& __lhs, const years& __rhs) noexcept
-{ return (__lhs.year() + __rhs) / __lhs.month() / __lhs.day(); }
-
-inline constexpr
-year_month_day operator+(const years& __lhs, const year_month_day& __rhs) noexcept
-{ return __rhs + __lhs; }
-
-inline constexpr
-year_month_day operator-(const year_month_day& __lhs, const years& __rhs) noexcept
-{ return __lhs + -__rhs; }
-
-inline constexpr year_month_day& year_month_day::operator+=(const months& __dm) noexcept { *this = *this + __dm; return *this; }
-inline constexpr year_month_day& year_month_day::operator-=(const months& __dm) noexcept { *this = *this - __dm; return *this; }
-inline constexpr year_month_day& year_month_day::operator+=(const years& __dy) noexcept { *this = *this + __dy; return *this; }
-inline constexpr year_month_day& year_month_day::operator-=(const years& __dy) noexcept { *this = *this - __dy; return *this; }
-
-class _LIBCPP_TYPE_VIS year_month_day_last {
-private:
- chrono::year __y;
- chrono::month_day_last __mdl;
-public:
- constexpr year_month_day_last(const year& __yval, const month_day_last& __mdlval) noexcept
- : __y{__yval}, __mdl{__mdlval} {}
-
- constexpr year_month_day_last& operator+=(const months& __m) noexcept;
- constexpr year_month_day_last& operator-=(const months& __m) noexcept;
- constexpr year_month_day_last& operator+=(const years& __y) noexcept;
- constexpr year_month_day_last& operator-=(const years& __y) noexcept;
-
- inline constexpr chrono::year year() const noexcept { return __y; }
- inline constexpr chrono::month month() const noexcept { return __mdl.month(); }
- inline constexpr chrono::month_day_last month_day_last() const noexcept { return __mdl; }
- constexpr chrono::day day() const noexcept;
- inline constexpr operator sys_days() const noexcept { return sys_days{year()/month()/day()}; }
- inline explicit constexpr operator local_days() const noexcept { return local_days{year()/month()/day()}; }
- inline constexpr bool ok() const noexcept { return __y.ok() && __mdl.ok(); }
-};
-
-inline constexpr
-chrono::day year_month_day_last::day() const noexcept
-{
- constexpr chrono::day __d[] =
- {
- chrono::day(31), chrono::day(28), chrono::day(31),
- chrono::day(30), chrono::day(31), chrono::day(30),
- chrono::day(31), chrono::day(31), chrono::day(30),
- chrono::day(31), chrono::day(30), chrono::day(31)
- };
- return month() != February || !__y.is_leap() ?
- __d[static_cast<unsigned>(month()) - 1] : chrono::day{29};
-}
-
-inline constexpr
-bool operator==(const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept
-{ return __lhs.year() == __rhs.year() && __lhs.month_day_last() == __rhs.month_day_last(); }
-
-inline constexpr
-bool operator!=(const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept
-{ return !(__lhs == __rhs); }
-
-inline constexpr
-bool operator< (const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept
-{
- if (__lhs.year() < __rhs.year()) return true;
- if (__lhs.year() > __rhs.year()) return false;
- return __lhs.month_day_last() < __rhs.month_day_last();
-}
-
-inline constexpr
-bool operator> (const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept
-{ return __rhs < __lhs; }
-
-inline constexpr
-bool operator<=(const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept
-{ return !(__rhs < __lhs);}
-
-inline constexpr
-bool operator>=(const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept
-{ return !(__lhs < __rhs); }
-
-inline constexpr year_month_day_last operator/(const year_month& __lhs, last_spec) noexcept
-{ return year_month_day_last{__lhs.year(), month_day_last{__lhs.month()}}; }
-
-inline constexpr year_month_day_last operator/(const year& __lhs, const month_day_last& __rhs) noexcept
-{ return year_month_day_last{__lhs, __rhs}; }
-
-inline constexpr year_month_day_last operator/(int __lhs, const month_day_last& __rhs) noexcept
-{ return year_month_day_last{year{__lhs}, __rhs}; }
-
-inline constexpr year_month_day_last operator/(const month_day_last& __lhs, const year& __rhs) noexcept
-{ return __rhs / __lhs; }
-
-inline constexpr year_month_day_last operator/(const month_day_last& __lhs, int __rhs) noexcept
-{ return year{__rhs} / __lhs; }
-
-
-inline constexpr
-year_month_day_last operator+(const year_month_day_last& __lhs, const months& __rhs) noexcept
-{ return (__lhs.year() / __lhs.month() + __rhs) / last; }
-
-inline constexpr
-year_month_day_last operator+(const months& __lhs, const year_month_day_last& __rhs) noexcept
-{ return __rhs + __lhs; }
-
-inline constexpr
-year_month_day_last operator-(const year_month_day_last& __lhs, const months& __rhs) noexcept
-{ return __lhs + (-__rhs); }
-
-inline constexpr
-year_month_day_last operator+(const year_month_day_last& __lhs, const years& __rhs) noexcept
-{ return year_month_day_last{__lhs.year() + __rhs, __lhs.month_day_last()}; }
-
-inline constexpr
-year_month_day_last operator+(const years& __lhs, const year_month_day_last& __rhs) noexcept
-{ return __rhs + __lhs; }
-
-inline constexpr
-year_month_day_last operator-(const year_month_day_last& __lhs, const years& __rhs) noexcept
-{ return __lhs + (-__rhs); }
-
-inline constexpr year_month_day_last& year_month_day_last::operator+=(const months& __dm) noexcept { *this = *this + __dm; return *this; }
-inline constexpr year_month_day_last& year_month_day_last::operator-=(const months& __dm) noexcept { *this = *this - __dm; return *this; }
-inline constexpr year_month_day_last& year_month_day_last::operator+=(const years& __dy) noexcept { *this = *this + __dy; return *this; }
-inline constexpr year_month_day_last& year_month_day_last::operator-=(const years& __dy) noexcept { *this = *this - __dy; return *this; }
-
-inline constexpr year_month_day::year_month_day(const year_month_day_last& __ymdl) noexcept
- : __y{__ymdl.year()}, __m{__ymdl.month()}, __d{__ymdl.day()} {}
-
-inline constexpr bool year_month_day::ok() const noexcept
-{
- if (!__y.ok() || !__m.ok()) return false;
- return chrono::day{1} <= __d && __d <= (__y / __m / last).day();
-}
-
-class _LIBCPP_TYPE_VIS year_month_weekday {
- chrono::year __y;
- chrono::month __m;
- chrono::weekday_indexed __wdi;
-public:
- year_month_weekday() = default;
- constexpr year_month_weekday(const chrono::year& __yval, const chrono::month& __mval,
- const chrono::weekday_indexed& __wdival) noexcept
- : __y{__yval}, __m{__mval}, __wdi{__wdival} {}
- constexpr year_month_weekday(const sys_days& __sysd) noexcept
- : year_month_weekday(__from_days(__sysd.time_since_epoch())) {}
- inline explicit constexpr year_month_weekday(const local_days& __locd) noexcept
- : year_month_weekday(__from_days(__locd.time_since_epoch())) {}
- constexpr year_month_weekday& operator+=(const months& m) noexcept;
- constexpr year_month_weekday& operator-=(const months& m) noexcept;
- constexpr year_month_weekday& operator+=(const years& y) noexcept;
- constexpr year_month_weekday& operator-=(const years& y) noexcept;
-
- inline constexpr chrono::year year() const noexcept { return __y; }
- inline constexpr chrono::month month() const noexcept { return __m; }
- inline constexpr chrono::weekday weekday() const noexcept { return __wdi.weekday(); }
- inline constexpr unsigned index() const noexcept { return __wdi.index(); }
- inline constexpr chrono::weekday_indexed weekday_indexed() const noexcept { return __wdi; }
-
- inline constexpr operator sys_days() const noexcept { return sys_days{__to_days()}; }
- inline explicit constexpr operator local_days() const noexcept { return local_days{__to_days()}; }
- inline constexpr bool ok() const noexcept
- {
- if (!__y.ok() || !__m.ok() || !__wdi.ok()) return false;
- // TODO: make sure it's a valid date
- return true;
- }
-
- static constexpr year_month_weekday __from_days(days __d) noexcept;
- constexpr days __to_days() const noexcept;
-};
-
-inline constexpr
-year_month_weekday year_month_weekday::__from_days(days __d) noexcept
-{
- const sys_days __sysd{__d};
- const chrono::weekday __wd = chrono::weekday(__sysd);
- const year_month_day __ymd = year_month_day(__sysd);
- return year_month_weekday{__ymd.year(), __ymd.month(),
- __wd[(static_cast<unsigned>(__ymd.day())-1)/7+1]};
-}
-
-inline constexpr
-days year_month_weekday::__to_days() const noexcept
-{
- const sys_days __sysd = sys_days(__y/__m/1);
- return (__sysd + (__wdi.weekday() - chrono::weekday(__sysd) + days{(__wdi.index()-1)*7}))
- .time_since_epoch();
-}
-
-inline constexpr
-bool operator==(const year_month_weekday& __lhs, const year_month_weekday& __rhs) noexcept
-{ return __lhs.year() == __rhs.year() && __lhs.month() == __rhs.month() && __lhs.weekday_indexed() == __rhs.weekday_indexed(); }
-
-inline constexpr
-bool operator!=(const year_month_weekday& __lhs, const year_month_weekday& __rhs) noexcept
-{ return !(__lhs == __rhs); }
-
-inline constexpr
-year_month_weekday operator/(const year_month& __lhs, const weekday_indexed& __rhs) noexcept
-{ return year_month_weekday{__lhs.year(), __lhs.month(), __rhs}; }
-
-inline constexpr
-year_month_weekday operator/(const year& __lhs, const month_weekday& __rhs) noexcept
-{ return year_month_weekday{__lhs, __rhs.month(), __rhs.weekday_indexed()}; }
-
-inline constexpr
-year_month_weekday operator/(int __lhs, const month_weekday& __rhs) noexcept
-{ return year(__lhs) / __rhs; }
-
-inline constexpr
-year_month_weekday operator/(const month_weekday& __lhs, const year& __rhs) noexcept
-{ return __rhs / __lhs; }
-
-inline constexpr
-year_month_weekday operator/(const month_weekday& __lhs, int __rhs) noexcept
-{ return year(__rhs) / __lhs; }
-
-
-inline constexpr
-year_month_weekday operator+(const year_month_weekday& __lhs, const months& __rhs) noexcept
-{ return (__lhs.year() / __lhs.month() + __rhs) / __lhs.weekday_indexed(); }
-
-inline constexpr
-year_month_weekday operator+(const months& __lhs, const year_month_weekday& __rhs) noexcept
-{ return __rhs + __lhs; }
-
-inline constexpr
-year_month_weekday operator-(const year_month_weekday& __lhs, const months& __rhs) noexcept
-{ return __lhs + (-__rhs); }
-
-inline constexpr
-year_month_weekday operator+(const year_month_weekday& __lhs, const years& __rhs) noexcept
-{ return year_month_weekday{__lhs.year() + __rhs, __lhs.month(), __lhs.weekday_indexed()}; }
-
-inline constexpr
-year_month_weekday operator+(const years& __lhs, const year_month_weekday& __rhs) noexcept
-{ return __rhs + __lhs; }
-
-inline constexpr
-year_month_weekday operator-(const year_month_weekday& __lhs, const years& __rhs) noexcept
-{ return __lhs + (-__rhs); }
-
-
-inline constexpr year_month_weekday& year_month_weekday::operator+=(const months& __dm) noexcept { *this = *this + __dm; return *this; }
-inline constexpr year_month_weekday& year_month_weekday::operator-=(const months& __dm) noexcept { *this = *this - __dm; return *this; }
-inline constexpr year_month_weekday& year_month_weekday::operator+=(const years& __dy) noexcept { *this = *this + __dy; return *this; }
-inline constexpr year_month_weekday& year_month_weekday::operator-=(const years& __dy) noexcept { *this = *this - __dy; return *this; }
-
-class _LIBCPP_TYPE_VIS year_month_weekday_last {
-private:
- chrono::year __y;
- chrono::month __m;
- chrono::weekday_last __wdl;
-public:
- constexpr year_month_weekday_last(const chrono::year& __yval, const chrono::month& __mval,
- const chrono::weekday_last& __wdlval) noexcept
- : __y{__yval}, __m{__mval}, __wdl{__wdlval} {}
- constexpr year_month_weekday_last& operator+=(const months& __dm) noexcept;
- constexpr year_month_weekday_last& operator-=(const months& __dm) noexcept;
- constexpr year_month_weekday_last& operator+=(const years& __dy) noexcept;
- constexpr year_month_weekday_last& operator-=(const years& __dy) noexcept;
-
- inline constexpr chrono::year year() const noexcept { return __y; }
- inline constexpr chrono::month month() const noexcept { return __m; }
- inline constexpr chrono::weekday weekday() const noexcept { return __wdl.weekday(); }
- inline constexpr chrono::weekday_last weekday_last() const noexcept { return __wdl; }
- inline constexpr operator sys_days() const noexcept { return sys_days{__to_days()}; }
- inline explicit constexpr operator local_days() const noexcept { return local_days{__to_days()}; }
- inline constexpr bool ok() const noexcept { return __y.ok() && __m.ok() && __wdl.ok(); }
-
- constexpr days __to_days() const noexcept;
-
-};
-
-inline constexpr
-days year_month_weekday_last::__to_days() const noexcept
-{
- const sys_days __last = sys_days{__y/__m/last};
- return (__last - (chrono::weekday{__last} - __wdl.weekday())).time_since_epoch();
-
-}
-
-inline constexpr
-bool operator==(const year_month_weekday_last& __lhs, const year_month_weekday_last& __rhs) noexcept
-{ return __lhs.year() == __rhs.year() && __lhs.month() == __rhs.month() && __lhs.weekday_last() == __rhs.weekday_last(); }
-
-inline constexpr
-bool operator!=(const year_month_weekday_last& __lhs, const year_month_weekday_last& __rhs) noexcept
-{ return !(__lhs == __rhs); }
-
-
-inline constexpr
-year_month_weekday_last operator/(const year_month& __lhs, const weekday_last& __rhs) noexcept
-{ return year_month_weekday_last{__lhs.year(), __lhs.month(), __rhs}; }
-
-inline constexpr
-year_month_weekday_last operator/(const year& __lhs, const month_weekday_last& __rhs) noexcept
-{ return year_month_weekday_last{__lhs, __rhs.month(), __rhs.weekday_last()}; }
-
-inline constexpr
-year_month_weekday_last operator/(int __lhs, const month_weekday_last& __rhs) noexcept
-{ return year(__lhs) / __rhs; }
-
-inline constexpr
-year_month_weekday_last operator/(const month_weekday_last& __lhs, const year& __rhs) noexcept
-{ return __rhs / __lhs; }
-
-inline constexpr
-year_month_weekday_last operator/(const month_weekday_last& __lhs, int __rhs) noexcept
-{ return year(__rhs) / __lhs; }
-
-
-inline constexpr
-year_month_weekday_last operator+(const year_month_weekday_last& __lhs, const months& __rhs) noexcept
-{ return (__lhs.year() / __lhs.month() + __rhs) / __lhs.weekday_last(); }
-
-inline constexpr
-year_month_weekday_last operator+(const months& __lhs, const year_month_weekday_last& __rhs) noexcept
-{ return __rhs + __lhs; }
-
-inline constexpr
-year_month_weekday_last operator-(const year_month_weekday_last& __lhs, const months& __rhs) noexcept
-{ return __lhs + (-__rhs); }
-
-inline constexpr
-year_month_weekday_last operator+(const year_month_weekday_last& __lhs, const years& __rhs) noexcept
-{ return year_month_weekday_last{__lhs.year() + __rhs, __lhs.month(), __lhs.weekday_last()}; }
-
-inline constexpr
-year_month_weekday_last operator+(const years& __lhs, const year_month_weekday_last& __rhs) noexcept
-{ return __rhs + __lhs; }
-
-inline constexpr
-year_month_weekday_last operator-(const year_month_weekday_last& __lhs, const years& __rhs) noexcept
-{ return __lhs + (-__rhs); }
-
-inline constexpr year_month_weekday_last& year_month_weekday_last::operator+=(const months& __dm) noexcept { *this = *this + __dm; return *this; }
-inline constexpr year_month_weekday_last& year_month_weekday_last::operator-=(const months& __dm) noexcept { *this = *this - __dm; return *this; }
-inline constexpr year_month_weekday_last& year_month_weekday_last::operator+=(const years& __dy) noexcept { *this = *this + __dy; return *this; }
-inline constexpr year_month_weekday_last& year_month_weekday_last::operator-=(const years& __dy) noexcept { *this = *this - __dy; return *this; }
-
-#endif // _LIBCPP_STD_VER > 17
-} // chrono
-
-#if _LIBCPP_STD_VER > 11
-// Suffixes for duration literals [time.duration.literals]
-inline namespace literals
-{
- inline namespace chrono_literals
- {
-
- constexpr chrono::hours operator""h(unsigned long long __h)
- {
- return chrono::hours(static_cast<chrono::hours::rep>(__h));
- }
-
- constexpr chrono::duration<long double, ratio<3600,1>> operator""h(long double __h)
- {
- return chrono::duration<long double, ratio<3600,1>>(__h);
- }
-
-
- constexpr chrono::minutes operator""min(unsigned long long __m)
- {
- return chrono::minutes(static_cast<chrono::minutes::rep>(__m));
- }
-
- constexpr chrono::duration<long double, ratio<60,1>> operator""min(long double __m)
- {
- return chrono::duration<long double, ratio<60,1>> (__m);
- }
-
-
- constexpr chrono::seconds operator""s(unsigned long long __s)
- {
- return chrono::seconds(static_cast<chrono::seconds::rep>(__s));
- }
-
- constexpr chrono::duration<long double> operator""s(long double __s)
- {
- return chrono::duration<long double> (__s);
- }
-
-
- constexpr chrono::milliseconds operator""ms(unsigned long long __ms)
- {
- return chrono::milliseconds(static_cast<chrono::milliseconds::rep>(__ms));
- }
-
- constexpr chrono::duration<long double, milli> operator""ms(long double __ms)
- {
- return chrono::duration<long double, milli>(__ms);
- }
-
-
- constexpr chrono::microseconds operator""us(unsigned long long __us)
- {
- return chrono::microseconds(static_cast<chrono::microseconds::rep>(__us));
- }
-
- constexpr chrono::duration<long double, micro> operator""us(long double __us)
- {
- return chrono::duration<long double, micro> (__us);
- }
-
-
- constexpr chrono::nanoseconds operator""ns(unsigned long long __ns)
- {
- return chrono::nanoseconds(static_cast<chrono::nanoseconds::rep>(__ns));
- }
-
- constexpr chrono::duration<long double, nano> operator""ns(long double __ns)
- {
- return chrono::duration<long double, nano> (__ns);
- }
-
-#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CXX20_CHRONO_LITERALS)
- constexpr chrono::day operator ""d(unsigned long long __d) noexcept
- {
- return chrono::day(static_cast<unsigned>(__d));
- }
-
- constexpr chrono::year operator ""y(unsigned long long __y) noexcept
- {
- return chrono::year(static_cast<int>(__y));
- }
-#endif
-}}
-
-namespace chrono { // hoist the literals into namespace std::chrono
- using namespace literals::chrono_literals;
-}
-
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-#ifndef _LIBCPP_CXX03_LANG
-_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM
-struct _FilesystemClock {
-#if !defined(_LIBCPP_HAS_NO_INT128)
- typedef __int128_t rep;
- typedef nano period;
-#else
- typedef long long rep;
- typedef nano period;
-#endif
-
- typedef chrono::duration<rep, period> duration;
- typedef chrono::time_point<_FilesystemClock> time_point;
-
- static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = false;
-
- _LIBCPP_FUNC_VIS static time_point now() noexcept;
-
- _LIBCPP_INLINE_VISIBILITY
- static time_t to_time_t(const time_point& __t) noexcept {
- typedef chrono::duration<rep> __secs;
- return time_t(
- chrono::duration_cast<__secs>(__t.time_since_epoch()).count());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- static time_point from_time_t(time_t __t) noexcept {
- typedef chrono::duration<rep> __secs;
- return time_point(__secs(__t));
- }
-};
-_LIBCPP_END_NAMESPACE_FILESYSTEM
-#endif // !_LIBCPP_CXX03_LANG
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_CHRONO
diff --git a/lib/libcxx/include/cinttypes b/lib/libcxx/include/cinttypes
deleted file mode 100644
index 3f61b0634b1..00000000000
--- a/lib/libcxx/include/cinttypes
+++ /dev/null
@@ -1,258 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- cinttypes --------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CINTTYPES
-#define _LIBCPP_CINTTYPES
-
-/*
- cinttypes synopsis
-
-This entire header is C99 / C++0X
-
-#include <cstdint> // <cinttypes> includes <cstdint>
-
-Macros:
-
- PRId8
- PRId16
- PRId32
- PRId64
-
- PRIdLEAST8
- PRIdLEAST16
- PRIdLEAST32
- PRIdLEAST64
-
- PRIdFAST8
- PRIdFAST16
- PRIdFAST32
- PRIdFAST64
-
- PRIdMAX
- PRIdPTR
-
- PRIi8
- PRIi16
- PRIi32
- PRIi64
-
- PRIiLEAST8
- PRIiLEAST16
- PRIiLEAST32
- PRIiLEAST64
-
- PRIiFAST8
- PRIiFAST16
- PRIiFAST32
- PRIiFAST64
-
- PRIiMAX
- PRIiPTR
-
- PRIo8
- PRIo16
- PRIo32
- PRIo64
-
- PRIoLEAST8
- PRIoLEAST16
- PRIoLEAST32
- PRIoLEAST64
-
- PRIoFAST8
- PRIoFAST16
- PRIoFAST32
- PRIoFAST64
-
- PRIoMAX
- PRIoPTR
-
- PRIu8
- PRIu16
- PRIu32
- PRIu64
-
- PRIuLEAST8
- PRIuLEAST16
- PRIuLEAST32
- PRIuLEAST64
-
- PRIuFAST8
- PRIuFAST16
- PRIuFAST32
- PRIuFAST64
-
- PRIuMAX
- PRIuPTR
-
- PRIx8
- PRIx16
- PRIx32
- PRIx64
-
- PRIxLEAST8
- PRIxLEAST16
- PRIxLEAST32
- PRIxLEAST64
-
- PRIxFAST8
- PRIxFAST16
- PRIxFAST32
- PRIxFAST64
-
- PRIxMAX
- PRIxPTR
-
- PRIX8
- PRIX16
- PRIX32
- PRIX64
-
- PRIXLEAST8
- PRIXLEAST16
- PRIXLEAST32
- PRIXLEAST64
-
- PRIXFAST8
- PRIXFAST16
- PRIXFAST32
- PRIXFAST64
-
- PRIXMAX
- PRIXPTR
-
- SCNd8
- SCNd16
- SCNd32
- SCNd64
-
- SCNdLEAST8
- SCNdLEAST16
- SCNdLEAST32
- SCNdLEAST64
-
- SCNdFAST8
- SCNdFAST16
- SCNdFAST32
- SCNdFAST64
-
- SCNdMAX
- SCNdPTR
-
- SCNi8
- SCNi16
- SCNi32
- SCNi64
-
- SCNiLEAST8
- SCNiLEAST16
- SCNiLEAST32
- SCNiLEAST64
-
- SCNiFAST8
- SCNiFAST16
- SCNiFAST32
- SCNiFAST64
-
- SCNiMAX
- SCNiPTR
-
- SCNo8
- SCNo16
- SCNo32
- SCNo64
-
- SCNoLEAST8
- SCNoLEAST16
- SCNoLEAST32
- SCNoLEAST64
-
- SCNoFAST8
- SCNoFAST16
- SCNoFAST32
- SCNoFAST64
-
- SCNoMAX
- SCNoPTR
-
- SCNu8
- SCNu16
- SCNu32
- SCNu64
-
- SCNuLEAST8
- SCNuLEAST16
- SCNuLEAST32
- SCNuLEAST64
-
- SCNuFAST8
- SCNuFAST16
- SCNuFAST32
- SCNuFAST64
-
- SCNuMAX
- SCNuPTR
-
- SCNx8
- SCNx16
- SCNx32
- SCNx64
-
- SCNxLEAST8
- SCNxLEAST16
- SCNxLEAST32
- SCNxLEAST64
-
- SCNxFAST8
- SCNxFAST16
- SCNxFAST32
- SCNxFAST64
-
- SCNxMAX
- SCNxPTR
-
-namespace std
-{
-
-Types:
-
- imaxdiv_t
-
-intmax_t imaxabs(intmax_t j);
-imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom);
-intmax_t strtoimax(const char* restrict nptr, char** restrict endptr, int base);
-uintmax_t strtoumax(const char* restrict nptr, char** restrict endptr, int base);
-intmax_t wcstoimax(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base);
-uintmax_t wcstoumax(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base);
-
-} // std
-*/
-
-#include <__config>
-#include <cstdint>
-#include <inttypes.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-using::imaxdiv_t;
-using::imaxabs;
-using::imaxdiv;
-using::strtoimax;
-using::strtoumax;
-using::wcstoimax;
-using::wcstoumax;
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_CINTTYPES
diff --git a/lib/libcxx/include/ciso646 b/lib/libcxx/include/ciso646
deleted file mode 100644
index b2efc72a9aa..00000000000
--- a/lib/libcxx/include/ciso646
+++ /dev/null
@@ -1,25 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- ciso646 ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CISO646
-#define _LIBCPP_CISO646
-
-/*
- ciso646 synopsis
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#endif // _LIBCPP_CISO646
diff --git a/lib/libcxx/include/climits b/lib/libcxx/include/climits
deleted file mode 100644
index 81ffecdf6ee..00000000000
--- a/lib/libcxx/include/climits
+++ /dev/null
@@ -1,48 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- climits ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CLIMITS
-#define _LIBCPP_CLIMITS
-
-/*
- climits synopsis
-
-Macros:
-
- CHAR_BIT
- SCHAR_MIN
- SCHAR_MAX
- UCHAR_MAX
- CHAR_MIN
- CHAR_MAX
- MB_LEN_MAX
- SHRT_MIN
- SHRT_MAX
- USHRT_MAX
- INT_MIN
- INT_MAX
- UINT_MAX
- LONG_MIN
- LONG_MAX
- ULONG_MAX
- LLONG_MIN // C99
- LLONG_MAX // C99
- ULLONG_MAX // C99
-
-*/
-
-#include <__config>
-#include <limits.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#endif // _LIBCPP_CLIMITS
diff --git a/lib/libcxx/include/clocale b/lib/libcxx/include/clocale
deleted file mode 100644
index 05fa9c6edda..00000000000
--- a/lib/libcxx/include/clocale
+++ /dev/null
@@ -1,55 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- clocale ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CLOCALE
-#define _LIBCPP_CLOCALE
-
-/*
- clocale synopsis
-
-Macros:
-
- LC_ALL
- LC_COLLATE
- LC_CTYPE
- LC_MONETARY
- LC_NUMERIC
- LC_TIME
- NULL
-
-namespace std
-{
-
-struct lconv;
-char* setlocale(int category, const char* locale);
-lconv* localeconv();
-
-} // std
-
-*/
-
-#include <__config>
-#include <locale.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-using ::lconv;
-#ifndef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
-using ::setlocale;
-#endif
-using ::localeconv;
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_CLOCALE
diff --git a/lib/libcxx/include/cmath b/lib/libcxx/include/cmath
deleted file mode 100644
index f5f62adcfb8..00000000000
--- a/lib/libcxx/include/cmath
+++ /dev/null
@@ -1,612 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- cmath -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CMATH
-#define _LIBCPP_CMATH
-
-/*
- cmath synopsis
-
-Macros:
-
- HUGE_VAL
- HUGE_VALF // C99
- HUGE_VALL // C99
- INFINITY // C99
- NAN // C99
- FP_INFINITE // C99
- FP_NAN // C99
- FP_NORMAL // C99
- FP_SUBNORMAL // C99
- FP_ZERO // C99
- FP_FAST_FMA // C99
- FP_FAST_FMAF // C99
- FP_FAST_FMAL // C99
- FP_ILOGB0 // C99
- FP_ILOGBNAN // C99
- MATH_ERRNO // C99
- MATH_ERREXCEPT // C99
- math_errhandling // C99
-
-namespace std
-{
-
-Types:
-
- float_t // C99
- double_t // C99
-
-// C90
-
-floating_point abs(floating_point x);
-
-floating_point acos (arithmetic x);
-float acosf(float x);
-long double acosl(long double x);
-
-floating_point asin (arithmetic x);
-float asinf(float x);
-long double asinl(long double x);
-
-floating_point atan (arithmetic x);
-float atanf(float x);
-long double atanl(long double x);
-
-floating_point atan2 (arithmetic y, arithmetic x);
-float atan2f(float y, float x);
-long double atan2l(long double y, long double x);
-
-floating_point ceil (arithmetic x);
-float ceilf(float x);
-long double ceill(long double x);
-
-floating_point cos (arithmetic x);
-float cosf(float x);
-long double cosl(long double x);
-
-floating_point cosh (arithmetic x);
-float coshf(float x);
-long double coshl(long double x);
-
-floating_point exp (arithmetic x);
-float expf(float x);
-long double expl(long double x);
-
-floating_point fabs (arithmetic x);
-float fabsf(float x);
-long double fabsl(long double x);
-
-floating_point floor (arithmetic x);
-float floorf(float x);
-long double floorl(long double x);
-
-floating_point fmod (arithmetic x, arithmetic y);
-float fmodf(float x, float y);
-long double fmodl(long double x, long double y);
-
-floating_point frexp (arithmetic value, int* exp);
-float frexpf(float value, int* exp);
-long double frexpl(long double value, int* exp);
-
-floating_point ldexp (arithmetic value, int exp);
-float ldexpf(float value, int exp);
-long double ldexpl(long double value, int exp);
-
-floating_point log (arithmetic x);
-float logf(float x);
-long double logl(long double x);
-
-floating_point log10 (arithmetic x);
-float log10f(float x);
-long double log10l(long double x);
-
-floating_point modf (floating_point value, floating_point* iptr);
-float modff(float value, float* iptr);
-long double modfl(long double value, long double* iptr);
-
-floating_point pow (arithmetic x, arithmetic y);
-float powf(float x, float y);
-long double powl(long double x, long double y);
-
-floating_point sin (arithmetic x);
-float sinf(float x);
-long double sinl(long double x);
-
-floating_point sinh (arithmetic x);
-float sinhf(float x);
-long double sinhl(long double x);
-
-floating_point sqrt (arithmetic x);
-float sqrtf(float x);
-long double sqrtl(long double x);
-
-floating_point tan (arithmetic x);
-float tanf(float x);
-long double tanl(long double x);
-
-floating_point tanh (arithmetic x);
-float tanhf(float x);
-long double tanhl(long double x);
-
-// C99
-
-bool signbit(arithmetic x);
-
-int fpclassify(arithmetic x);
-
-bool isfinite(arithmetic x);
-bool isinf(arithmetic x);
-bool isnan(arithmetic x);
-bool isnormal(arithmetic x);
-
-bool isgreater(arithmetic x, arithmetic y);
-bool isgreaterequal(arithmetic x, arithmetic y);
-bool isless(arithmetic x, arithmetic y);
-bool islessequal(arithmetic x, arithmetic y);
-bool islessgreater(arithmetic x, arithmetic y);
-bool isunordered(arithmetic x, arithmetic y);
-
-floating_point acosh (arithmetic x);
-float acoshf(float x);
-long double acoshl(long double x);
-
-floating_point asinh (arithmetic x);
-float asinhf(float x);
-long double asinhl(long double x);
-
-floating_point atanh (arithmetic x);
-float atanhf(float x);
-long double atanhl(long double x);
-
-floating_point cbrt (arithmetic x);
-float cbrtf(float x);
-long double cbrtl(long double x);
-
-floating_point copysign (arithmetic x, arithmetic y);
-float copysignf(float x, float y);
-long double copysignl(long double x, long double y);
-
-floating_point erf (arithmetic x);
-float erff(float x);
-long double erfl(long double x);
-
-floating_point erfc (arithmetic x);
-float erfcf(float x);
-long double erfcl(long double x);
-
-floating_point exp2 (arithmetic x);
-float exp2f(float x);
-long double exp2l(long double x);
-
-floating_point expm1 (arithmetic x);
-float expm1f(float x);
-long double expm1l(long double x);
-
-floating_point fdim (arithmetic x, arithmetic y);
-float fdimf(float x, float y);
-long double fdiml(long double x, long double y);
-
-floating_point fma (arithmetic x, arithmetic y, arithmetic z);
-float fmaf(float x, float y, float z);
-long double fmal(long double x, long double y, long double z);
-
-floating_point fmax (arithmetic x, arithmetic y);
-float fmaxf(float x, float y);
-long double fmaxl(long double x, long double y);
-
-floating_point fmin (arithmetic x, arithmetic y);
-float fminf(float x, float y);
-long double fminl(long double x, long double y);
-
-floating_point hypot (arithmetic x, arithmetic y);
-float hypotf(float x, float y);
-long double hypotl(long double x, long double y);
-
-double hypot(double x, double y, double z); // C++17
-float hypot(float x, float y, float z); // C++17
-long double hypot(long double x, long double y, long double z); // C++17
-
-int ilogb (arithmetic x);
-int ilogbf(float x);
-int ilogbl(long double x);
-
-floating_point lgamma (arithmetic x);
-float lgammaf(float x);
-long double lgammal(long double x);
-
-long long llrint (arithmetic x);
-long long llrintf(float x);
-long long llrintl(long double x);
-
-long long llround (arithmetic x);
-long long llroundf(float x);
-long long llroundl(long double x);
-
-floating_point log1p (arithmetic x);
-float log1pf(float x);
-long double log1pl(long double x);
-
-floating_point log2 (arithmetic x);
-float log2f(float x);
-long double log2l(long double x);
-
-floating_point logb (arithmetic x);
-float logbf(float x);
-long double logbl(long double x);
-
-long lrint (arithmetic x);
-long lrintf(float x);
-long lrintl(long double x);
-
-long lround (arithmetic x);
-long lroundf(float x);
-long lroundl(long double x);
-
-double nan (const char* str);
-float nanf(const char* str);
-long double nanl(const char* str);
-
-floating_point nearbyint (arithmetic x);
-float nearbyintf(float x);
-long double nearbyintl(long double x);
-
-floating_point nextafter (arithmetic x, arithmetic y);
-float nextafterf(float x, float y);
-long double nextafterl(long double x, long double y);
-
-floating_point nexttoward (arithmetic x, long double y);
-float nexttowardf(float x, long double y);
-long double nexttowardl(long double x, long double y);
-
-floating_point remainder (arithmetic x, arithmetic y);
-float remainderf(float x, float y);
-long double remainderl(long double x, long double y);
-
-floating_point remquo (arithmetic x, arithmetic y, int* pquo);
-float remquof(float x, float y, int* pquo);
-long double remquol(long double x, long double y, int* pquo);
-
-floating_point rint (arithmetic x);
-float rintf(float x);
-long double rintl(long double x);
-
-floating_point round (arithmetic x);
-float roundf(float x);
-long double roundl(long double x);
-
-floating_point scalbln (arithmetic x, long ex);
-float scalblnf(float x, long ex);
-long double scalblnl(long double x, long ex);
-
-floating_point scalbn (arithmetic x, int ex);
-float scalbnf(float x, int ex);
-long double scalbnl(long double x, int ex);
-
-floating_point tgamma (arithmetic x);
-float tgammaf(float x);
-long double tgammal(long double x);
-
-floating_point trunc (arithmetic x);
-float truncf(float x);
-long double truncl(long double x);
-
-} // std
-
-*/
-
-#include <__config>
-#include <math.h>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-using ::signbit;
-using ::fpclassify;
-using ::isfinite;
-using ::isinf;
-using ::isnan;
-using ::isnormal;
-using ::isgreater;
-using ::isgreaterequal;
-using ::isless;
-using ::islessequal;
-using ::islessgreater;
-using ::isunordered;
-using ::isunordered;
-
-using ::float_t;
-using ::double_t;
-
-#ifndef _AIX
-using ::abs;
-#endif
-
-using ::acos;
-using ::acosf;
-using ::asin;
-using ::asinf;
-using ::atan;
-using ::atanf;
-using ::atan2;
-using ::atan2f;
-using ::ceil;
-using ::ceilf;
-using ::cos;
-using ::cosf;
-using ::cosh;
-using ::coshf;
-
-using ::exp;
-using ::expf;
-
-using ::fabs;
-using ::fabsf;
-using ::floor;
-using ::floorf;
-
-using ::fmod;
-using ::fmodf;
-
-using ::frexp;
-using ::frexpf;
-using ::ldexp;
-using ::ldexpf;
-
-using ::log;
-using ::logf;
-
-using ::log10;
-using ::log10f;
-using ::modf;
-using ::modff;
-
-using ::pow;
-using ::powf;
-
-using ::sin;
-using ::sinf;
-using ::sinh;
-using ::sinhf;
-
-using ::sqrt;
-using ::sqrtf;
-using ::tan;
-using ::tanf;
-
-using ::tanh;
-using ::tanhf;
-
-using ::acosh;
-using ::acoshf;
-using ::asinh;
-using ::asinhf;
-using ::atanh;
-using ::atanhf;
-using ::cbrt;
-using ::cbrtf;
-
-using ::copysign;
-using ::copysignf;
-
-using ::erf;
-using ::erff;
-using ::erfc;
-using ::erfcf;
-using ::exp2;
-using ::exp2f;
-using ::expm1;
-using ::expm1f;
-using ::fdim;
-using ::fdimf;
-using ::fmaf;
-using ::fma;
-using ::fmax;
-using ::fmaxf;
-using ::fmin;
-using ::fminf;
-using ::hypot;
-using ::hypotf;
-using ::ilogb;
-using ::ilogbf;
-using ::lgamma;
-using ::lgammaf;
-using ::llrint;
-using ::llrintf;
-using ::llround;
-using ::llroundf;
-using ::log1p;
-using ::log1pf;
-using ::log2;
-using ::log2f;
-using ::logb;
-using ::logbf;
-using ::lrint;
-using ::lrintf;
-using ::lround;
-using ::lroundf;
-
-using ::nan;
-using ::nanf;
-
-using ::nearbyint;
-using ::nearbyintf;
-using ::nextafter;
-using ::nextafterf;
-using ::nexttoward;
-using ::nexttowardf;
-using ::remainder;
-using ::remainderf;
-using ::remquo;
-using ::remquof;
-using ::rint;
-using ::rintf;
-using ::round;
-using ::roundf;
-using ::scalbln;
-using ::scalblnf;
-using ::scalbn;
-using ::scalbnf;
-using ::tgamma;
-using ::tgammaf;
-using ::trunc;
-using ::truncf;
-
-using ::acosl;
-using ::asinl;
-using ::atanl;
-using ::atan2l;
-using ::ceill;
-using ::cosl;
-using ::coshl;
-using ::expl;
-using ::fabsl;
-using ::floorl;
-using ::fmodl;
-using ::frexpl;
-using ::ldexpl;
-using ::logl;
-using ::log10l;
-using ::modfl;
-using ::powl;
-using ::sinl;
-using ::sinhl;
-using ::sqrtl;
-using ::tanl;
-
-using ::tanhl;
-using ::acoshl;
-using ::asinhl;
-using ::atanhl;
-using ::cbrtl;
-
-using ::copysignl;
-
-using ::erfl;
-using ::erfcl;
-using ::exp2l;
-using ::expm1l;
-using ::fdiml;
-using ::fmal;
-using ::fmaxl;
-using ::fminl;
-using ::hypotl;
-using ::ilogbl;
-using ::lgammal;
-using ::llrintl;
-using ::llroundl;
-using ::log1pl;
-using ::log2l;
-using ::logbl;
-using ::lrintl;
-using ::lroundl;
-using ::nanl;
-using ::nearbyintl;
-using ::nextafterl;
-using ::nexttowardl;
-using ::remainderl;
-using ::remquol;
-using ::rintl;
-using ::roundl;
-using ::scalblnl;
-using ::scalbnl;
-using ::tgammal;
-using ::truncl;
-
-#if _LIBCPP_STD_VER > 14
-inline _LIBCPP_INLINE_VISIBILITY float hypot( float x, float y, float z ) { return sqrt(x*x + y*y + z*z); }
-inline _LIBCPP_INLINE_VISIBILITY double hypot( double x, double y, double z ) { return sqrt(x*x + y*y + z*z); }
-inline _LIBCPP_INLINE_VISIBILITY long double hypot( long double x, long double y, long double z ) { return sqrt(x*x + y*y + z*z); }
-
-template <class _A1, class _A2, class _A3>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __lazy_enable_if
-<
- is_arithmetic<_A1>::value &&
- is_arithmetic<_A2>::value &&
- is_arithmetic<_A3>::value,
- __promote<_A1, _A2, _A3>
->::type
-hypot(_A1 __lcpp_x, _A2 __lcpp_y, _A3 __lcpp_z) _NOEXCEPT
-{
- typedef typename __promote<_A1, _A2, _A3>::type __result_type;
- static_assert((!(is_same<_A1, __result_type>::value &&
- is_same<_A2, __result_type>::value &&
- is_same<_A3, __result_type>::value)), "");
- return hypot((__result_type)__lcpp_x, (__result_type)__lcpp_y, (__result_type)__lcpp_z);
-}
-#endif
-
-template <class _A1>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR typename enable_if<is_floating_point<_A1>::value, bool>::type
-__libcpp_isnan_or_builtin(_A1 __lcpp_x) _NOEXCEPT
-{
-#if __has_builtin(__builtin_isnan)
- return __builtin_isnan(__lcpp_x);
-#else
- return isnan(__lcpp_x);
-#endif
-}
-
-template <class _A1>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR typename enable_if<!is_floating_point<_A1>::value, bool>::type
-__libcpp_isnan_or_builtin(_A1 __lcpp_x) _NOEXCEPT
-{
- return isnan(__lcpp_x);
-}
-
-template <class _A1>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR typename enable_if<is_floating_point<_A1>::value, bool>::type
-__libcpp_isinf_or_builtin(_A1 __lcpp_x) _NOEXCEPT
-{
-#if __has_builtin(__builtin_isinf)
- return __builtin_isinf(__lcpp_x);
-#else
- return isinf(__lcpp_x);
-#endif
-}
-
-template <class _A1>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR typename enable_if<!is_floating_point<_A1>::value, bool>::type
-__libcpp_isinf_or_builtin(_A1 __lcpp_x) _NOEXCEPT
-{
- return isinf(__lcpp_x);
-}
-
-template <class _A1>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR typename enable_if<is_floating_point<_A1>::value, bool>::type
-__libcpp_isfinite_or_builtin(_A1 __lcpp_x) _NOEXCEPT
-{
-#if __has_builtin(__builtin_isfinite)
- return __builtin_isfinite(__lcpp_x);
-#else
- return isfinite(__lcpp_x);
-#endif
-}
-
-template <class _A1>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR typename enable_if<!is_floating_point<_A1>::value, bool>::type
-__libcpp_isfinite_or_builtin(_A1 __lcpp_x) _NOEXCEPT
-{
- return isfinite(__lcpp_x);
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_CMATH
diff --git a/lib/libcxx/include/codecvt b/lib/libcxx/include/codecvt
deleted file mode 100644
index 5eb9d154911..00000000000
--- a/lib/libcxx/include/codecvt
+++ /dev/null
@@ -1,550 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- codecvt -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CODECVT
-#define _LIBCPP_CODECVT
-
-/*
- codecvt synopsis
-
-namespace std
-{
-
-enum codecvt_mode
-{
- consume_header = 4,
- generate_header = 2,
- little_endian = 1
-};
-
-template <class Elem, unsigned long Maxcode = 0x10ffff,
- codecvt_mode Mode = (codecvt_mode)0>
-class codecvt_utf8
- : public codecvt<Elem, char, mbstate_t>
-{
- explicit codecvt_utf8(size_t refs = 0);
- ~codecvt_utf8();
-};
-
-template <class Elem, unsigned long Maxcode = 0x10ffff,
- codecvt_mode Mode = (codecvt_mode)0>
-class codecvt_utf16
- : public codecvt<Elem, char, mbstate_t>
-{
- explicit codecvt_utf16(size_t refs = 0);
- ~codecvt_utf16();
-};
-
-template <class Elem, unsigned long Maxcode = 0x10ffff,
- codecvt_mode Mode = (codecvt_mode)0>
-class codecvt_utf8_utf16
- : public codecvt<Elem, char, mbstate_t>
-{
- explicit codecvt_utf8_utf16(size_t refs = 0);
- ~codecvt_utf8_utf16();
-};
-
-} // std
-
-*/
-
-#include <__config>
-#include <__locale>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-enum codecvt_mode
-{
- consume_header = 4,
- generate_header = 2,
- little_endian = 1
-};
-
-// codecvt_utf8
-
-template <class _Elem> class __codecvt_utf8;
-
-template <>
-class _LIBCPP_TYPE_VIS __codecvt_utf8<wchar_t>
- : public codecvt<wchar_t, char, mbstate_t>
-{
- unsigned long _Maxcode_;
- codecvt_mode _Mode_;
-public:
- typedef wchar_t intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __codecvt_utf8(size_t __refs, unsigned long _Maxcode,
- codecvt_mode _Mode)
- : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
- _Mode_(_Mode) {}
-protected:
- virtual result
- do_out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual result
- do_in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
- virtual result
- do_unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual int do_encoding() const throw();
- virtual bool do_always_noconv() const throw();
- virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
- size_t __mx) const;
- virtual int do_max_length() const throw();
-};
-
-template <>
-class _LIBCPP_TYPE_VIS __codecvt_utf8<char16_t>
- : public codecvt<char16_t, char, mbstate_t>
-{
- unsigned long _Maxcode_;
- codecvt_mode _Mode_;
-public:
- typedef char16_t intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __codecvt_utf8(size_t __refs, unsigned long _Maxcode,
- codecvt_mode _Mode)
- : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
- _Mode_(_Mode) {}
-protected:
- virtual result
- do_out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual result
- do_in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
- virtual result
- do_unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual int do_encoding() const throw();
- virtual bool do_always_noconv() const throw();
- virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
- size_t __mx) const;
- virtual int do_max_length() const throw();
-};
-
-template <>
-class _LIBCPP_TYPE_VIS __codecvt_utf8<char32_t>
- : public codecvt<char32_t, char, mbstate_t>
-{
- unsigned long _Maxcode_;
- codecvt_mode _Mode_;
-public:
- typedef char32_t intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __codecvt_utf8(size_t __refs, unsigned long _Maxcode,
- codecvt_mode _Mode)
- : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
- _Mode_(_Mode) {}
-protected:
- virtual result
- do_out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual result
- do_in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
- virtual result
- do_unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual int do_encoding() const throw();
- virtual bool do_always_noconv() const throw();
- virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
- size_t __mx) const;
- virtual int do_max_length() const throw();
-};
-
-template <class _Elem, unsigned long _Maxcode = 0x10ffff,
- codecvt_mode _Mode = (codecvt_mode)0>
-class _LIBCPP_TEMPLATE_VIS codecvt_utf8
- : public __codecvt_utf8<_Elem>
-{
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit codecvt_utf8(size_t __refs = 0)
- : __codecvt_utf8<_Elem>(__refs, _Maxcode, _Mode) {}
-
- _LIBCPP_INLINE_VISIBILITY
- ~codecvt_utf8() {}
-};
-
-// codecvt_utf16
-
-template <class _Elem, bool _LittleEndian> class __codecvt_utf16;
-
-template <>
-class _LIBCPP_TYPE_VIS __codecvt_utf16<wchar_t, false>
- : public codecvt<wchar_t, char, mbstate_t>
-{
- unsigned long _Maxcode_;
- codecvt_mode _Mode_;
-public:
- typedef wchar_t intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode,
- codecvt_mode _Mode)
- : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
- _Mode_(_Mode) {}
-protected:
- virtual result
- do_out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual result
- do_in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
- virtual result
- do_unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual int do_encoding() const throw();
- virtual bool do_always_noconv() const throw();
- virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
- size_t __mx) const;
- virtual int do_max_length() const throw();
-};
-
-template <>
-class _LIBCPP_TYPE_VIS __codecvt_utf16<wchar_t, true>
- : public codecvt<wchar_t, char, mbstate_t>
-{
- unsigned long _Maxcode_;
- codecvt_mode _Mode_;
-public:
- typedef wchar_t intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode,
- codecvt_mode _Mode)
- : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
- _Mode_(_Mode) {}
-protected:
- virtual result
- do_out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual result
- do_in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
- virtual result
- do_unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual int do_encoding() const throw();
- virtual bool do_always_noconv() const throw();
- virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
- size_t __mx) const;
- virtual int do_max_length() const throw();
-};
-
-template <>
-class _LIBCPP_TYPE_VIS __codecvt_utf16<char16_t, false>
- : public codecvt<char16_t, char, mbstate_t>
-{
- unsigned long _Maxcode_;
- codecvt_mode _Mode_;
-public:
- typedef char16_t intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode,
- codecvt_mode _Mode)
- : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
- _Mode_(_Mode) {}
-protected:
- virtual result
- do_out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual result
- do_in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
- virtual result
- do_unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual int do_encoding() const throw();
- virtual bool do_always_noconv() const throw();
- virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
- size_t __mx) const;
- virtual int do_max_length() const throw();
-};
-
-template <>
-class _LIBCPP_TYPE_VIS __codecvt_utf16<char16_t, true>
- : public codecvt<char16_t, char, mbstate_t>
-{
- unsigned long _Maxcode_;
- codecvt_mode _Mode_;
-public:
- typedef char16_t intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode,
- codecvt_mode _Mode)
- : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
- _Mode_(_Mode) {}
-protected:
- virtual result
- do_out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual result
- do_in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
- virtual result
- do_unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual int do_encoding() const throw();
- virtual bool do_always_noconv() const throw();
- virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
- size_t __mx) const;
- virtual int do_max_length() const throw();
-};
-
-template <>
-class _LIBCPP_TYPE_VIS __codecvt_utf16<char32_t, false>
- : public codecvt<char32_t, char, mbstate_t>
-{
- unsigned long _Maxcode_;
- codecvt_mode _Mode_;
-public:
- typedef char32_t intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode,
- codecvt_mode _Mode)
- : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
- _Mode_(_Mode) {}
-protected:
- virtual result
- do_out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual result
- do_in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
- virtual result
- do_unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual int do_encoding() const throw();
- virtual bool do_always_noconv() const throw();
- virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
- size_t __mx) const;
- virtual int do_max_length() const throw();
-};
-
-template <>
-class _LIBCPP_TYPE_VIS __codecvt_utf16<char32_t, true>
- : public codecvt<char32_t, char, mbstate_t>
-{
- unsigned long _Maxcode_;
- codecvt_mode _Mode_;
-public:
- typedef char32_t intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode,
- codecvt_mode _Mode)
- : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
- _Mode_(_Mode) {}
-protected:
- virtual result
- do_out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual result
- do_in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
- virtual result
- do_unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual int do_encoding() const throw();
- virtual bool do_always_noconv() const throw();
- virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
- size_t __mx) const;
- virtual int do_max_length() const throw();
-};
-
-template <class _Elem, unsigned long _Maxcode = 0x10ffff,
- codecvt_mode _Mode = (codecvt_mode)0>
-class _LIBCPP_TEMPLATE_VIS codecvt_utf16
- : public __codecvt_utf16<_Elem, _Mode & little_endian>
-{
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit codecvt_utf16(size_t __refs = 0)
- : __codecvt_utf16<_Elem, _Mode & little_endian>(__refs, _Maxcode, _Mode) {}
-
- _LIBCPP_INLINE_VISIBILITY
- ~codecvt_utf16() {}
-};
-
-// codecvt_utf8_utf16
-
-template <class _Elem> class __codecvt_utf8_utf16;
-
-template <>
-class _LIBCPP_TYPE_VIS __codecvt_utf8_utf16<wchar_t>
- : public codecvt<wchar_t, char, mbstate_t>
-{
- unsigned long _Maxcode_;
- codecvt_mode _Mode_;
-public:
- typedef wchar_t intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __codecvt_utf8_utf16(size_t __refs, unsigned long _Maxcode,
- codecvt_mode _Mode)
- : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
- _Mode_(_Mode) {}
-protected:
- virtual result
- do_out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual result
- do_in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
- virtual result
- do_unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual int do_encoding() const throw();
- virtual bool do_always_noconv() const throw();
- virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
- size_t __mx) const;
- virtual int do_max_length() const throw();
-};
-
-template <>
-class _LIBCPP_TYPE_VIS __codecvt_utf8_utf16<char32_t>
- : public codecvt<char32_t, char, mbstate_t>
-{
- unsigned long _Maxcode_;
- codecvt_mode _Mode_;
-public:
- typedef char32_t intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __codecvt_utf8_utf16(size_t __refs, unsigned long _Maxcode,
- codecvt_mode _Mode)
- : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
- _Mode_(_Mode) {}
-protected:
- virtual result
- do_out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual result
- do_in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
- virtual result
- do_unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual int do_encoding() const throw();
- virtual bool do_always_noconv() const throw();
- virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
- size_t __mx) const;
- virtual int do_max_length() const throw();
-};
-
-template <>
-class _LIBCPP_TYPE_VIS __codecvt_utf8_utf16<char16_t>
- : public codecvt<char16_t, char, mbstate_t>
-{
- unsigned long _Maxcode_;
- codecvt_mode _Mode_;
-public:
- typedef char16_t intern_type;
- typedef char extern_type;
- typedef mbstate_t state_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __codecvt_utf8_utf16(size_t __refs, unsigned long _Maxcode,
- codecvt_mode _Mode)
- : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
- _Mode_(_Mode) {}
-protected:
- virtual result
- do_out(state_type& __st,
- const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual result
- do_in(state_type& __st,
- const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
- intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
- virtual result
- do_unshift(state_type& __st,
- extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
- virtual int do_encoding() const throw();
- virtual bool do_always_noconv() const throw();
- virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
- size_t __mx) const;
- virtual int do_max_length() const throw();
-};
-
-template <class _Elem, unsigned long _Maxcode = 0x10ffff,
- codecvt_mode _Mode = (codecvt_mode)0>
-class _LIBCPP_TEMPLATE_VIS codecvt_utf8_utf16
- : public __codecvt_utf8_utf16<_Elem>
-{
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit codecvt_utf8_utf16(size_t __refs = 0)
- : __codecvt_utf8_utf16<_Elem>(__refs, _Maxcode, _Mode) {}
-
- _LIBCPP_INLINE_VISIBILITY
- ~codecvt_utf8_utf16() {}
-};
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_CODECVT
diff --git a/lib/libcxx/include/compare b/lib/libcxx/include/compare
deleted file mode 100644
index 07f88f09cb3..00000000000
--- a/lib/libcxx/include/compare
+++ /dev/null
@@ -1,679 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- compare -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_COMPARE
-#define _LIBCPP_COMPARE
-
-/*
- compare synopsis
-
-namespace std {
- // [cmp.categories], comparison category types
- class weak_equality;
- class strong_equality;
- class partial_ordering;
- class weak_ordering;
- class strong_ordering;
-
- // named comparison functions
- constexpr bool is_eq (weak_equality cmp) noexcept { return cmp == 0; }
- constexpr bool is_neq (weak_equality cmp) noexcept { return cmp != 0; }
- constexpr bool is_lt (partial_ordering cmp) noexcept { return cmp < 0; }
- constexpr bool is_lteq(partial_ordering cmp) noexcept { return cmp <= 0; }
- constexpr bool is_gt (partial_ordering cmp) noexcept { return cmp > 0; }
- constexpr bool is_gteq(partial_ordering cmp) noexcept { return cmp >= 0; }
-
- // [cmp.common], common comparison category type
- template<class... Ts>
- struct common_comparison_category {
- using type = see below;
- };
- template<class... Ts>
- using common_comparison_category_t = typename common_comparison_category<Ts...>::type;
-
- // [cmp.alg], comparison algorithms
- template<class T> constexpr strong_ordering strong_order(const T& a, const T& b);
- template<class T> constexpr weak_ordering weak_order(const T& a, const T& b);
- template<class T> constexpr partial_ordering partial_order(const T& a, const T& b);
- template<class T> constexpr strong_equality strong_equal(const T& a, const T& b);
- template<class T> constexpr weak_equality weak_equal(const T& a, const T& b);
-}
-*/
-
-#include <__config>
-#include <type_traits>
-#include <array>
-
-#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-#if _LIBCPP_STD_VER > 17
-
-// exposition only
-enum class _LIBCPP_ENUM_VIS _EqResult : unsigned char {
- __zero = 0,
- __equal = __zero,
- __equiv = __equal,
- __nonequal = 1,
- __nonequiv = __nonequal
-};
-
-enum class _LIBCPP_ENUM_VIS _OrdResult : signed char {
- __less = -1,
- __greater = 1
-};
-
-enum class _LIBCPP_ENUM_VIS _NCmpResult : signed char {
- __unordered = -127
-};
-
-struct _CmpUnspecifiedType;
-using _CmpUnspecifiedParam = void (_CmpUnspecifiedType::*)();
-
-class weak_equality {
- _LIBCPP_INLINE_VISIBILITY
- constexpr explicit weak_equality(_EqResult __val) noexcept : __value_(__val) {}
-
-public:
- static const weak_equality equivalent;
- static const weak_equality nonequivalent;
-
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(weak_equality __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(_CmpUnspecifiedParam, weak_equality __v) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator!=(weak_equality __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator!=(_CmpUnspecifiedParam, weak_equality __v) noexcept;
-
-#ifndef _LIBCPP_HAS_NO_SPACESHIP_OPERATOR
- _LIBCPP_INLINE_VISIBILITY friend constexpr weak_equality operator<=>(weak_equality __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr weak_equality operator<=>(_CmpUnspecifiedParam, weak_equality __v) noexcept;
-#endif
-
-private:
- _EqResult __value_;
-};
-
-_LIBCPP_INLINE_VAR constexpr weak_equality weak_equality::equivalent(_EqResult::__equiv);
-_LIBCPP_INLINE_VAR constexpr weak_equality weak_equality::nonequivalent(_EqResult::__nonequiv);
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr bool operator==(weak_equality __v, _CmpUnspecifiedParam) noexcept {
- return __v.__value_ == _EqResult::__zero;
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr bool operator==(_CmpUnspecifiedParam, weak_equality __v) noexcept {
- return __v.__value_ == _EqResult::__zero;
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr bool operator!=(weak_equality __v, _CmpUnspecifiedParam) noexcept {
- return __v.__value_ != _EqResult::__zero;
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr bool operator!=(_CmpUnspecifiedParam, weak_equality __v) noexcept {
- return __v.__value_ != _EqResult::__zero;
-}
-
-#ifndef _LIBCPP_HAS_NO_SPACESHIP_OPERATOR
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr weak_equality operator<=>(weak_equality __v, _CmpUnspecifiedParam) noexcept {
- return __v;
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr weak_equality operator<=>(_CmpUnspecifiedParam, weak_equality __v) noexcept {
- return __v;
-}
-#endif
-
-class strong_equality {
- _LIBCPP_INLINE_VISIBILITY
- explicit constexpr strong_equality(_EqResult __val) noexcept : __value_(__val) {}
-
-public:
- static const strong_equality equal;
- static const strong_equality nonequal;
- static const strong_equality equivalent;
- static const strong_equality nonequivalent;
-
- // conversion
- _LIBCPP_INLINE_VISIBILITY constexpr operator weak_equality() const noexcept {
- return __value_ == _EqResult::__zero ? weak_equality::equivalent
- : weak_equality::nonequivalent;
- }
-
- // comparisons
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(strong_equality __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator!=(strong_equality __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(_CmpUnspecifiedParam, strong_equality __v) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator!=(_CmpUnspecifiedParam, strong_equality __v) noexcept;
-
-#ifndef _LIBCPP_HAS_NO_SPACESHIP_OPERATOR
- _LIBCPP_INLINE_VISIBILITY friend constexpr strong_equality operator<=>(strong_equality __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr strong_equality operator<=>(_CmpUnspecifiedParam, strong_equality __v) noexcept;
-#endif
-private:
- _EqResult __value_;
-};
-
-_LIBCPP_INLINE_VAR constexpr strong_equality strong_equality::equal(_EqResult::__equal);
-_LIBCPP_INLINE_VAR constexpr strong_equality strong_equality::nonequal(_EqResult::__nonequal);
-_LIBCPP_INLINE_VAR constexpr strong_equality strong_equality::equivalent(_EqResult::__equiv);
-_LIBCPP_INLINE_VAR constexpr strong_equality strong_equality::nonequivalent(_EqResult::__nonequiv);
-
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator==(strong_equality __v, _CmpUnspecifiedParam) noexcept {
- return __v.__value_ == _EqResult::__zero;
-}
-
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator==(_CmpUnspecifiedParam, strong_equality __v) noexcept {
- return __v.__value_ == _EqResult::__zero;
-}
-
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator!=(strong_equality __v, _CmpUnspecifiedParam) noexcept {
- return __v.__value_ != _EqResult::__zero;
-}
-
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator!=(_CmpUnspecifiedParam, strong_equality __v) noexcept {
- return __v.__value_ != _EqResult::__zero;
-}
-
-#ifndef _LIBCPP_HAS_NO_SPACESHIP_OPERATOR
-_LIBCPP_INLINE_VISIBILITY
-constexpr strong_equality operator<=>(strong_equality __v, _CmpUnspecifiedParam) noexcept {
- return __v;
-}
-
-_LIBCPP_INLINE_VISIBILITY
-constexpr strong_equality operator<=>(_CmpUnspecifiedParam, strong_equality __v) noexcept {
- return __v;
-}
-#endif // _LIBCPP_HAS_NO_SPACESHIP_OPERATOR
-
-class partial_ordering {
- using _ValueT = signed char;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit constexpr partial_ordering(_EqResult __v) noexcept
- : __value_(_ValueT(__v)) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit constexpr partial_ordering(_OrdResult __v) noexcept
- : __value_(_ValueT(__v)) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit constexpr partial_ordering(_NCmpResult __v) noexcept
- : __value_(_ValueT(__v)) {}
-
- constexpr bool __is_ordered() const noexcept {
- return __value_ != _ValueT(_NCmpResult::__unordered);
- }
-public:
- // valid values
- static const partial_ordering less;
- static const partial_ordering equivalent;
- static const partial_ordering greater;
- static const partial_ordering unordered;
-
- // conversion
- constexpr operator weak_equality() const noexcept {
- return __value_ == 0 ? weak_equality::equivalent : weak_equality::nonequivalent;
- }
-
- // comparisons
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(partial_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator!=(partial_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator< (partial_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator<=(partial_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator> (partial_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator>=(partial_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(_CmpUnspecifiedParam, partial_ordering __v) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator!=(_CmpUnspecifiedParam, partial_ordering __v) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator< (_CmpUnspecifiedParam, partial_ordering __v) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator<=(_CmpUnspecifiedParam, partial_ordering __v) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator> (_CmpUnspecifiedParam, partial_ordering __v) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator>=(_CmpUnspecifiedParam, partial_ordering __v) noexcept;
-
-#ifndef _LIBCPP_HAS_NO_SPACESHIP_OPERATOR
- _LIBCPP_INLINE_VISIBILITY friend constexpr partial_ordering operator<=>(partial_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr partial_ordering operator<=>(_CmpUnspecifiedParam, partial_ordering __v) noexcept;
-#endif
-
-private:
- _ValueT __value_;
-};
-
-_LIBCPP_INLINE_VAR constexpr partial_ordering partial_ordering::less(_OrdResult::__less);
-_LIBCPP_INLINE_VAR constexpr partial_ordering partial_ordering::equivalent(_EqResult::__equiv);
-_LIBCPP_INLINE_VAR constexpr partial_ordering partial_ordering::greater(_OrdResult::__greater);
-_LIBCPP_INLINE_VAR constexpr partial_ordering partial_ordering::unordered(_NCmpResult ::__unordered);
-
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator==(partial_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v.__is_ordered() && __v.__value_ == 0;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator< (partial_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v.__is_ordered() && __v.__value_ < 0;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator<=(partial_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v.__is_ordered() && __v.__value_ <= 0;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator> (partial_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v.__is_ordered() && __v.__value_ > 0;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator>=(partial_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v.__is_ordered() && __v.__value_ >= 0;
-}
-
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator==(_CmpUnspecifiedParam, partial_ordering __v) noexcept {
- return __v.__is_ordered() && 0 == __v.__value_;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator< (_CmpUnspecifiedParam, partial_ordering __v) noexcept {
- return __v.__is_ordered() && 0 < __v.__value_;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator<=(_CmpUnspecifiedParam, partial_ordering __v) noexcept {
- return __v.__is_ordered() && 0 <= __v.__value_;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator> (_CmpUnspecifiedParam, partial_ordering __v) noexcept {
- return __v.__is_ordered() && 0 > __v.__value_;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator>=(_CmpUnspecifiedParam, partial_ordering __v) noexcept {
- return __v.__is_ordered() && 0 >= __v.__value_;
-}
-
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator!=(partial_ordering __v, _CmpUnspecifiedParam) noexcept {
- return !__v.__is_ordered() || __v.__value_ != 0;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator!=(_CmpUnspecifiedParam, partial_ordering __v) noexcept {
- return !__v.__is_ordered() || __v.__value_ != 0;
-}
-
-#ifndef _LIBCPP_HAS_NO_SPACESHIP_OPERATOR
-_LIBCPP_INLINE_VISIBILITY
-constexpr partial_ordering operator<=>(partial_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr partial_ordering operator<=>(_CmpUnspecifiedParam, partial_ordering __v) noexcept {
- return __v < 0 ? partial_ordering::greater : (__v > 0 ? partial_ordering::less : __v);
-}
-#endif // _LIBCPP_HAS_NO_SPACESHIP_OPERATOR
-
-class weak_ordering {
- using _ValueT = signed char;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit constexpr weak_ordering(_EqResult __v) noexcept : __value_(_ValueT(__v)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit constexpr weak_ordering(_OrdResult __v) noexcept : __value_(_ValueT(__v)) {}
-
-public:
- static const weak_ordering less;
- static const weak_ordering equivalent;
- static const weak_ordering greater;
-
- // conversions
- _LIBCPP_INLINE_VISIBILITY
- constexpr operator weak_equality() const noexcept {
- return __value_ == 0 ? weak_equality::equivalent
- : weak_equality::nonequivalent;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr operator partial_ordering() const noexcept {
- return __value_ == 0 ? partial_ordering::equivalent
- : (__value_ < 0 ? partial_ordering::less : partial_ordering::greater);
- }
-
- // comparisons
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(weak_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator!=(weak_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator< (weak_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator<=(weak_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator> (weak_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator>=(weak_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(_CmpUnspecifiedParam, weak_ordering __v) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator!=(_CmpUnspecifiedParam, weak_ordering __v) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator< (_CmpUnspecifiedParam, weak_ordering __v) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator<=(_CmpUnspecifiedParam, weak_ordering __v) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator> (_CmpUnspecifiedParam, weak_ordering __v) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator>=(_CmpUnspecifiedParam, weak_ordering __v) noexcept;
-
-#ifndef _LIBCPP_HAS_NO_SPACESHIP_OPERATOR
- _LIBCPP_INLINE_VISIBILITY friend constexpr weak_ordering operator<=>(weak_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr weak_ordering operator<=>(_CmpUnspecifiedParam, weak_ordering __v) noexcept;
-#endif
-
-private:
- _ValueT __value_;
-};
-
-_LIBCPP_INLINE_VAR constexpr weak_ordering weak_ordering::less(_OrdResult::__less);
-_LIBCPP_INLINE_VAR constexpr weak_ordering weak_ordering::equivalent(_EqResult::__equiv);
-_LIBCPP_INLINE_VAR constexpr weak_ordering weak_ordering::greater(_OrdResult::__greater);
-
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator==(weak_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v.__value_ == 0;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator!=(weak_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v.__value_ != 0;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator< (weak_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v.__value_ < 0;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator<=(weak_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v.__value_ <= 0;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator> (weak_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v.__value_ > 0;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator>=(weak_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v.__value_ >= 0;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator==(_CmpUnspecifiedParam, weak_ordering __v) noexcept {
- return 0 == __v.__value_;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator!=(_CmpUnspecifiedParam, weak_ordering __v) noexcept {
- return 0 != __v.__value_;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator< (_CmpUnspecifiedParam, weak_ordering __v) noexcept {
- return 0 < __v.__value_;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator<=(_CmpUnspecifiedParam, weak_ordering __v) noexcept {
- return 0 <= __v.__value_;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator> (_CmpUnspecifiedParam, weak_ordering __v) noexcept {
- return 0 > __v.__value_;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator>=(_CmpUnspecifiedParam, weak_ordering __v) noexcept {
- return 0 >= __v.__value_;
-}
-
-#ifndef _LIBCPP_HAS_NO_SPACESHIP_OPERATOR
-_LIBCPP_INLINE_VISIBILITY
-constexpr weak_ordering operator<=>(weak_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr weak_ordering operator<=>(_CmpUnspecifiedParam, weak_ordering __v) noexcept {
- return __v < 0 ? weak_ordering::greater : (__v > 0 ? weak_ordering::less : __v);
-}
-#endif // _LIBCPP_HAS_NO_SPACESHIP_OPERATOR
-
-class strong_ordering {
- using _ValueT = signed char;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit constexpr strong_ordering(_EqResult __v) noexcept : __value_(_ValueT(__v)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit constexpr strong_ordering(_OrdResult __v) noexcept : __value_(_ValueT(__v)) {}
-
-public:
- static const strong_ordering less;
- static const strong_ordering equal;
- static const strong_ordering equivalent;
- static const strong_ordering greater;
-
- // conversions
- _LIBCPP_INLINE_VISIBILITY
- constexpr operator weak_equality() const noexcept {
- return __value_ == 0 ? weak_equality::equivalent
- : weak_equality::nonequivalent;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr operator strong_equality() const noexcept {
- return __value_ == 0 ? strong_equality::equal
- : strong_equality::nonequal;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr operator partial_ordering() const noexcept {
- return __value_ == 0 ? partial_ordering::equivalent
- : (__value_ < 0 ? partial_ordering::less : partial_ordering::greater);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr operator weak_ordering() const noexcept {
- return __value_ == 0 ? weak_ordering::equivalent
- : (__value_ < 0 ? weak_ordering::less : weak_ordering::greater);
- }
-
- // comparisons
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(strong_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator!=(strong_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator< (strong_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator<=(strong_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator> (strong_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator>=(strong_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(_CmpUnspecifiedParam, strong_ordering __v) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator!=(_CmpUnspecifiedParam, strong_ordering __v) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator< (_CmpUnspecifiedParam, strong_ordering __v) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator<=(_CmpUnspecifiedParam, strong_ordering __v) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator> (_CmpUnspecifiedParam, strong_ordering __v) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator>=(_CmpUnspecifiedParam, strong_ordering __v) noexcept;
-
-#ifndef _LIBCPP_HAS_NO_SPACESHIP_OPERATOR
- _LIBCPP_INLINE_VISIBILITY friend constexpr strong_ordering operator<=>(strong_ordering __v, _CmpUnspecifiedParam) noexcept;
- _LIBCPP_INLINE_VISIBILITY friend constexpr strong_ordering operator<=>(_CmpUnspecifiedParam, strong_ordering __v) noexcept;
-#endif
-
-private:
- _ValueT __value_;
-};
-
-_LIBCPP_INLINE_VAR constexpr strong_ordering strong_ordering::less(_OrdResult::__less);
-_LIBCPP_INLINE_VAR constexpr strong_ordering strong_ordering::equal(_EqResult::__equal);
-_LIBCPP_INLINE_VAR constexpr strong_ordering strong_ordering::equivalent(_EqResult::__equiv);
-_LIBCPP_INLINE_VAR constexpr strong_ordering strong_ordering::greater(_OrdResult::__greater);
-
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator==(strong_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v.__value_ == 0;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator!=(strong_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v.__value_ != 0;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator< (strong_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v.__value_ < 0;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator<=(strong_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v.__value_ <= 0;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator> (strong_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v.__value_ > 0;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator>=(strong_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v.__value_ >= 0;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator==(_CmpUnspecifiedParam, strong_ordering __v) noexcept {
- return 0 == __v.__value_;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator!=(_CmpUnspecifiedParam, strong_ordering __v) noexcept {
- return 0 != __v.__value_;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator< (_CmpUnspecifiedParam, strong_ordering __v) noexcept {
- return 0 < __v.__value_;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator<=(_CmpUnspecifiedParam, strong_ordering __v) noexcept {
- return 0 <= __v.__value_;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator> (_CmpUnspecifiedParam, strong_ordering __v) noexcept {
- return 0 > __v.__value_;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool operator>=(_CmpUnspecifiedParam, strong_ordering __v) noexcept {
- return 0 >= __v.__value_;
-}
-
-#ifndef _LIBCPP_HAS_NO_SPACESHIP_OPERATOR
-_LIBCPP_INLINE_VISIBILITY
-constexpr strong_ordering operator<=>(strong_ordering __v, _CmpUnspecifiedParam) noexcept {
- return __v;
-}
-_LIBCPP_INLINE_VISIBILITY
-constexpr strong_ordering operator<=>(_CmpUnspecifiedParam, strong_ordering __v) noexcept {
- return __v < 0 ? strong_ordering::greater : (__v > 0 ? strong_ordering::less : __v);
-}
-#endif // _LIBCPP_HAS_NO_SPACESHIP_OPERATOR
-
-// named comparison functions
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool is_eq(weak_equality __cmp) noexcept { return __cmp == 0; }
-
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool is_neq(weak_equality __cmp) noexcept { return __cmp != 0; }
-
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool is_lt(partial_ordering __cmp) noexcept { return __cmp < 0; }
-
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool is_lteq(partial_ordering __cmp) noexcept { return __cmp <= 0; }
-
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool is_gt(partial_ordering __cmp) noexcept { return __cmp > 0; }
-
-_LIBCPP_INLINE_VISIBILITY
-constexpr bool is_gteq(partial_ordering __cmp) noexcept { return __cmp >= 0; }
-
-namespace __comp_detail {
-
-enum _ClassifyCompCategory : unsigned{
- _None,
- _WeakEq,
- _StrongEq,
- _PartialOrd,
- _WeakOrd,
- _StrongOrd,
- _CCC_Size
-};
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY
-constexpr _ClassifyCompCategory __type_to_enum() noexcept {
- if (is_same_v<_Tp, weak_equality>)
- return _WeakEq;
- if (is_same_v<_Tp, strong_equality>)
- return _StrongEq;
- if (is_same_v<_Tp, partial_ordering>)
- return _PartialOrd;
- if (is_same_v<_Tp, weak_ordering>)
- return _WeakOrd;
- if (is_same_v<_Tp, strong_ordering>)
- return _StrongOrd;
- return _None;
-}
-
-template <size_t _Size>
-constexpr _ClassifyCompCategory
-__compute_comp_type(std::array<_ClassifyCompCategory, _Size> __types) {
- std::array<int, _CCC_Size> __seen = {};
- for (auto __type : __types)
- ++__seen[__type];
- if (__seen[_None])
- return _None;
- if (__seen[_WeakEq])
- return _WeakEq;
- if (__seen[_StrongEq] && (__seen[_PartialOrd] || __seen[_WeakOrd]))
- return _WeakEq;
- if (__seen[_StrongEq])
- return _StrongEq;
- if (__seen[_PartialOrd])
- return _PartialOrd;
- if (__seen[_WeakOrd])
- return _WeakOrd;
- return _StrongOrd;
-}
-
-template <class ..._Ts>
-constexpr auto __get_comp_type() {
- using _CCC = _ClassifyCompCategory;
- constexpr array<_CCC, sizeof...(_Ts)> __type_kinds{{__comp_detail::__type_to_enum<_Ts>()...}};
- constexpr _CCC _Cat = sizeof...(_Ts) == 0 ? _StrongOrd
- : __compute_comp_type(__type_kinds);
- if constexpr (_Cat == _None)
- return void();
- else if constexpr (_Cat == _WeakEq)
- return weak_equality::equivalent;
- else if constexpr (_Cat == _StrongEq)
- return strong_equality::equivalent;
- else if constexpr (_Cat == _PartialOrd)
- return partial_ordering::equivalent;
- else if constexpr (_Cat == _WeakOrd)
- return weak_ordering::equivalent;
- else if constexpr (_Cat == _StrongOrd)
- return strong_ordering::equivalent;
- else
- static_assert(_Cat != _Cat, "unhandled case");
-}
-} // namespace __comp_detail
-
-// [cmp.common], common comparison category type
-template<class... _Ts>
-struct _LIBCPP_TEMPLATE_VIS common_comparison_category {
- using type = decltype(__comp_detail::__get_comp_type<_Ts...>());
-};
-
-template<class... _Ts>
-using common_comparison_category_t = typename common_comparison_category<_Ts...>::type;
-
-// [cmp.alg], comparison algorithms
-// TODO: unimplemented
-template<class _Tp> constexpr strong_ordering strong_order(const _Tp& __lhs, const _Tp& __rhs);
-template<class _Tp> constexpr weak_ordering weak_order(const _Tp& __lhs, const _Tp& __rhs);
-template<class _Tp> constexpr partial_ordering partial_order(const _Tp& __lhs, const _Tp& __rhs);
-template<class _Tp> constexpr strong_equality strong_equal(const _Tp& __lhs, const _Tp& __rhs);
-template<class _Tp> constexpr weak_equality weak_equal(const _Tp& __lhs, const _Tp& __rhs);
-
-#endif // _LIBCPP_STD_VER > 17
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_COMPARE
diff --git a/lib/libcxx/include/complex b/lib/libcxx/include/complex
deleted file mode 100644
index 8cf6a946d71..00000000000
--- a/lib/libcxx/include/complex
+++ /dev/null
@@ -1,1496 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- complex ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_COMPLEX
-#define _LIBCPP_COMPLEX
-
-/*
- complex synopsis
-
-namespace std
-{
-
-template<class T>
-class complex
-{
-public:
- typedef T value_type;
-
- complex(const T& re = T(), const T& im = T()); // constexpr in C++14
- complex(const complex&); // constexpr in C++14
- template<class X> complex(const complex<X>&); // constexpr in C++14
-
- T real() const; // constexpr in C++14
- T imag() const; // constexpr in C++14
-
- void real(T);
- void imag(T);
-
- complex<T>& operator= (const T&);
- complex<T>& operator+=(const T&);
- complex<T>& operator-=(const T&);
- complex<T>& operator*=(const T&);
- complex<T>& operator/=(const T&);
-
- complex& operator=(const complex&);
- template<class X> complex<T>& operator= (const complex<X>&);
- template<class X> complex<T>& operator+=(const complex<X>&);
- template<class X> complex<T>& operator-=(const complex<X>&);
- template<class X> complex<T>& operator*=(const complex<X>&);
- template<class X> complex<T>& operator/=(const complex<X>&);
-};
-
-template<>
-class complex<float>
-{
-public:
- typedef float value_type;
-
- constexpr complex(float re = 0.0f, float im = 0.0f);
- explicit constexpr complex(const complex<double>&);
- explicit constexpr complex(const complex<long double>&);
-
- constexpr float real() const;
- void real(float);
- constexpr float imag() const;
- void imag(float);
-
- complex<float>& operator= (float);
- complex<float>& operator+=(float);
- complex<float>& operator-=(float);
- complex<float>& operator*=(float);
- complex<float>& operator/=(float);
-
- complex<float>& operator=(const complex<float>&);
- template<class X> complex<float>& operator= (const complex<X>&);
- template<class X> complex<float>& operator+=(const complex<X>&);
- template<class X> complex<float>& operator-=(const complex<X>&);
- template<class X> complex<float>& operator*=(const complex<X>&);
- template<class X> complex<float>& operator/=(const complex<X>&);
-};
-
-template<>
-class complex<double>
-{
-public:
- typedef double value_type;
-
- constexpr complex(double re = 0.0, double im = 0.0);
- constexpr complex(const complex<float>&);
- explicit constexpr complex(const complex<long double>&);
-
- constexpr double real() const;
- void real(double);
- constexpr double imag() const;
- void imag(double);
-
- complex<double>& operator= (double);
- complex<double>& operator+=(double);
- complex<double>& operator-=(double);
- complex<double>& operator*=(double);
- complex<double>& operator/=(double);
- complex<double>& operator=(const complex<double>&);
-
- template<class X> complex<double>& operator= (const complex<X>&);
- template<class X> complex<double>& operator+=(const complex<X>&);
- template<class X> complex<double>& operator-=(const complex<X>&);
- template<class X> complex<double>& operator*=(const complex<X>&);
- template<class X> complex<double>& operator/=(const complex<X>&);
-};
-
-template<>
-class complex<long double>
-{
-public:
- typedef long double value_type;
-
- constexpr complex(long double re = 0.0L, long double im = 0.0L);
- constexpr complex(const complex<float>&);
- constexpr complex(const complex<double>&);
-
- constexpr long double real() const;
- void real(long double);
- constexpr long double imag() const;
- void imag(long double);
-
- complex<long double>& operator=(const complex<long double>&);
- complex<long double>& operator= (long double);
- complex<long double>& operator+=(long double);
- complex<long double>& operator-=(long double);
- complex<long double>& operator*=(long double);
- complex<long double>& operator/=(long double);
-
- template<class X> complex<long double>& operator= (const complex<X>&);
- template<class X> complex<long double>& operator+=(const complex<X>&);
- template<class X> complex<long double>& operator-=(const complex<X>&);
- template<class X> complex<long double>& operator*=(const complex<X>&);
- template<class X> complex<long double>& operator/=(const complex<X>&);
-};
-
-// 26.3.6 operators:
-template<class T> complex<T> operator+(const complex<T>&, const complex<T>&);
-template<class T> complex<T> operator+(const complex<T>&, const T&);
-template<class T> complex<T> operator+(const T&, const complex<T>&);
-template<class T> complex<T> operator-(const complex<T>&, const complex<T>&);
-template<class T> complex<T> operator-(const complex<T>&, const T&);
-template<class T> complex<T> operator-(const T&, const complex<T>&);
-template<class T> complex<T> operator*(const complex<T>&, const complex<T>&);
-template<class T> complex<T> operator*(const complex<T>&, const T&);
-template<class T> complex<T> operator*(const T&, const complex<T>&);
-template<class T> complex<T> operator/(const complex<T>&, const complex<T>&);
-template<class T> complex<T> operator/(const complex<T>&, const T&);
-template<class T> complex<T> operator/(const T&, const complex<T>&);
-template<class T> complex<T> operator+(const complex<T>&);
-template<class T> complex<T> operator-(const complex<T>&);
-template<class T> bool operator==(const complex<T>&, const complex<T>&); // constexpr in C++14
-template<class T> bool operator==(const complex<T>&, const T&); // constexpr in C++14
-template<class T> bool operator==(const T&, const complex<T>&); // constexpr in C++14
-template<class T> bool operator!=(const complex<T>&, const complex<T>&); // constexpr in C++14
-template<class T> bool operator!=(const complex<T>&, const T&); // constexpr in C++14
-template<class T> bool operator!=(const T&, const complex<T>&); // constexpr in C++14
-
-template<class T, class charT, class traits>
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>&, complex<T>&);
-template<class T, class charT, class traits>
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>&, const complex<T>&);
-
-// 26.3.7 values:
-
-template<class T> T real(const complex<T>&); // constexpr in C++14
- long double real(long double); // constexpr in C++14
- double real(double); // constexpr in C++14
-template<Integral T> double real(T); // constexpr in C++14
- float real(float); // constexpr in C++14
-
-template<class T> T imag(const complex<T>&); // constexpr in C++14
- long double imag(long double); // constexpr in C++14
- double imag(double); // constexpr in C++14
-template<Integral T> double imag(T); // constexpr in C++14
- float imag(float); // constexpr in C++14
-
-template<class T> T abs(const complex<T>&);
-
-template<class T> T arg(const complex<T>&);
- long double arg(long double);
- double arg(double);
-template<Integral T> double arg(T);
- float arg(float);
-
-template<class T> T norm(const complex<T>&);
- long double norm(long double);
- double norm(double);
-template<Integral T> double norm(T);
- float norm(float);
-
-template<class T> complex<T> conj(const complex<T>&);
- complex<long double> conj(long double);
- complex<double> conj(double);
-template<Integral T> complex<double> conj(T);
- complex<float> conj(float);
-
-template<class T> complex<T> proj(const complex<T>&);
- complex<long double> proj(long double);
- complex<double> proj(double);
-template<Integral T> complex<double> proj(T);
- complex<float> proj(float);
-
-template<class T> complex<T> polar(const T&, const T& = T());
-
-// 26.3.8 transcendentals:
-template<class T> complex<T> acos(const complex<T>&);
-template<class T> complex<T> asin(const complex<T>&);
-template<class T> complex<T> atan(const complex<T>&);
-template<class T> complex<T> acosh(const complex<T>&);
-template<class T> complex<T> asinh(const complex<T>&);
-template<class T> complex<T> atanh(const complex<T>&);
-template<class T> complex<T> cos (const complex<T>&);
-template<class T> complex<T> cosh (const complex<T>&);
-template<class T> complex<T> exp (const complex<T>&);
-template<class T> complex<T> log (const complex<T>&);
-template<class T> complex<T> log10(const complex<T>&);
-
-template<class T> complex<T> pow(const complex<T>&, const T&);
-template<class T> complex<T> pow(const complex<T>&, const complex<T>&);
-template<class T> complex<T> pow(const T&, const complex<T>&);
-
-template<class T> complex<T> sin (const complex<T>&);
-template<class T> complex<T> sinh (const complex<T>&);
-template<class T> complex<T> sqrt (const complex<T>&);
-template<class T> complex<T> tan (const complex<T>&);
-template<class T> complex<T> tanh (const complex<T>&);
-
-template<class T, class charT, class traits>
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is, complex<T>& x);
-
-template<class T, class charT, class traits>
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& o, const complex<T>& x);
-
-} // std
-
-*/
-
-#include <__config>
-#include <type_traits>
-#include <stdexcept>
-#include <cmath>
-#include <sstream>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template<class _Tp> class _LIBCPP_TEMPLATE_VIS complex;
-
-template<class _Tp> complex<_Tp> operator*(const complex<_Tp>& __z, const complex<_Tp>& __w);
-template<class _Tp> complex<_Tp> operator/(const complex<_Tp>& __x, const complex<_Tp>& __y);
-
-template<class _Tp>
-class _LIBCPP_TEMPLATE_VIS complex
-{
-public:
- typedef _Tp value_type;
-private:
- value_type __re_;
- value_type __im_;
-public:
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- complex(const value_type& __re = value_type(), const value_type& __im = value_type())
- : __re_(__re), __im_(__im) {}
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- complex(const complex<_Xp>& __c)
- : __re_(__c.real()), __im_(__c.imag()) {}
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type real() const {return __re_;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type imag() const {return __im_;}
-
- _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
- _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
-
- _LIBCPP_INLINE_VISIBILITY complex& operator= (const value_type& __re)
- {__re_ = __re; __im_ = value_type(); return *this;}
- _LIBCPP_INLINE_VISIBILITY complex& operator+=(const value_type& __re) {__re_ += __re; return *this;}
- _LIBCPP_INLINE_VISIBILITY complex& operator-=(const value_type& __re) {__re_ -= __re; return *this;}
- _LIBCPP_INLINE_VISIBILITY complex& operator*=(const value_type& __re) {__re_ *= __re; __im_ *= __re; return *this;}
- _LIBCPP_INLINE_VISIBILITY complex& operator/=(const value_type& __re) {__re_ /= __re; __im_ /= __re; return *this;}
-
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
- {
- __re_ = __c.real();
- __im_ = __c.imag();
- return *this;
- }
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
- {
- __re_ += __c.real();
- __im_ += __c.imag();
- return *this;
- }
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
- {
- __re_ -= __c.real();
- __im_ -= __c.imag();
- return *this;
- }
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
- {
- *this = *this * complex(__c.real(), __c.imag());
- return *this;
- }
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
- {
- *this = *this / complex(__c.real(), __c.imag());
- return *this;
- }
-};
-
-template<> class _LIBCPP_TEMPLATE_VIS complex<double>;
-template<> class _LIBCPP_TEMPLATE_VIS complex<long double>;
-
-template<>
-class _LIBCPP_TEMPLATE_VIS complex<float>
-{
- float __re_;
- float __im_;
-public:
- typedef float value_type;
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(float __re = 0.0f, float __im = 0.0f)
- : __re_(__re), __im_(__im) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit _LIBCPP_CONSTEXPR complex(const complex<double>& __c);
- _LIBCPP_INLINE_VISIBILITY
- explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c);
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float real() const {return __re_;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float imag() const {return __im_;}
-
- _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
- _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
-
- _LIBCPP_INLINE_VISIBILITY complex& operator= (float __re)
- {__re_ = __re; __im_ = value_type(); return *this;}
- _LIBCPP_INLINE_VISIBILITY complex& operator+=(float __re) {__re_ += __re; return *this;}
- _LIBCPP_INLINE_VISIBILITY complex& operator-=(float __re) {__re_ -= __re; return *this;}
- _LIBCPP_INLINE_VISIBILITY complex& operator*=(float __re) {__re_ *= __re; __im_ *= __re; return *this;}
- _LIBCPP_INLINE_VISIBILITY complex& operator/=(float __re) {__re_ /= __re; __im_ /= __re; return *this;}
-
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
- {
- __re_ = __c.real();
- __im_ = __c.imag();
- return *this;
- }
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
- {
- __re_ += __c.real();
- __im_ += __c.imag();
- return *this;
- }
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
- {
- __re_ -= __c.real();
- __im_ -= __c.imag();
- return *this;
- }
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
- {
- *this = *this * complex(__c.real(), __c.imag());
- return *this;
- }
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
- {
- *this = *this / complex(__c.real(), __c.imag());
- return *this;
- }
-};
-
-template<>
-class _LIBCPP_TEMPLATE_VIS complex<double>
-{
- double __re_;
- double __im_;
-public:
- typedef double value_type;
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(double __re = 0.0, double __im = 0.0)
- : __re_(__re), __im_(__im) {}
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR complex(const complex<float>& __c);
- _LIBCPP_INLINE_VISIBILITY
- explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c);
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double real() const {return __re_;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double imag() const {return __im_;}
-
- _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
- _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
-
- _LIBCPP_INLINE_VISIBILITY complex& operator= (double __re)
- {__re_ = __re; __im_ = value_type(); return *this;}
- _LIBCPP_INLINE_VISIBILITY complex& operator+=(double __re) {__re_ += __re; return *this;}
- _LIBCPP_INLINE_VISIBILITY complex& operator-=(double __re) {__re_ -= __re; return *this;}
- _LIBCPP_INLINE_VISIBILITY complex& operator*=(double __re) {__re_ *= __re; __im_ *= __re; return *this;}
- _LIBCPP_INLINE_VISIBILITY complex& operator/=(double __re) {__re_ /= __re; __im_ /= __re; return *this;}
-
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
- {
- __re_ = __c.real();
- __im_ = __c.imag();
- return *this;
- }
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
- {
- __re_ += __c.real();
- __im_ += __c.imag();
- return *this;
- }
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
- {
- __re_ -= __c.real();
- __im_ -= __c.imag();
- return *this;
- }
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
- {
- *this = *this * complex(__c.real(), __c.imag());
- return *this;
- }
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
- {
- *this = *this / complex(__c.real(), __c.imag());
- return *this;
- }
-};
-
-template<>
-class _LIBCPP_TEMPLATE_VIS complex<long double>
-{
- long double __re_;
- long double __im_;
-public:
- typedef long double value_type;
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(long double __re = 0.0L, long double __im = 0.0L)
- : __re_(__re), __im_(__im) {}
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR complex(const complex<float>& __c);
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR complex(const complex<double>& __c);
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double real() const {return __re_;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double imag() const {return __im_;}
-
- _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
- _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
-
- _LIBCPP_INLINE_VISIBILITY complex& operator= (long double __re)
- {__re_ = __re; __im_ = value_type(); return *this;}
- _LIBCPP_INLINE_VISIBILITY complex& operator+=(long double __re) {__re_ += __re; return *this;}
- _LIBCPP_INLINE_VISIBILITY complex& operator-=(long double __re) {__re_ -= __re; return *this;}
- _LIBCPP_INLINE_VISIBILITY complex& operator*=(long double __re) {__re_ *= __re; __im_ *= __re; return *this;}
- _LIBCPP_INLINE_VISIBILITY complex& operator/=(long double __re) {__re_ /= __re; __im_ /= __re; return *this;}
-
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
- {
- __re_ = __c.real();
- __im_ = __c.imag();
- return *this;
- }
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
- {
- __re_ += __c.real();
- __im_ += __c.imag();
- return *this;
- }
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
- {
- __re_ -= __c.real();
- __im_ -= __c.imag();
- return *this;
- }
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
- {
- *this = *this * complex(__c.real(), __c.imag());
- return *this;
- }
- template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
- {
- *this = *this / complex(__c.real(), __c.imag());
- return *this;
- }
-};
-
-inline
-_LIBCPP_CONSTEXPR
-complex<float>::complex(const complex<double>& __c)
- : __re_(__c.real()), __im_(__c.imag()) {}
-
-inline
-_LIBCPP_CONSTEXPR
-complex<float>::complex(const complex<long double>& __c)
- : __re_(__c.real()), __im_(__c.imag()) {}
-
-inline
-_LIBCPP_CONSTEXPR
-complex<double>::complex(const complex<float>& __c)
- : __re_(__c.real()), __im_(__c.imag()) {}
-
-inline
-_LIBCPP_CONSTEXPR
-complex<double>::complex(const complex<long double>& __c)
- : __re_(__c.real()), __im_(__c.imag()) {}
-
-inline
-_LIBCPP_CONSTEXPR
-complex<long double>::complex(const complex<float>& __c)
- : __re_(__c.real()), __im_(__c.imag()) {}
-
-inline
-_LIBCPP_CONSTEXPR
-complex<long double>::complex(const complex<double>& __c)
- : __re_(__c.real()), __im_(__c.imag()) {}
-
-// 26.3.6 operators:
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-operator+(const complex<_Tp>& __x, const complex<_Tp>& __y)
-{
- complex<_Tp> __t(__x);
- __t += __y;
- return __t;
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-operator+(const complex<_Tp>& __x, const _Tp& __y)
-{
- complex<_Tp> __t(__x);
- __t += __y;
- return __t;
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-operator+(const _Tp& __x, const complex<_Tp>& __y)
-{
- complex<_Tp> __t(__y);
- __t += __x;
- return __t;
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-operator-(const complex<_Tp>& __x, const complex<_Tp>& __y)
-{
- complex<_Tp> __t(__x);
- __t -= __y;
- return __t;
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-operator-(const complex<_Tp>& __x, const _Tp& __y)
-{
- complex<_Tp> __t(__x);
- __t -= __y;
- return __t;
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-operator-(const _Tp& __x, const complex<_Tp>& __y)
-{
- complex<_Tp> __t(-__y);
- __t += __x;
- return __t;
-}
-
-template<class _Tp>
-complex<_Tp>
-operator*(const complex<_Tp>& __z, const complex<_Tp>& __w)
-{
- _Tp __a = __z.real();
- _Tp __b = __z.imag();
- _Tp __c = __w.real();
- _Tp __d = __w.imag();
- _Tp __ac = __a * __c;
- _Tp __bd = __b * __d;
- _Tp __ad = __a * __d;
- _Tp __bc = __b * __c;
- _Tp __x = __ac - __bd;
- _Tp __y = __ad + __bc;
- if (__libcpp_isnan_or_builtin(__x) && __libcpp_isnan_or_builtin(__y))
- {
- bool __recalc = false;
- if (__libcpp_isinf_or_builtin(__a) || __libcpp_isinf_or_builtin(__b))
- {
- __a = copysign(__libcpp_isinf_or_builtin(__a) ? _Tp(1) : _Tp(0), __a);
- __b = copysign(__libcpp_isinf_or_builtin(__b) ? _Tp(1) : _Tp(0), __b);
- if (__libcpp_isnan_or_builtin(__c))
- __c = copysign(_Tp(0), __c);
- if (__libcpp_isnan_or_builtin(__d))
- __d = copysign(_Tp(0), __d);
- __recalc = true;
- }
- if (__libcpp_isinf_or_builtin(__c) || __libcpp_isinf_or_builtin(__d))
- {
- __c = copysign(__libcpp_isinf_or_builtin(__c) ? _Tp(1) : _Tp(0), __c);
- __d = copysign(__libcpp_isinf_or_builtin(__d) ? _Tp(1) : _Tp(0), __d);
- if (__libcpp_isnan_or_builtin(__a))
- __a = copysign(_Tp(0), __a);
- if (__libcpp_isnan_or_builtin(__b))
- __b = copysign(_Tp(0), __b);
- __recalc = true;
- }
- if (!__recalc && (__libcpp_isinf_or_builtin(__ac) || __libcpp_isinf_or_builtin(__bd) ||
- __libcpp_isinf_or_builtin(__ad) || __libcpp_isinf_or_builtin(__bc)))
- {
- if (__libcpp_isnan_or_builtin(__a))
- __a = copysign(_Tp(0), __a);
- if (__libcpp_isnan_or_builtin(__b))
- __b = copysign(_Tp(0), __b);
- if (__libcpp_isnan_or_builtin(__c))
- __c = copysign(_Tp(0), __c);
- if (__libcpp_isnan_or_builtin(__d))
- __d = copysign(_Tp(0), __d);
- __recalc = true;
- }
- if (__recalc)
- {
- __x = _Tp(INFINITY) * (__a * __c - __b * __d);
- __y = _Tp(INFINITY) * (__a * __d + __b * __c);
- }
- }
- return complex<_Tp>(__x, __y);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-operator*(const complex<_Tp>& __x, const _Tp& __y)
-{
- complex<_Tp> __t(__x);
- __t *= __y;
- return __t;
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-operator*(const _Tp& __x, const complex<_Tp>& __y)
-{
- complex<_Tp> __t(__y);
- __t *= __x;
- return __t;
-}
-
-template<class _Tp>
-complex<_Tp>
-operator/(const complex<_Tp>& __z, const complex<_Tp>& __w)
-{
- int __ilogbw = 0;
- _Tp __a = __z.real();
- _Tp __b = __z.imag();
- _Tp __c = __w.real();
- _Tp __d = __w.imag();
- _Tp __logbw = logb(fmax(fabs(__c), fabs(__d)));
- if (__libcpp_isfinite_or_builtin(__logbw))
- {
- __ilogbw = static_cast<int>(__logbw);
- __c = scalbn(__c, -__ilogbw);
- __d = scalbn(__d, -__ilogbw);
- }
- _Tp __denom = __c * __c + __d * __d;
- _Tp __x = scalbn((__a * __c + __b * __d) / __denom, -__ilogbw);
- _Tp __y = scalbn((__b * __c - __a * __d) / __denom, -__ilogbw);
- if (__libcpp_isnan_or_builtin(__x) && __libcpp_isnan_or_builtin(__y))
- {
- if ((__denom == _Tp(0)) && (!__libcpp_isnan_or_builtin(__a) || !__libcpp_isnan_or_builtin(__b)))
- {
- __x = copysign(_Tp(INFINITY), __c) * __a;
- __y = copysign(_Tp(INFINITY), __c) * __b;
- }
- else if ((__libcpp_isinf_or_builtin(__a) || __libcpp_isinf_or_builtin(__b)) && __libcpp_isfinite_or_builtin(__c) && __libcpp_isfinite_or_builtin(__d))
- {
- __a = copysign(__libcpp_isinf_or_builtin(__a) ? _Tp(1) : _Tp(0), __a);
- __b = copysign(__libcpp_isinf_or_builtin(__b) ? _Tp(1) : _Tp(0), __b);
- __x = _Tp(INFINITY) * (__a * __c + __b * __d);
- __y = _Tp(INFINITY) * (__b * __c - __a * __d);
- }
- else if (__libcpp_isinf_or_builtin(__logbw) && __logbw > _Tp(0) && __libcpp_isfinite_or_builtin(__a) && __libcpp_isfinite_or_builtin(__b))
- {
- __c = copysign(__libcpp_isinf_or_builtin(__c) ? _Tp(1) : _Tp(0), __c);
- __d = copysign(__libcpp_isinf_or_builtin(__d) ? _Tp(1) : _Tp(0), __d);
- __x = _Tp(0) * (__a * __c + __b * __d);
- __y = _Tp(0) * (__b * __c - __a * __d);
- }
- }
- return complex<_Tp>(__x, __y);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-operator/(const complex<_Tp>& __x, const _Tp& __y)
-{
- return complex<_Tp>(__x.real() / __y, __x.imag() / __y);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-operator/(const _Tp& __x, const complex<_Tp>& __y)
-{
- complex<_Tp> __t(__x);
- __t /= __y;
- return __t;
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-operator+(const complex<_Tp>& __x)
-{
- return __x;
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-operator-(const complex<_Tp>& __x)
-{
- return complex<_Tp>(-__x.real(), -__x.imag());
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator==(const complex<_Tp>& __x, const complex<_Tp>& __y)
-{
- return __x.real() == __y.real() && __x.imag() == __y.imag();
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator==(const complex<_Tp>& __x, const _Tp& __y)
-{
- return __x.real() == __y && __x.imag() == 0;
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator==(const _Tp& __x, const complex<_Tp>& __y)
-{
- return __x == __y.real() && 0 == __y.imag();
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator!=(const complex<_Tp>& __x, const complex<_Tp>& __y)
-{
- return !(__x == __y);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator!=(const complex<_Tp>& __x, const _Tp& __y)
-{
- return !(__x == __y);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator!=(const _Tp& __x, const complex<_Tp>& __y)
-{
- return !(__x == __y);
-}
-
-// 26.3.7 values:
-
-template <class _Tp, bool = is_integral<_Tp>::value,
- bool = is_floating_point<_Tp>::value
- >
-struct __libcpp_complex_overload_traits {};
-
-// Integral Types
-template <class _Tp>
-struct __libcpp_complex_overload_traits<_Tp, true, false>
-{
- typedef double _ValueType;
- typedef complex<double> _ComplexType;
-};
-
-// Floating point types
-template <class _Tp>
-struct __libcpp_complex_overload_traits<_Tp, false, true>
-{
- typedef _Tp _ValueType;
- typedef complex<_Tp> _ComplexType;
-};
-
-// real
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-_Tp
-real(const complex<_Tp>& __c)
-{
- return __c.real();
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-typename __libcpp_complex_overload_traits<_Tp>::_ValueType
-real(_Tp __re)
-{
- return __re;
-}
-
-// imag
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-_Tp
-imag(const complex<_Tp>& __c)
-{
- return __c.imag();
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-typename __libcpp_complex_overload_traits<_Tp>::_ValueType
-imag(_Tp)
-{
- return 0;
-}
-
-// abs
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-abs(const complex<_Tp>& __c)
-{
- return hypot(__c.real(), __c.imag());
-}
-
-// arg
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-arg(const complex<_Tp>& __c)
-{
- return atan2(__c.imag(), __c.real());
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if<
- is_same<_Tp, long double>::value,
- long double
->::type
-arg(_Tp __re)
-{
- return atan2l(0.L, __re);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value || is_same<_Tp, double>::value,
- double
->::type
-arg(_Tp __re)
-{
- return atan2(0., __re);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if<
- is_same<_Tp, float>::value,
- float
->::type
-arg(_Tp __re)
-{
- return atan2f(0.F, __re);
-}
-
-// norm
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-norm(const complex<_Tp>& __c)
-{
- if (__libcpp_isinf_or_builtin(__c.real()))
- return abs(__c.real());
- if (__libcpp_isinf_or_builtin(__c.imag()))
- return abs(__c.imag());
- return __c.real() * __c.real() + __c.imag() * __c.imag();
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __libcpp_complex_overload_traits<_Tp>::_ValueType
-norm(_Tp __re)
-{
- typedef typename __libcpp_complex_overload_traits<_Tp>::_ValueType _ValueType;
- return static_cast<_ValueType>(__re) * __re;
-}
-
-// conj
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-conj(const complex<_Tp>& __c)
-{
- return complex<_Tp>(__c.real(), -__c.imag());
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __libcpp_complex_overload_traits<_Tp>::_ComplexType
-conj(_Tp __re)
-{
- typedef typename __libcpp_complex_overload_traits<_Tp>::_ComplexType _ComplexType;
- return _ComplexType(__re);
-}
-
-
-
-// proj
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-proj(const complex<_Tp>& __c)
-{
- std::complex<_Tp> __r = __c;
- if (__libcpp_isinf_or_builtin(__c.real()) || __libcpp_isinf_or_builtin(__c.imag()))
- __r = complex<_Tp>(INFINITY, copysign(_Tp(0), __c.imag()));
- return __r;
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_floating_point<_Tp>::value,
- typename __libcpp_complex_overload_traits<_Tp>::_ComplexType
->::type
-proj(_Tp __re)
-{
- if (__libcpp_isinf_or_builtin(__re))
- __re = abs(__re);
- return complex<_Tp>(__re);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_integral<_Tp>::value,
- typename __libcpp_complex_overload_traits<_Tp>::_ComplexType
->::type
-proj(_Tp __re)
-{
- typedef typename __libcpp_complex_overload_traits<_Tp>::_ComplexType _ComplexType;
- return _ComplexType(__re);
-}
-
-// polar
-
-template<class _Tp>
-complex<_Tp>
-polar(const _Tp& __rho, const _Tp& __theta = _Tp())
-{
- if (__libcpp_isnan_or_builtin(__rho) || signbit(__rho))
- return complex<_Tp>(_Tp(NAN), _Tp(NAN));
- if (__libcpp_isnan_or_builtin(__theta))
- {
- if (__libcpp_isinf_or_builtin(__rho))
- return complex<_Tp>(__rho, __theta);
- return complex<_Tp>(__theta, __theta);
- }
- if (__libcpp_isinf_or_builtin(__theta))
- {
- if (__libcpp_isinf_or_builtin(__rho))
- return complex<_Tp>(__rho, _Tp(NAN));
- return complex<_Tp>(_Tp(NAN), _Tp(NAN));
- }
- _Tp __x = __rho * cos(__theta);
- if (__libcpp_isnan_or_builtin(__x))
- __x = 0;
- _Tp __y = __rho * sin(__theta);
- if (__libcpp_isnan_or_builtin(__y))
- __y = 0;
- return complex<_Tp>(__x, __y);
-}
-
-// log
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-log(const complex<_Tp>& __x)
-{
- return complex<_Tp>(log(abs(__x)), arg(__x));
-}
-
-// log10
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-log10(const complex<_Tp>& __x)
-{
- return log(__x) / log(_Tp(10));
-}
-
-// sqrt
-
-template<class _Tp>
-complex<_Tp>
-sqrt(const complex<_Tp>& __x)
-{
- if (__libcpp_isinf_or_builtin(__x.imag()))
- return complex<_Tp>(_Tp(INFINITY), __x.imag());
- if (__libcpp_isinf_or_builtin(__x.real()))
- {
- if (__x.real() > _Tp(0))
- return complex<_Tp>(__x.real(), __libcpp_isnan_or_builtin(__x.imag()) ? __x.imag() : copysign(_Tp(0), __x.imag()));
- return complex<_Tp>(__libcpp_isnan_or_builtin(__x.imag()) ? __x.imag() : _Tp(0), copysign(__x.real(), __x.imag()));
- }
- return polar(sqrt(abs(__x)), arg(__x) / _Tp(2));
-}
-
-// exp
-
-template<class _Tp>
-complex<_Tp>
-exp(const complex<_Tp>& __x)
-{
- _Tp __i = __x.imag();
- if (__libcpp_isinf_or_builtin(__x.real()))
- {
- if (__x.real() < _Tp(0))
- {
- if (!__libcpp_isfinite_or_builtin(__i))
- __i = _Tp(1);
- }
- else if (__i == 0 || !__libcpp_isfinite_or_builtin(__i))
- {
- if (__libcpp_isinf_or_builtin(__i))
- __i = _Tp(NAN);
- return complex<_Tp>(__x.real(), __i);
- }
- }
- else if (__libcpp_isnan_or_builtin(__x.real()) && __x.imag() == 0)
- return __x;
- _Tp __e = exp(__x.real());
- return complex<_Tp>(__e * cos(__i), __e * sin(__i));
-}
-
-// pow
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-pow(const complex<_Tp>& __x, const complex<_Tp>& __y)
-{
- return exp(__y * log(__x));
-}
-
-template<class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<typename __promote<_Tp, _Up>::type>
-pow(const complex<_Tp>& __x, const complex<_Up>& __y)
-{
- typedef complex<typename __promote<_Tp, _Up>::type> result_type;
- return _VSTD::pow(result_type(__x), result_type(__y));
-}
-
-template<class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_arithmetic<_Up>::value,
- complex<typename __promote<_Tp, _Up>::type>
->::type
-pow(const complex<_Tp>& __x, const _Up& __y)
-{
- typedef complex<typename __promote<_Tp, _Up>::type> result_type;
- return _VSTD::pow(result_type(__x), result_type(__y));
-}
-
-template<class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_arithmetic<_Tp>::value,
- complex<typename __promote<_Tp, _Up>::type>
->::type
-pow(const _Tp& __x, const complex<_Up>& __y)
-{
- typedef complex<typename __promote<_Tp, _Up>::type> result_type;
- return _VSTD::pow(result_type(__x), result_type(__y));
-}
-
-// __sqr, computes pow(x, 2)
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-__sqr(const complex<_Tp>& __x)
-{
- return complex<_Tp>((__x.real() - __x.imag()) * (__x.real() + __x.imag()),
- _Tp(2) * __x.real() * __x.imag());
-}
-
-// asinh
-
-template<class _Tp>
-complex<_Tp>
-asinh(const complex<_Tp>& __x)
-{
- const _Tp __pi(atan2(+0., -0.));
- if (__libcpp_isinf_or_builtin(__x.real()))
- {
- if (__libcpp_isnan_or_builtin(__x.imag()))
- return __x;
- if (__libcpp_isinf_or_builtin(__x.imag()))
- return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag()));
- return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag()));
- }
- if (__libcpp_isnan_or_builtin(__x.real()))
- {
- if (__libcpp_isinf_or_builtin(__x.imag()))
- return complex<_Tp>(__x.imag(), __x.real());
- if (__x.imag() == 0)
- return __x;
- return complex<_Tp>(__x.real(), __x.real());
- }
- if (__libcpp_isinf_or_builtin(__x.imag()))
- return complex<_Tp>(copysign(__x.imag(), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
- complex<_Tp> __z = log(__x + sqrt(__sqr(__x) + _Tp(1)));
- return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag()));
-}
-
-// acosh
-
-template<class _Tp>
-complex<_Tp>
-acosh(const complex<_Tp>& __x)
-{
- const _Tp __pi(atan2(+0., -0.));
- if (__libcpp_isinf_or_builtin(__x.real()))
- {
- if (__libcpp_isnan_or_builtin(__x.imag()))
- return complex<_Tp>(abs(__x.real()), __x.imag());
- if (__libcpp_isinf_or_builtin(__x.imag()))
- {
- if (__x.real() > 0)
- return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag()));
- else
- return complex<_Tp>(-__x.real(), copysign(__pi * _Tp(0.75), __x.imag()));
- }
- if (__x.real() < 0)
- return complex<_Tp>(-__x.real(), copysign(__pi, __x.imag()));
- return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag()));
- }
- if (__libcpp_isnan_or_builtin(__x.real()))
- {
- if (__libcpp_isinf_or_builtin(__x.imag()))
- return complex<_Tp>(abs(__x.imag()), __x.real());
- return complex<_Tp>(__x.real(), __x.real());
- }
- if (__libcpp_isinf_or_builtin(__x.imag()))
- return complex<_Tp>(abs(__x.imag()), copysign(__pi/_Tp(2), __x.imag()));
- complex<_Tp> __z = log(__x + sqrt(__sqr(__x) - _Tp(1)));
- return complex<_Tp>(copysign(__z.real(), _Tp(0)), copysign(__z.imag(), __x.imag()));
-}
-
-// atanh
-
-template<class _Tp>
-complex<_Tp>
-atanh(const complex<_Tp>& __x)
-{
- const _Tp __pi(atan2(+0., -0.));
- if (__libcpp_isinf_or_builtin(__x.imag()))
- {
- return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
- }
- if (__libcpp_isnan_or_builtin(__x.imag()))
- {
- if (__libcpp_isinf_or_builtin(__x.real()) || __x.real() == 0)
- return complex<_Tp>(copysign(_Tp(0), __x.real()), __x.imag());
- return complex<_Tp>(__x.imag(), __x.imag());
- }
- if (__libcpp_isnan_or_builtin(__x.real()))
- {
- return complex<_Tp>(__x.real(), __x.real());
- }
- if (__libcpp_isinf_or_builtin(__x.real()))
- {
- return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
- }
- if (abs(__x.real()) == _Tp(1) && __x.imag() == _Tp(0))
- {
- return complex<_Tp>(copysign(_Tp(INFINITY), __x.real()), copysign(_Tp(0), __x.imag()));
- }
- complex<_Tp> __z = log((_Tp(1) + __x) / (_Tp(1) - __x)) / _Tp(2);
- return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag()));
-}
-
-// sinh
-
-template<class _Tp>
-complex<_Tp>
-sinh(const complex<_Tp>& __x)
-{
- if (__libcpp_isinf_or_builtin(__x.real()) && !__libcpp_isfinite_or_builtin(__x.imag()))
- return complex<_Tp>(__x.real(), _Tp(NAN));
- if (__x.real() == 0 && !__libcpp_isfinite_or_builtin(__x.imag()))
- return complex<_Tp>(__x.real(), _Tp(NAN));
- if (__x.imag() == 0 && !__libcpp_isfinite_or_builtin(__x.real()))
- return __x;
- return complex<_Tp>(sinh(__x.real()) * cos(__x.imag()), cosh(__x.real()) * sin(__x.imag()));
-}
-
-// cosh
-
-template<class _Tp>
-complex<_Tp>
-cosh(const complex<_Tp>& __x)
-{
- if (__libcpp_isinf_or_builtin(__x.real()) && !__libcpp_isfinite_or_builtin(__x.imag()))
- return complex<_Tp>(abs(__x.real()), _Tp(NAN));
- if (__x.real() == 0 && !__libcpp_isfinite_or_builtin(__x.imag()))
- return complex<_Tp>(_Tp(NAN), __x.real());
- if (__x.real() == 0 && __x.imag() == 0)
- return complex<_Tp>(_Tp(1), __x.imag());
- if (__x.imag() == 0 && !__libcpp_isfinite_or_builtin(__x.real()))
- return complex<_Tp>(abs(__x.real()), __x.imag());
- return complex<_Tp>(cosh(__x.real()) * cos(__x.imag()), sinh(__x.real()) * sin(__x.imag()));
-}
-
-// tanh
-
-template<class _Tp>
-complex<_Tp>
-tanh(const complex<_Tp>& __x)
-{
- if (__libcpp_isinf_or_builtin(__x.real()))
- {
- if (!__libcpp_isfinite_or_builtin(__x.imag()))
- return complex<_Tp>(_Tp(1), _Tp(0));
- return complex<_Tp>(_Tp(1), copysign(_Tp(0), sin(_Tp(2) * __x.imag())));
- }
- if (__libcpp_isnan_or_builtin(__x.real()) && __x.imag() == 0)
- return __x;
- _Tp __2r(_Tp(2) * __x.real());
- _Tp __2i(_Tp(2) * __x.imag());
- _Tp __d(cosh(__2r) + cos(__2i));
- _Tp __2rsh(sinh(__2r));
- if (__libcpp_isinf_or_builtin(__2rsh) && __libcpp_isinf_or_builtin(__d))
- return complex<_Tp>(__2rsh > _Tp(0) ? _Tp(1) : _Tp(-1),
- __2i > _Tp(0) ? _Tp(0) : _Tp(-0.));
- return complex<_Tp>(__2rsh/__d, sin(__2i)/__d);
-}
-
-// asin
-
-template<class _Tp>
-complex<_Tp>
-asin(const complex<_Tp>& __x)
-{
- complex<_Tp> __z = asinh(complex<_Tp>(-__x.imag(), __x.real()));
- return complex<_Tp>(__z.imag(), -__z.real());
-}
-
-// acos
-
-template<class _Tp>
-complex<_Tp>
-acos(const complex<_Tp>& __x)
-{
- const _Tp __pi(atan2(+0., -0.));
- if (__libcpp_isinf_or_builtin(__x.real()))
- {
- if (__libcpp_isnan_or_builtin(__x.imag()))
- return complex<_Tp>(__x.imag(), __x.real());
- if (__libcpp_isinf_or_builtin(__x.imag()))
- {
- if (__x.real() < _Tp(0))
- return complex<_Tp>(_Tp(0.75) * __pi, -__x.imag());
- return complex<_Tp>(_Tp(0.25) * __pi, -__x.imag());
- }
- if (__x.real() < _Tp(0))
- return complex<_Tp>(__pi, signbit(__x.imag()) ? -__x.real() : __x.real());
- return complex<_Tp>(_Tp(0), signbit(__x.imag()) ? __x.real() : -__x.real());
- }
- if (__libcpp_isnan_or_builtin(__x.real()))
- {
- if (__libcpp_isinf_or_builtin(__x.imag()))
- return complex<_Tp>(__x.real(), -__x.imag());
- return complex<_Tp>(__x.real(), __x.real());
- }
- if (__libcpp_isinf_or_builtin(__x.imag()))
- return complex<_Tp>(__pi/_Tp(2), -__x.imag());
- if (__x.real() == 0 && (__x.imag() == 0 || isnan(__x.imag())))
- return complex<_Tp>(__pi/_Tp(2), -__x.imag());
- complex<_Tp> __z = log(__x + sqrt(__sqr(__x) - _Tp(1)));
- if (signbit(__x.imag()))
- return complex<_Tp>(abs(__z.imag()), abs(__z.real()));
- return complex<_Tp>(abs(__z.imag()), -abs(__z.real()));
-}
-
-// atan
-
-template<class _Tp>
-complex<_Tp>
-atan(const complex<_Tp>& __x)
-{
- complex<_Tp> __z = atanh(complex<_Tp>(-__x.imag(), __x.real()));
- return complex<_Tp>(__z.imag(), -__z.real());
-}
-
-// sin
-
-template<class _Tp>
-complex<_Tp>
-sin(const complex<_Tp>& __x)
-{
- complex<_Tp> __z = sinh(complex<_Tp>(-__x.imag(), __x.real()));
- return complex<_Tp>(__z.imag(), -__z.real());
-}
-
-// cos
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-complex<_Tp>
-cos(const complex<_Tp>& __x)
-{
- return cosh(complex<_Tp>(-__x.imag(), __x.real()));
-}
-
-// tan
-
-template<class _Tp>
-complex<_Tp>
-tan(const complex<_Tp>& __x)
-{
- complex<_Tp> __z = tanh(complex<_Tp>(-__x.imag(), __x.real()));
- return complex<_Tp>(__z.imag(), -__z.real());
-}
-
-template<class _Tp, class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x)
-{
- if (__is.good())
- {
- ws(__is);
- if (__is.peek() == _CharT('('))
- {
- __is.get();
- _Tp __r;
- __is >> __r;
- if (!__is.fail())
- {
- ws(__is);
- _CharT __c = __is.peek();
- if (__c == _CharT(','))
- {
- __is.get();
- _Tp __i;
- __is >> __i;
- if (!__is.fail())
- {
- ws(__is);
- __c = __is.peek();
- if (__c == _CharT(')'))
- {
- __is.get();
- __x = complex<_Tp>(__r, __i);
- }
- else
- __is.setstate(ios_base::failbit);
- }
- else
- __is.setstate(ios_base::failbit);
- }
- else if (__c == _CharT(')'))
- {
- __is.get();
- __x = complex<_Tp>(__r, _Tp(0));
- }
- else
- __is.setstate(ios_base::failbit);
- }
- else
- __is.setstate(ios_base::failbit);
- }
- else
- {
- _Tp __r;
- __is >> __r;
- if (!__is.fail())
- __x = complex<_Tp>(__r, _Tp(0));
- else
- __is.setstate(ios_base::failbit);
- }
- }
- else
- __is.setstate(ios_base::failbit);
- return __is;
-}
-
-template<class _Tp, class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x)
-{
- basic_ostringstream<_CharT, _Traits> __s;
- __s.flags(__os.flags());
- __s.imbue(__os.getloc());
- __s.precision(__os.precision());
- __s << '(' << __x.real() << ',' << __x.imag() << ')';
- return __os << __s.str();
-}
-
-#if _LIBCPP_STD_VER > 11
-// Literal suffix for complex number literals [complex.literals]
-inline namespace literals
-{
- inline namespace complex_literals
- {
- constexpr complex<long double> operator""il(long double __im)
- {
- return { 0.0l, __im };
- }
-
- constexpr complex<long double> operator""il(unsigned long long __im)
- {
- return { 0.0l, static_cast<long double>(__im) };
- }
-
-
- constexpr complex<double> operator""i(long double __im)
- {
- return { 0.0, static_cast<double>(__im) };
- }
-
- constexpr complex<double> operator""i(unsigned long long __im)
- {
- return { 0.0, static_cast<double>(__im) };
- }
-
-
- constexpr complex<float> operator""if(long double __im)
- {
- return { 0.0f, static_cast<float>(__im) };
- }
-
- constexpr complex<float> operator""if(unsigned long long __im)
- {
- return { 0.0f, static_cast<float>(__im) };
- }
- }
-}
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_COMPLEX
diff --git a/lib/libcxx/include/complex.h b/lib/libcxx/include/complex.h
deleted file mode 100644
index c2359665add..00000000000
--- a/lib/libcxx/include/complex.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- complex.h --------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_COMPLEX_H
-#define _LIBCPP_COMPLEX_H
-
-/*
- complex.h synopsis
-
-#include <ccomplex>
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#ifdef __cplusplus
-
-#include <ccomplex>
-
-#else // __cplusplus
-
-#include_next <complex.h>
-
-#endif // __cplusplus
-
-#endif // _LIBCPP_COMPLEX_H
diff --git a/lib/libcxx/include/condition_variable b/lib/libcxx/include/condition_variable
deleted file mode 100644
index c45a326d898..00000000000
--- a/lib/libcxx/include/condition_variable
+++ /dev/null
@@ -1,269 +0,0 @@
-// -*- C++ -*-
-//===---------------------- condition_variable ----------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CONDITION_VARIABLE
-#define _LIBCPP_CONDITION_VARIABLE
-
-/*
- condition_variable synopsis
-
-namespace std
-{
-
-enum class cv_status { no_timeout, timeout };
-
-class condition_variable
-{
-public:
- condition_variable();
- ~condition_variable();
-
- condition_variable(const condition_variable&) = delete;
- condition_variable& operator=(const condition_variable&) = delete;
-
- void notify_one() noexcept;
- void notify_all() noexcept;
-
- void wait(unique_lock<mutex>& lock);
- template <class Predicate>
- void wait(unique_lock<mutex>& lock, Predicate pred);
-
- template <class Clock, class Duration>
- cv_status
- wait_until(unique_lock<mutex>& lock,
- const chrono::time_point<Clock, Duration>& abs_time);
-
- template <class Clock, class Duration, class Predicate>
- bool
- wait_until(unique_lock<mutex>& lock,
- const chrono::time_point<Clock, Duration>& abs_time,
- Predicate pred);
-
- template <class Rep, class Period>
- cv_status
- wait_for(unique_lock<mutex>& lock,
- const chrono::duration<Rep, Period>& rel_time);
-
- template <class Rep, class Period, class Predicate>
- bool
- wait_for(unique_lock<mutex>& lock,
- const chrono::duration<Rep, Period>& rel_time,
- Predicate pred);
-
- typedef pthread_cond_t* native_handle_type;
- native_handle_type native_handle();
-};
-
-void notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk);
-
-class condition_variable_any
-{
-public:
- condition_variable_any();
- ~condition_variable_any();
-
- condition_variable_any(const condition_variable_any&) = delete;
- condition_variable_any& operator=(const condition_variable_any&) = delete;
-
- void notify_one() noexcept;
- void notify_all() noexcept;
-
- template <class Lock>
- void wait(Lock& lock);
- template <class Lock, class Predicate>
- void wait(Lock& lock, Predicate pred);
-
- template <class Lock, class Clock, class Duration>
- cv_status
- wait_until(Lock& lock,
- const chrono::time_point<Clock, Duration>& abs_time);
-
- template <class Lock, class Clock, class Duration, class Predicate>
- bool
- wait_until(Lock& lock,
- const chrono::time_point<Clock, Duration>& abs_time,
- Predicate pred);
-
- template <class Lock, class Rep, class Period>
- cv_status
- wait_for(Lock& lock,
- const chrono::duration<Rep, Period>& rel_time);
-
- template <class Lock, class Rep, class Period, class Predicate>
- bool
- wait_for(Lock& lock,
- const chrono::duration<Rep, Period>& rel_time,
- Predicate pred);
-};
-
-} // std
-
-*/
-
-#include <__config>
-#include <__mutex_base>
-#include <memory>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#ifndef _LIBCPP_HAS_NO_THREADS
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-class _LIBCPP_TYPE_VIS condition_variable_any
-{
- condition_variable __cv_;
- shared_ptr<mutex> __mut_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- condition_variable_any();
-
- _LIBCPP_INLINE_VISIBILITY
- void notify_one() _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- void notify_all() _NOEXCEPT;
-
- template <class _Lock>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- void wait(_Lock& __lock);
- template <class _Lock, class _Predicate>
- _LIBCPP_INLINE_VISIBILITY
- void wait(_Lock& __lock, _Predicate __pred);
-
- template <class _Lock, class _Clock, class _Duration>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- cv_status
- wait_until(_Lock& __lock,
- const chrono::time_point<_Clock, _Duration>& __t);
-
- template <class _Lock, class _Clock, class _Duration, class _Predicate>
- bool
- _LIBCPP_INLINE_VISIBILITY
- wait_until(_Lock& __lock,
- const chrono::time_point<_Clock, _Duration>& __t,
- _Predicate __pred);
-
- template <class _Lock, class _Rep, class _Period>
- cv_status
- _LIBCPP_INLINE_VISIBILITY
- wait_for(_Lock& __lock,
- const chrono::duration<_Rep, _Period>& __d);
-
- template <class _Lock, class _Rep, class _Period, class _Predicate>
- bool
- _LIBCPP_INLINE_VISIBILITY
- wait_for(_Lock& __lock,
- const chrono::duration<_Rep, _Period>& __d,
- _Predicate __pred);
-};
-
-inline
-condition_variable_any::condition_variable_any()
- : __mut_(make_shared<mutex>()) {}
-
-inline
-void
-condition_variable_any::notify_one() _NOEXCEPT
-{
- {lock_guard<mutex> __lx(*__mut_);}
- __cv_.notify_one();
-}
-
-inline
-void
-condition_variable_any::notify_all() _NOEXCEPT
-{
- {lock_guard<mutex> __lx(*__mut_);}
- __cv_.notify_all();
-}
-
-struct __lock_external
-{
- template <class _Lock>
- void operator()(_Lock* __m) {__m->lock();}
-};
-
-template <class _Lock>
-void
-condition_variable_any::wait(_Lock& __lock)
-{
- shared_ptr<mutex> __mut = __mut_;
- unique_lock<mutex> __lk(*__mut);
- __lock.unlock();
- unique_ptr<_Lock, __lock_external> __lxx(&__lock);
- lock_guard<unique_lock<mutex> > __lx(__lk, adopt_lock);
- __cv_.wait(__lk);
-} // __mut_.unlock(), __lock.lock()
-
-template <class _Lock, class _Predicate>
-inline
-void
-condition_variable_any::wait(_Lock& __lock, _Predicate __pred)
-{
- while (!__pred())
- wait(__lock);
-}
-
-template <class _Lock, class _Clock, class _Duration>
-cv_status
-condition_variable_any::wait_until(_Lock& __lock,
- const chrono::time_point<_Clock, _Duration>& __t)
-{
- shared_ptr<mutex> __mut = __mut_;
- unique_lock<mutex> __lk(*__mut);
- __lock.unlock();
- unique_ptr<_Lock, __lock_external> __lxx(&__lock);
- lock_guard<unique_lock<mutex> > __lx(__lk, adopt_lock);
- return __cv_.wait_until(__lk, __t);
-} // __mut_.unlock(), __lock.lock()
-
-template <class _Lock, class _Clock, class _Duration, class _Predicate>
-inline
-bool
-condition_variable_any::wait_until(_Lock& __lock,
- const chrono::time_point<_Clock, _Duration>& __t,
- _Predicate __pred)
-{
- while (!__pred())
- if (wait_until(__lock, __t) == cv_status::timeout)
- return __pred();
- return true;
-}
-
-template <class _Lock, class _Rep, class _Period>
-inline
-cv_status
-condition_variable_any::wait_for(_Lock& __lock,
- const chrono::duration<_Rep, _Period>& __d)
-{
- return wait_until(__lock, chrono::steady_clock::now() + __d);
-}
-
-template <class _Lock, class _Rep, class _Period, class _Predicate>
-inline
-bool
-condition_variable_any::wait_for(_Lock& __lock,
- const chrono::duration<_Rep, _Period>& __d,
- _Predicate __pred)
-{
- return wait_until(__lock, chrono::steady_clock::now() + __d,
- _VSTD::move(__pred));
-}
-
-_LIBCPP_FUNC_VIS
-void notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk);
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // !_LIBCPP_HAS_NO_THREADS
-
-#endif // _LIBCPP_CONDITION_VARIABLE
diff --git a/lib/libcxx/include/csetjmp b/lib/libcxx/include/csetjmp
deleted file mode 100644
index 58a9c73ab56..00000000000
--- a/lib/libcxx/include/csetjmp
+++ /dev/null
@@ -1,48 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- csetjmp ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CSETJMP
-#define _LIBCPP_CSETJMP
-
-/*
- csetjmp synopsis
-
-Macros:
-
- setjmp
-
-namespace std
-{
-
-Types:
-
- jmp_buf
-
-void longjmp(jmp_buf env, int val);
-
-} // std
-
-*/
-
-#include <__config>
-#include <setjmp.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-using ::jmp_buf;
-using ::longjmp;
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_CSETJMP
diff --git a/lib/libcxx/include/csignal b/lib/libcxx/include/csignal
deleted file mode 100644
index 97282661872..00000000000
--- a/lib/libcxx/include/csignal
+++ /dev/null
@@ -1,58 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- csignal ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CSIGNAL
-#define _LIBCPP_CSIGNAL
-
-/*
- csignal synopsis
-
-Macros:
-
- SIG_DFL
- SIG_ERR
- SIG_IGN
- SIGABRT
- SIGFPE
- SIGILL
- SIGINT
- SIGSEGV
- SIGTERM
-
-namespace std
-{
-
-Types:
-
- sig_atomic_t
-
-void (*signal(int sig, void (*func)(int)))(int);
-int raise(int sig);
-
-} // std
-
-*/
-
-#include <__config>
-#include <signal.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-using ::sig_atomic_t;
-using ::signal;
-using ::raise;
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_CSIGNAL
diff --git a/lib/libcxx/include/cstdarg b/lib/libcxx/include/cstdarg
deleted file mode 100644
index c8b6999242f..00000000000
--- a/lib/libcxx/include/cstdarg
+++ /dev/null
@@ -1,48 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- cstdarg ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CSTDARG
-#define _LIBCPP_CSTDARG
-
-/*
- cstdarg synopsis
-
-Macros:
-
- type va_arg(va_list ap, type);
- void va_copy(va_list dest, va_list src); // C99
- void va_end(va_list ap);
- void va_start(va_list ap, parmN);
-
-namespace std
-{
-
-Types:
-
- va_list
-
-} // std
-
-*/
-
-#include <__config>
-#include <stdarg.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-using ::va_list;
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_CSTDARG
diff --git a/lib/libcxx/include/cstdbool b/lib/libcxx/include/cstdbool
deleted file mode 100644
index 2c764a61f21..00000000000
--- a/lib/libcxx/include/cstdbool
+++ /dev/null
@@ -1,32 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- cstdbool ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CSTDBOOL
-#define _LIBCPP_CSTDBOOL
-
-/*
- cstdbool synopsis
-
-Macros:
-
- __bool_true_false_are_defined
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#undef __bool_true_false_are_defined
-#define __bool_true_false_are_defined 1
-
-#endif // _LIBCPP_CSTDBOOL
diff --git a/lib/libcxx/include/cstddef b/lib/libcxx/include/cstddef
deleted file mode 100644
index b4c42b19ddb..00000000000
--- a/lib/libcxx/include/cstddef
+++ /dev/null
@@ -1,114 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- cstddef ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CSTDDEF
-#define _LIBCPP_CSTDDEF
-
-/*
- cstddef synopsis
-
-Macros:
-
- offsetof(type,member-designator)
- NULL
-
-namespace std
-{
-
-Types:
-
- ptrdiff_t
- size_t
- max_align_t
- nullptr_t
- byte // C++17
-
-} // std
-
-*/
-
-#include <__config>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-// Don't include our own <stddef.h>; we don't want to declare ::nullptr_t.
-#include_next <stddef.h>
-#include <__nullptr>
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-using ::ptrdiff_t;
-using ::size_t;
-
-#if defined(__CLANG_MAX_ALIGN_T_DEFINED) || defined(_GCC_MAX_ALIGN_T) || \
- defined(__DEFINED_max_align_t) || defined(__NetBSD__)
-// Re-use the compiler's <stddef.h> max_align_t where possible.
-using ::max_align_t;
-#else
-typedef long double max_align_t;
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-#if _LIBCPP_STD_VER > 14
-namespace std // purposefully not versioned
-{
-enum class byte : unsigned char {};
-
-constexpr byte operator| (byte __lhs, byte __rhs) noexcept
-{
- return static_cast<byte>(
- static_cast<unsigned char>(
- static_cast<unsigned int>(__lhs) | static_cast<unsigned int>(__rhs)
- ));
-}
-
-constexpr byte& operator|=(byte& __lhs, byte __rhs) noexcept
-{ return __lhs = __lhs | __rhs; }
-
-constexpr byte operator& (byte __lhs, byte __rhs) noexcept
-{
- return static_cast<byte>(
- static_cast<unsigned char>(
- static_cast<unsigned int>(__lhs) & static_cast<unsigned int>(__rhs)
- ));
-}
-
-constexpr byte& operator&=(byte& __lhs, byte __rhs) noexcept
-{ return __lhs = __lhs & __rhs; }
-
-constexpr byte operator^ (byte __lhs, byte __rhs) noexcept
-{
- return static_cast<byte>(
- static_cast<unsigned char>(
- static_cast<unsigned int>(__lhs) ^ static_cast<unsigned int>(__rhs)
- ));
-}
-
-constexpr byte& operator^=(byte& __lhs, byte __rhs) noexcept
-{ return __lhs = __lhs ^ __rhs; }
-
-constexpr byte operator~ (byte __b) noexcept
-{
- return static_cast<byte>(
- static_cast<unsigned char>(
- ~static_cast<unsigned int>(__b)
- ));
-}
-
-}
-
-#include <type_traits> // rest of byte
-#endif
-
-#endif // _LIBCPP_CSTDDEF
diff --git a/lib/libcxx/include/cstdint b/lib/libcxx/include/cstdint
deleted file mode 100644
index 7a187d3ebf2..00000000000
--- a/lib/libcxx/include/cstdint
+++ /dev/null
@@ -1,191 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- cstdint ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CSTDINT
-#define _LIBCPP_CSTDINT
-
-/*
- cstdint synopsis
-
-Macros:
-
- INT8_MIN
- INT16_MIN
- INT32_MIN
- INT64_MIN
-
- INT8_MAX
- INT16_MAX
- INT32_MAX
- INT64_MAX
-
- UINT8_MAX
- UINT16_MAX
- UINT32_MAX
- UINT64_MAX
-
- INT_LEAST8_MIN
- INT_LEAST16_MIN
- INT_LEAST32_MIN
- INT_LEAST64_MIN
-
- INT_LEAST8_MAX
- INT_LEAST16_MAX
- INT_LEAST32_MAX
- INT_LEAST64_MAX
-
- UINT_LEAST8_MAX
- UINT_LEAST16_MAX
- UINT_LEAST32_MAX
- UINT_LEAST64_MAX
-
- INT_FAST8_MIN
- INT_FAST16_MIN
- INT_FAST32_MIN
- INT_FAST64_MIN
-
- INT_FAST8_MAX
- INT_FAST16_MAX
- INT_FAST32_MAX
- INT_FAST64_MAX
-
- UINT_FAST8_MAX
- UINT_FAST16_MAX
- UINT_FAST32_MAX
- UINT_FAST64_MAX
-
- INTPTR_MIN
- INTPTR_MAX
- UINTPTR_MAX
-
- INTMAX_MIN
- INTMAX_MAX
-
- UINTMAX_MAX
-
- PTRDIFF_MIN
- PTRDIFF_MAX
-
- SIG_ATOMIC_MIN
- SIG_ATOMIC_MAX
-
- SIZE_MAX
-
- WCHAR_MIN
- WCHAR_MAX
-
- WINT_MIN
- WINT_MAX
-
- INT8_C(value)
- INT16_C(value)
- INT32_C(value)
- INT64_C(value)
-
- UINT8_C(value)
- UINT16_C(value)
- UINT32_C(value)
- UINT64_C(value)
-
- INTMAX_C(value)
- UINTMAX_C(value)
-
-namespace std
-{
-
-Types:
-
- int8_t
- int16_t
- int32_t
- int64_t
-
- uint8_t
- uint16_t
- uint32_t
- uint64_t
-
- int_least8_t
- int_least16_t
- int_least32_t
- int_least64_t
-
- uint_least8_t
- uint_least16_t
- uint_least32_t
- uint_least64_t
-
- int_fast8_t
- int_fast16_t
- int_fast32_t
- int_fast64_t
-
- uint_fast8_t
- uint_fast16_t
- uint_fast32_t
- uint_fast64_t
-
- intptr_t
- uintptr_t
-
- intmax_t
- uintmax_t
-
-} // std
-*/
-
-#include <__config>
-#include <stdint.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-using::int8_t;
-using::int16_t;
-using::int32_t;
-using::int64_t;
-
-using::uint8_t;
-using::uint16_t;
-using::uint32_t;
-using::uint64_t;
-
-using::int_least8_t;
-using::int_least16_t;
-using::int_least32_t;
-using::int_least64_t;
-
-using::uint_least8_t;
-using::uint_least16_t;
-using::uint_least32_t;
-using::uint_least64_t;
-
-using::int_fast8_t;
-using::int_fast16_t;
-using::int_fast32_t;
-using::int_fast64_t;
-
-using::uint_fast8_t;
-using::uint_fast16_t;
-using::uint_fast32_t;
-using::uint_fast64_t;
-
-using::intptr_t;
-using::uintptr_t;
-
-using::intmax_t;
-using::uintmax_t;
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_CSTDINT
diff --git a/lib/libcxx/include/cstdio b/lib/libcxx/include/cstdio
deleted file mode 100644
index 48643c5eb4b..00000000000
--- a/lib/libcxx/include/cstdio
+++ /dev/null
@@ -1,172 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- cstdio ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CSTDIO
-#define _LIBCPP_CSTDIO
-
-/*
- cstdio synopsis
-
-Macros:
-
- BUFSIZ
- EOF
- FILENAME_MAX
- FOPEN_MAX
- L_tmpnam
- NULL
- SEEK_CUR
- SEEK_END
- SEEK_SET
- TMP_MAX
- _IOFBF
- _IOLBF
- _IONBF
- stderr
- stdin
- stdout
-
-namespace std
-{
-
-Types:
-
-FILE
-fpos_t
-size_t
-
-int remove(const char* filename);
-int rename(const char* old, const char* new);
-FILE* tmpfile(void);
-char* tmpnam(char* s);
-int fclose(FILE* stream);
-int fflush(FILE* stream);
-FILE* fopen(const char* restrict filename, const char* restrict mode);
-FILE* freopen(const char* restrict filename, const char * restrict mode,
- FILE * restrict stream);
-void setbuf(FILE* restrict stream, char* restrict buf);
-int setvbuf(FILE* restrict stream, char* restrict buf, int mode, size_t size);
-int fprintf(FILE* restrict stream, const char* restrict format, ...);
-int fscanf(FILE* restrict stream, const char * restrict format, ...);
-int printf(const char* restrict format, ...);
-int scanf(const char* restrict format, ...);
-int snprintf(char* restrict s, size_t n, const char* restrict format, ...); // C99
-int sprintf(char* restrict s, const char* restrict format, ...);
-int sscanf(const char* restrict s, const char* restrict format, ...);
-int vfprintf(FILE* restrict stream, const char* restrict format, va_list arg);
-int vfscanf(FILE* restrict stream, const char* restrict format, va_list arg); // C99
-int vprintf(const char* restrict format, va_list arg);
-int vscanf(const char* restrict format, va_list arg); // C99
-int vsnprintf(char* restrict s, size_t n, const char* restrict format, // C99
- va_list arg);
-int vsprintf(char* restrict s, const char* restrict format, va_list arg);
-int vsscanf(const char* restrict s, const char* restrict format, va_list arg); // C99
-int fgetc(FILE* stream);
-char* fgets(char* restrict s, int n, FILE* restrict stream);
-int fputc(int c, FILE* stream);
-int fputs(const char* restrict s, FILE* restrict stream);
-int getc(FILE* stream);
-int getchar(void);
-char* gets(char* s); // removed in C++14
-int putc(int c, FILE* stream);
-int putchar(int c);
-int puts(const char* s);
-int ungetc(int c, FILE* stream);
-size_t fread(void* restrict ptr, size_t size, size_t nmemb,
- FILE* restrict stream);
-size_t fwrite(const void* restrict ptr, size_t size, size_t nmemb,
- FILE* restrict stream);
-int fgetpos(FILE* restrict stream, fpos_t* restrict pos);
-int fseek(FILE* stream, long offset, int whence);
-int fsetpos(FILE*stream, const fpos_t* pos);
-long ftell(FILE* stream);
-void rewind(FILE* stream);
-void clearerr(FILE* stream);
-int feof(FILE* stream);
-int ferror(FILE* stream);
-void perror(const char* s);
-
-} // std
-*/
-
-#include <__config>
-#include <stdio.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-using ::FILE;
-using ::fpos_t;
-using ::size_t;
-
-using ::fclose;
-using ::fflush;
-using ::setbuf;
-using ::setvbuf;
-using ::fprintf;
-using ::fscanf;
-using ::snprintf;
-using ::sprintf;
-using ::sscanf;
-using ::vfprintf;
-using ::vfscanf;
-using ::vsscanf;
-using ::vsnprintf;
-using ::vsprintf;
-using ::fgetc;
-using ::fgets;
-using ::fputc;
-using ::fputs;
-using ::getc;
-using ::putc;
-using ::ungetc;
-using ::fread;
-using ::fwrite;
-using ::fgetpos;
-using ::fseek;
-using ::fsetpos;
-using ::ftell;
-using ::rewind;
-using ::clearerr;
-using ::feof;
-using ::ferror;
-using ::perror;
-
-#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
-using ::fopen;
-using ::freopen;
-using ::remove;
-using ::rename;
-using ::tmpfile;
-using ::tmpnam;
-#endif
-
-#ifndef _LIBCPP_HAS_NO_STDIN
-using ::getchar;
-#if _LIBCPP_STD_VER <= 11 && !defined(_LIBCPP_MSVCRT) && !defined(__OpenBSD__)
-using ::gets;
-#endif
-using ::scanf;
-using ::vscanf;
-#endif
-
-#ifndef _LIBCPP_HAS_NO_STDOUT
-using ::printf;
-using ::putchar;
-using ::puts;
-using ::vprintf;
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_CSTDIO
diff --git a/lib/libcxx/include/cstdlib b/lib/libcxx/include/cstdlib
deleted file mode 100644
index 00c604e6762..00000000000
--- a/lib/libcxx/include/cstdlib
+++ /dev/null
@@ -1,164 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- cstdlib ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CSTDLIB
-#define _LIBCPP_CSTDLIB
-
-/*
- cstdlib synopsis
-
-Macros:
-
- EXIT_FAILURE
- EXIT_SUCCESS
- MB_CUR_MAX
- NULL
- RAND_MAX
-
-namespace std
-{
-
-Types:
-
- size_t
- div_t
- ldiv_t
- lldiv_t // C99
-
-double atof (const char* nptr);
-int atoi (const char* nptr);
-long atol (const char* nptr);
-long long atoll(const char* nptr); // C99
-double strtod (const char* restrict nptr, char** restrict endptr);
-float strtof (const char* restrict nptr, char** restrict endptr); // C99
-long double strtold (const char* restrict nptr, char** restrict endptr); // C99
-long strtol (const char* restrict nptr, char** restrict endptr, int base);
-long long strtoll (const char* restrict nptr, char** restrict endptr, int base); // C99
-unsigned long strtoul (const char* restrict nptr, char** restrict endptr, int base);
-unsigned long long strtoull(const char* restrict nptr, char** restrict endptr, int base); // C99
-int rand(void);
-void srand(unsigned int seed);
-void* calloc(size_t nmemb, size_t size);
-void free(void* ptr);
-void* malloc(size_t size);
-void* realloc(void* ptr, size_t size);
-void abort(void);
-int atexit(void (*func)(void));
-void exit(int status);
-void _Exit(int status);
-char* getenv(const char* name);
-int system(const char* string);
-void* bsearch(const void* key, const void* base, size_t nmemb, size_t size,
- int (*compar)(const void *, const void *));
-void qsort(void* base, size_t nmemb, size_t size,
- int (*compar)(const void *, const void *));
-int abs( int j);
-long abs( long j);
-long long abs(long long j); // C++0X
-long labs( long j);
-long long llabs(long long j); // C99
-div_t div( int numer, int denom);
-ldiv_t div( long numer, long denom);
-lldiv_t div(long long numer, long long denom); // C++0X
-ldiv_t ldiv( long numer, long denom);
-lldiv_t lldiv(long long numer, long long denom); // C99
-int mblen(const char* s, size_t n);
-int mbtowc(wchar_t* restrict pwc, const char* restrict s, size_t n);
-int wctomb(char* s, wchar_t wchar);
-size_t mbstowcs(wchar_t* restrict pwcs, const char* restrict s, size_t n);
-size_t wcstombs(char* restrict s, const wchar_t* restrict pwcs, size_t n);
-int at_quick_exit(void (*func)(void)) // C++11
-void quick_exit(int status); // C++11
-void *aligned_alloc(size_t alignment, size_t size); // C11
-
-} // std
-
-*/
-
-#include <__config>
-#include <stdlib.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#ifdef __GNUC__
-#define _LIBCPP_UNREACHABLE() __builtin_unreachable()
-#else
-#define _LIBCPP_UNREACHABLE() _VSTD::abort()
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-using ::size_t;
-using ::div_t;
-using ::ldiv_t;
-#ifndef _LIBCPP_HAS_NO_LONG_LONG
-using ::lldiv_t;
-#endif // _LIBCPP_HAS_NO_LONG_LONG
-using ::atof;
-using ::atoi;
-using ::atol;
-#ifndef _LIBCPP_HAS_NO_LONG_LONG
-using ::atoll;
-#endif // _LIBCPP_HAS_NO_LONG_LONG
-using ::strtod;
-using ::strtof;
-using ::strtold;
-using ::strtol;
-#ifndef _LIBCPP_HAS_NO_LONG_LONG
-using ::strtoll;
-#endif // _LIBCPP_HAS_NO_LONG_LONG
-using ::strtoul;
-#ifndef _LIBCPP_HAS_NO_LONG_LONG
-using ::strtoull;
-#endif // _LIBCPP_HAS_NO_LONG_LONG
-using ::rand;
-using ::srand;
-using ::calloc;
-using ::free;
-using ::malloc;
-using ::realloc;
-using ::abort;
-using ::atexit;
-using ::exit;
-using ::_Exit;
-#ifndef _LIBCPP_WINDOWS_STORE_APP
-using ::getenv;
-using ::system;
-#endif
-using ::bsearch;
-using ::qsort;
-using ::abs;
-using ::labs;
-#ifndef _LIBCPP_HAS_NO_LONG_LONG
-using ::llabs;
-#endif // _LIBCPP_HAS_NO_LONG_LONG
-using ::div;
-using ::ldiv;
-#ifndef _LIBCPP_HAS_NO_LONG_LONG
-using ::lldiv;
-#endif // _LIBCPP_HAS_NO_LONG_LONG
-using ::mblen;
-using ::mbtowc;
-using ::wctomb;
-using ::mbstowcs;
-using ::wcstombs;
-#if !defined(_LIBCPP_CXX03_LANG) && defined(_LIBCPP_HAS_QUICK_EXIT)
-using ::at_quick_exit;
-using ::quick_exit;
-#endif
-#if _LIBCPP_STD_VER > 14 && defined(_LIBCPP_HAS_C11_FEATURES)
-using ::aligned_alloc;
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_CSTDLIB
diff --git a/lib/libcxx/include/cstring b/lib/libcxx/include/cstring
deleted file mode 100644
index d550695caa4..00000000000
--- a/lib/libcxx/include/cstring
+++ /dev/null
@@ -1,97 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- cstring ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CSTRING
-#define _LIBCPP_CSTRING
-
-/*
- cstring synopsis
-
-Macros:
-
- NULL
-
-namespace std
-{
-
-Types:
-
- size_t
-
-void* memcpy(void* restrict s1, const void* restrict s2, size_t n);
-void* memmove(void* s1, const void* s2, size_t n);
-char* strcpy (char* restrict s1, const char* restrict s2);
-char* strncpy(char* restrict s1, const char* restrict s2, size_t n);
-char* strcat (char* restrict s1, const char* restrict s2);
-char* strncat(char* restrict s1, const char* restrict s2, size_t n);
-int memcmp(const void* s1, const void* s2, size_t n);
-int strcmp (const char* s1, const char* s2);
-int strncmp(const char* s1, const char* s2, size_t n);
-int strcoll(const char* s1, const char* s2);
-size_t strxfrm(char* restrict s1, const char* restrict s2, size_t n);
-const void* memchr(const void* s, int c, size_t n);
- void* memchr( void* s, int c, size_t n);
-const char* strchr(const char* s, int c);
- char* strchr( char* s, int c);
-size_t strcspn(const char* s1, const char* s2);
-const char* strpbrk(const char* s1, const char* s2);
- char* strpbrk( char* s1, const char* s2);
-const char* strrchr(const char* s, int c);
- char* strrchr( char* s, int c);
-size_t strspn(const char* s1, const char* s2);
-const char* strstr(const char* s1, const char* s2);
- char* strstr( char* s1, const char* s2);
-char* strtok(char* restrict s1, const char* restrict s2);
-void* memset(void* s, int c, size_t n);
-char* strerror(int errnum);
-size_t strlen(const char* s);
-
-} // std
-
-*/
-
-#include <__config>
-#include <string.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-using ::size_t;
-using ::memcpy;
-using ::memmove;
-using ::strcpy;
-using ::strncpy;
-using ::strcat;
-using ::strncat;
-using ::memcmp;
-using ::strcmp;
-using ::strncmp;
-using ::strcoll;
-using ::strxfrm;
-using ::memchr;
-using ::strchr;
-using ::strcspn;
-using ::strpbrk;
-using ::strrchr;
-using ::strspn;
-using ::strstr;
-#ifndef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
-using ::strtok;
-#endif
-using ::memset;
-using ::strerror;
-using ::strlen;
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_CSTRING
diff --git a/lib/libcxx/include/ctgmath b/lib/libcxx/include/ctgmath
deleted file mode 100644
index 535eb7dccd1..00000000000
--- a/lib/libcxx/include/ctgmath
+++ /dev/null
@@ -1,29 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- ctgmath -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CTGMATH
-#define _LIBCPP_CTGMATH
-
-/*
- ctgmath synopsis
-
-#include <ccomplex>
-#include <cmath>
-
-*/
-
-#include <ccomplex>
-#include <cmath>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#endif // _LIBCPP_CTGMATH
diff --git a/lib/libcxx/include/ctime b/lib/libcxx/include/ctime
deleted file mode 100644
index 8264fe33b96..00000000000
--- a/lib/libcxx/include/ctime
+++ /dev/null
@@ -1,82 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- ctime -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CTIME
-#define _LIBCPP_CTIME
-
-/*
- ctime synopsis
-
-Macros:
-
- NULL
- CLOCKS_PER_SEC
- TIME_UTC // C++17
-
-namespace std
-{
-
-Types:
-
- clock_t
- size_t
- time_t
- tm
- timespec // C++17
-
-clock_t clock();
-double difftime(time_t time1, time_t time0);
-time_t mktime(tm* timeptr);
-time_t time(time_t* timer);
-char* asctime(const tm* timeptr);
-char* ctime(const time_t* timer);
-tm* gmtime(const time_t* timer);
-tm* localtime(const time_t* timer);
-size_t strftime(char* restrict s, size_t maxsize, const char* restrict format,
- const tm* restrict timeptr);
-int timespec_get( struct timespec *ts, int base); // C++17
-} // std
-
-*/
-
-#include <__config>
-#include <time.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-using ::clock_t;
-using ::size_t;
-using ::time_t;
-using ::tm;
-#if _LIBCPP_STD_VER > 14 && defined(_LIBCPP_HAS_C11_FEATURES)
-using ::timespec;
-#endif
-using ::clock;
-using ::difftime;
-using ::mktime;
-using ::time;
-#ifndef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
-using ::asctime;
-using ::ctime;
-using ::gmtime;
-using ::localtime;
-#endif
-using ::strftime;
-#if _LIBCPP_STD_VER > 14 && defined(_LIBCPP_HAS_TIMESPEC_GET)
-using ::timespec_get;
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_CTIME
diff --git a/lib/libcxx/include/ctype.h b/lib/libcxx/include/ctype.h
deleted file mode 100644
index e97ff3c4887..00000000000
--- a/lib/libcxx/include/ctype.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- ctype.h ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CTYPE_H
-#define _LIBCPP_CTYPE_H
-
-/*
- ctype.h synopsis
-
-int isalnum(int c);
-int isalpha(int c);
-int isblank(int c); // C99
-int iscntrl(int c);
-int isdigit(int c);
-int isgraph(int c);
-int islower(int c);
-int isprint(int c);
-int ispunct(int c);
-int isspace(int c);
-int isupper(int c);
-int isxdigit(int c);
-int tolower(int c);
-int toupper(int c);
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#include_next <ctype.h>
-
-#ifdef __cplusplus
-
-#undef isalnum
-#undef isalpha
-#undef isblank
-#undef iscntrl
-#undef isdigit
-#undef isgraph
-#undef islower
-#undef isprint
-#undef ispunct
-#undef isspace
-#undef isupper
-#undef isxdigit
-#undef tolower
-#undef toupper
-
-#endif
-
-#endif // _LIBCPP_CTYPE_H
diff --git a/lib/libcxx/include/cwchar b/lib/libcxx/include/cwchar
deleted file mode 100644
index d268e8bbd39..00000000000
--- a/lib/libcxx/include/cwchar
+++ /dev/null
@@ -1,193 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- cwchar -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CWCHAR
-#define _LIBCPP_CWCHAR
-
-/*
- cwchar synopsis
-
-Macros:
-
- NULL
- WCHAR_MAX
- WCHAR_MIN
- WEOF
-
-namespace std
-{
-
-Types:
-
- mbstate_t
- size_t
- tm
- wint_t
-
-int fwprintf(FILE* restrict stream, const wchar_t* restrict format, ...);
-int fwscanf(FILE* restrict stream, const wchar_t* restrict format, ...);
-int swprintf(wchar_t* restrict s, size_t n, const wchar_t* restrict format, ...);
-int swscanf(const wchar_t* restrict s, const wchar_t* restrict format, ...);
-int vfwprintf(FILE* restrict stream, const wchar_t* restrict format, va_list arg);
-int vfwscanf(FILE* restrict stream, const wchar_t* restrict format, va_list arg); // C99
-int vswprintf(wchar_t* restrict s, size_t n, const wchar_t* restrict format, va_list arg);
-int vswscanf(const wchar_t* restrict s, const wchar_t* restrict format, va_list arg); // C99
-int vwprintf(const wchar_t* restrict format, va_list arg);
-int vwscanf(const wchar_t* restrict format, va_list arg); // C99
-int wprintf(const wchar_t* restrict format, ...);
-int wscanf(const wchar_t* restrict format, ...);
-wint_t fgetwc(FILE* stream);
-wchar_t* fgetws(wchar_t* restrict s, int n, FILE* restrict stream);
-wint_t fputwc(wchar_t c, FILE* stream);
-int fputws(const wchar_t* restrict s, FILE* restrict stream);
-int fwide(FILE* stream, int mode);
-wint_t getwc(FILE* stream);
-wint_t getwchar();
-wint_t putwc(wchar_t c, FILE* stream);
-wint_t putwchar(wchar_t c);
-wint_t ungetwc(wint_t c, FILE* stream);
-double wcstod(const wchar_t* restrict nptr, wchar_t** restrict endptr);
-float wcstof(const wchar_t* restrict nptr, wchar_t** restrict endptr); // C99
-long double wcstold(const wchar_t* restrict nptr, wchar_t** restrict endptr); // C99
-long wcstol(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base);
-long long wcstoll(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base); // C99
-unsigned long wcstoul(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base);
-unsigned long long wcstoull(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base); // C99
-wchar_t* wcscpy(wchar_t* restrict s1, const wchar_t* restrict s2);
-wchar_t* wcsncpy(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n);
-wchar_t* wcscat(wchar_t* restrict s1, const wchar_t* restrict s2);
-wchar_t* wcsncat(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n);
-int wcscmp(const wchar_t* s1, const wchar_t* s2);
-int wcscoll(const wchar_t* s1, const wchar_t* s2);
-int wcsncmp(const wchar_t* s1, const wchar_t* s2, size_t n);
-size_t wcsxfrm(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n);
-const wchar_t* wcschr(const wchar_t* s, wchar_t c);
- wchar_t* wcschr( wchar_t* s, wchar_t c);
-size_t wcscspn(const wchar_t* s1, const wchar_t* s2);
-size_t wcslen(const wchar_t* s);
-const wchar_t* wcspbrk(const wchar_t* s1, const wchar_t* s2);
- wchar_t* wcspbrk( wchar_t* s1, const wchar_t* s2);
-const wchar_t* wcsrchr(const wchar_t* s, wchar_t c);
- wchar_t* wcsrchr( wchar_t* s, wchar_t c);
-size_t wcsspn(const wchar_t* s1, const wchar_t* s2);
-const wchar_t* wcsstr(const wchar_t* s1, const wchar_t* s2);
- wchar_t* wcsstr( wchar_t* s1, const wchar_t* s2);
-wchar_t* wcstok(wchar_t* restrict s1, const wchar_t* restrict s2, wchar_t** restrict ptr);
-const wchar_t* wmemchr(const wchar_t* s, wchar_t c, size_t n);
- wchar_t* wmemchr( wchar_t* s, wchar_t c, size_t n);
-int wmemcmp(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n);
-wchar_t* wmemcpy(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n);
-wchar_t* wmemmove(wchar_t* s1, const wchar_t* s2, size_t n);
-wchar_t* wmemset(wchar_t* s, wchar_t c, size_t n);
-size_t wcsftime(wchar_t* restrict s, size_t maxsize, const wchar_t* restrict format,
- const tm* restrict timeptr);
-wint_t btowc(int c);
-int wctob(wint_t c);
-int mbsinit(const mbstate_t* ps);
-size_t mbrlen(const char* restrict s, size_t n, mbstate_t* restrict ps);
-size_t mbrtowc(wchar_t* restrict pwc, const char* restrict s, size_t n, mbstate_t* restrict ps);
-size_t wcrtomb(char* restrict s, wchar_t wc, mbstate_t* restrict ps);
-size_t mbsrtowcs(wchar_t* restrict dst, const char** restrict src, size_t len,
- mbstate_t* restrict ps);
-size_t wcsrtombs(char* restrict dst, const wchar_t** restrict src, size_t len,
- mbstate_t* restrict ps);
-
-} // std
-
-*/
-
-#include <__config>
-#include <cwctype>
-#include <wchar.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-using ::mbstate_t;
-using ::size_t;
-using ::tm;
-using ::wint_t;
-using ::FILE;
-using ::fwprintf;
-using ::fwscanf;
-using ::swprintf;
-using ::vfwprintf;
-using ::vswprintf;
-using ::swscanf;
-using ::vfwscanf;
-using ::vswscanf;
-using ::fgetwc;
-using ::fgetws;
-using ::fputwc;
-using ::fputws;
-using ::fwide;
-using ::getwc;
-using ::putwc;
-using ::ungetwc;
-using ::wcstod;
-using ::wcstof;
-using ::wcstold;
-using ::wcstol;
-#ifndef _LIBCPP_HAS_NO_LONG_LONG
-using ::wcstoll;
-#endif // _LIBCPP_HAS_NO_LONG_LONG
-using ::wcstoul;
-#ifndef _LIBCPP_HAS_NO_LONG_LONG
-using ::wcstoull;
-#endif // _LIBCPP_HAS_NO_LONG_LONG
-using ::wcscpy;
-using ::wcsncpy;
-using ::wcscat;
-using ::wcsncat;
-using ::wcscmp;
-using ::wcscoll;
-using ::wcsncmp;
-using ::wcsxfrm;
-using ::wcschr;
-using ::wcspbrk;
-using ::wcsrchr;
-using ::wcsstr;
-using ::wmemchr;
-using ::wcscspn;
-using ::wcslen;
-using ::wcsspn;
-using ::wcstok;
-using ::wmemcmp;
-using ::wmemcpy;
-using ::wmemmove;
-using ::wmemset;
-using ::wcsftime;
-using ::btowc;
-using ::wctob;
-using ::mbsinit;
-using ::mbrlen;
-using ::mbrtowc;
-using ::wcrtomb;
-using ::mbsrtowcs;
-using ::wcsrtombs;
-
-#ifndef _LIBCPP_HAS_NO_STDIN
-using ::getwchar;
-using ::vwscanf;
-using ::wscanf;
-#endif
-
-#ifndef _LIBCPP_HAS_NO_STDOUT
-using ::putwchar;
-using ::vwprintf;
-using ::wprintf;
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_CWCHAR
diff --git a/lib/libcxx/include/cwctype b/lib/libcxx/include/cwctype
deleted file mode 100644
index 25b2489edf2..00000000000
--- a/lib/libcxx/include/cwctype
+++ /dev/null
@@ -1,87 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- cwctype ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CWCTYPE
-#define _LIBCPP_CWCTYPE
-
-/*
- cwctype synopsis
-
-Macros:
-
- WEOF
-
-namespace std
-{
-
-Types:
-
- wint_t
- wctrans_t
- wctype_t
-
-int iswalnum(wint_t wc);
-int iswalpha(wint_t wc);
-int iswblank(wint_t wc); // C99
-int iswcntrl(wint_t wc);
-int iswdigit(wint_t wc);
-int iswgraph(wint_t wc);
-int iswlower(wint_t wc);
-int iswprint(wint_t wc);
-int iswpunct(wint_t wc);
-int iswspace(wint_t wc);
-int iswupper(wint_t wc);
-int iswxdigit(wint_t wc);
-int iswctype(wint_t wc, wctype_t desc);
-wctype_t wctype(const char* property);
-wint_t towlower(wint_t wc);
-wint_t towupper(wint_t wc);
-wint_t towctrans(wint_t wc, wctrans_t desc);
-wctrans_t wctrans(const char* property);
-
-} // std
-
-*/
-
-#include <__config>
-#include <cctype>
-#include <wctype.h>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-using ::wint_t;
-using ::wctrans_t;
-using ::wctype_t;
-using ::iswalnum;
-using ::iswalpha;
-using ::iswblank;
-using ::iswcntrl;
-using ::iswdigit;
-using ::iswgraph;
-using ::iswlower;
-using ::iswprint;
-using ::iswpunct;
-using ::iswspace;
-using ::iswupper;
-using ::iswxdigit;
-using ::iswctype;
-using ::wctype;
-using ::towlower;
-using ::towupper;
-using ::towctrans;
-using ::wctrans;
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_CWCTYPE
diff --git a/lib/libcxx/include/deque b/lib/libcxx/include/deque
deleted file mode 100644
index 6f7d04be52b..00000000000
--- a/lib/libcxx/include/deque
+++ /dev/null
@@ -1,2953 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- deque -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_DEQUE
-#define _LIBCPP_DEQUE
-
-/*
- deque synopsis
-
-namespace std
-{
-
-template <class T, class Allocator = allocator<T> >
-class deque
-{
-public:
- // types:
- typedef T value_type;
- typedef Allocator allocator_type;
-
- typedef typename allocator_type::reference reference;
- typedef typename allocator_type::const_reference const_reference;
- typedef implementation-defined iterator;
- typedef implementation-defined const_iterator;
- typedef typename allocator_type::size_type size_type;
- typedef typename allocator_type::difference_type difference_type;
-
- typedef typename allocator_type::pointer pointer;
- typedef typename allocator_type::const_pointer const_pointer;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
-
- // construct/copy/destroy:
- deque() noexcept(is_nothrow_default_constructible<allocator_type>::value);
- explicit deque(const allocator_type& a);
- explicit deque(size_type n);
- explicit deque(size_type n, const allocator_type& a); // C++14
- deque(size_type n, const value_type& v);
- deque(size_type n, const value_type& v, const allocator_type& a);
- template <class InputIterator>
- deque(InputIterator f, InputIterator l);
- template <class InputIterator>
- deque(InputIterator f, InputIterator l, const allocator_type& a);
- deque(const deque& c);
- deque(deque&& c)
- noexcept(is_nothrow_move_constructible<allocator_type>::value);
- deque(initializer_list<value_type> il, const Allocator& a = allocator_type());
- deque(const deque& c, const allocator_type& a);
- deque(deque&& c, const allocator_type& a);
- ~deque();
-
- deque& operator=(const deque& c);
- deque& operator=(deque&& c)
- noexcept(
- allocator_type::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value);
- deque& operator=(initializer_list<value_type> il);
-
- template <class InputIterator>
- void assign(InputIterator f, InputIterator l);
- void assign(size_type n, const value_type& v);
- void assign(initializer_list<value_type> il);
-
- allocator_type get_allocator() const noexcept;
-
- // iterators:
-
- iterator begin() noexcept;
- const_iterator begin() const noexcept;
- iterator end() noexcept;
- const_iterator end() const noexcept;
-
- reverse_iterator rbegin() noexcept;
- const_reverse_iterator rbegin() const noexcept;
- reverse_iterator rend() noexcept;
- const_reverse_iterator rend() const noexcept;
-
- const_iterator cbegin() const noexcept;
- const_iterator cend() const noexcept;
- const_reverse_iterator crbegin() const noexcept;
- const_reverse_iterator crend() const noexcept;
-
- // capacity:
- size_type size() const noexcept;
- size_type max_size() const noexcept;
- void resize(size_type n);
- void resize(size_type n, const value_type& v);
- void shrink_to_fit();
- bool empty() const noexcept;
-
- // element access:
- reference operator[](size_type i);
- const_reference operator[](size_type i) const;
- reference at(size_type i);
- const_reference at(size_type i) const;
- reference front();
- const_reference front() const;
- reference back();
- const_reference back() const;
-
- // modifiers:
- void push_front(const value_type& v);
- void push_front(value_type&& v);
- void push_back(const value_type& v);
- void push_back(value_type&& v);
- template <class... Args> reference emplace_front(Args&&... args); // reference in C++17
- template <class... Args> reference emplace_back(Args&&... args); // reference in C++17
- template <class... Args> iterator emplace(const_iterator p, Args&&... args);
- iterator insert(const_iterator p, const value_type& v);
- iterator insert(const_iterator p, value_type&& v);
- iterator insert(const_iterator p, size_type n, const value_type& v);
- template <class InputIterator>
- iterator insert(const_iterator p, InputIterator f, InputIterator l);
- iterator insert(const_iterator p, initializer_list<value_type> il);
- void pop_front();
- void pop_back();
- iterator erase(const_iterator p);
- iterator erase(const_iterator f, const_iterator l);
- void swap(deque& c)
- noexcept(allocator_traits<allocator_type>::is_always_equal::value); // C++17
- void clear() noexcept;
-};
-
-template <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
- deque(InputIterator, InputIterator, Allocator = Allocator())
- -> deque<typename iterator_traits<InputIterator>::value_type, Allocator>;
-
-template <class T, class Allocator>
- bool operator==(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
-template <class T, class Allocator>
- bool operator< (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
-template <class T, class Allocator>
- bool operator!=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
-template <class T, class Allocator>
- bool operator> (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
-template <class T, class Allocator>
- bool operator>=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
-template <class T, class Allocator>
- bool operator<=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
-
-// specialized algorithms:
-template <class T, class Allocator>
- void swap(deque<T,Allocator>& x, deque<T,Allocator>& y)
- noexcept(noexcept(x.swap(y)));
-
-template <class T, class Allocator, class U>
- void erase(deque<T, Allocator>& c, const U& value); // C++20
-template <class T, class Allocator, class Predicate>
- void erase_if(deque<T, Allocator>& c, Predicate pred); // C++20
-
-} // std
-
-*/
-
-#include <__config>
-#include <__split_buffer>
-#include <type_traits>
-#include <initializer_list>
-#include <iterator>
-#include <algorithm>
-#include <stdexcept>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Tp, class _Allocator> class __deque_base;
-template <class _Tp, class _Allocator = allocator<_Tp> > class _LIBCPP_TEMPLATE_VIS deque;
-
-template <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
- class _DiffType, _DiffType _BlockSize>
-class _LIBCPP_TEMPLATE_VIS __deque_iterator;
-
-template <class _RAIter,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-copy(_RAIter __f,
- _RAIter __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
- typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
-
-template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _OutputIterator>
-_OutputIterator
-copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- _OutputIterator __r);
-
-template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
-
-template <class _RAIter,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-copy_backward(_RAIter __f,
- _RAIter __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
- typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
-
-template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _OutputIterator>
-_OutputIterator
-copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- _OutputIterator __r);
-
-template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
-
-template <class _RAIter,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-move(_RAIter __f,
- _RAIter __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
- typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
-
-template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _OutputIterator>
-_OutputIterator
-move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- _OutputIterator __r);
-
-template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
-
-template <class _RAIter,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-move_backward(_RAIter __f,
- _RAIter __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
- typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
-
-template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _OutputIterator>
-_OutputIterator
-move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- _OutputIterator __r);
-
-template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
-
-template <class _ValueType, class _DiffType>
-struct __deque_block_size {
- static const _DiffType value = sizeof(_ValueType) < 256 ? 4096 / sizeof(_ValueType) : 16;
-};
-
-template <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
- class _DiffType, _DiffType _BS =
-#ifdef _LIBCPP_ABI_INCOMPLETE_TYPES_IN_DEQUE
-// Keep template parameter to avoid changing all template declarations thoughout
-// this file.
- 0
-#else
- __deque_block_size<_ValueType, _DiffType>::value
-#endif
- >
-class _LIBCPP_TEMPLATE_VIS __deque_iterator
-{
- typedef _MapPointer __map_iterator;
-public:
- typedef _Pointer pointer;
- typedef _DiffType difference_type;
-private:
- __map_iterator __m_iter_;
- pointer __ptr_;
-
- static const difference_type __block_size;
-public:
- typedef _ValueType value_type;
- typedef random_access_iterator_tag iterator_category;
- typedef _Reference reference;
-
- _LIBCPP_INLINE_VISIBILITY __deque_iterator() _NOEXCEPT
-#if _LIBCPP_STD_VER > 11
- : __m_iter_(nullptr), __ptr_(nullptr)
-#endif
- {}
-
- template <class _Pp, class _Rp, class _MP>
- _LIBCPP_INLINE_VISIBILITY
- __deque_iterator(const __deque_iterator<value_type, _Pp, _Rp, _MP, difference_type, _BS>& __it,
- typename enable_if<is_convertible<_Pp, pointer>::value>::type* = 0) _NOEXCEPT
- : __m_iter_(__it.__m_iter_), __ptr_(__it.__ptr_) {}
-
- _LIBCPP_INLINE_VISIBILITY reference operator*() const {return *__ptr_;}
- _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return __ptr_;}
-
- _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator++()
- {
- if (++__ptr_ - *__m_iter_ == __block_size)
- {
- ++__m_iter_;
- __ptr_ = *__m_iter_;
- }
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY __deque_iterator operator++(int)
- {
- __deque_iterator __tmp = *this;
- ++(*this);
- return __tmp;
- }
-
- _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator--()
- {
- if (__ptr_ == *__m_iter_)
- {
- --__m_iter_;
- __ptr_ = *__m_iter_ + __block_size;
- }
- --__ptr_;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY __deque_iterator operator--(int)
- {
- __deque_iterator __tmp = *this;
- --(*this);
- return __tmp;
- }
-
- _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator+=(difference_type __n)
- {
- if (__n != 0)
- {
- __n += __ptr_ - *__m_iter_;
- if (__n > 0)
- {
- __m_iter_ += __n / __block_size;
- __ptr_ = *__m_iter_ + __n % __block_size;
- }
- else // (__n < 0)
- {
- difference_type __z = __block_size - 1 - __n;
- __m_iter_ -= __z / __block_size;
- __ptr_ = *__m_iter_ + (__block_size - 1 - __z % __block_size);
- }
- }
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator-=(difference_type __n)
- {
- return *this += -__n;
- }
-
- _LIBCPP_INLINE_VISIBILITY __deque_iterator operator+(difference_type __n) const
- {
- __deque_iterator __t(*this);
- __t += __n;
- return __t;
- }
-
- _LIBCPP_INLINE_VISIBILITY __deque_iterator operator-(difference_type __n) const
- {
- __deque_iterator __t(*this);
- __t -= __n;
- return __t;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- friend __deque_iterator operator+(difference_type __n, const __deque_iterator& __it)
- {return __it + __n;}
-
- _LIBCPP_INLINE_VISIBILITY
- friend difference_type operator-(const __deque_iterator& __x, const __deque_iterator& __y)
- {
- if (__x != __y)
- return (__x.__m_iter_ - __y.__m_iter_) * __block_size
- + (__x.__ptr_ - *__x.__m_iter_)
- - (__y.__ptr_ - *__y.__m_iter_);
- return 0;
- }
-
- _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const
- {return *(*this + __n);}
-
- _LIBCPP_INLINE_VISIBILITY friend
- bool operator==(const __deque_iterator& __x, const __deque_iterator& __y)
- {return __x.__ptr_ == __y.__ptr_;}
-
- _LIBCPP_INLINE_VISIBILITY friend
- bool operator!=(const __deque_iterator& __x, const __deque_iterator& __y)
- {return !(__x == __y);}
-
- _LIBCPP_INLINE_VISIBILITY friend
- bool operator<(const __deque_iterator& __x, const __deque_iterator& __y)
- {return __x.__m_iter_ < __y.__m_iter_ ||
- (__x.__m_iter_ == __y.__m_iter_ && __x.__ptr_ < __y.__ptr_);}
-
- _LIBCPP_INLINE_VISIBILITY friend
- bool operator>(const __deque_iterator& __x, const __deque_iterator& __y)
- {return __y < __x;}
-
- _LIBCPP_INLINE_VISIBILITY friend
- bool operator<=(const __deque_iterator& __x, const __deque_iterator& __y)
- {return !(__y < __x);}
-
- _LIBCPP_INLINE_VISIBILITY friend
- bool operator>=(const __deque_iterator& __x, const __deque_iterator& __y)
- {return !(__x < __y);}
-
-private:
- _LIBCPP_INLINE_VISIBILITY __deque_iterator(__map_iterator __m, pointer __p) _NOEXCEPT
- : __m_iter_(__m), __ptr_(__p) {}
-
- template <class _Tp, class _Ap> friend class __deque_base;
- template <class _Tp, class _Ap> friend class _LIBCPP_TEMPLATE_VIS deque;
- template <class _Vp, class _Pp, class _Rp, class _MP, class _Dp, _Dp>
- friend class _LIBCPP_TEMPLATE_VIS __deque_iterator;
-
- template <class _RAIter,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
- friend
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
- copy(_RAIter __f,
- _RAIter __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
- typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
-
- template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _OutputIterator>
- friend
- _OutputIterator
- copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- _OutputIterator __r);
-
- template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
- friend
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
- copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
-
- template <class _RAIter,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
- friend
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
- copy_backward(_RAIter __f,
- _RAIter __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
- typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
-
- template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _OutputIterator>
- friend
- _OutputIterator
- copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- _OutputIterator __r);
-
- template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
- friend
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
- copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
-
- template <class _RAIter,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
- friend
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
- move(_RAIter __f,
- _RAIter __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
- typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
-
- template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _OutputIterator>
- friend
- _OutputIterator
- move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- _OutputIterator __r);
-
- template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
- friend
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
- move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
-
- template <class _RAIter,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
- friend
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
- move_backward(_RAIter __f,
- _RAIter __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
- typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
-
- template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _OutputIterator>
- friend
- _OutputIterator
- move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- _OutputIterator __r);
-
- template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
- friend
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
- move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
-};
-
-template <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
- class _DiffType, _DiffType _BlockSize>
-const _DiffType __deque_iterator<_ValueType, _Pointer, _Reference, _MapPointer,
- _DiffType, _BlockSize>::__block_size =
- __deque_block_size<_ValueType, _DiffType>::value;
-
-// copy
-
-template <class _RAIter,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-copy(_RAIter __f,
- _RAIter __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
- typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
-{
- typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
- typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
- const difference_type __block_size = __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::__block_size;
- while (__f != __l)
- {
- pointer __rb = __r.__ptr_;
- pointer __re = *__r.__m_iter_ + __block_size;
- difference_type __bs = __re - __rb;
- difference_type __n = __l - __f;
- _RAIter __m = __l;
- if (__n > __bs)
- {
- __n = __bs;
- __m = __f + __n;
- }
- _VSTD::copy(__f, __m, __rb);
- __f = __m;
- __r += __n;
- }
- return __r;
-}
-
-template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _OutputIterator>
-_OutputIterator
-copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- _OutputIterator __r)
-{
- typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
- typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
- const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
- difference_type __n = __l - __f;
- while (__n > 0)
- {
- pointer __fb = __f.__ptr_;
- pointer __fe = *__f.__m_iter_ + __block_size;
- difference_type __bs = __fe - __fb;
- if (__bs > __n)
- {
- __bs = __n;
- __fe = __fb + __bs;
- }
- __r = _VSTD::copy(__fb, __fe, __r);
- __n -= __bs;
- __f += __bs;
- }
- return __r;
-}
-
-template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
-{
- typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
- typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
- const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
- difference_type __n = __l - __f;
- while (__n > 0)
- {
- pointer __fb = __f.__ptr_;
- pointer __fe = *__f.__m_iter_ + __block_size;
- difference_type __bs = __fe - __fb;
- if (__bs > __n)
- {
- __bs = __n;
- __fe = __fb + __bs;
- }
- __r = _VSTD::copy(__fb, __fe, __r);
- __n -= __bs;
- __f += __bs;
- }
- return __r;
-}
-
-// copy_backward
-
-template <class _RAIter,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-copy_backward(_RAIter __f,
- _RAIter __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
- typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
-{
- typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
- typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
- while (__f != __l)
- {
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _VSTD::prev(__r);
- pointer __rb = *__rp.__m_iter_;
- pointer __re = __rp.__ptr_ + 1;
- difference_type __bs = __re - __rb;
- difference_type __n = __l - __f;
- _RAIter __m = __f;
- if (__n > __bs)
- {
- __n = __bs;
- __m = __l - __n;
- }
- _VSTD::copy_backward(__m, __l, __re);
- __l = __m;
- __r -= __n;
- }
- return __r;
-}
-
-template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _OutputIterator>
-_OutputIterator
-copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- _OutputIterator __r)
-{
- typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
- typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
- difference_type __n = __l - __f;
- while (__n > 0)
- {
- --__l;
- pointer __lb = *__l.__m_iter_;
- pointer __le = __l.__ptr_ + 1;
- difference_type __bs = __le - __lb;
- if (__bs > __n)
- {
- __bs = __n;
- __lb = __le - __bs;
- }
- __r = _VSTD::copy_backward(__lb, __le, __r);
- __n -= __bs;
- __l -= __bs - 1;
- }
- return __r;
-}
-
-template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
-{
- typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
- typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
- difference_type __n = __l - __f;
- while (__n > 0)
- {
- --__l;
- pointer __lb = *__l.__m_iter_;
- pointer __le = __l.__ptr_ + 1;
- difference_type __bs = __le - __lb;
- if (__bs > __n)
- {
- __bs = __n;
- __lb = __le - __bs;
- }
- __r = _VSTD::copy_backward(__lb, __le, __r);
- __n -= __bs;
- __l -= __bs - 1;
- }
- return __r;
-}
-
-// move
-
-template <class _RAIter,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-move(_RAIter __f,
- _RAIter __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
- typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
-{
- typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
- typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
- const difference_type __block_size = __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::__block_size;
- while (__f != __l)
- {
- pointer __rb = __r.__ptr_;
- pointer __re = *__r.__m_iter_ + __block_size;
- difference_type __bs = __re - __rb;
- difference_type __n = __l - __f;
- _RAIter __m = __l;
- if (__n > __bs)
- {
- __n = __bs;
- __m = __f + __n;
- }
- _VSTD::move(__f, __m, __rb);
- __f = __m;
- __r += __n;
- }
- return __r;
-}
-
-template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _OutputIterator>
-_OutputIterator
-move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- _OutputIterator __r)
-{
- typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
- typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
- const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
- difference_type __n = __l - __f;
- while (__n > 0)
- {
- pointer __fb = __f.__ptr_;
- pointer __fe = *__f.__m_iter_ + __block_size;
- difference_type __bs = __fe - __fb;
- if (__bs > __n)
- {
- __bs = __n;
- __fe = __fb + __bs;
- }
- __r = _VSTD::move(__fb, __fe, __r);
- __n -= __bs;
- __f += __bs;
- }
- return __r;
-}
-
-template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
-{
- typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
- typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
- const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
- difference_type __n = __l - __f;
- while (__n > 0)
- {
- pointer __fb = __f.__ptr_;
- pointer __fe = *__f.__m_iter_ + __block_size;
- difference_type __bs = __fe - __fb;
- if (__bs > __n)
- {
- __bs = __n;
- __fe = __fb + __bs;
- }
- __r = _VSTD::move(__fb, __fe, __r);
- __n -= __bs;
- __f += __bs;
- }
- return __r;
-}
-
-// move_backward
-
-template <class _RAIter,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-move_backward(_RAIter __f,
- _RAIter __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
- typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
-{
- typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
- typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
- while (__f != __l)
- {
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _VSTD::prev(__r);
- pointer __rb = *__rp.__m_iter_;
- pointer __re = __rp.__ptr_ + 1;
- difference_type __bs = __re - __rb;
- difference_type __n = __l - __f;
- _RAIter __m = __f;
- if (__n > __bs)
- {
- __n = __bs;
- __m = __l - __n;
- }
- _VSTD::move_backward(__m, __l, __re);
- __l = __m;
- __r -= __n;
- }
- return __r;
-}
-
-template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _OutputIterator>
-_OutputIterator
-move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- _OutputIterator __r)
-{
- typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
- typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
- difference_type __n = __l - __f;
- while (__n > 0)
- {
- --__l;
- pointer __lb = *__l.__m_iter_;
- pointer __le = __l.__ptr_ + 1;
- difference_type __bs = __le - __lb;
- if (__bs > __n)
- {
- __bs = __n;
- __lb = __le - __bs;
- }
- __r = _VSTD::move_backward(__lb, __le, __r);
- __n -= __bs;
- __l -= __bs - 1;
- }
- return __r;
-}
-
-template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
- class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
- __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
- __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
-{
- typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
- typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
- difference_type __n = __l - __f;
- while (__n > 0)
- {
- --__l;
- pointer __lb = *__l.__m_iter_;
- pointer __le = __l.__ptr_ + 1;
- difference_type __bs = __le - __lb;
- if (__bs > __n)
- {
- __bs = __n;
- __lb = __le - __bs;
- }
- __r = _VSTD::move_backward(__lb, __le, __r);
- __n -= __bs;
- __l -= __bs - 1;
- }
- return __r;
-}
-
-template <bool>
-class __deque_base_common
-{
-protected:
- _LIBCPP_NORETURN void __throw_length_error() const;
- _LIBCPP_NORETURN void __throw_out_of_range() const;
-};
-
-template <bool __b>
-void
-__deque_base_common<__b>::__throw_length_error() const
-{
- _VSTD::__throw_length_error("deque");
-}
-
-template <bool __b>
-void
-__deque_base_common<__b>::__throw_out_of_range() const
-{
- _VSTD::__throw_out_of_range("deque");
-}
-
-template <class _Tp, class _Allocator>
-class __deque_base
- : protected __deque_base_common<true>
-{
- __deque_base(const __deque_base& __c);
- __deque_base& operator=(const __deque_base& __c);
-public:
- typedef _Allocator allocator_type;
- typedef allocator_traits<allocator_type> __alloc_traits;
- typedef typename __alloc_traits::size_type size_type;
-protected:
- typedef _Tp value_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename __alloc_traits::difference_type difference_type;
- typedef typename __alloc_traits::pointer pointer;
- typedef typename __alloc_traits::const_pointer const_pointer;
-
- static const difference_type __block_size;
-
- typedef typename __rebind_alloc_helper<__alloc_traits, pointer>::type __pointer_allocator;
- typedef allocator_traits<__pointer_allocator> __map_traits;
- typedef typename __map_traits::pointer __map_pointer;
- typedef typename __rebind_alloc_helper<__alloc_traits, const_pointer>::type __const_pointer_allocator;
- typedef typename allocator_traits<__const_pointer_allocator>::const_pointer __map_const_pointer;
- typedef __split_buffer<pointer, __pointer_allocator> __map;
-
- typedef __deque_iterator<value_type, pointer, reference, __map_pointer,
- difference_type> iterator;
- typedef __deque_iterator<value_type, const_pointer, const_reference, __map_const_pointer,
- difference_type> const_iterator;
-
-protected:
- __map __map_;
- size_type __start_;
- __compressed_pair<size_type, allocator_type> __size_;
-
- iterator begin() _NOEXCEPT;
- const_iterator begin() const _NOEXCEPT;
- iterator end() _NOEXCEPT;
- const_iterator end() const _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY size_type& size() {return __size_.first();}
- _LIBCPP_INLINE_VISIBILITY
- const size_type& size() const _NOEXCEPT {return __size_.first();}
- _LIBCPP_INLINE_VISIBILITY allocator_type& __alloc() {return __size_.second();}
- _LIBCPP_INLINE_VISIBILITY
- const allocator_type& __alloc() const _NOEXCEPT {return __size_.second();}
-
- _LIBCPP_INLINE_VISIBILITY
- __deque_base()
- _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
- _LIBCPP_INLINE_VISIBILITY
- explicit __deque_base(const allocator_type& __a);
-public:
- ~__deque_base();
-
-#ifndef _LIBCPP_CXX03_LANG
- __deque_base(__deque_base&& __c)
- _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
- __deque_base(__deque_base&& __c, const allocator_type& __a);
-#endif // _LIBCPP_CXX03_LANG
-
- void swap(__deque_base& __c)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT;
-#else
- _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
- __is_nothrow_swappable<allocator_type>::value);
-#endif
-protected:
- void clear() _NOEXCEPT;
-
- bool __invariants() const;
-
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign(__deque_base& __c)
- _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value)
- {
- __map_ = _VSTD::move(__c.__map_);
- __start_ = __c.__start_;
- size() = __c.size();
- __move_assign_alloc(__c);
- __c.__start_ = __c.size() = 0;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__deque_base& __c)
- _NOEXCEPT_(!__alloc_traits::propagate_on_container_move_assignment::value ||
- is_nothrow_move_assignable<allocator_type>::value)
- {__move_assign_alloc(__c, integral_constant<bool,
- __alloc_traits::propagate_on_container_move_assignment::value>());}
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__deque_base& __c, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
- {
- __alloc() = _VSTD::move(__c.__alloc());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__deque_base&, false_type) _NOEXCEPT
- {}
-};
-
-template <class _Tp, class _Allocator>
-const typename __deque_base<_Tp, _Allocator>::difference_type
- __deque_base<_Tp, _Allocator>::__block_size =
- __deque_block_size<value_type, difference_type>::value;
-
-template <class _Tp, class _Allocator>
-bool
-__deque_base<_Tp, _Allocator>::__invariants() const
-{
- if (!__map_.__invariants())
- return false;
- if (__map_.size() >= size_type(-1) / __block_size)
- return false;
- for (typename __map::const_iterator __i = __map_.begin(), __e = __map_.end();
- __i != __e; ++__i)
- if (*__i == nullptr)
- return false;
- if (__map_.size() != 0)
- {
- if (size() >= __map_.size() * __block_size)
- return false;
- if (__start_ >= __map_.size() * __block_size - size())
- return false;
- }
- else
- {
- if (size() != 0)
- return false;
- if (__start_ != 0)
- return false;
- }
- return true;
-}
-
-template <class _Tp, class _Allocator>
-typename __deque_base<_Tp, _Allocator>::iterator
-__deque_base<_Tp, _Allocator>::begin() _NOEXCEPT
-{
- __map_pointer __mp = __map_.begin() + __start_ / __block_size;
- return iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size);
-}
-
-template <class _Tp, class _Allocator>
-typename __deque_base<_Tp, _Allocator>::const_iterator
-__deque_base<_Tp, _Allocator>::begin() const _NOEXCEPT
-{
- __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __start_ / __block_size);
- return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size);
-}
-
-template <class _Tp, class _Allocator>
-typename __deque_base<_Tp, _Allocator>::iterator
-__deque_base<_Tp, _Allocator>::end() _NOEXCEPT
-{
- size_type __p = size() + __start_;
- __map_pointer __mp = __map_.begin() + __p / __block_size;
- return iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size);
-}
-
-template <class _Tp, class _Allocator>
-typename __deque_base<_Tp, _Allocator>::const_iterator
-__deque_base<_Tp, _Allocator>::end() const _NOEXCEPT
-{
- size_type __p = size() + __start_;
- __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __p / __block_size);
- return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size);
-}
-
-template <class _Tp, class _Allocator>
-inline
-__deque_base<_Tp, _Allocator>::__deque_base()
- _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
- : __start_(0), __size_(0) {}
-
-template <class _Tp, class _Allocator>
-inline
-__deque_base<_Tp, _Allocator>::__deque_base(const allocator_type& __a)
- : __map_(__pointer_allocator(__a)), __start_(0), __size_(0, __a) {}
-
-template <class _Tp, class _Allocator>
-__deque_base<_Tp, _Allocator>::~__deque_base()
-{
- clear();
- typename __map::iterator __i = __map_.begin();
- typename __map::iterator __e = __map_.end();
- for (; __i != __e; ++__i)
- __alloc_traits::deallocate(__alloc(), *__i, __block_size);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Allocator>
-__deque_base<_Tp, _Allocator>::__deque_base(__deque_base&& __c)
- _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
- : __map_(_VSTD::move(__c.__map_)),
- __start_(_VSTD::move(__c.__start_)),
- __size_(_VSTD::move(__c.__size_))
-{
- __c.__start_ = 0;
- __c.size() = 0;
-}
-
-template <class _Tp, class _Allocator>
-__deque_base<_Tp, _Allocator>::__deque_base(__deque_base&& __c, const allocator_type& __a)
- : __map_(_VSTD::move(__c.__map_), __pointer_allocator(__a)),
- __start_(_VSTD::move(__c.__start_)),
- __size_(_VSTD::move(__c.size()), __a)
-{
- if (__a == __c.__alloc())
- {
- __c.__start_ = 0;
- __c.size() = 0;
- }
- else
- {
- __map_.clear();
- __start_ = 0;
- size() = 0;
- }
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Allocator>
-void
-__deque_base<_Tp, _Allocator>::swap(__deque_base& __c)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT
-#else
- _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
- __is_nothrow_swappable<allocator_type>::value)
-#endif
-{
- __map_.swap(__c.__map_);
- _VSTD::swap(__start_, __c.__start_);
- _VSTD::swap(size(), __c.size());
- __swap_allocator(__alloc(), __c.__alloc());
-}
-
-template <class _Tp, class _Allocator>
-void
-__deque_base<_Tp, _Allocator>::clear() _NOEXCEPT
-{
- allocator_type& __a = __alloc();
- for (iterator __i = begin(), __e = end(); __i != __e; ++__i)
- __alloc_traits::destroy(__a, _VSTD::addressof(*__i));
- size() = 0;
- while (__map_.size() > 2)
- {
- __alloc_traits::deallocate(__a, __map_.front(), __block_size);
- __map_.pop_front();
- }
- switch (__map_.size())
- {
- case 1:
- __start_ = __block_size / 2;
- break;
- case 2:
- __start_ = __block_size;
- break;
- }
-}
-
-template <class _Tp, class _Allocator /*= allocator<_Tp>*/>
-class _LIBCPP_TEMPLATE_VIS deque
- : private __deque_base<_Tp, _Allocator>
-{
-public:
- // types:
-
- typedef _Tp value_type;
- typedef _Allocator allocator_type;
-
- static_assert((is_same<typename allocator_type::value_type, value_type>::value),
- "Allocator::value_type must be same type as value_type");
-
- typedef __deque_base<value_type, allocator_type> __base;
-
- typedef typename __base::__alloc_traits __alloc_traits;
- typedef typename __base::reference reference;
- typedef typename __base::const_reference const_reference;
- typedef typename __base::iterator iterator;
- typedef typename __base::const_iterator const_iterator;
- typedef typename __base::size_type size_type;
- typedef typename __base::difference_type difference_type;
-
- typedef typename __base::pointer pointer;
- typedef typename __base::const_pointer const_pointer;
- typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
- typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
-
- // construct/copy/destroy:
- _LIBCPP_INLINE_VISIBILITY
- deque()
- _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
- {}
- _LIBCPP_INLINE_VISIBILITY explicit deque(const allocator_type& __a) : __base(__a) {}
- explicit deque(size_type __n);
-#if _LIBCPP_STD_VER > 11
- explicit deque(size_type __n, const _Allocator& __a);
-#endif
- deque(size_type __n, const value_type& __v);
- deque(size_type __n, const value_type& __v, const allocator_type& __a);
- template <class _InputIter>
- deque(_InputIter __f, _InputIter __l,
- typename enable_if<__is_input_iterator<_InputIter>::value>::type* = 0);
- template <class _InputIter>
- deque(_InputIter __f, _InputIter __l, const allocator_type& __a,
- typename enable_if<__is_input_iterator<_InputIter>::value>::type* = 0);
- deque(const deque& __c);
- deque(const deque& __c, const allocator_type& __a);
-
- deque& operator=(const deque& __c);
-
-#ifndef _LIBCPP_CXX03_LANG
- deque(initializer_list<value_type> __il);
- deque(initializer_list<value_type> __il, const allocator_type& __a);
-
- _LIBCPP_INLINE_VISIBILITY
- deque& operator=(initializer_list<value_type> __il) {assign(__il); return *this;}
-
- _LIBCPP_INLINE_VISIBILITY
- deque(deque&& __c) _NOEXCEPT_(is_nothrow_move_constructible<__base>::value);
- _LIBCPP_INLINE_VISIBILITY
- deque(deque&& __c, const allocator_type& __a);
- _LIBCPP_INLINE_VISIBILITY
- deque& operator=(deque&& __c)
- _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value);
-
- _LIBCPP_INLINE_VISIBILITY
- void assign(initializer_list<value_type> __il) {assign(__il.begin(), __il.end());}
-#endif // _LIBCPP_CXX03_LANG
-
- template <class _InputIter>
- void assign(_InputIter __f, _InputIter __l,
- typename enable_if<__is_input_iterator<_InputIter>::value &&
- !__is_random_access_iterator<_InputIter>::value>::type* = 0);
- template <class _RAIter>
- void assign(_RAIter __f, _RAIter __l,
- typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
- void assign(size_type __n, const value_type& __v);
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const _NOEXCEPT;
-
- // iterators:
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT {return __base::begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT {return __base::begin();}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT {return __base::end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT {return __base::end();}
-
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rbegin() _NOEXCEPT
- {return reverse_iterator(__base::end());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rbegin() const _NOEXCEPT
- {return const_reverse_iterator(__base::end());}
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rend() _NOEXCEPT
- {return reverse_iterator(__base::begin());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rend() const _NOEXCEPT
- {return const_reverse_iterator(__base::begin());}
-
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const _NOEXCEPT
- {return __base::begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const _NOEXCEPT
- {return __base::end();}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crbegin() const _NOEXCEPT
- {return const_reverse_iterator(__base::end());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crend() const _NOEXCEPT
- {return const_reverse_iterator(__base::begin());}
-
- // capacity:
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT {return __base::size();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const _NOEXCEPT
- {return std::min<size_type>(
- __alloc_traits::max_size(__base::__alloc()),
- numeric_limits<difference_type>::max());}
- void resize(size_type __n);
- void resize(size_type __n, const value_type& __v);
- void shrink_to_fit() _NOEXCEPT;
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const _NOEXCEPT {return __base::size() == 0;}
-
- // element access:
- _LIBCPP_INLINE_VISIBILITY
- reference operator[](size_type __i);
- _LIBCPP_INLINE_VISIBILITY
- const_reference operator[](size_type __i) const;
- _LIBCPP_INLINE_VISIBILITY
- reference at(size_type __i);
- _LIBCPP_INLINE_VISIBILITY
- const_reference at(size_type __i) const;
- _LIBCPP_INLINE_VISIBILITY
- reference front();
- _LIBCPP_INLINE_VISIBILITY
- const_reference front() const;
- _LIBCPP_INLINE_VISIBILITY
- reference back();
- _LIBCPP_INLINE_VISIBILITY
- const_reference back() const;
-
- // 23.2.2.3 modifiers:
- void push_front(const value_type& __v);
- void push_back(const value_type& __v);
-#ifndef _LIBCPP_CXX03_LANG
-#if _LIBCPP_STD_VER > 14
- template <class... _Args> reference emplace_front(_Args&&... __args);
- template <class... _Args> reference emplace_back (_Args&&... __args);
-#else
- template <class... _Args> void emplace_front(_Args&&... __args);
- template <class... _Args> void emplace_back (_Args&&... __args);
-#endif
- template <class... _Args> iterator emplace(const_iterator __p, _Args&&... __args);
-
- void push_front(value_type&& __v);
- void push_back(value_type&& __v);
- iterator insert(const_iterator __p, value_type&& __v);
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __p, initializer_list<value_type> __il)
- {return insert(__p, __il.begin(), __il.end());}
-#endif // _LIBCPP_CXX03_LANG
- iterator insert(const_iterator __p, const value_type& __v);
- iterator insert(const_iterator __p, size_type __n, const value_type& __v);
- template <class _InputIter>
- iterator insert(const_iterator __p, _InputIter __f, _InputIter __l,
- typename enable_if<__is_input_iterator<_InputIter>::value
- &&!__is_forward_iterator<_InputIter>::value>::type* = 0);
- template <class _ForwardIterator>
- iterator insert(const_iterator __p, _ForwardIterator __f, _ForwardIterator __l,
- typename enable_if<__is_forward_iterator<_ForwardIterator>::value
- &&!__is_bidirectional_iterator<_ForwardIterator>::value>::type* = 0);
- template <class _BiIter>
- iterator insert(const_iterator __p, _BiIter __f, _BiIter __l,
- typename enable_if<__is_bidirectional_iterator<_BiIter>::value>::type* = 0);
-
- void pop_front();
- void pop_back();
- iterator erase(const_iterator __p);
- iterator erase(const_iterator __f, const_iterator __l);
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(deque& __c)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT;
-#else
- _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
- __is_nothrow_swappable<allocator_type>::value);
-#endif
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- bool __invariants() const {return __base::__invariants();}
-private:
- typedef typename __base::__map_const_pointer __map_const_pointer;
-
- _LIBCPP_INLINE_VISIBILITY
- static size_type __recommend_blocks(size_type __n)
- {
- return __n / __base::__block_size + (__n % __base::__block_size != 0);
- }
- _LIBCPP_INLINE_VISIBILITY
- size_type __capacity() const
- {
- return __base::__map_.size() == 0 ? 0 : __base::__map_.size() * __base::__block_size - 1;
- }
- _LIBCPP_INLINE_VISIBILITY
- size_type __front_spare() const
- {
- return __base::__start_;
- }
- _LIBCPP_INLINE_VISIBILITY
- size_type __back_spare() const
- {
- return __capacity() - (__base::__start_ + __base::size());
- }
-
- template <class _InpIter>
- void __append(_InpIter __f, _InpIter __l,
- typename enable_if<__is_input_iterator<_InpIter>::value &&
- !__is_forward_iterator<_InpIter>::value>::type* = 0);
- template <class _ForIter>
- void __append(_ForIter __f, _ForIter __l,
- typename enable_if<__is_forward_iterator<_ForIter>::value>::type* = 0);
- void __append(size_type __n);
- void __append(size_type __n, const value_type& __v);
- void __erase_to_end(const_iterator __f);
- void __add_front_capacity();
- void __add_front_capacity(size_type __n);
- void __add_back_capacity();
- void __add_back_capacity(size_type __n);
- iterator __move_and_check(iterator __f, iterator __l, iterator __r,
- const_pointer& __vt);
- iterator __move_backward_and_check(iterator __f, iterator __l, iterator __r,
- const_pointer& __vt);
- void __move_construct_and_check(iterator __f, iterator __l,
- iterator __r, const_pointer& __vt);
- void __move_construct_backward_and_check(iterator __f, iterator __l,
- iterator __r, const_pointer& __vt);
-
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const deque& __c)
- {__copy_assign_alloc(__c, integral_constant<bool,
- __alloc_traits::propagate_on_container_copy_assignment::value>());}
-
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const deque& __c, true_type)
- {
- if (__base::__alloc() != __c.__alloc())
- {
- clear();
- shrink_to_fit();
- }
- __base::__alloc() = __c.__alloc();
- __base::__map_.__alloc() = __c.__map_.__alloc();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const deque&, false_type)
- {}
-
- void __move_assign(deque& __c, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
- void __move_assign(deque& __c, false_type);
-};
-
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-template<class _InputIterator,
- class _Alloc = typename std::allocator<typename iterator_traits<_InputIterator>::value_type>,
- class = typename enable_if<__is_allocator<_Alloc>::value, void>::type
- >
-deque(_InputIterator, _InputIterator)
- -> deque<typename iterator_traits<_InputIterator>::value_type, _Alloc>;
-
-template<class _InputIterator,
- class _Alloc,
- class = typename enable_if<__is_allocator<_Alloc>::value, void>::type
- >
-deque(_InputIterator, _InputIterator, _Alloc)
- -> deque<typename iterator_traits<_InputIterator>::value_type, _Alloc>;
-#endif
-
-
-template <class _Tp, class _Allocator>
-deque<_Tp, _Allocator>::deque(size_type __n)
-{
- if (__n > 0)
- __append(__n);
-}
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp, class _Allocator>
-deque<_Tp, _Allocator>::deque(size_type __n, const _Allocator& __a)
- : __base(__a)
-{
- if (__n > 0)
- __append(__n);
-}
-#endif
-
-template <class _Tp, class _Allocator>
-deque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v)
-{
- if (__n > 0)
- __append(__n, __v);
-}
-
-template <class _Tp, class _Allocator>
-deque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v, const allocator_type& __a)
- : __base(__a)
-{
- if (__n > 0)
- __append(__n, __v);
-}
-
-template <class _Tp, class _Allocator>
-template <class _InputIter>
-deque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l,
- typename enable_if<__is_input_iterator<_InputIter>::value>::type*)
-{
- __append(__f, __l);
-}
-
-template <class _Tp, class _Allocator>
-template <class _InputIter>
-deque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l, const allocator_type& __a,
- typename enable_if<__is_input_iterator<_InputIter>::value>::type*)
- : __base(__a)
-{
- __append(__f, __l);
-}
-
-template <class _Tp, class _Allocator>
-deque<_Tp, _Allocator>::deque(const deque& __c)
- : __base(__alloc_traits::select_on_container_copy_construction(__c.__alloc()))
-{
- __append(__c.begin(), __c.end());
-}
-
-template <class _Tp, class _Allocator>
-deque<_Tp, _Allocator>::deque(const deque& __c, const allocator_type& __a)
- : __base(__a)
-{
- __append(__c.begin(), __c.end());
-}
-
-template <class _Tp, class _Allocator>
-deque<_Tp, _Allocator>&
-deque<_Tp, _Allocator>::operator=(const deque& __c)
-{
- if (this != &__c)
- {
- __copy_assign_alloc(__c);
- assign(__c.begin(), __c.end());
- }
- return *this;
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Allocator>
-deque<_Tp, _Allocator>::deque(initializer_list<value_type> __il)
-{
- __append(__il.begin(), __il.end());
-}
-
-template <class _Tp, class _Allocator>
-deque<_Tp, _Allocator>::deque(initializer_list<value_type> __il, const allocator_type& __a)
- : __base(__a)
-{
- __append(__il.begin(), __il.end());
-}
-
-template <class _Tp, class _Allocator>
-inline
-deque<_Tp, _Allocator>::deque(deque&& __c)
- _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
- : __base(_VSTD::move(__c))
-{
-}
-
-template <class _Tp, class _Allocator>
-inline
-deque<_Tp, _Allocator>::deque(deque&& __c, const allocator_type& __a)
- : __base(_VSTD::move(__c), __a)
-{
- if (__a != __c.__alloc())
- {
- typedef move_iterator<iterator> _Ip;
- assign(_Ip(__c.begin()), _Ip(__c.end()));
- }
-}
-
-template <class _Tp, class _Allocator>
-inline
-deque<_Tp, _Allocator>&
-deque<_Tp, _Allocator>::operator=(deque&& __c)
- _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value)
-{
- __move_assign(__c, integral_constant<bool,
- __alloc_traits::propagate_on_container_move_assignment::value>());
- return *this;
-}
-
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::__move_assign(deque& __c, false_type)
-{
- if (__base::__alloc() != __c.__alloc())
- {
- typedef move_iterator<iterator> _Ip;
- assign(_Ip(__c.begin()), _Ip(__c.end()));
- }
- else
- __move_assign(__c, true_type());
-}
-
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::__move_assign(deque& __c, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
-{
- clear();
- shrink_to_fit();
- __base::__move_assign(__c);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Allocator>
-template <class _InputIter>
-void
-deque<_Tp, _Allocator>::assign(_InputIter __f, _InputIter __l,
- typename enable_if<__is_input_iterator<_InputIter>::value &&
- !__is_random_access_iterator<_InputIter>::value>::type*)
-{
- iterator __i = __base::begin();
- iterator __e = __base::end();
- for (; __f != __l && __i != __e; ++__f, (void) ++__i)
- *__i = *__f;
- if (__f != __l)
- __append(__f, __l);
- else
- __erase_to_end(__i);
-}
-
-template <class _Tp, class _Allocator>
-template <class _RAIter>
-void
-deque<_Tp, _Allocator>::assign(_RAIter __f, _RAIter __l,
- typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
-{
- if (static_cast<size_type>(__l - __f) > __base::size())
- {
- _RAIter __m = __f + __base::size();
- _VSTD::copy(__f, __m, __base::begin());
- __append(__m, __l);
- }
- else
- __erase_to_end(_VSTD::copy(__f, __l, __base::begin()));
-}
-
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::assign(size_type __n, const value_type& __v)
-{
- if (__n > __base::size())
- {
- _VSTD::fill_n(__base::begin(), __base::size(), __v);
- __n -= __base::size();
- __append(__n, __v);
- }
- else
- __erase_to_end(_VSTD::fill_n(__base::begin(), __n, __v));
-}
-
-template <class _Tp, class _Allocator>
-inline
-_Allocator
-deque<_Tp, _Allocator>::get_allocator() const _NOEXCEPT
-{
- return __base::__alloc();
-}
-
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::resize(size_type __n)
-{
- if (__n > __base::size())
- __append(__n - __base::size());
- else if (__n < __base::size())
- __erase_to_end(__base::begin() + __n);
-}
-
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::resize(size_type __n, const value_type& __v)
-{
- if (__n > __base::size())
- __append(__n - __base::size(), __v);
- else if (__n < __base::size())
- __erase_to_end(__base::begin() + __n);
-}
-
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
-{
- allocator_type& __a = __base::__alloc();
- if (empty())
- {
- while (__base::__map_.size() > 0)
- {
- __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
- __base::__map_.pop_back();
- }
- __base::__start_ = 0;
- }
- else
- {
- if (__front_spare() >= __base::__block_size)
- {
- __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
- __base::__map_.pop_front();
- __base::__start_ -= __base::__block_size;
- }
- if (__back_spare() >= __base::__block_size)
- {
- __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
- __base::__map_.pop_back();
- }
- }
- __base::__map_.shrink_to_fit();
-}
-
-template <class _Tp, class _Allocator>
-inline
-typename deque<_Tp, _Allocator>::reference
-deque<_Tp, _Allocator>::operator[](size_type __i)
-{
- size_type __p = __base::__start_ + __i;
- return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
-}
-
-template <class _Tp, class _Allocator>
-inline
-typename deque<_Tp, _Allocator>::const_reference
-deque<_Tp, _Allocator>::operator[](size_type __i) const
-{
- size_type __p = __base::__start_ + __i;
- return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
-}
-
-template <class _Tp, class _Allocator>
-inline
-typename deque<_Tp, _Allocator>::reference
-deque<_Tp, _Allocator>::at(size_type __i)
-{
- if (__i >= __base::size())
- __base::__throw_out_of_range();
- size_type __p = __base::__start_ + __i;
- return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
-}
-
-template <class _Tp, class _Allocator>
-inline
-typename deque<_Tp, _Allocator>::const_reference
-deque<_Tp, _Allocator>::at(size_type __i) const
-{
- if (__i >= __base::size())
- __base::__throw_out_of_range();
- size_type __p = __base::__start_ + __i;
- return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
-}
-
-template <class _Tp, class _Allocator>
-inline
-typename deque<_Tp, _Allocator>::reference
-deque<_Tp, _Allocator>::front()
-{
- return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size)
- + __base::__start_ % __base::__block_size);
-}
-
-template <class _Tp, class _Allocator>
-inline
-typename deque<_Tp, _Allocator>::const_reference
-deque<_Tp, _Allocator>::front() const
-{
- return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size)
- + __base::__start_ % __base::__block_size);
-}
-
-template <class _Tp, class _Allocator>
-inline
-typename deque<_Tp, _Allocator>::reference
-deque<_Tp, _Allocator>::back()
-{
- size_type __p = __base::size() + __base::__start_ - 1;
- return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
-}
-
-template <class _Tp, class _Allocator>
-inline
-typename deque<_Tp, _Allocator>::const_reference
-deque<_Tp, _Allocator>::back() const
-{
- size_type __p = __base::size() + __base::__start_ - 1;
- return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
-}
-
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::push_back(const value_type& __v)
-{
- allocator_type& __a = __base::__alloc();
- if (__back_spare() == 0)
- __add_back_capacity();
- // __back_spare() >= 1
- __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), __v);
- ++__base::size();
-}
-
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::push_front(const value_type& __v)
-{
- allocator_type& __a = __base::__alloc();
- if (__front_spare() == 0)
- __add_front_capacity();
- // __front_spare() >= 1
- __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), __v);
- --__base::__start_;
- ++__base::size();
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::push_back(value_type&& __v)
-{
- allocator_type& __a = __base::__alloc();
- if (__back_spare() == 0)
- __add_back_capacity();
- // __back_spare() >= 1
- __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::move(__v));
- ++__base::size();
-}
-
-template <class _Tp, class _Allocator>
-template <class... _Args>
-#if _LIBCPP_STD_VER > 14
-typename deque<_Tp, _Allocator>::reference
-#else
-void
-#endif
-deque<_Tp, _Allocator>::emplace_back(_Args&&... __args)
-{
- allocator_type& __a = __base::__alloc();
- if (__back_spare() == 0)
- __add_back_capacity();
- // __back_spare() >= 1
- __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()),
- _VSTD::forward<_Args>(__args)...);
- ++__base::size();
-#if _LIBCPP_STD_VER > 14
- return *--__base::end();
-#endif
-}
-
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::push_front(value_type&& __v)
-{
- allocator_type& __a = __base::__alloc();
- if (__front_spare() == 0)
- __add_front_capacity();
- // __front_spare() >= 1
- __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::move(__v));
- --__base::__start_;
- ++__base::size();
-}
-
-
-template <class _Tp, class _Allocator>
-template <class... _Args>
-#if _LIBCPP_STD_VER > 14
-typename deque<_Tp, _Allocator>::reference
-#else
-void
-#endif
-deque<_Tp, _Allocator>::emplace_front(_Args&&... __args)
-{
- allocator_type& __a = __base::__alloc();
- if (__front_spare() == 0)
- __add_front_capacity();
- // __front_spare() >= 1
- __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::forward<_Args>(__args)...);
- --__base::__start_;
- ++__base::size();
-#if _LIBCPP_STD_VER > 14
- return *__base::begin();
-#endif
-}
-
-template <class _Tp, class _Allocator>
-typename deque<_Tp, _Allocator>::iterator
-deque<_Tp, _Allocator>::insert(const_iterator __p, value_type&& __v)
-{
- size_type __pos = __p - __base::begin();
- size_type __to_end = __base::size() - __pos;
- allocator_type& __a = __base::__alloc();
- if (__pos < __to_end)
- { // insert by shifting things backward
- if (__front_spare() == 0)
- __add_front_capacity();
- // __front_spare() >= 1
- if (__pos == 0)
- {
- __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::move(__v));
- --__base::__start_;
- ++__base::size();
- }
- else
- {
- iterator __b = __base::begin();
- iterator __bm1 = _VSTD::prev(__b);
- __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b));
- --__base::__start_;
- ++__base::size();
- if (__pos > 1)
- __b = _VSTD::move(_VSTD::next(__b), __b + __pos, __b);
- *__b = _VSTD::move(__v);
- }
- }
- else
- { // insert by shifting things forward
- if (__back_spare() == 0)
- __add_back_capacity();
- // __back_capacity >= 1
- size_type __de = __base::size() - __pos;
- if (__de == 0)
- {
- __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::move(__v));
- ++__base::size();
- }
- else
- {
- iterator __e = __base::end();
- iterator __em1 = _VSTD::prev(__e);
- __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1));
- ++__base::size();
- if (__de > 1)
- __e = _VSTD::move_backward(__e - __de, __em1, __e);
- *--__e = _VSTD::move(__v);
- }
- }
- return __base::begin() + __pos;
-}
-
-template <class _Tp, class _Allocator>
-template <class... _Args>
-typename deque<_Tp, _Allocator>::iterator
-deque<_Tp, _Allocator>::emplace(const_iterator __p, _Args&&... __args)
-{
- size_type __pos = __p - __base::begin();
- size_type __to_end = __base::size() - __pos;
- allocator_type& __a = __base::__alloc();
- if (__pos < __to_end)
- { // insert by shifting things backward
- if (__front_spare() == 0)
- __add_front_capacity();
- // __front_spare() >= 1
- if (__pos == 0)
- {
- __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::forward<_Args>(__args)...);
- --__base::__start_;
- ++__base::size();
- }
- else
- {
- __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...);
- iterator __b = __base::begin();
- iterator __bm1 = _VSTD::prev(__b);
- __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b));
- --__base::__start_;
- ++__base::size();
- if (__pos > 1)
- __b = _VSTD::move(_VSTD::next(__b), __b + __pos, __b);
- *__b = _VSTD::move(__tmp.get());
- }
- }
- else
- { // insert by shifting things forward
- if (__back_spare() == 0)
- __add_back_capacity();
- // __back_capacity >= 1
- size_type __de = __base::size() - __pos;
- if (__de == 0)
- {
- __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::forward<_Args>(__args)...);
- ++__base::size();
- }
- else
- {
- __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...);
- iterator __e = __base::end();
- iterator __em1 = _VSTD::prev(__e);
- __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1));
- ++__base::size();
- if (__de > 1)
- __e = _VSTD::move_backward(__e - __de, __em1, __e);
- *--__e = _VSTD::move(__tmp.get());
- }
- }
- return __base::begin() + __pos;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-
-template <class _Tp, class _Allocator>
-typename deque<_Tp, _Allocator>::iterator
-deque<_Tp, _Allocator>::insert(const_iterator __p, const value_type& __v)
-{
- size_type __pos = __p - __base::begin();
- size_type __to_end = __base::size() - __pos;
- allocator_type& __a = __base::__alloc();
- if (__pos < __to_end)
- { // insert by shifting things backward
- if (__front_spare() == 0)
- __add_front_capacity();
- // __front_spare() >= 1
- if (__pos == 0)
- {
- __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), __v);
- --__base::__start_;
- ++__base::size();
- }
- else
- {
- const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
- iterator __b = __base::begin();
- iterator __bm1 = _VSTD::prev(__b);
- if (__vt == pointer_traits<const_pointer>::pointer_to(*__b))
- __vt = pointer_traits<const_pointer>::pointer_to(*__bm1);
- __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b));
- --__base::__start_;
- ++__base::size();
- if (__pos > 1)
- __b = __move_and_check(_VSTD::next(__b), __b + __pos, __b, __vt);
- *__b = *__vt;
- }
- }
- else
- { // insert by shifting things forward
- if (__back_spare() == 0)
- __add_back_capacity();
- // __back_capacity >= 1
- size_type __de = __base::size() - __pos;
- if (__de == 0)
- {
- __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), __v);
- ++__base::size();
- }
- else
- {
- const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
- iterator __e = __base::end();
- iterator __em1 = _VSTD::prev(__e);
- if (__vt == pointer_traits<const_pointer>::pointer_to(*__em1))
- __vt = pointer_traits<const_pointer>::pointer_to(*__e);
- __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1));
- ++__base::size();
- if (__de > 1)
- __e = __move_backward_and_check(__e - __de, __em1, __e, __vt);
- *--__e = *__vt;
- }
- }
- return __base::begin() + __pos;
-}
-
-template <class _Tp, class _Allocator>
-typename deque<_Tp, _Allocator>::iterator
-deque<_Tp, _Allocator>::insert(const_iterator __p, size_type __n, const value_type& __v)
-{
- size_type __pos = __p - __base::begin();
- size_type __to_end = __base::size() - __pos;
- allocator_type& __a = __base::__alloc();
- if (__pos < __to_end)
- { // insert by shifting things backward
- if (__n > __front_spare())
- __add_front_capacity(__n - __front_spare());
- // __n <= __front_spare()
- iterator __old_begin = __base::begin();
- iterator __i = __old_begin;
- if (__n > __pos)
- {
- for (size_type __m = __n - __pos; __m; --__m, --__base::__start_, ++__base::size())
- __alloc_traits::construct(__a, _VSTD::addressof(*--__i), __v);
- __n = __pos;
- }
- if (__n > 0)
- {
- const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
- iterator __obn = __old_begin + __n;
- __move_construct_backward_and_check(__old_begin, __obn, __i, __vt);
- if (__n < __pos)
- __old_begin = __move_and_check(__obn, __old_begin + __pos, __old_begin, __vt);
- _VSTD::fill_n(__old_begin, __n, *__vt);
- }
- }
- else
- { // insert by shifting things forward
- size_type __back_capacity = __back_spare();
- if (__n > __back_capacity)
- __add_back_capacity(__n - __back_capacity);
- // __n <= __back_capacity
- iterator __old_end = __base::end();
- iterator __i = __old_end;
- size_type __de = __base::size() - __pos;
- if (__n > __de)
- {
- for (size_type __m = __n - __de; __m; --__m, ++__i, ++__base::size())
- __alloc_traits::construct(__a, _VSTD::addressof(*__i), __v);
- __n = __de;
- }
- if (__n > 0)
- {
- const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
- iterator __oen = __old_end - __n;
- __move_construct_and_check(__oen, __old_end, __i, __vt);
- if (__n < __de)
- __old_end = __move_backward_and_check(__old_end - __de, __oen, __old_end, __vt);
- _VSTD::fill_n(__old_end - __n, __n, *__vt);
- }
- }
- return __base::begin() + __pos;
-}
-
-template <class _Tp, class _Allocator>
-template <class _InputIter>
-typename deque<_Tp, _Allocator>::iterator
-deque<_Tp, _Allocator>::insert(const_iterator __p, _InputIter __f, _InputIter __l,
- typename enable_if<__is_input_iterator<_InputIter>::value
- &&!__is_forward_iterator<_InputIter>::value>::type*)
-{
- __split_buffer<value_type, allocator_type&> __buf(__base::__alloc());
- __buf.__construct_at_end(__f, __l);
- typedef typename __split_buffer<value_type, allocator_type&>::iterator __bi;
- return insert(__p, move_iterator<__bi>(__buf.begin()), move_iterator<__bi>(__buf.end()));
-}
-
-template <class _Tp, class _Allocator>
-template <class _ForwardIterator>
-typename deque<_Tp, _Allocator>::iterator
-deque<_Tp, _Allocator>::insert(const_iterator __p, _ForwardIterator __f, _ForwardIterator __l,
- typename enable_if<__is_forward_iterator<_ForwardIterator>::value
- &&!__is_bidirectional_iterator<_ForwardIterator>::value>::type*)
-{
- size_type __n = _VSTD::distance(__f, __l);
- __split_buffer<value_type, allocator_type&> __buf(__n, 0, __base::__alloc());
- __buf.__construct_at_end(__f, __l);
- typedef typename __split_buffer<value_type, allocator_type&>::iterator __fwd;
- return insert(__p, move_iterator<__fwd>(__buf.begin()), move_iterator<__fwd>(__buf.end()));
-}
-
-template <class _Tp, class _Allocator>
-template <class _BiIter>
-typename deque<_Tp, _Allocator>::iterator
-deque<_Tp, _Allocator>::insert(const_iterator __p, _BiIter __f, _BiIter __l,
- typename enable_if<__is_bidirectional_iterator<_BiIter>::value>::type*)
-{
- size_type __n = _VSTD::distance(__f, __l);
- size_type __pos = __p - __base::begin();
- size_type __to_end = __base::size() - __pos;
- allocator_type& __a = __base::__alloc();
- if (__pos < __to_end)
- { // insert by shifting things backward
- if (__n > __front_spare())
- __add_front_capacity(__n - __front_spare());
- // __n <= __front_spare()
- iterator __old_begin = __base::begin();
- iterator __i = __old_begin;
- _BiIter __m = __f;
- if (__n > __pos)
- {
- __m = __pos < __n / 2 ? _VSTD::prev(__l, __pos) : _VSTD::next(__f, __n - __pos);
- for (_BiIter __j = __m; __j != __f; --__base::__start_, ++__base::size())
- __alloc_traits::construct(__a, _VSTD::addressof(*--__i), *--__j);
- __n = __pos;
- }
- if (__n > 0)
- {
- iterator __obn = __old_begin + __n;
- for (iterator __j = __obn; __j != __old_begin;)
- {
- __alloc_traits::construct(__a, _VSTD::addressof(*--__i), _VSTD::move(*--__j));
- --__base::__start_;
- ++__base::size();
- }
- if (__n < __pos)
- __old_begin = _VSTD::move(__obn, __old_begin + __pos, __old_begin);
- _VSTD::copy(__m, __l, __old_begin);
- }
- }
- else
- { // insert by shifting things forward
- size_type __back_capacity = __back_spare();
- if (__n > __back_capacity)
- __add_back_capacity(__n - __back_capacity);
- // __n <= __back_capacity
- iterator __old_end = __base::end();
- iterator __i = __old_end;
- _BiIter __m = __l;
- size_type __de = __base::size() - __pos;
- if (__n > __de)
- {
- __m = __de < __n / 2 ? _VSTD::next(__f, __de) : _VSTD::prev(__l, __n - __de);
- for (_BiIter __j = __m; __j != __l; ++__i, (void) ++__j, ++__base::size())
- __alloc_traits::construct(__a, _VSTD::addressof(*__i), *__j);
- __n = __de;
- }
- if (__n > 0)
- {
- iterator __oen = __old_end - __n;
- for (iterator __j = __oen; __j != __old_end; ++__i, ++__j, ++__base::size())
- __alloc_traits::construct(__a, _VSTD::addressof(*__i), _VSTD::move(*__j));
- if (__n < __de)
- __old_end = _VSTD::move_backward(__old_end - __de, __oen, __old_end);
- _VSTD::copy_backward(__f, __m, __old_end);
- }
- }
- return __base::begin() + __pos;
-}
-
-template <class _Tp, class _Allocator>
-template <class _InpIter>
-void
-deque<_Tp, _Allocator>::__append(_InpIter __f, _InpIter __l,
- typename enable_if<__is_input_iterator<_InpIter>::value &&
- !__is_forward_iterator<_InpIter>::value>::type*)
-{
- for (; __f != __l; ++__f)
-#ifdef _LIBCPP_CXX03_LANG
- push_back(*__f);
-#else
- emplace_back(*__f);
-#endif
-}
-
-template <class _Tp, class _Allocator>
-template <class _ForIter>
-void
-deque<_Tp, _Allocator>::__append(_ForIter __f, _ForIter __l,
- typename enable_if<__is_forward_iterator<_ForIter>::value>::type*)
-{
- size_type __n = _VSTD::distance(__f, __l);
- allocator_type& __a = __base::__alloc();
- size_type __back_capacity = __back_spare();
- if (__n > __back_capacity)
- __add_back_capacity(__n - __back_capacity);
- // __n <= __back_capacity
- for (iterator __i = __base::end(); __f != __l; ++__i, (void) ++__f, ++__base::size())
- __alloc_traits::construct(__a, _VSTD::addressof(*__i), *__f);
-}
-
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::__append(size_type __n)
-{
- allocator_type& __a = __base::__alloc();
- size_type __back_capacity = __back_spare();
- if (__n > __back_capacity)
- __add_back_capacity(__n - __back_capacity);
- // __n <= __back_capacity
- for (iterator __i = __base::end(); __n; --__n, ++__i, ++__base::size())
- __alloc_traits::construct(__a, _VSTD::addressof(*__i));
-}
-
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::__append(size_type __n, const value_type& __v)
-{
- allocator_type& __a = __base::__alloc();
- size_type __back_capacity = __back_spare();
- if (__n > __back_capacity)
- __add_back_capacity(__n - __back_capacity);
- // __n <= __back_capacity
- for (iterator __i = __base::end(); __n; --__n, ++__i, ++__base::size())
- __alloc_traits::construct(__a, _VSTD::addressof(*__i), __v);
-}
-
-// Create front capacity for one block of elements.
-// Strong guarantee. Either do it or don't touch anything.
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::__add_front_capacity()
-{
- allocator_type& __a = __base::__alloc();
- if (__back_spare() >= __base::__block_size)
- {
- __base::__start_ += __base::__block_size;
- pointer __pt = __base::__map_.back();
- __base::__map_.pop_back();
- __base::__map_.push_front(__pt);
- }
- // Else if __base::__map_.size() < __base::__map_.capacity() then we need to allocate 1 buffer
- else if (__base::__map_.size() < __base::__map_.capacity())
- { // we can put the new buffer into the map, but don't shift things around
- // until all buffers are allocated. If we throw, we don't need to fix
- // anything up (any added buffers are undetectible)
- if (__base::__map_.__front_spare() > 0)
- __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
- else
- {
- __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
- // Done allocating, reorder capacity
- pointer __pt = __base::__map_.back();
- __base::__map_.pop_back();
- __base::__map_.push_front(__pt);
- }
- __base::__start_ = __base::__map_.size() == 1 ?
- __base::__block_size / 2 :
- __base::__start_ + __base::__block_size;
- }
- // Else need to allocate 1 buffer, *and* we need to reallocate __map_.
- else
- {
- __split_buffer<pointer, typename __base::__pointer_allocator&>
- __buf(max<size_type>(2 * __base::__map_.capacity(), 1),
- 0, __base::__map_.__alloc());
-
- typedef __allocator_destructor<_Allocator> _Dp;
- unique_ptr<pointer, _Dp> __hold(
- __alloc_traits::allocate(__a, __base::__block_size),
- _Dp(__a, __base::__block_size));
- __buf.push_back(__hold.get());
- __hold.release();
-
- for (typename __base::__map_pointer __i = __base::__map_.begin();
- __i != __base::__map_.end(); ++__i)
- __buf.push_back(*__i);
- _VSTD::swap(__base::__map_.__first_, __buf.__first_);
- _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
- _VSTD::swap(__base::__map_.__end_, __buf.__end_);
- _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
- __base::__start_ = __base::__map_.size() == 1 ?
- __base::__block_size / 2 :
- __base::__start_ + __base::__block_size;
- }
-}
-
-// Create front capacity for __n elements.
-// Strong guarantee. Either do it or don't touch anything.
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::__add_front_capacity(size_type __n)
-{
- allocator_type& __a = __base::__alloc();
- size_type __nb = __recommend_blocks(__n + __base::__map_.empty());
- // Number of unused blocks at back:
- size_type __back_capacity = __back_spare() / __base::__block_size;
- __back_capacity = _VSTD::min(__back_capacity, __nb); // don't take more than you need
- __nb -= __back_capacity; // number of blocks need to allocate
- // If __nb == 0, then we have sufficient capacity.
- if (__nb == 0)
- {
- __base::__start_ += __base::__block_size * __back_capacity;
- for (; __back_capacity > 0; --__back_capacity)
- {
- pointer __pt = __base::__map_.back();
- __base::__map_.pop_back();
- __base::__map_.push_front(__pt);
- }
- }
- // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
- else if (__nb <= __base::__map_.capacity() - __base::__map_.size())
- { // we can put the new buffers into the map, but don't shift things around
- // until all buffers are allocated. If we throw, we don't need to fix
- // anything up (any added buffers are undetectible)
- for (; __nb > 0; --__nb, __base::__start_ += __base::__block_size - (__base::__map_.size() == 1))
- {
- if (__base::__map_.__front_spare() == 0)
- break;
- __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
- }
- for (; __nb > 0; --__nb, ++__back_capacity)
- __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
- // Done allocating, reorder capacity
- __base::__start_ += __back_capacity * __base::__block_size;
- for (; __back_capacity > 0; --__back_capacity)
- {
- pointer __pt = __base::__map_.back();
- __base::__map_.pop_back();
- __base::__map_.push_front(__pt);
- }
- }
- // Else need to allocate __nb buffers, *and* we need to reallocate __map_.
- else
- {
- size_type __ds = (__nb + __back_capacity) * __base::__block_size - __base::__map_.empty();
- __split_buffer<pointer, typename __base::__pointer_allocator&>
- __buf(max<size_type>(2* __base::__map_.capacity(),
- __nb + __base::__map_.size()),
- 0, __base::__map_.__alloc());
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (; __nb > 0; --__nb)
- __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size));
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- for (typename __base::__map_pointer __i = __buf.begin();
- __i != __buf.end(); ++__i)
- __alloc_traits::deallocate(__a, *__i, __base::__block_size);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (; __back_capacity > 0; --__back_capacity)
- {
- __buf.push_back(__base::__map_.back());
- __base::__map_.pop_back();
- }
- for (typename __base::__map_pointer __i = __base::__map_.begin();
- __i != __base::__map_.end(); ++__i)
- __buf.push_back(*__i);
- _VSTD::swap(__base::__map_.__first_, __buf.__first_);
- _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
- _VSTD::swap(__base::__map_.__end_, __buf.__end_);
- _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
- __base::__start_ += __ds;
- }
-}
-
-// Create back capacity for one block of elements.
-// Strong guarantee. Either do it or don't touch anything.
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::__add_back_capacity()
-{
- allocator_type& __a = __base::__alloc();
- if (__front_spare() >= __base::__block_size)
- {
- __base::__start_ -= __base::__block_size;
- pointer __pt = __base::__map_.front();
- __base::__map_.pop_front();
- __base::__map_.push_back(__pt);
- }
- // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
- else if (__base::__map_.size() < __base::__map_.capacity())
- { // we can put the new buffer into the map, but don't shift things around
- // until it is allocated. If we throw, we don't need to fix
- // anything up (any added buffers are undetectible)
- if (__base::__map_.__back_spare() != 0)
- __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
- else
- {
- __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
- // Done allocating, reorder capacity
- pointer __pt = __base::__map_.front();
- __base::__map_.pop_front();
- __base::__map_.push_back(__pt);
- }
- }
- // Else need to allocate 1 buffer, *and* we need to reallocate __map_.
- else
- {
- __split_buffer<pointer, typename __base::__pointer_allocator&>
- __buf(max<size_type>(2* __base::__map_.capacity(), 1),
- __base::__map_.size(),
- __base::__map_.__alloc());
-
- typedef __allocator_destructor<_Allocator> _Dp;
- unique_ptr<pointer, _Dp> __hold(
- __alloc_traits::allocate(__a, __base::__block_size),
- _Dp(__a, __base::__block_size));
- __buf.push_back(__hold.get());
- __hold.release();
-
- for (typename __base::__map_pointer __i = __base::__map_.end();
- __i != __base::__map_.begin();)
- __buf.push_front(*--__i);
- _VSTD::swap(__base::__map_.__first_, __buf.__first_);
- _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
- _VSTD::swap(__base::__map_.__end_, __buf.__end_);
- _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
- }
-}
-
-// Create back capacity for __n elements.
-// Strong guarantee. Either do it or don't touch anything.
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::__add_back_capacity(size_type __n)
-{
- allocator_type& __a = __base::__alloc();
- size_type __nb = __recommend_blocks(__n + __base::__map_.empty());
- // Number of unused blocks at front:
- size_type __front_capacity = __front_spare() / __base::__block_size;
- __front_capacity = _VSTD::min(__front_capacity, __nb); // don't take more than you need
- __nb -= __front_capacity; // number of blocks need to allocate
- // If __nb == 0, then we have sufficient capacity.
- if (__nb == 0)
- {
- __base::__start_ -= __base::__block_size * __front_capacity;
- for (; __front_capacity > 0; --__front_capacity)
- {
- pointer __pt = __base::__map_.front();
- __base::__map_.pop_front();
- __base::__map_.push_back(__pt);
- }
- }
- // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
- else if (__nb <= __base::__map_.capacity() - __base::__map_.size())
- { // we can put the new buffers into the map, but don't shift things around
- // until all buffers are allocated. If we throw, we don't need to fix
- // anything up (any added buffers are undetectible)
- for (; __nb > 0; --__nb)
- {
- if (__base::__map_.__back_spare() == 0)
- break;
- __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
- }
- for (; __nb > 0; --__nb, ++__front_capacity, __base::__start_ +=
- __base::__block_size - (__base::__map_.size() == 1))
- __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
- // Done allocating, reorder capacity
- __base::__start_ -= __base::__block_size * __front_capacity;
- for (; __front_capacity > 0; --__front_capacity)
- {
- pointer __pt = __base::__map_.front();
- __base::__map_.pop_front();
- __base::__map_.push_back(__pt);
- }
- }
- // Else need to allocate __nb buffers, *and* we need to reallocate __map_.
- else
- {
- size_type __ds = __front_capacity * __base::__block_size;
- __split_buffer<pointer, typename __base::__pointer_allocator&>
- __buf(max<size_type>(2* __base::__map_.capacity(),
- __nb + __base::__map_.size()),
- __base::__map_.size() - __front_capacity,
- __base::__map_.__alloc());
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (; __nb > 0; --__nb)
- __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size));
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- for (typename __base::__map_pointer __i = __buf.begin();
- __i != __buf.end(); ++__i)
- __alloc_traits::deallocate(__a, *__i, __base::__block_size);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (; __front_capacity > 0; --__front_capacity)
- {
- __buf.push_back(__base::__map_.front());
- __base::__map_.pop_front();
- }
- for (typename __base::__map_pointer __i = __base::__map_.end();
- __i != __base::__map_.begin();)
- __buf.push_front(*--__i);
- _VSTD::swap(__base::__map_.__first_, __buf.__first_);
- _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
- _VSTD::swap(__base::__map_.__end_, __buf.__end_);
- _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
- __base::__start_ -= __ds;
- }
-}
-
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::pop_front()
-{
- allocator_type& __a = __base::__alloc();
- __alloc_traits::destroy(__a, __to_raw_pointer(*(__base::__map_.begin() +
- __base::__start_ / __base::__block_size) +
- __base::__start_ % __base::__block_size));
- --__base::size();
- if (++__base::__start_ >= 2 * __base::__block_size)
- {
- __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
- __base::__map_.pop_front();
- __base::__start_ -= __base::__block_size;
- }
-}
-
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::pop_back()
-{
- _LIBCPP_ASSERT(!empty(), "deque::pop_back called for empty deque");
- allocator_type& __a = __base::__alloc();
- size_type __p = __base::size() + __base::__start_ - 1;
- __alloc_traits::destroy(__a, __to_raw_pointer(*(__base::__map_.begin() +
- __p / __base::__block_size) +
- __p % __base::__block_size));
- --__base::size();
- if (__back_spare() >= 2 * __base::__block_size)
- {
- __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
- __base::__map_.pop_back();
- }
-}
-
-// move assign [__f, __l) to [__r, __r + (__l-__f)).
-// If __vt points into [__f, __l), then subtract (__f - __r) from __vt.
-template <class _Tp, class _Allocator>
-typename deque<_Tp, _Allocator>::iterator
-deque<_Tp, _Allocator>::__move_and_check(iterator __f, iterator __l, iterator __r,
- const_pointer& __vt)
-{
- // as if
- // for (; __f != __l; ++__f, ++__r)
- // *__r = _VSTD::move(*__f);
- difference_type __n = __l - __f;
- while (__n > 0)
- {
- pointer __fb = __f.__ptr_;
- pointer __fe = *__f.__m_iter_ + __base::__block_size;
- difference_type __bs = __fe - __fb;
- if (__bs > __n)
- {
- __bs = __n;
- __fe = __fb + __bs;
- }
- if (__fb <= __vt && __vt < __fe)
- __vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) -= __f - __r).__ptr_;
- __r = _VSTD::move(__fb, __fe, __r);
- __n -= __bs;
- __f += __bs;
- }
- return __r;
-}
-
-// move assign [__f, __l) to [__r - (__l-__f), __r) backwards.
-// If __vt points into [__f, __l), then add (__r - __l) to __vt.
-template <class _Tp, class _Allocator>
-typename deque<_Tp, _Allocator>::iterator
-deque<_Tp, _Allocator>::__move_backward_and_check(iterator __f, iterator __l, iterator __r,
- const_pointer& __vt)
-{
- // as if
- // while (__f != __l)
- // *--__r = _VSTD::move(*--__l);
- difference_type __n = __l - __f;
- while (__n > 0)
- {
- --__l;
- pointer __lb = *__l.__m_iter_;
- pointer __le = __l.__ptr_ + 1;
- difference_type __bs = __le - __lb;
- if (__bs > __n)
- {
- __bs = __n;
- __lb = __le - __bs;
- }
- if (__lb <= __vt && __vt < __le)
- __vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) += __r - __l - 1).__ptr_;
- __r = _VSTD::move_backward(__lb, __le, __r);
- __n -= __bs;
- __l -= __bs - 1;
- }
- return __r;
-}
-
-// move construct [__f, __l) to [__r, __r + (__l-__f)).
-// If __vt points into [__f, __l), then add (__r - __f) to __vt.
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::__move_construct_and_check(iterator __f, iterator __l,
- iterator __r, const_pointer& __vt)
-{
- allocator_type& __a = __base::__alloc();
- // as if
- // for (; __f != __l; ++__r, ++__f, ++__base::size())
- // __alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__f));
- difference_type __n = __l - __f;
- while (__n > 0)
- {
- pointer __fb = __f.__ptr_;
- pointer __fe = *__f.__m_iter_ + __base::__block_size;
- difference_type __bs = __fe - __fb;
- if (__bs > __n)
- {
- __bs = __n;
- __fe = __fb + __bs;
- }
- if (__fb <= __vt && __vt < __fe)
- __vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) += __r - __f).__ptr_;
- for (; __fb != __fe; ++__fb, ++__r, ++__base::size())
- __alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__fb));
- __n -= __bs;
- __f += __bs;
- }
-}
-
-// move construct [__f, __l) to [__r - (__l-__f), __r) backwards.
-// If __vt points into [__f, __l), then subtract (__l - __r) from __vt.
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::__move_construct_backward_and_check(iterator __f, iterator __l,
- iterator __r, const_pointer& __vt)
-{
- allocator_type& __a = __base::__alloc();
- // as if
- // for (iterator __j = __l; __j != __f;)
- // {
- // __alloc_traitsconstruct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__j));
- // --__base::__start_;
- // ++__base::size();
- // }
- difference_type __n = __l - __f;
- while (__n > 0)
- {
- --__l;
- pointer __lb = *__l.__m_iter_;
- pointer __le = __l.__ptr_ + 1;
- difference_type __bs = __le - __lb;
- if (__bs > __n)
- {
- __bs = __n;
- __lb = __le - __bs;
- }
- if (__lb <= __vt && __vt < __le)
- __vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) -= __l - __r + 1).__ptr_;
- while (__le != __lb)
- {
- __alloc_traits::construct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__le));
- --__base::__start_;
- ++__base::size();
- }
- __n -= __bs;
- __l -= __bs - 1;
- }
-}
-
-template <class _Tp, class _Allocator>
-typename deque<_Tp, _Allocator>::iterator
-deque<_Tp, _Allocator>::erase(const_iterator __f)
-{
- iterator __b = __base::begin();
- difference_type __pos = __f - __b;
- iterator __p = __b + __pos;
- allocator_type& __a = __base::__alloc();
- if (static_cast<size_t>(__pos) <= (__base::size() - 1) / 2)
- { // erase from front
- _VSTD::move_backward(__b, __p, _VSTD::next(__p));
- __alloc_traits::destroy(__a, _VSTD::addressof(*__b));
- --__base::size();
- ++__base::__start_;
- if (__front_spare() >= 2 * __base::__block_size)
- {
- __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
- __base::__map_.pop_front();
- __base::__start_ -= __base::__block_size;
- }
- }
- else
- { // erase from back
- iterator __i = _VSTD::move(_VSTD::next(__p), __base::end(), __p);
- __alloc_traits::destroy(__a, _VSTD::addressof(*__i));
- --__base::size();
- if (__back_spare() >= 2 * __base::__block_size)
- {
- __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
- __base::__map_.pop_back();
- }
- }
- return __base::begin() + __pos;
-}
-
-template <class _Tp, class _Allocator>
-typename deque<_Tp, _Allocator>::iterator
-deque<_Tp, _Allocator>::erase(const_iterator __f, const_iterator __l)
-{
- difference_type __n = __l - __f;
- iterator __b = __base::begin();
- difference_type __pos = __f - __b;
- iterator __p = __b + __pos;
- if (__n > 0)
- {
- allocator_type& __a = __base::__alloc();
- if (static_cast<size_t>(__pos) <= (__base::size() - __n) / 2)
- { // erase from front
- iterator __i = _VSTD::move_backward(__b, __p, __p + __n);
- for (; __b != __i; ++__b)
- __alloc_traits::destroy(__a, _VSTD::addressof(*__b));
- __base::size() -= __n;
- __base::__start_ += __n;
- while (__front_spare() >= 2 * __base::__block_size)
- {
- __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
- __base::__map_.pop_front();
- __base::__start_ -= __base::__block_size;
- }
- }
- else
- { // erase from back
- iterator __i = _VSTD::move(__p + __n, __base::end(), __p);
- for (iterator __e = __base::end(); __i != __e; ++__i)
- __alloc_traits::destroy(__a, _VSTD::addressof(*__i));
- __base::size() -= __n;
- while (__back_spare() >= 2 * __base::__block_size)
- {
- __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
- __base::__map_.pop_back();
- }
- }
- }
- return __base::begin() + __pos;
-}
-
-template <class _Tp, class _Allocator>
-void
-deque<_Tp, _Allocator>::__erase_to_end(const_iterator __f)
-{
- iterator __e = __base::end();
- difference_type __n = __e - __f;
- if (__n > 0)
- {
- allocator_type& __a = __base::__alloc();
- iterator __b = __base::begin();
- difference_type __pos = __f - __b;
- for (iterator __p = __b + __pos; __p != __e; ++__p)
- __alloc_traits::destroy(__a, _VSTD::addressof(*__p));
- __base::size() -= __n;
- while (__back_spare() >= 2 * __base::__block_size)
- {
- __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
- __base::__map_.pop_back();
- }
- }
-}
-
-template <class _Tp, class _Allocator>
-inline
-void
-deque<_Tp, _Allocator>::swap(deque& __c)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT
-#else
- _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
- __is_nothrow_swappable<allocator_type>::value)
-#endif
-{
- __base::swap(__c);
-}
-
-template <class _Tp, class _Allocator>
-inline
-void
-deque<_Tp, _Allocator>::clear() _NOEXCEPT
-{
- __base::clear();
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
-{
- const typename deque<_Tp, _Allocator>::size_type __sz = __x.size();
- return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator< (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
-{
- return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator> (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
-{
- return __y < __x;
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
-{
- return !(__x < __y);
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
-{
- return !(__y < __x);
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(deque<_Tp, _Allocator>& __x, deque<_Tp, _Allocator>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-#if _LIBCPP_STD_VER > 17
-template <class _Tp, class _Allocator, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase(deque<_Tp, _Allocator>& __c, const _Up& __v)
-{ __c.erase(_VSTD::remove(__c.begin(), __c.end(), __v), __c.end()); }
-
-template <class _Tp, class _Allocator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase_if(deque<_Tp, _Allocator>& __c, _Predicate __pred)
-{ __c.erase(_VSTD::remove_if(__c.begin(), __c.end(), __pred), __c.end()); }
-#endif
-
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_DEQUE
diff --git a/lib/libcxx/include/errno.h b/lib/libcxx/include/errno.h
deleted file mode 100644
index ee6429110cc..00000000000
--- a/lib/libcxx/include/errno.h
+++ /dev/null
@@ -1,398 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- errno.h -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_ERRNO_H
-#define _LIBCPP_ERRNO_H
-
-/*
- errno.h synopsis
-
-Macros:
-
- EDOM
- EILSEQ // C99
- ERANGE
- errno
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#include_next <errno.h>
-
-#ifdef __cplusplus
-
-#if !defined(EOWNERDEAD) || !defined(ENOTRECOVERABLE)
-
-#ifdef ELAST
-
-static const int __elast1 = ELAST+1;
-static const int __elast2 = ELAST+2;
-
-#else
-
-static const int __elast1 = 104;
-static const int __elast2 = 105;
-
-#endif
-
-#ifdef ENOTRECOVERABLE
-
-#define EOWNERDEAD __elast1
-
-#ifdef ELAST
-#undef ELAST
-#define ELAST EOWNERDEAD
-#endif
-
-#elif defined(EOWNERDEAD)
-
-#define ENOTRECOVERABLE __elast1
-#ifdef ELAST
-#undef ELAST
-#define ELAST ENOTRECOVERABLE
-#endif
-
-#else // defined(EOWNERDEAD)
-
-#define EOWNERDEAD __elast1
-#define ENOTRECOVERABLE __elast2
-#ifdef ELAST
-#undef ELAST
-#define ELAST ENOTRECOVERABLE
-#endif
-
-#endif // defined(EOWNERDEAD)
-
-#endif // !defined(EOWNERDEAD) || !defined(ENOTRECOVERABLE)
-
-// supply errno values likely to be missing, particularly on Windows
-
-#ifndef EAFNOSUPPORT
-#define EAFNOSUPPORT 9901
-#endif
-
-#ifndef EADDRINUSE
-#define EADDRINUSE 9902
-#endif
-
-#ifndef EADDRNOTAVAIL
-#define EADDRNOTAVAIL 9903
-#endif
-
-#ifndef EISCONN
-#define EISCONN 9904
-#endif
-
-#ifndef EBADMSG
-#define EBADMSG 9905
-#endif
-
-#ifndef ECONNABORTED
-#define ECONNABORTED 9906
-#endif
-
-#ifndef EALREADY
-#define EALREADY 9907
-#endif
-
-#ifndef ECONNREFUSED
-#define ECONNREFUSED 9908
-#endif
-
-#ifndef ECONNRESET
-#define ECONNRESET 9909
-#endif
-
-#ifndef EDESTADDRREQ
-#define EDESTADDRREQ 9910
-#endif
-
-#ifndef EHOSTUNREACH
-#define EHOSTUNREACH 9911
-#endif
-
-#ifndef EIDRM
-#define EIDRM 9912
-#endif
-
-#ifndef EMSGSIZE
-#define EMSGSIZE 9913
-#endif
-
-#ifndef ENETDOWN
-#define ENETDOWN 9914
-#endif
-
-#ifndef ENETRESET
-#define ENETRESET 9915
-#endif
-
-#ifndef ENETUNREACH
-#define ENETUNREACH 9916
-#endif
-
-#ifndef ENOBUFS
-#define ENOBUFS 9917
-#endif
-
-#ifndef ENOLINK
-#define ENOLINK 9918
-#endif
-
-#ifndef ENODATA
-#define ENODATA 9919
-#endif
-
-#ifndef ENOMSG
-#define ENOMSG 9920
-#endif
-
-#ifndef ENOPROTOOPT
-#define ENOPROTOOPT 9921
-#endif
-
-#ifndef ENOSR
-#define ENOSR 9922
-#endif
-
-#ifndef ENOTSOCK
-#define ENOTSOCK 9923
-#endif
-
-#ifndef ENOSTR
-#define ENOSTR 9924
-#endif
-
-#ifndef ENOTCONN
-#define ENOTCONN 9925
-#endif
-
-#ifndef ENOTSUP
-#define ENOTSUP 9926
-#endif
-
-#ifndef ECANCELED
-#define ECANCELED 9927
-#endif
-
-#ifndef EINPROGRESS
-#define EINPROGRESS 9928
-#endif
-
-#ifndef EOPNOTSUPP
-#define EOPNOTSUPP 9929
-#endif
-
-#ifndef EWOULDBLOCK
-#define EWOULDBLOCK 9930
-#endif
-
-#ifndef EOWNERDEAD
-#define EOWNERDEAD 9931
-#endif
-
-#ifndef EPROTO
-#define EPROTO 9932
-#endif
-
-#ifndef EPROTONOSUPPORT
-#define EPROTONOSUPPORT 9933
-#endif
-
-#ifndef ENOTRECOVERABLE
-#define ENOTRECOVERABLE 9934
-#endif
-
-#ifndef ETIME
-#define ETIME 9935
-#endif
-
-#ifndef ETXTBSY
-#define ETXTBSY 9936
-#endif
-
-#ifndef ETIMEDOUT
-#define ETIMEDOUT 9938
-#endif
-
-#ifndef ELOOP
-#define ELOOP 9939
-#endif
-
-#ifndef EOVERFLOW
-#define EOVERFLOW 9940
-#endif
-
-#ifndef EPROTOTYPE
-#define EPROTOTYPE 9941
-#endif
-
-#ifndef ENOSYS
-#define ENOSYS 9942
-#endif
-
-#ifndef EINVAL
-#define EINVAL 9943
-#endif
-
-#ifndef ERANGE
-#define ERANGE 9944
-#endif
-
-#ifndef EILSEQ
-#define EILSEQ 9945
-#endif
-
-// Windows Mobile doesn't appear to define these:
-
-#ifndef E2BIG
-#define E2BIG 9946
-#endif
-
-#ifndef EDOM
-#define EDOM 9947
-#endif
-
-#ifndef EFAULT
-#define EFAULT 9948
-#endif
-
-#ifndef EBADF
-#define EBADF 9949
-#endif
-
-#ifndef EPIPE
-#define EPIPE 9950
-#endif
-
-#ifndef EXDEV
-#define EXDEV 9951
-#endif
-
-#ifndef EBUSY
-#define EBUSY 9952
-#endif
-
-#ifndef ENOTEMPTY
-#define ENOTEMPTY 9953
-#endif
-
-#ifndef ENOEXEC
-#define ENOEXEC 9954
-#endif
-
-#ifndef EEXIST
-#define EEXIST 9955
-#endif
-
-#ifndef EFBIG
-#define EFBIG 9956
-#endif
-
-#ifndef ENAMETOOLONG
-#define ENAMETOOLONG 9957
-#endif
-
-#ifndef ENOTTY
-#define ENOTTY 9958
-#endif
-
-#ifndef EINTR
-#define EINTR 9959
-#endif
-
-#ifndef ESPIPE
-#define ESPIPE 9960
-#endif
-
-#ifndef EIO
-#define EIO 9961
-#endif
-
-#ifndef EISDIR
-#define EISDIR 9962
-#endif
-
-#ifndef ECHILD
-#define ECHILD 9963
-#endif
-
-#ifndef ENOLCK
-#define ENOLCK 9964
-#endif
-
-#ifndef ENOSPC
-#define ENOSPC 9965
-#endif
-
-#ifndef ENXIO
-#define ENXIO 9966
-#endif
-
-#ifndef ENODEV
-#define ENODEV 9967
-#endif
-
-#ifndef ENOENT
-#define ENOENT 9968
-#endif
-
-#ifndef ESRCH
-#define ESRCH 9969
-#endif
-
-#ifndef ENOTDIR
-#define ENOTDIR 9970
-#endif
-
-#ifndef ENOMEM
-#define ENOMEM 9971
-#endif
-
-#ifndef EPERM
-#define EPERM 9972
-#endif
-
-#ifndef EACCES
-#define EACCES 9973
-#endif
-
-#ifndef EROFS
-#define EROFS 9974
-#endif
-
-#ifndef EDEADLK
-#define EDEADLK 9975
-#endif
-
-#ifndef EAGAIN
-#define EAGAIN 9976
-#endif
-
-#ifndef ENFILE
-#define ENFILE 9977
-#endif
-
-#ifndef EMFILE
-#define EMFILE 9978
-#endif
-
-#ifndef EMLINK
-#define EMLINK 9979
-#endif
-
-#endif // __cplusplus
-
-#endif // _LIBCPP_ERRNO_H
diff --git a/lib/libcxx/include/exception b/lib/libcxx/include/exception
deleted file mode 100644
index fdd83d10c3d..00000000000
--- a/lib/libcxx/include/exception
+++ /dev/null
@@ -1,338 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- exception ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXCEPTION
-#define _LIBCPP_EXCEPTION
-
-/*
- exception synopsis
-
-namespace std
-{
-
-class exception
-{
-public:
- exception() noexcept;
- exception(const exception&) noexcept;
- exception& operator=(const exception&) noexcept;
- virtual ~exception() noexcept;
- virtual const char* what() const noexcept;
-};
-
-class bad_exception
- : public exception
-{
-public:
- bad_exception() noexcept;
- bad_exception(const bad_exception&) noexcept;
- bad_exception& operator=(const bad_exception&) noexcept;
- virtual ~bad_exception() noexcept;
- virtual const char* what() const noexcept;
-};
-
-typedef void (*unexpected_handler)();
-unexpected_handler set_unexpected(unexpected_handler f ) noexcept;
-unexpected_handler get_unexpected() noexcept;
-[[noreturn]] void unexpected();
-
-typedef void (*terminate_handler)();
-terminate_handler set_terminate(terminate_handler f ) noexcept;
-terminate_handler get_terminate() noexcept;
-[[noreturn]] void terminate() noexcept;
-
-bool uncaught_exception() noexcept;
-int uncaught_exceptions() noexcept; // C++17
-
-typedef unspecified exception_ptr;
-
-exception_ptr current_exception() noexcept;
-void rethrow_exception [[noreturn]] (exception_ptr p);
-template<class E> exception_ptr make_exception_ptr(E e) noexcept;
-
-class nested_exception
-{
-public:
- nested_exception() noexcept;
- nested_exception(const nested_exception&) noexcept = default;
- nested_exception& operator=(const nested_exception&) noexcept = default;
- virtual ~nested_exception() = default;
-
- // access functions
- [[noreturn]] void rethrow_nested() const;
- exception_ptr nested_ptr() const noexcept;
-};
-
-template <class T> [[noreturn]] void throw_with_nested(T&& t);
-template <class E> void rethrow_if_nested(const E& e);
-
-} // std
-
-*/
-
-#include <__config>
-#include <cstddef>
-#include <cstdlib>
-#include <type_traits>
-#include <version>
-
-#if defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_NO_VCRUNTIME)
-#include <vcruntime_exception.h>
-#endif
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-namespace std // purposefully not using versioning namespace
-{
-
-#if !defined(_LIBCPP_ABI_MICROSOFT) || defined(_LIBCPP_NO_VCRUNTIME)
-class _LIBCPP_EXCEPTION_ABI exception
-{
-public:
- _LIBCPP_INLINE_VISIBILITY exception() _NOEXCEPT {}
- virtual ~exception() _NOEXCEPT;
- virtual const char* what() const _NOEXCEPT;
-};
-
-class _LIBCPP_EXCEPTION_ABI bad_exception
- : public exception
-{
-public:
- _LIBCPP_INLINE_VISIBILITY bad_exception() _NOEXCEPT {}
- virtual ~bad_exception() _NOEXCEPT;
- virtual const char* what() const _NOEXCEPT;
-};
-#endif // !_LIBCPP_ABI_MICROSOFT || _LIBCPP_NO_VCRUNTIME
-
-#if _LIBCPP_STD_VER <= 14 \
- || defined(_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS) \
- || defined(_LIBCPP_BUILDING_LIBRARY)
-typedef void (*unexpected_handler)();
-_LIBCPP_FUNC_VIS unexpected_handler set_unexpected(unexpected_handler) _NOEXCEPT;
-_LIBCPP_FUNC_VIS unexpected_handler get_unexpected() _NOEXCEPT;
-_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void unexpected();
-#endif
-
-typedef void (*terminate_handler)();
-_LIBCPP_FUNC_VIS terminate_handler set_terminate(terminate_handler) _NOEXCEPT;
-_LIBCPP_FUNC_VIS terminate_handler get_terminate() _NOEXCEPT;
-_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void terminate() _NOEXCEPT;
-
-_LIBCPP_FUNC_VIS bool uncaught_exception() _NOEXCEPT;
-_LIBCPP_FUNC_VIS _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS int uncaught_exceptions() _NOEXCEPT;
-
-class _LIBCPP_TYPE_VIS exception_ptr;
-
-_LIBCPP_FUNC_VIS exception_ptr current_exception() _NOEXCEPT;
-_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void rethrow_exception(exception_ptr);
-
-#ifndef _LIBCPP_ABI_MICROSOFT
-
-class _LIBCPP_TYPE_VIS exception_ptr
-{
- void* __ptr_;
-public:
- _LIBCPP_INLINE_VISIBILITY exception_ptr() _NOEXCEPT : __ptr_() {}
- _LIBCPP_INLINE_VISIBILITY exception_ptr(nullptr_t) _NOEXCEPT : __ptr_() {}
-
- exception_ptr(const exception_ptr&) _NOEXCEPT;
- exception_ptr& operator=(const exception_ptr&) _NOEXCEPT;
- ~exception_ptr() _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT
- {return __ptr_ != nullptr;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const exception_ptr& __x, const exception_ptr& __y) _NOEXCEPT
- {return __x.__ptr_ == __y.__ptr_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const exception_ptr& __x, const exception_ptr& __y) _NOEXCEPT
- {return !(__x == __y);}
-
- friend _LIBCPP_FUNC_VIS exception_ptr current_exception() _NOEXCEPT;
- friend _LIBCPP_FUNC_VIS void rethrow_exception(exception_ptr);
-};
-
-template<class _Ep>
-_LIBCPP_INLINE_VISIBILITY exception_ptr
-make_exception_ptr(_Ep __e) _NOEXCEPT
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
- throw __e;
- }
- catch (...)
- {
- return current_exception();
- }
-#else
- ((void)__e);
- _VSTD::abort();
-#endif
-}
-
-#else // _LIBCPP_ABI_MICROSOFT
-
-class _LIBCPP_TYPE_VIS exception_ptr
-{
-#if defined(__clang__)
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wunused-private-field"
-#endif
- void* __ptr1_;
- void* __ptr2_;
-#if defined(__clang__)
-#pragma clang diagnostic pop
-#endif
-public:
- exception_ptr() _NOEXCEPT;
- exception_ptr(nullptr_t) _NOEXCEPT;
- exception_ptr(const exception_ptr& __other) _NOEXCEPT;
- exception_ptr& operator=(const exception_ptr& __other) _NOEXCEPT;
- exception_ptr& operator=(nullptr_t) _NOEXCEPT;
- ~exception_ptr() _NOEXCEPT;
- _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT;
-};
-
-_LIBCPP_FUNC_VIS
-bool operator==(const exception_ptr& __x, const exception_ptr& __y) _NOEXCEPT;
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator!=(const exception_ptr& __x, const exception_ptr& __y) _NOEXCEPT
- {return !(__x == __y);}
-
-_LIBCPP_FUNC_VIS void swap(exception_ptr&, exception_ptr&) _NOEXCEPT;
-
-_LIBCPP_FUNC_VIS exception_ptr __copy_exception_ptr(void *__except, const void* __ptr);
-_LIBCPP_FUNC_VIS exception_ptr current_exception() _NOEXCEPT;
-_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void rethrow_exception(exception_ptr p);
-
-// This is a built-in template function which automagically extracts the required
-// information.
-template <class _E> void *__GetExceptionInfo(_E);
-
-template<class _Ep>
-_LIBCPP_INLINE_VISIBILITY exception_ptr
-make_exception_ptr(_Ep __e) _NOEXCEPT
-{
- return __copy_exception_ptr(_VSTD::addressof(__e), __GetExceptionInfo(__e));
-}
-
-#endif // _LIBCPP_ABI_MICROSOFT
-// nested_exception
-
-class _LIBCPP_EXCEPTION_ABI nested_exception
-{
- exception_ptr __ptr_;
-public:
- nested_exception() _NOEXCEPT;
-// nested_exception(const nested_exception&) noexcept = default;
-// nested_exception& operator=(const nested_exception&) noexcept = default;
- virtual ~nested_exception() _NOEXCEPT;
-
- // access functions
- _LIBCPP_NORETURN void rethrow_nested() const;
- _LIBCPP_INLINE_VISIBILITY exception_ptr nested_ptr() const _NOEXCEPT {return __ptr_;}
-};
-
-template <class _Tp>
-struct __nested
- : public _Tp,
- public nested_exception
-{
- _LIBCPP_INLINE_VISIBILITY explicit __nested(const _Tp& __t) : _Tp(__t) {}
-};
-
-#ifndef _LIBCPP_NO_EXCEPTIONS
-template <class _Tp, class _Up, bool>
-struct __throw_with_nested;
-
-template <class _Tp, class _Up>
-struct __throw_with_nested<_Tp, _Up, true> {
- _LIBCPP_NORETURN static inline _LIBCPP_INLINE_VISIBILITY void
-#ifndef _LIBCPP_CXX03_LANG
- __do_throw(_Tp&& __t)
-#else
- __do_throw (_Tp& __t)
-#endif // _LIBCPP_CXX03_LANG
- {
- throw __nested<_Up>(_VSTD::forward<_Tp>(__t));
- }
-};
-
-template <class _Tp, class _Up>
-struct __throw_with_nested<_Tp, _Up, false> {
- _LIBCPP_NORETURN static inline _LIBCPP_INLINE_VISIBILITY void
-#ifndef _LIBCPP_CXX03_LANG
- __do_throw(_Tp&& __t)
-#else
- __do_throw (_Tp& __t)
-#endif // _LIBCPP_CXX03_LANG
- {
- throw _VSTD::forward<_Tp>(__t);
- }
-};
-#endif
-
-template <class _Tp>
-_LIBCPP_NORETURN
-void
-#ifndef _LIBCPP_CXX03_LANG
-throw_with_nested(_Tp&& __t)
-#else
-throw_with_nested (_Tp& __t)
-#endif // _LIBCPP_CXX03_LANG
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- typedef typename decay<_Tp>::type _Up;
- static_assert( is_copy_constructible<_Up>::value, "type thrown must be CopyConstructible");
- __throw_with_nested<_Tp, _Up,
- is_class<_Up>::value &&
- !is_base_of<nested_exception, _Up>::value &&
- !__libcpp_is_final<_Up>::value>::
- __do_throw(_VSTD::forward<_Tp>(__t));
-#else
- ((void)__t);
- // FIXME: Make this abort
-#endif
-}
-
-template <class _From, class _To>
-struct __can_dynamic_cast : public _LIBCPP_BOOL_CONSTANT(
- is_polymorphic<_From>::value &&
- (!is_base_of<_To, _From>::value ||
- is_convertible<const _From*, const _To*>::value)) {};
-
-template <class _Ep>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-rethrow_if_nested(const _Ep& __e,
- typename enable_if< __can_dynamic_cast<_Ep, nested_exception>::value>::type* = 0)
-{
- const nested_exception* __nep = dynamic_cast<const nested_exception*>(_VSTD::addressof(__e));
- if (__nep)
- __nep->rethrow_nested();
-}
-
-template <class _Ep>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-rethrow_if_nested(const _Ep&,
- typename enable_if<!__can_dynamic_cast<_Ep, nested_exception>::value>::type* = 0)
-{
-}
-
-} // std
-
-#endif // _LIBCPP_EXCEPTION
diff --git a/lib/libcxx/include/experimental/__config b/lib/libcxx/include/experimental/__config
deleted file mode 100644
index c6f17762022..00000000000
--- a/lib/libcxx/include/experimental/__config
+++ /dev/null
@@ -1,74 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- __config ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_CONFIG
-#define _LIBCPP_EXPERIMENTAL_CONFIG
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#define _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL namespace std { namespace experimental {
-#define _LIBCPP_END_NAMESPACE_EXPERIMENTAL } }
-#define _VSTD_EXPERIMENTAL std::experimental
-
-#define _LIBCPP_BEGIN_NAMESPACE_LFTS _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL inline namespace fundamentals_v1 {
-#define _LIBCPP_END_NAMESPACE_LFTS } } }
-#define _VSTD_LFTS _VSTD_EXPERIMENTAL::fundamentals_v1
-
-#define _LIBCPP_BEGIN_NAMESPACE_LFTS_V2 _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL inline namespace fundamentals_v2 {
-#define _LIBCPP_END_NAMESPACE_LFTS_V2 } } }
-#define _VSTD_LFTS_V2 _VSTD_EXPERIMENTAL::fundamentals_v2
-
-#define _LIBCPP_BEGIN_NAMESPACE_LFTS_PMR _LIBCPP_BEGIN_NAMESPACE_LFTS namespace pmr {
-#define _LIBCPP_END_NAMESPACE_LFTS_PMR _LIBCPP_END_NAMESPACE_LFTS }
-#define _VSTD_LFTS_PMR _VSTD_LFTS::pmr
-
-#define _LIBCPP_BEGIN_NAMESPACE_CHRONO_LFTS _LIBCPP_BEGIN_NAMESPACE_STD \
- namespace chrono { namespace experimental { inline namespace fundamentals_v1 {
-#define _LIBCPP_END_NAMESPACE_CHRONO_LFTS _LIBCPP_END_NAMESPACE_STD } } }
-
-#define _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_FILESYSTEM \
- _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL namespace filesystem { \
- inline namespace v1 {
-
-#define _LIBCPP_END_NAMESPACE_EXPERIMENTAL_FILESYSTEM \
- } } _LIBCPP_END_NAMESPACE_EXPERIMENTAL
-
-#define _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_COROUTINES \
- _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL inline namespace coroutines_v1 {
-
-#define _LIBCPP_END_NAMESPACE_EXPERIMENTAL_COROUTINES \
- } _LIBCPP_END_NAMESPACE_EXPERIMENTAL
-
-#define _VSTD_CORO _VSTD_EXPERIMENTAL::coroutines_v1
-
-#define _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_SIMD \
- _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL inline namespace parallelism_v2 {
-
-#define _LIBCPP_END_NAMESPACE_EXPERIMENTAL_SIMD \
- } _LIBCPP_END_NAMESPACE_EXPERIMENTAL
-
-#define _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_SIMD_ABI \
- _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_SIMD namespace simd_abi {
-
-#define _LIBCPP_END_NAMESPACE_EXPERIMENTAL_SIMD_ABI \
- } _LIBCPP_END_NAMESPACE_EXPERIMENTAL_SIMD
-
-// TODO: support more targets
-#if defined(__AVX__)
-#define _LIBCPP_NATIVE_SIMD_WIDTH_IN_BYTES 32
-#else
-#define _LIBCPP_NATIVE_SIMD_WIDTH_IN_BYTES 16
-#endif
-
-#endif
diff --git a/lib/libcxx/include/experimental/__memory b/lib/libcxx/include/experimental/__memory
deleted file mode 100644
index 229fea605bf..00000000000
--- a/lib/libcxx/include/experimental/__memory
+++ /dev/null
@@ -1,90 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL___MEMORY
-#define _LIBCPP_EXPERIMENTAL___MEMORY
-
-#include <experimental/__config>
-#include <experimental/utility> // for erased_type
-#include <__functional_base>
-#include <type_traits>
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS
-
-template <
- class _Tp, class _Alloc
- , bool = uses_allocator<_Tp, _Alloc>::value
- , bool = __has_allocator_type<_Tp>::value
- >
-struct __lfts_uses_allocator : public false_type {};
-
-template <class _Tp, class _Alloc>
-struct __lfts_uses_allocator<_Tp, _Alloc, false, false> : public false_type {};
-
-template <class _Tp, class _Alloc, bool HasAlloc>
-struct __lfts_uses_allocator<_Tp, _Alloc, true, HasAlloc> : public true_type {};
-
-template <class _Tp, class _Alloc>
-struct __lfts_uses_allocator<_Tp, _Alloc, false, true>
- : public integral_constant<bool
- , is_convertible<_Alloc, typename _Tp::allocator_type>::value
- || is_same<erased_type, typename _Tp::allocator_type>::value
- >
-{};
-
-template <bool _UsesAlloc, class _Tp, class _Alloc, class ..._Args>
-struct __lfts_uses_alloc_ctor_imp
-{
- static const int value = 0;
-};
-
-template <class _Tp, class _Alloc, class ..._Args>
-struct __lfts_uses_alloc_ctor_imp<true, _Tp, _Alloc, _Args...>
-{
- static const bool __ic_first
- = is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value;
-
- static const bool __ic_second =
- conditional<
- __ic_first,
- false_type,
- is_constructible<_Tp, _Args..., _Alloc>
- >::type::value;
-
- static_assert(__ic_first || __ic_second,
- "Request for uses allocator construction is ill-formed");
-
- static const int value = __ic_first ? 1 : 2;
-};
-
-template <class _Tp, class _Alloc, class ..._Args>
-struct __lfts_uses_alloc_ctor
- : integral_constant<int,
- __lfts_uses_alloc_ctor_imp<
- __lfts_uses_allocator<_Tp, _Alloc>::value
- , _Tp, _Alloc, _Args...
- >::value
- >
-{};
-
-template <class _Tp, class _Alloc, class ..._Args>
-inline _LIBCPP_INLINE_VISIBILITY
-void __lfts_user_alloc_construct(
- _Tp * __store, const _Alloc & __a, _Args &&... __args)
-{
- _VSTD::__user_alloc_construct_impl(
- typename __lfts_uses_alloc_ctor<_Tp, _Alloc, _Args...>::type()
- , __store, __a, _VSTD::forward<_Args>(__args)...
- );
-}
-
-_LIBCPP_END_NAMESPACE_LFTS
-
-#endif /* _LIBCPP_EXPERIMENTAL___MEMORY */
diff --git a/lib/libcxx/include/experimental/algorithm b/lib/libcxx/include/experimental/algorithm
deleted file mode 100644
index eb3bad6ef98..00000000000
--- a/lib/libcxx/include/experimental/algorithm
+++ /dev/null
@@ -1,60 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- algorithm ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_ALGORITHM
-#define _LIBCPP_EXPERIMENTAL_ALGORITHM
-
-/*
- experimental/algorithm synopsis
-
-#include <algorithm>
-
-namespace std {
-namespace experimental {
-inline namespace fundamentals_v1 {
-
-template <class ForwardIterator, class Searcher>
-ForwardIterator search(ForwardIterator first, ForwardIterator last,
- const Searcher &searcher);
-
-// sample removed because it's now part of C++17
-
-} // namespace fundamentals_v1
-} // namespace experimental
-} // namespace std
-
-*/
-
-#include <experimental/__config>
-#include <algorithm>
-#include <type_traits>
-
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS
-
-template <class _ForwardIterator, class _Searcher>
-_LIBCPP_INLINE_VISIBILITY
-_ForwardIterator search(_ForwardIterator __f, _ForwardIterator __l, const _Searcher &__s)
-{ return __s(__f, __l).first; }
-
-_LIBCPP_END_NAMESPACE_LFTS
-
-_LIBCPP_POP_MACROS
-
-#endif /* _LIBCPP_EXPERIMENTAL_ALGORITHM */
diff --git a/lib/libcxx/include/experimental/any b/lib/libcxx/include/experimental/any
deleted file mode 100644
index d9c95342589..00000000000
--- a/lib/libcxx/include/experimental/any
+++ /dev/null
@@ -1,21 +0,0 @@
-// -*- C++ -*-
-//===------------------------------- any ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#ifndef _LIBCPP_EXPERIMENTAL_ANY
-#define _LIBCPP_EXPERIMENTAL_ANY
-
-#include <__config>
-
-#ifdef _LIBCPP_WARNING
-_LIBCPP_WARNING("<experimental/any> has been removed. Use <any> instead.")
-#else
-# warning "<experimental/any> has been removed. Use <any> instead."
-#endif
-
-#endif // _LIBCPP_EXPERIMENTAL_ANY
diff --git a/lib/libcxx/include/experimental/chrono b/lib/libcxx/include/experimental/chrono
deleted file mode 100644
index 30c7e4a9d5a..00000000000
--- a/lib/libcxx/include/experimental/chrono
+++ /dev/null
@@ -1,21 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- chrono ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#ifndef _LIBCPP_EXPERIMENTAL_CHRONO
-#define _LIBCPP_EXPERIMENTAL_CHRONO
-
-#include <__config>
-
-#ifdef _LIBCPP_WARNING
-_LIBCPP_WARNING("<experimental/chrono> has been removed. Use <chrono> instead.")
-#else
-# warning "<experimental/chrono> has been removed. Use <chrono> instead."
-#endif
-
-#endif // _LIBCPP_EXPERIMENTAL_CHRONO
diff --git a/lib/libcxx/include/experimental/coroutine b/lib/libcxx/include/experimental/coroutine
deleted file mode 100644
index 7cb39b81b48..00000000000
--- a/lib/libcxx/include/experimental/coroutine
+++ /dev/null
@@ -1,336 +0,0 @@
-// -*- C++ -*-
-//===----------------------------- coroutine -----------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_COROUTINE
-#define _LIBCPP_EXPERIMENTAL_COROUTINE
-
-/**
- experimental/coroutine synopsis
-
-// C++next
-
-namespace std {
-namespace experimental {
-inline namespace coroutines_v1 {
-
- // 18.11.1 coroutine traits
-template <typename R, typename... ArgTypes>
-class coroutine_traits;
-// 18.11.2 coroutine handle
-template <typename Promise = void>
-class coroutine_handle;
-// 18.11.2.7 comparison operators:
-bool operator==(coroutine_handle<> x, coroutine_handle<> y) _NOEXCEPT;
-bool operator!=(coroutine_handle<> x, coroutine_handle<> y) _NOEXCEPT;
-bool operator<(coroutine_handle<> x, coroutine_handle<> y) _NOEXCEPT;
-bool operator<=(coroutine_handle<> x, coroutine_handle<> y) _NOEXCEPT;
-bool operator>=(coroutine_handle<> x, coroutine_handle<> y) _NOEXCEPT;
-bool operator>(coroutine_handle<> x, coroutine_handle<> y) _NOEXCEPT;
-// 18.11.3 trivial awaitables
-struct suspend_never;
-struct suspend_always;
-// 18.11.2.8 hash support:
-template <class T> struct hash;
-template <class P> struct hash<coroutine_handle<P>>;
-
-} // namespace coroutines_v1
-} // namespace experimental
-} // namespace std
-
- */
-
-#include <experimental/__config>
-#include <new>
-#include <type_traits>
-#include <functional>
-#include <memory> // for hash<T*>
-#include <cstddef>
-#include <cassert>
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#ifdef _LIBCPP_HAS_NO_COROUTINES
-# if defined(_LIBCPP_WARNING)
- _LIBCPP_WARNING("<experimental/coroutine> cannot be used with this compiler")
-# else
-# warning <experimental/coroutine> cannot be used with this compiler
-# endif
-#endif
-
-#ifndef _LIBCPP_HAS_NO_COROUTINES
-
-_LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_COROUTINES
-
-template <class _Tp, class = void>
-struct __coroutine_traits_sfinae {};
-
-template <class _Tp>
-struct __coroutine_traits_sfinae<
- _Tp, typename __void_t<typename _Tp::promise_type>::type>
-{
- using promise_type = typename _Tp::promise_type;
-};
-
-template <typename _Ret, typename... _Args>
-struct _LIBCPP_TEMPLATE_VIS coroutine_traits
- : public __coroutine_traits_sfinae<_Ret>
-{
-};
-
-template <typename _Promise = void>
-class _LIBCPP_TEMPLATE_VIS coroutine_handle;
-
-template <>
-class _LIBCPP_TEMPLATE_VIS coroutine_handle<void> {
-public:
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR coroutine_handle() _NOEXCEPT : __handle_(nullptr) {}
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR coroutine_handle(nullptr_t) _NOEXCEPT : __handle_(nullptr) {}
-
- _LIBCPP_INLINE_VISIBILITY
- coroutine_handle& operator=(nullptr_t) _NOEXCEPT {
- __handle_ = nullptr;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR void* address() const _NOEXCEPT { return __handle_; }
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR explicit operator bool() const _NOEXCEPT { return __handle_; }
-
- _LIBCPP_INLINE_VISIBILITY
- void operator()() { resume(); }
-
- _LIBCPP_INLINE_VISIBILITY
- void resume() {
- _LIBCPP_ASSERT(__is_suspended(),
- "resume() can only be called on suspended coroutines");
- _LIBCPP_ASSERT(!done(),
- "resume() has undefined behavior when the coroutine is done");
- __builtin_coro_resume(__handle_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void destroy() {
- _LIBCPP_ASSERT(__is_suspended(),
- "destroy() can only be called on suspended coroutines");
- __builtin_coro_destroy(__handle_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool done() const {
- _LIBCPP_ASSERT(__is_suspended(),
- "done() can only be called on suspended coroutines");
- return __builtin_coro_done(__handle_);
- }
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- static coroutine_handle from_address(void* __addr) _NOEXCEPT {
- coroutine_handle __tmp;
- __tmp.__handle_ = __addr;
- return __tmp;
- }
-
- // FIXME: Should from_address(nullptr) be allowed?
- _LIBCPP_INLINE_VISIBILITY
- static coroutine_handle from_address(nullptr_t) _NOEXCEPT {
- return coroutine_handle(nullptr);
- }
-
- template <class _Tp, bool _CallIsValid = false>
- static coroutine_handle from_address(_Tp*) {
- static_assert(_CallIsValid,
- "coroutine_handle<void>::from_address cannot be called with "
- "non-void pointers");
- }
-
-private:
- bool __is_suspended() const _NOEXCEPT {
- // FIXME actually implement a check for if the coro is suspended.
- return __handle_;
- }
-
- template <class _PromiseT> friend class coroutine_handle;
- void* __handle_;
-};
-
-// 18.11.2.7 comparison operators:
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator==(coroutine_handle<> __x, coroutine_handle<> __y) _NOEXCEPT {
- return __x.address() == __y.address();
-}
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator!=(coroutine_handle<> __x, coroutine_handle<> __y) _NOEXCEPT {
- return !(__x == __y);
-}
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator<(coroutine_handle<> __x, coroutine_handle<> __y) _NOEXCEPT {
- return less<void*>()(__x.address(), __y.address());
-}
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator>(coroutine_handle<> __x, coroutine_handle<> __y) _NOEXCEPT {
- return __y < __x;
-}
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator<=(coroutine_handle<> __x, coroutine_handle<> __y) _NOEXCEPT {
- return !(__x > __y);
-}
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator>=(coroutine_handle<> __x, coroutine_handle<> __y) _NOEXCEPT {
- return !(__x < __y);
-}
-
-template <typename _Promise>
-class _LIBCPP_TEMPLATE_VIS coroutine_handle : public coroutine_handle<> {
- using _Base = coroutine_handle<>;
-public:
-#ifndef _LIBCPP_CXX03_LANG
- // 18.11.2.1 construct/reset
- using coroutine_handle<>::coroutine_handle;
-#else
- _LIBCPP_INLINE_VISIBILITY coroutine_handle() _NOEXCEPT : _Base() {}
- _LIBCPP_INLINE_VISIBILITY coroutine_handle(nullptr_t) _NOEXCEPT : _Base(nullptr) {}
-#endif
- _LIBCPP_INLINE_VISIBILITY
- coroutine_handle& operator=(nullptr_t) _NOEXCEPT {
- _Base::operator=(nullptr);
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- _Promise& promise() const {
- return *static_cast<_Promise*>(
- __builtin_coro_promise(this->__handle_, _LIBCPP_ALIGNOF(_Promise), false));
- }
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- static coroutine_handle from_address(void* __addr) _NOEXCEPT {
- coroutine_handle __tmp;
- __tmp.__handle_ = __addr;
- return __tmp;
- }
-
- // NOTE: this overload isn't required by the standard but is needed so
- // the deleted _Promise* overload doesn't make from_address(nullptr)
- // ambiguous.
- // FIXME: should from_address work with nullptr?
- _LIBCPP_INLINE_VISIBILITY
- static coroutine_handle from_address(nullptr_t) _NOEXCEPT {
- return coroutine_handle(nullptr);
- }
-
- template <class _Tp, bool _CallIsValid = false>
- static coroutine_handle from_address(_Tp*) {
- static_assert(_CallIsValid,
- "coroutine_handle<promise_type>::from_address cannot be called with "
- "non-void pointers");
- }
-
- template <bool _CallIsValid = false>
- static coroutine_handle from_address(_Promise*) {
- static_assert(_CallIsValid,
- "coroutine_handle<promise_type>::from_address cannot be used with "
- "pointers to the coroutine's promise type; use 'from_promise' instead");
- }
-
- _LIBCPP_INLINE_VISIBILITY
- static coroutine_handle from_promise(_Promise& __promise) _NOEXCEPT {
- typedef typename remove_cv<_Promise>::type _RawPromise;
- coroutine_handle __tmp;
- __tmp.__handle_ = __builtin_coro_promise(
- _VSTD::addressof(const_cast<_RawPromise&>(__promise)),
- _LIBCPP_ALIGNOF(_Promise), true);
- return __tmp;
- }
-};
-
-#if __has_builtin(__builtin_coro_noop)
-struct noop_coroutine_promise {};
-
-template <>
-class _LIBCPP_TEMPLATE_VIS coroutine_handle<noop_coroutine_promise>
- : public coroutine_handle<> {
- using _Base = coroutine_handle<>;
- using _Promise = noop_coroutine_promise;
-public:
-
- _LIBCPP_INLINE_VISIBILITY
- _Promise& promise() const {
- return *static_cast<_Promise*>(
- __builtin_coro_promise(this->__handle_, _LIBCPP_ALIGNOF(_Promise), false));
- }
-
- _LIBCPP_CONSTEXPR explicit operator bool() const _NOEXCEPT { return true; }
- _LIBCPP_CONSTEXPR bool done() const _NOEXCEPT { return false; }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX17 void operator()() const _NOEXCEPT {}
- _LIBCPP_CONSTEXPR_AFTER_CXX17 void resume() const _NOEXCEPT {}
- _LIBCPP_CONSTEXPR_AFTER_CXX17 void destroy() const _NOEXCEPT {}
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- friend coroutine_handle<noop_coroutine_promise> noop_coroutine() _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY coroutine_handle() _NOEXCEPT {
- this->__handle_ = __builtin_coro_noop();
- }
-};
-
-using noop_coroutine_handle = coroutine_handle<noop_coroutine_promise>;
-
-inline _LIBCPP_INLINE_VISIBILITY
-noop_coroutine_handle noop_coroutine() _NOEXCEPT {
- return noop_coroutine_handle();
-}
-#endif // __has_builtin(__builtin_coro_noop)
-
-struct _LIBCPP_TYPE_VIS suspend_never {
- _LIBCPP_INLINE_VISIBILITY
- bool await_ready() const _NOEXCEPT { return true; }
- _LIBCPP_INLINE_VISIBILITY
- void await_suspend(coroutine_handle<>) const _NOEXCEPT {}
- _LIBCPP_INLINE_VISIBILITY
- void await_resume() const _NOEXCEPT {}
-};
-
-struct _LIBCPP_TYPE_VIS suspend_always {
- _LIBCPP_INLINE_VISIBILITY
- bool await_ready() const _NOEXCEPT { return false; }
- _LIBCPP_INLINE_VISIBILITY
- void await_suspend(coroutine_handle<>) const _NOEXCEPT {}
- _LIBCPP_INLINE_VISIBILITY
- void await_resume() const _NOEXCEPT {}
-};
-
-_LIBCPP_END_NAMESPACE_EXPERIMENTAL_COROUTINES
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Tp>
-struct hash<_VSTD_CORO::coroutine_handle<_Tp> > {
- using __arg_type = _VSTD_CORO::coroutine_handle<_Tp>;
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(__arg_type const& __v) const _NOEXCEPT
- {return hash<void*>()(__v.address());}
-};
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // !defined(_LIBCPP_HAS_NO_COROUTINES)
-
-#endif /* _LIBCPP_EXPERIMENTAL_COROUTINE */
diff --git a/lib/libcxx/include/experimental/deque b/lib/libcxx/include/experimental/deque
deleted file mode 100644
index f8495743c1f..00000000000
--- a/lib/libcxx/include/experimental/deque
+++ /dev/null
@@ -1,47 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- deque ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_DEQUE
-#define _LIBCPP_EXPERIMENTAL_DEQUE
-/*
- experimental/deque synopsis
-
-// C++1z
-namespace std {
-namespace experimental {
-inline namespace fundamentals_v1 {
-namespace pmr {
-
- template <class T>
- using deque = std::deque<T,polymorphic_allocator<T>>;
-
-} // namespace pmr
-} // namespace fundamentals_v1
-} // namespace experimental
-} // namespace std
-
- */
-
-#include <experimental/__config>
-#include <deque>
-#include <experimental/memory_resource>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
-
-template <class _ValueT>
-using deque = _VSTD::deque<_ValueT, polymorphic_allocator<_ValueT>>;
-
-_LIBCPP_END_NAMESPACE_LFTS_PMR
-
-#endif /* _LIBCPP_EXPERIMENTAL_DEQUE */
diff --git a/lib/libcxx/include/experimental/filesystem b/lib/libcxx/include/experimental/filesystem
deleted file mode 100644
index 28d8dcf4fc1..00000000000
--- a/lib/libcxx/include/experimental/filesystem
+++ /dev/null
@@ -1,257 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- filesystem -------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#ifndef _LIBCPP_EXPERIMENTAL_FILESYSTEM
-#define _LIBCPP_EXPERIMENTAL_FILESYSTEM
-/*
- filesystem synopsis
-
- namespace std { namespace experimental { namespace filesystem { inline namespace v1 {
-
- class path;
-
- void swap(path& lhs, path& rhs) noexcept;
- size_t hash_value(const path& p) noexcept;
-
- bool operator==(const path& lhs, const path& rhs) noexcept;
- bool operator!=(const path& lhs, const path& rhs) noexcept;
- bool operator< (const path& lhs, const path& rhs) noexcept;
- bool operator<=(const path& lhs, const path& rhs) noexcept;
- bool operator> (const path& lhs, const path& rhs) noexcept;
- bool operator>=(const path& lhs, const path& rhs) noexcept;
-
- path operator/ (const path& lhs, const path& rhs);
-
- // fs.path.io operators are friends of path.
- template <class charT, class traits>
- friend basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os, const path& p);
-
- template <class charT, class traits>
- friend basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is, path& p);
-
- template <class Source>
- path u8path(const Source& source);
- template <class InputIterator>
- path u8path(InputIterator first, InputIterator last);
-
- class filesystem_error;
- class directory_entry;
-
- class directory_iterator;
-
- // enable directory_iterator range-based for statements
- directory_iterator begin(directory_iterator iter) noexcept;
- directory_iterator end(const directory_iterator&) noexcept;
-
- class recursive_directory_iterator;
-
- // enable recursive_directory_iterator range-based for statements
- recursive_directory_iterator begin(recursive_directory_iterator iter) noexcept;
- recursive_directory_iterator end(const recursive_directory_iterator&) noexcept;
-
- class file_status;
-
- struct space_info
- {
- uintmax_t capacity;
- uintmax_t free;
- uintmax_t available;
- };
-
- enum class file_type;
- enum class perms;
- enum class perm_options;
- enum class copy_options;
- enum class directory_options;
-
- typedef chrono::time_point<trivial-clock> file_time_type;
-
- // operational functions
-
- path absolute(const path& p);
- path absolute(const path& p, error_code &ec);
-
- path canonical(const path& p);
- path canonical(const path& p, error_code& ec);
-
- void copy(const path& from, const path& to);
- void copy(const path& from, const path& to, error_code& ec);
- void copy(const path& from, const path& to, copy_options options);
- void copy(const path& from, const path& to, copy_options options,
- error_code& ec);
-
- bool copy_file(const path& from, const path& to);
- bool copy_file(const path& from, const path& to, error_code& ec);
- bool copy_file(const path& from, const path& to, copy_options option);
- bool copy_file(const path& from, const path& to, copy_options option,
- error_code& ec);
-
- void copy_symlink(const path& existing_symlink, const path& new_symlink);
- void copy_symlink(const path& existing_symlink, const path& new_symlink,
- error_code& ec) noexcept;
-
- bool create_directories(const path& p);
- bool create_directories(const path& p, error_code& ec);
-
- bool create_directory(const path& p);
- bool create_directory(const path& p, error_code& ec) noexcept;
-
- bool create_directory(const path& p, const path& attributes);
- bool create_directory(const path& p, const path& attributes,
- error_code& ec) noexcept;
-
- void create_directory_symlink(const path& to, const path& new_symlink);
- void create_directory_symlink(const path& to, const path& new_symlink,
- error_code& ec) noexcept;
-
- void create_hard_link(const path& to, const path& new_hard_link);
- void create_hard_link(const path& to, const path& new_hard_link,
- error_code& ec) noexcept;
-
- void create_symlink(const path& to, const path& new_symlink);
- void create_symlink(const path& to, const path& new_symlink,
- error_code& ec) noexcept;
-
- path current_path();
- path current_path(error_code& ec);
- void current_path(const path& p);
- void current_path(const path& p, error_code& ec) noexcept;
-
- bool exists(file_status s) noexcept;
- bool exists(const path& p);
- bool exists(const path& p, error_code& ec) noexcept;
-
- bool equivalent(const path& p1, const path& p2);
- bool equivalent(const path& p1, const path& p2, error_code& ec) noexcept;
-
- uintmax_t file_size(const path& p);
- uintmax_t file_size(const path& p, error_code& ec) noexcept;
-
- uintmax_t hard_link_count(const path& p);
- uintmax_t hard_link_count(const path& p, error_code& ec) noexcept;
-
- bool is_block_file(file_status s) noexcept;
- bool is_block_file(const path& p);
- bool is_block_file(const path& p, error_code& ec) noexcept;
-
- bool is_character_file(file_status s) noexcept;
- bool is_character_file(const path& p);
- bool is_character_file(const path& p, error_code& ec) noexcept;
-
- bool is_directory(file_status s) noexcept;
- bool is_directory(const path& p);
- bool is_directory(const path& p, error_code& ec) noexcept;
-
- bool is_empty(const path& p);
- bool is_empty(const path& p, error_code& ec) noexcept;
-
- bool is_fifo(file_status s) noexcept;
- bool is_fifo(const path& p);
- bool is_fifo(const path& p, error_code& ec) noexcept;
-
- bool is_other(file_status s) noexcept;
- bool is_other(const path& p);
- bool is_other(const path& p, error_code& ec) noexcept;
-
- bool is_regular_file(file_status s) noexcept;
- bool is_regular_file(const path& p);
- bool is_regular_file(const path& p, error_code& ec) noexcept;
-
- bool is_socket(file_status s) noexcept;
- bool is_socket(const path& p);
- bool is_socket(const path& p, error_code& ec) noexcept;
-
- bool is_symlink(file_status s) noexcept;
- bool is_symlink(const path& p);
- bool is_symlink(const path& p, error_code& ec) noexcept;
-
- file_time_type last_write_time(const path& p);
- file_time_type last_write_time(const path& p, error_code& ec) noexcept;
- void last_write_time(const path& p, file_time_type new_time);
- void last_write_time(const path& p, file_time_type new_time,
- error_code& ec) noexcept;
-
- void permissions(const path& p, perms prms,
- perm_options opts=perm_options::replace);
- void permissions(const path& p, perms prms, error_code& ec) noexcept;
- void permissions(const path& p, perms prms, perm_options opts,
- error_code& ec);
-
- path proximate(const path& p, error_code& ec);
- path proximate(const path& p, const path& base = current_path());
- path proximate(const path& p, const path& base, error_code &ec);
-
- path read_symlink(const path& p);
- path read_symlink(const path& p, error_code& ec);
-
- path relative(const path& p, error_code& ec);
- path relative(const path& p, const path& base=current_path());
- path relative(const path& p, const path& base, error_code& ec);
-
- bool remove(const path& p);
- bool remove(const path& p, error_code& ec) noexcept;
-
- uintmax_t remove_all(const path& p);
- uintmax_t remove_all(const path& p, error_code& ec);
-
- void rename(const path& from, const path& to);
- void rename(const path& from, const path& to, error_code& ec) noexcept;
-
- void resize_file(const path& p, uintmax_t size);
- void resize_file(const path& p, uintmax_t size, error_code& ec) noexcept;
-
- space_info space(const path& p);
- space_info space(const path& p, error_code& ec) noexcept;
-
- file_status status(const path& p);
- file_status status(const path& p, error_code& ec) noexcept;
-
- bool status_known(file_status s) noexcept;
-
- file_status symlink_status(const path& p);
- file_status symlink_status(const path& p, error_code& ec) noexcept;
-
- path temp_directory_path();
- path temp_directory_path(error_code& ec);
-
- path weakly_canonical(path const& p);
- path weakly_canonical(path const& p, error_code& ec);
-
-
-} } } } // namespaces std::experimental::filesystem::v1
-
-*/
-
-#include <experimental/__config>
-#include <filesystem>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-#ifndef _LIBCPP_CXX03_LANG
-
-#define __cpp_lib_experimental_filesystem 201406
-
-_LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_FILESYSTEM
-
-using namespace _VSTD_FS;
-
-_LIBCPP_END_NAMESPACE_EXPERIMENTAL_FILESYSTEM
-
-#endif // !_LIBCPP_CXX03_LANG
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_EXPERIMENTAL_FILESYSTEM
diff --git a/lib/libcxx/include/experimental/forward_list b/lib/libcxx/include/experimental/forward_list
deleted file mode 100644
index 55e195f446f..00000000000
--- a/lib/libcxx/include/experimental/forward_list
+++ /dev/null
@@ -1,47 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- forward_list -----------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_FORWARD_LIST
-#define _LIBCPP_EXPERIMENTAL_FORWARD_LIST
-/*
- experimental/forward_list synopsis
-
-// C++1z
-namespace std {
-namespace experimental {
-inline namespace fundamentals_v1 {
-namespace pmr {
-
- template <class T>
- using forward_list = std::forward_list<T,polymorphic_allocator<T>>;
-
-} // namespace pmr
-} // namespace fundamentals_v1
-} // namespace experimental
-} // namespace std
-
- */
-
-#include <experimental/__config>
-#include <forward_list>
-#include <experimental/memory_resource>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
-
-template <class _ValueT>
-using forward_list = _VSTD::forward_list<_ValueT, polymorphic_allocator<_ValueT>>;
-
-_LIBCPP_END_NAMESPACE_LFTS_PMR
-
-#endif /* _LIBCPP_EXPERIMENTAL_FORWARD_LIST */
diff --git a/lib/libcxx/include/experimental/functional b/lib/libcxx/include/experimental/functional
deleted file mode 100644
index f63dfb07bb0..00000000000
--- a/lib/libcxx/include/experimental/functional
+++ /dev/null
@@ -1,462 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- functional --------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_FUNCTIONAL
-#define _LIBCPP_EXPERIMENTAL_FUNCTIONAL
-
-/*
- experimental/functional synopsis
-
-#include <algorithm>
-
-namespace std {
-namespace experimental {
-inline namespace fundamentals_v1 {
-
- // See C++14 20.9.9, Function object binders
- template <class T> constexpr bool is_bind_expression_v
- = is_bind_expression<T>::value;
- template <class T> constexpr int is_placeholder_v
- = is_placeholder<T>::value;
-
- // 4.2, Class template function
- template<class> class function; // undefined
- template<class R, class... ArgTypes> class function<R(ArgTypes...)>;
-
- template<class R, class... ArgTypes>
- void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&);
-
- template<class R, class... ArgTypes>
- bool operator==(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
- template<class R, class... ArgTypes>
- bool operator==(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
- template<class R, class... ArgTypes>
- bool operator!=(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
- template<class R, class... ArgTypes>
- bool operator!=(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
-
- // 4.3, Searchers
- template<class ForwardIterator, class BinaryPredicate = equal_to<>>
- class default_searcher;
-
- template<class RandomAccessIterator,
- class Hash = hash<typename iterator_traits<RandomAccessIterator>::value_type>,
- class BinaryPredicate = equal_to<>>
- class boyer_moore_searcher;
-
- template<class RandomAccessIterator,
- class Hash = hash<typename iterator_traits<RandomAccessIterator>::value_type>,
- class BinaryPredicate = equal_to<>>
- class boyer_moore_horspool_searcher;
-
- template<class ForwardIterator, class BinaryPredicate = equal_to<>>
- default_searcher<ForwardIterator, BinaryPredicate>
- make_default_searcher(ForwardIterator pat_first, ForwardIterator pat_last,
- BinaryPredicate pred = BinaryPredicate());
-
- template<class RandomAccessIterator,
- class Hash = hash<typename iterator_traits<RandomAccessIterator>::value_type>,
- class BinaryPredicate = equal_to<>>
- boyer_moore_searcher<RandomAccessIterator, Hash, BinaryPredicate>
- make_boyer_moore_searcher(
- RandomAccessIterator pat_first, RandomAccessIterator pat_last,
- Hash hf = Hash(), BinaryPredicate pred = BinaryPredicate());
-
- template<class RandomAccessIterator,
- class Hash = hash<typename iterator_traits<RandomAccessIterator>::value_type>,
- class BinaryPredicate = equal_to<>>
- boyer_moore_horspool_searcher<RandomAccessIterator, Hash, BinaryPredicate>
- make_boyer_moore_horspool_searcher(
- RandomAccessIterator pat_first, RandomAccessIterator pat_last,
- Hash hf = Hash(), BinaryPredicate pred = BinaryPredicate());
-
- } // namespace fundamentals_v1
- } // namespace experimental
-
- template<class R, class... ArgTypes, class Alloc>
- struct uses_allocator<experimental::function<R(ArgTypes...)>, Alloc>;
-
-} // namespace std
-
-*/
-
-#include <experimental/__config>
-#include <functional>
-#include <algorithm>
-#include <type_traits>
-#include <vector>
-#include <array>
-#include <unordered_map>
-
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS
-
-#if _LIBCPP_STD_VER > 11
-// default searcher
-template<class _ForwardIterator, class _BinaryPredicate = equal_to<>>
-_LIBCPP_TYPE_VIS
-class default_searcher {
-public:
- _LIBCPP_INLINE_VISIBILITY
- default_searcher(_ForwardIterator __f, _ForwardIterator __l,
- _BinaryPredicate __p = _BinaryPredicate())
- : __first_(__f), __last_(__l), __pred_(__p) {}
-
- template <typename _ForwardIterator2>
- _LIBCPP_INLINE_VISIBILITY
- pair<_ForwardIterator2, _ForwardIterator2>
- operator () (_ForwardIterator2 __f, _ForwardIterator2 __l) const
- {
- return _VSTD::__search(__f, __l, __first_, __last_, __pred_,
- typename _VSTD::iterator_traits<_ForwardIterator>::iterator_category(),
- typename _VSTD::iterator_traits<_ForwardIterator2>::iterator_category());
- }
-
-private:
- _ForwardIterator __first_;
- _ForwardIterator __last_;
- _BinaryPredicate __pred_;
- };
-
-template<class _ForwardIterator, class _BinaryPredicate = equal_to<>>
-_LIBCPP_INLINE_VISIBILITY
-default_searcher<_ForwardIterator, _BinaryPredicate>
-make_default_searcher( _ForwardIterator __f, _ForwardIterator __l, _BinaryPredicate __p = _BinaryPredicate ())
-{
- return default_searcher<_ForwardIterator, _BinaryPredicate>(__f, __l, __p);
-}
-
-template<class _Key, class _Value, class _Hash, class _BinaryPredicate, bool /*useArray*/> class _BMSkipTable;
-
-// General case for BM data searching; use a map
-template<class _Key, typename _Value, class _Hash, class _BinaryPredicate>
-class _BMSkipTable<_Key, _Value, _Hash, _BinaryPredicate, false> {
-public: // TODO private:
- typedef _Value value_type;
- typedef _Key key_type;
-
- const _Value __default_value_;
- std::unordered_map<_Key, _Value, _Hash, _BinaryPredicate> __table;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- _BMSkipTable(std::size_t __sz, _Value __default, _Hash __hf, _BinaryPredicate __pred)
- : __default_value_(__default), __table(__sz, __hf, __pred) {}
-
- _LIBCPP_INLINE_VISIBILITY
- void insert(const key_type &__key, value_type __val)
- {
- __table [__key] = __val; // Would skip_.insert (val) be better here?
- }
-
- _LIBCPP_INLINE_VISIBILITY
- value_type operator [](const key_type & __key) const
- {
- auto __it = __table.find (__key);
- return __it == __table.end() ? __default_value_ : __it->second;
- }
-};
-
-
-// Special case small numeric values; use an array
-template<class _Key, typename _Value, class _Hash, class _BinaryPredicate>
-class _BMSkipTable<_Key, _Value, _Hash, _BinaryPredicate, true> {
-private:
- typedef _Value value_type;
- typedef _Key key_type;
-
- typedef typename std::make_unsigned<key_type>::type unsigned_key_type;
- typedef std::array<value_type, _VSTD::numeric_limits<unsigned_key_type>::max()> skip_map;
- skip_map __table;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- _BMSkipTable(std::size_t /*__sz*/, _Value __default, _Hash /*__hf*/, _BinaryPredicate /*__pred*/)
- {
- std::fill_n(__table.begin(), __table.size(), __default);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void insert(key_type __key, value_type __val)
- {
- __table[static_cast<unsigned_key_type>(__key)] = __val;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- value_type operator [](key_type __key) const
- {
- return __table[static_cast<unsigned_key_type>(__key)];
- }
-};
-
-
-template <class _RandomAccessIterator1,
- class _Hash = hash<typename iterator_traits<_RandomAccessIterator1>::value_type>,
- class _BinaryPredicate = equal_to<>>
-_LIBCPP_TYPE_VIS
-class boyer_moore_searcher {
-private:
- typedef typename std::iterator_traits<_RandomAccessIterator1>::difference_type difference_type;
- typedef typename std::iterator_traits<_RandomAccessIterator1>::value_type value_type;
- typedef _BMSkipTable<value_type, difference_type, _Hash, _BinaryPredicate,
- _VSTD::is_integral<value_type>::value && // what about enums?
- sizeof(value_type) == 1 &&
- is_same<_Hash, hash<value_type>>::value &&
- is_same<_BinaryPredicate, equal_to<>>::value
- > skip_table_type;
-
-public:
- boyer_moore_searcher(_RandomAccessIterator1 __f, _RandomAccessIterator1 __l,
- _Hash __hf = _Hash(), _BinaryPredicate __pred = _BinaryPredicate())
- : __first_(__f), __last_(__l), __pred_(__pred),
- __pattern_length_(_VSTD::distance(__first_, __last_)),
- __skip_{make_shared<skip_table_type>(__pattern_length_, -1, __hf, __pred_)},
- __suffix_{make_shared<vector<difference_type>>(__pattern_length_ + 1)}
- {
- // build the skip table
- for ( difference_type __i = 0; __f != __l; ++__f, (void) ++__i )
- __skip_->insert(*__f, __i);
-
- this->__build_suffix_table ( __first_, __last_, __pred_ );
- }
-
- template <typename _RandomAccessIterator2>
- pair<_RandomAccessIterator2, _RandomAccessIterator2>
- operator ()(_RandomAccessIterator2 __f, _RandomAccessIterator2 __l) const
- {
- static_assert ( std::is_same<
- typename std::__uncvref<typename std::iterator_traits<_RandomAccessIterator1>::value_type>::type,
- typename std::__uncvref<typename std::iterator_traits<_RandomAccessIterator2>::value_type>::type
- >::value,
- "Corpus and Pattern iterators must point to the same type" );
-
- if (__f == __l ) return make_pair(__l, __l); // empty corpus
- if (__first_ == __last_) return make_pair(__f, __f); // empty pattern
-
- // If the pattern is larger than the corpus, we can't find it!
- if ( __pattern_length_ > _VSTD::distance (__f, __l))
- return make_pair(__l, __l);
-
- // Do the search
- return this->__search(__f, __l);
- }
-
-public: // TODO private:
- _RandomAccessIterator1 __first_;
- _RandomAccessIterator1 __last_;
- _BinaryPredicate __pred_;
- difference_type __pattern_length_;
- shared_ptr<skip_table_type> __skip_;
- shared_ptr<vector<difference_type>> __suffix_;
-
- template <typename _RandomAccessIterator2>
- pair<_RandomAccessIterator2, _RandomAccessIterator2>
- __search(_RandomAccessIterator2 __f, _RandomAccessIterator2 __l) const
- {
- _RandomAccessIterator2 __cur = __f;
- const _RandomAccessIterator2 __last = __l - __pattern_length_;
- const skip_table_type & __skip = *__skip_.get();
- const vector<difference_type> & __suffix = *__suffix_.get();
-
- while (__cur <= __last)
- {
-
- // Do we match right where we are?
- difference_type __j = __pattern_length_;
- while (__pred_(__first_ [__j-1], __cur [__j-1])) {
- __j--;
- // We matched - we're done!
- if ( __j == 0 )
- return make_pair(__cur, __cur + __pattern_length_);
- }
-
- // Since we didn't match, figure out how far to skip forward
- difference_type __k = __skip[__cur [ __j - 1 ]];
- difference_type __m = __j - __k - 1;
- if (__k < __j && __m > __suffix[ __j ])
- __cur += __m;
- else
- __cur += __suffix[ __j ];
- }
-
- return make_pair(__l, __l); // We didn't find anything
- }
-
-
- template<typename _Iterator, typename _Container>
- void __compute_bm_prefix ( _Iterator __f, _Iterator __l, _BinaryPredicate __pred, _Container &__prefix )
- {
- const std::size_t __count = _VSTD::distance(__f, __l);
-
- __prefix[0] = 0;
- std::size_t __k = 0;
- for ( std::size_t __i = 1; __i < __count; ++__i )
- {
- while ( __k > 0 && !__pred ( __f[__k], __f[__i] ))
- __k = __prefix [ __k - 1 ];
-
- if ( __pred ( __f[__k], __f[__i] ))
- __k++;
- __prefix [ __i ] = __k;
- }
- }
-
- void __build_suffix_table(_RandomAccessIterator1 __f, _RandomAccessIterator1 __l,
- _BinaryPredicate __pred)
- {
- const std::size_t __count = _VSTD::distance(__f, __l);
- vector<difference_type> & __suffix = *__suffix_.get();
- if (__count > 0)
- {
- _VSTD::vector<value_type> __scratch(__count);
-
- __compute_bm_prefix(__f, __l, __pred, __scratch);
- for ( std::size_t __i = 0; __i <= __count; __i++ )
- __suffix[__i] = __count - __scratch[__count-1];
-
- typedef _VSTD::reverse_iterator<_RandomAccessIterator1> _RevIter;
- __compute_bm_prefix(_RevIter(__l), _RevIter(__f), __pred, __scratch);
-
- for ( std::size_t __i = 0; __i < __count; __i++ )
- {
- const std::size_t __j = __count - __scratch[__i];
- const difference_type __k = __i - __scratch[__i] + 1;
-
- if (__suffix[__j] > __k)
- __suffix[__j] = __k;
- }
- }
- }
-
-};
-
-template<class _RandomAccessIterator,
- class _Hash = hash<typename iterator_traits<_RandomAccessIterator>::value_type>,
- class _BinaryPredicate = equal_to<>>
-_LIBCPP_INLINE_VISIBILITY
-boyer_moore_searcher<_RandomAccessIterator, _Hash, _BinaryPredicate>
-make_boyer_moore_searcher( _RandomAccessIterator __f, _RandomAccessIterator __l,
- _Hash __hf = _Hash(), _BinaryPredicate __p = _BinaryPredicate ())
-{
- return boyer_moore_searcher<_RandomAccessIterator, _Hash, _BinaryPredicate>(__f, __l, __hf, __p);
-}
-
-// boyer-moore-horspool
-template <class _RandomAccessIterator1,
- class _Hash = hash<typename iterator_traits<_RandomAccessIterator1>::value_type>,
- class _BinaryPredicate = equal_to<>>
-_LIBCPP_TYPE_VIS
-class boyer_moore_horspool_searcher {
-private:
- typedef typename std::iterator_traits<_RandomAccessIterator1>::difference_type difference_type;
- typedef typename std::iterator_traits<_RandomAccessIterator1>::value_type value_type;
- typedef _BMSkipTable<value_type, difference_type, _Hash, _BinaryPredicate,
- _VSTD::is_integral<value_type>::value && // what about enums?
- sizeof(value_type) == 1 &&
- is_same<_Hash, hash<value_type>>::value &&
- is_same<_BinaryPredicate, equal_to<>>::value
- > skip_table_type;
-
-public:
- boyer_moore_horspool_searcher(_RandomAccessIterator1 __f, _RandomAccessIterator1 __l,
- _Hash __hf = _Hash(), _BinaryPredicate __pred = _BinaryPredicate())
- : __first_(__f), __last_(__l), __pred_(__pred),
- __pattern_length_(_VSTD::distance(__first_, __last_)),
- __skip_{_VSTD::make_shared<skip_table_type>(__pattern_length_, __pattern_length_, __hf, __pred_)}
- {
- // build the skip table
- if ( __f != __l )
- {
- __l = __l - 1;
- for ( difference_type __i = 0; __f != __l; ++__f, (void) ++__i )
- __skip_->insert(*__f, __pattern_length_ - 1 - __i);
- }
- }
-
- template <typename _RandomAccessIterator2>
- pair<_RandomAccessIterator2, _RandomAccessIterator2>
- operator ()(_RandomAccessIterator2 __f, _RandomAccessIterator2 __l) const
- {
- static_assert ( std::is_same<
- typename std::__uncvref<typename std::iterator_traits<_RandomAccessIterator1>::value_type>::type,
- typename std::__uncvref<typename std::iterator_traits<_RandomAccessIterator2>::value_type>::type
- >::value,
- "Corpus and Pattern iterators must point to the same type" );
-
- if (__f == __l ) return make_pair(__l, __l); // empty corpus
- if (__first_ == __last_) return make_pair(__f, __f); // empty pattern
-
- // If the pattern is larger than the corpus, we can't find it!
- if ( __pattern_length_ > _VSTD::distance (__f, __l))
- return make_pair(__l, __l);
-
- // Do the search
- return this->__search(__f, __l);
- }
-
-private:
- _RandomAccessIterator1 __first_;
- _RandomAccessIterator1 __last_;
- _BinaryPredicate __pred_;
- difference_type __pattern_length_;
- shared_ptr<skip_table_type> __skip_;
-
- template <typename _RandomAccessIterator2>
- pair<_RandomAccessIterator2, _RandomAccessIterator2>
- __search ( _RandomAccessIterator2 __f, _RandomAccessIterator2 __l ) const {
- _RandomAccessIterator2 __cur = __f;
- const _RandomAccessIterator2 __last = __l - __pattern_length_;
- const skip_table_type & __skip = *__skip_.get();
-
- while (__cur <= __last)
- {
- // Do we match right where we are?
- difference_type __j = __pattern_length_;
- while (__pred_(__first_[__j-1], __cur[__j-1]))
- {
- __j--;
- // We matched - we're done!
- if ( __j == 0 )
- return make_pair(__cur, __cur + __pattern_length_);
- }
- __cur += __skip[__cur[__pattern_length_-1]];
- }
-
- return make_pair(__l, __l);
- }
-};
-
-template<class _RandomAccessIterator,
- class _Hash = hash<typename iterator_traits<_RandomAccessIterator>::value_type>,
- class _BinaryPredicate = equal_to<>>
-_LIBCPP_INLINE_VISIBILITY
-boyer_moore_horspool_searcher<_RandomAccessIterator, _Hash, _BinaryPredicate>
-make_boyer_moore_horspool_searcher( _RandomAccessIterator __f, _RandomAccessIterator __l,
- _Hash __hf = _Hash(), _BinaryPredicate __p = _BinaryPredicate ())
-{
- return boyer_moore_horspool_searcher<_RandomAccessIterator, _Hash, _BinaryPredicate>(__f, __l, __hf, __p);
-}
-
-#endif // _LIBCPP_STD_VER > 11
-
-_LIBCPP_END_NAMESPACE_LFTS
-
-_LIBCPP_POP_MACROS
-
-#endif /* _LIBCPP_EXPERIMENTAL_FUNCTIONAL */
diff --git a/lib/libcxx/include/experimental/iterator b/lib/libcxx/include/experimental/iterator
deleted file mode 100644
index ea672e96631..00000000000
--- a/lib/libcxx/include/experimental/iterator
+++ /dev/null
@@ -1,114 +0,0 @@
-// -*- C++ -*-
-//===----------------------------- iterator -------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_ITERATOR
-#define _LIBCPP_EXPERIMENTAL_ITERATOR
-
-/*
-namespace std {
- namespace experimental {
- inline namespace fundamentals_v2 {
-
- template <class DelimT, class charT = char, class traits = char_traits<charT>>
- class ostream_joiner {
- public:
- typedef charT char_type;
- typedef traits traits_type;
- typedef basic_ostream<charT, traits> ostream_type;
- typedef output_iterator_tag iterator_category;
- typedef void value_type;
- typedef void difference_type;
- typedef void pointer;
- typedef void reference;
-
- ostream_joiner(ostream_type& s, const DelimT& delimiter);
- ostream_joiner(ostream_type& s, DelimT&& delimiter);
-
- template<typename T>
- ostream_joiner& operator=(const T& value);
-
- ostream_joiner& operator*() noexcept;
- ostream_joiner& operator++() noexcept;
- ostream_joiner& operator++(int) noexcept;
- private:
- ostream_type* out_stream; // exposition only
- DelimT delim; // exposition only
- bool first_element; // exposition only
- };
-
- template <class charT, class traits, class DelimT>
- ostream_joiner<decay_t<DelimT>, charT, traits>
- make_ostream_joiner(basic_ostream<charT, traits>& os, DelimT&& delimiter);
-
- } // inline namespace fundamentals_v2
- } // namespace experimental
-} // namespace std
-
-*/
-
-#include <experimental/__config>
-
-#if _LIBCPP_STD_VER > 11
-
-#include <iterator>
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS
-
-template <class _Delim, class _CharT = char, class _Traits = char_traits<_CharT>>
-class ostream_joiner {
-public:
-
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef basic_ostream<char_type,traits_type> ostream_type;
- typedef output_iterator_tag iterator_category;
- typedef void value_type;
- typedef void difference_type;
- typedef void pointer;
- typedef void reference;
-
- ostream_joiner(ostream_type& __os, _Delim&& __d)
- : __output_iter(_VSTD::addressof(__os)), __delim(_VSTD::move(__d)), __first(true) {}
-
- ostream_joiner(ostream_type& __os, const _Delim& __d)
- : __output_iter(_VSTD::addressof(__os)), __delim(__d), __first(true) {}
-
-
- template<typename _Tp>
- ostream_joiner& operator=(const _Tp& __v)
- {
- if (!__first)
- *__output_iter << __delim;
- __first = false;
- *__output_iter << __v;
- return *this;
- }
-
- ostream_joiner& operator*() _NOEXCEPT { return *this; }
- ostream_joiner& operator++() _NOEXCEPT { return *this; }
- ostream_joiner& operator++(int) _NOEXCEPT { return *this; }
-
-private:
- ostream_type* __output_iter;
- _Delim __delim;
- bool __first;
-};
-
-
-template <class _CharT, class _Traits, class _Delim>
-ostream_joiner<typename decay<_Delim>::type, _CharT, _Traits>
-make_ostream_joiner(basic_ostream<_CharT, _Traits>& __os, _Delim && __d)
-{ return ostream_joiner<typename decay<_Delim>::type, _CharT, _Traits>(__os, _VSTD::forward<_Delim>(__d)); }
-
-_LIBCPP_END_NAMESPACE_LFTS
-
-#endif /* _LIBCPP_STD_VER > 11 */
-
-#endif // _LIBCPP_EXPERIMENTAL_ITERATOR
diff --git a/lib/libcxx/include/experimental/list b/lib/libcxx/include/experimental/list
deleted file mode 100644
index 1678ee3e93c..00000000000
--- a/lib/libcxx/include/experimental/list
+++ /dev/null
@@ -1,47 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- list ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_LIST
-#define _LIBCPP_EXPERIMENTAL_LIST
-/*
- experimental/list synopsis
-
-// C++1z
-namespace std {
-namespace experimental {
-inline namespace fundamentals_v1 {
-namespace pmr {
-
- template <class T>
- using list = std::list<T,polymorphic_allocator<T>>;
-
-} // namespace pmr
-} // namespace fundamentals_v1
-} // namespace experimental
-} // namespace std
-
- */
-
-#include <experimental/__config>
-#include <list>
-#include <experimental/memory_resource>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
-
-template <class _ValueT>
-using list = _VSTD::list<_ValueT, polymorphic_allocator<_ValueT>>;
-
-_LIBCPP_END_NAMESPACE_LFTS_PMR
-
-#endif /* _LIBCPP_EXPERIMENTAL_LIST */
diff --git a/lib/libcxx/include/experimental/map b/lib/libcxx/include/experimental/map
deleted file mode 100644
index cff2c5e52c0..00000000000
--- a/lib/libcxx/include/experimental/map
+++ /dev/null
@@ -1,57 +0,0 @@
-// -*- C++ -*-
-//===----------------------------- map ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_MAP
-#define _LIBCPP_EXPERIMENTAL_MAP
-/*
- experimental/map synopsis
-
-// C++1z
-namespace std {
-namespace experimental {
-inline namespace fundamentals_v1 {
-namespace pmr {
-
- template <class Key, class T, class Compare = less<Key>>
- using map = std::map<Key, T, Compare,
- polymorphic_allocator<pair<const Key,T>>>;
-
- template <class Key, class T, class Compare = less<Key>>
- using multimap = std::multimap<Key, T, Compare,
- polymorphic_allocator<pair<const Key,T>>>;
-
-} // namespace pmr
-} // namespace fundamentals_v1
-} // namespace experimental
-} // namespace std
-
- */
-
-#include <experimental/__config>
-#include <map>
-#include <experimental/memory_resource>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
-
-template <class _Key, class _Value, class _Compare = less<_Key>>
-using map = _VSTD::map<_Key, _Value, _Compare,
- polymorphic_allocator<pair<const _Key, _Value>>>;
-
-template <class _Key, class _Value, class _Compare = less<_Key>>
-using multimap = _VSTD::multimap<_Key, _Value, _Compare,
- polymorphic_allocator<pair<const _Key, _Value>>>;
-
-_LIBCPP_END_NAMESPACE_LFTS_PMR
-
-#endif /* _LIBCPP_EXPERIMENTAL_MAP */
diff --git a/lib/libcxx/include/experimental/memory_resource b/lib/libcxx/include/experimental/memory_resource
deleted file mode 100644
index 83781d46203..00000000000
--- a/lib/libcxx/include/experimental/memory_resource
+++ /dev/null
@@ -1,427 +0,0 @@
-// -*- C++ -*-
-//===------------------------ memory_resource -----------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_MEMORY_RESOURCE
-#define _LIBCPP_EXPERIMENTAL_MEMORY_RESOURCE
-
-/**
- experimental/memory_resource synopsis
-
-// C++1y
-
-namespace std {
-namespace experimental {
-inline namespace fundamentals_v1 {
-namespace pmr {
-
- class memory_resource;
-
- bool operator==(const memory_resource& a,
- const memory_resource& b) noexcept;
- bool operator!=(const memory_resource& a,
- const memory_resource& b) noexcept;
-
- template <class Tp> class polymorphic_allocator;
-
- template <class T1, class T2>
- bool operator==(const polymorphic_allocator<T1>& a,
- const polymorphic_allocator<T2>& b) noexcept;
- template <class T1, class T2>
- bool operator!=(const polymorphic_allocator<T1>& a,
- const polymorphic_allocator<T2>& b) noexcept;
-
- // The name resource_adaptor_imp is for exposition only.
- template <class Allocator> class resource_adaptor_imp;
-
- template <class Allocator>
- using resource_adaptor = resource_adaptor_imp<
- allocator_traits<Allocator>::rebind_alloc<char>>;
-
- // Global memory resources
- memory_resource* new_delete_resource() noexcept;
- memory_resource* null_memory_resource() noexcept;
-
- // The default memory resource
- memory_resource* set_default_resource(memory_resource* r) noexcept;
- memory_resource* get_default_resource() noexcept;
-
- // Standard memory resources
- struct pool_options;
- class synchronized_pool_resource;
- class unsynchronized_pool_resource;
- class monotonic_buffer_resource;
-
-} // namespace pmr
-} // namespace fundamentals_v1
-} // namespace experimental
-} // namespace std
-
- */
-
-#include <experimental/__config>
-#include <experimental/__memory>
-#include <limits>
-#include <memory>
-#include <new>
-#include <stdexcept>
-#include <__tuple>
-#include <type_traits>
-#include <utility>
-#include <cstddef>
-#include <cstdlib>
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
-
-// Round __s up to next multiple of __a.
-inline _LIBCPP_INLINE_VISIBILITY
-size_t __aligned_allocation_size(size_t __s, size_t __a) _NOEXCEPT
-{
- _LIBCPP_ASSERT(__s + __a > __s, "aligned allocation size overflows");
- return (__s + __a - 1) & ~(__a - 1);
-}
-
-// 8.5, memory.resource
-class _LIBCPP_TYPE_VIS memory_resource
-{
- static const size_t __max_align = _LIBCPP_ALIGNOF(max_align_t);
-
-// 8.5.2, memory.resource.public
-public:
- virtual ~memory_resource() = default;
-
- _LIBCPP_INLINE_VISIBILITY
- void* allocate(size_t __bytes, size_t __align = __max_align)
- { return do_allocate(__bytes, __align); }
-
- _LIBCPP_INLINE_VISIBILITY
- void deallocate(void * __p, size_t __bytes, size_t __align = __max_align)
- { do_deallocate(__p, __bytes, __align); }
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_equal(memory_resource const & __other) const _NOEXCEPT
- { return do_is_equal(__other); }
-
-// 8.5.3, memory.resource.priv
-protected:
- virtual void* do_allocate(size_t, size_t) = 0;
- virtual void do_deallocate(void*, size_t, size_t) = 0;
- virtual bool do_is_equal(memory_resource const &) const _NOEXCEPT = 0;
-};
-
-// 8.5.4, memory.resource.eq
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator==(memory_resource const & __lhs,
- memory_resource const & __rhs) _NOEXCEPT
-{
- return &__lhs == &__rhs || __lhs.is_equal(__rhs);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator!=(memory_resource const & __lhs,
- memory_resource const & __rhs) _NOEXCEPT
-{
- return !(__lhs == __rhs);
-}
-
-_LIBCPP_FUNC_VIS
-memory_resource * new_delete_resource() _NOEXCEPT;
-
-_LIBCPP_FUNC_VIS
-memory_resource * null_memory_resource() _NOEXCEPT;
-
-_LIBCPP_FUNC_VIS
-memory_resource * get_default_resource() _NOEXCEPT;
-
-_LIBCPP_FUNC_VIS
-memory_resource * set_default_resource(memory_resource * __new_res) _NOEXCEPT;
-
-// 8.6, memory.polymorphic.allocator.class
-
-// 8.6.1, memory.polymorphic.allocator.overview
-template <class _ValueType>
-class _LIBCPP_TEMPLATE_VIS polymorphic_allocator
-{
-public:
- typedef _ValueType value_type;
-
- // 8.6.2, memory.polymorphic.allocator.ctor
- _LIBCPP_INLINE_VISIBILITY
- polymorphic_allocator() _NOEXCEPT
- : __res_(_VSTD_LFTS_PMR::get_default_resource())
- {}
-
- _LIBCPP_INLINE_VISIBILITY
- polymorphic_allocator(memory_resource * __r) _NOEXCEPT
- : __res_(__r)
- {}
-
- polymorphic_allocator(polymorphic_allocator const &) = default;
-
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY
- polymorphic_allocator(polymorphic_allocator<_Tp> const & __other) _NOEXCEPT
- : __res_(__other.resource())
- {}
-
- polymorphic_allocator &
- operator=(polymorphic_allocator const &) = delete;
-
- // 8.6.3, memory.polymorphic.allocator.mem
- _LIBCPP_INLINE_VISIBILITY
- _ValueType* allocate(size_t __n) {
- if (__n > __max_size()) {
- __throw_length_error(
- "std::experimental::pmr::polymorphic_allocator<T>::allocate(size_t n)"
- " 'n' exceeds maximum supported size");
- }
- return static_cast<_ValueType*>(
- __res_->allocate(__n * sizeof(_ValueType), _LIBCPP_ALIGNOF(_ValueType))
- );
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void deallocate(_ValueType * __p, size_t __n) _NOEXCEPT {
- _LIBCPP_ASSERT(__n <= __max_size(),
- "deallocate called for size which exceeds max_size()");
- __res_->deallocate(__p, __n * sizeof(_ValueType), _LIBCPP_ALIGNOF(_ValueType));
- }
-
- template <class _Tp, class ..._Ts>
- _LIBCPP_INLINE_VISIBILITY
- void construct(_Tp* __p, _Ts &&... __args)
- {
- _VSTD_LFTS::__lfts_user_alloc_construct(
- __p, *this, _VSTD::forward<_Ts>(__args)...
- );
- }
-
- template <class _T1, class _T2, class ..._Args1, class ..._Args2>
- _LIBCPP_INLINE_VISIBILITY
- void construct(pair<_T1, _T2>* __p, piecewise_construct_t,
- tuple<_Args1...> __x, tuple<_Args2...> __y)
- {
- ::new ((void*)__p) pair<_T1, _T2>(piecewise_construct
- , __transform_tuple(
- typename __lfts_uses_alloc_ctor<
- _T1, polymorphic_allocator&, _Args1...
- >::type()
- , _VSTD::move(__x)
- , typename __make_tuple_indices<sizeof...(_Args1)>::type{}
- )
- , __transform_tuple(
- typename __lfts_uses_alloc_ctor<
- _T2, polymorphic_allocator&, _Args2...
- >::type()
- , _VSTD::move(__y)
- , typename __make_tuple_indices<sizeof...(_Args2)>::type{}
- )
- );
- }
-
- template <class _T1, class _T2>
- _LIBCPP_INLINE_VISIBILITY
- void construct(pair<_T1, _T2>* __p) {
- construct(__p, piecewise_construct, tuple<>(), tuple<>());
- }
-
- template <class _T1, class _T2, class _Up, class _Vp>
- _LIBCPP_INLINE_VISIBILITY
- void construct(pair<_T1, _T2> * __p, _Up && __u, _Vp && __v) {
- construct(__p, piecewise_construct
- , _VSTD::forward_as_tuple(_VSTD::forward<_Up>(__u))
- , _VSTD::forward_as_tuple(_VSTD::forward<_Vp>(__v)));
- }
-
- template <class _T1, class _T2, class _U1, class _U2>
- _LIBCPP_INLINE_VISIBILITY
- void construct(pair<_T1, _T2> * __p, pair<_U1, _U2> const & __pr) {
- construct(__p, piecewise_construct
- , _VSTD::forward_as_tuple(__pr.first)
- , _VSTD::forward_as_tuple(__pr.second));
- }
-
- template <class _T1, class _T2, class _U1, class _U2>
- _LIBCPP_INLINE_VISIBILITY
- void construct(pair<_T1, _T2> * __p, pair<_U1, _U2> && __pr){
- construct(__p, piecewise_construct
- , _VSTD::forward_as_tuple(_VSTD::forward<_U1>(__pr.first))
- , _VSTD::forward_as_tuple(_VSTD::forward<_U2>(__pr.second)));
- }
-
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY
- void destroy(_Tp * __p) _NOEXCEPT
- { __p->~_Tp(); }
-
- _LIBCPP_INLINE_VISIBILITY
- polymorphic_allocator
- select_on_container_copy_construction() const _NOEXCEPT
- { return polymorphic_allocator(); }
-
- _LIBCPP_INLINE_VISIBILITY
- memory_resource * resource() const _NOEXCEPT
- { return __res_; }
-
-private:
- template <class ..._Args, size_t ..._Idx>
- _LIBCPP_INLINE_VISIBILITY
- tuple<_Args&&...>
- __transform_tuple(integral_constant<int, 0>, tuple<_Args...>&& __t,
- __tuple_indices<_Idx...>) const
- {
- return _VSTD::forward_as_tuple(_VSTD::get<_Idx>(_VSTD::move(__t))...);
- }
-
- template <class ..._Args, size_t ..._Idx>
- _LIBCPP_INLINE_VISIBILITY
- tuple<allocator_arg_t const&, polymorphic_allocator&, _Args&&...>
- __transform_tuple(integral_constant<int, 1>, tuple<_Args...> && __t,
- __tuple_indices<_Idx...>)
- {
- using _Tup = tuple<allocator_arg_t const&, polymorphic_allocator&, _Args&&...>;
- return _Tup(allocator_arg, *this,
- _VSTD::get<_Idx>(_VSTD::move(__t))...);
- }
-
- template <class ..._Args, size_t ..._Idx>
- _LIBCPP_INLINE_VISIBILITY
- tuple<_Args&&..., polymorphic_allocator&>
- __transform_tuple(integral_constant<int, 2>, tuple<_Args...> && __t,
- __tuple_indices<_Idx...>)
- {
- using _Tup = tuple<_Args&&..., polymorphic_allocator&>;
- return _Tup(_VSTD::get<_Idx>(_VSTD::move(__t))..., *this);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- size_t __max_size() const _NOEXCEPT
- { return numeric_limits<size_t>::max() / sizeof(value_type); }
-
- memory_resource * __res_;
-};
-
-// 8.6.4, memory.polymorphic.allocator.eq
-
-template <class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator==(polymorphic_allocator<_Tp> const & __lhs,
- polymorphic_allocator<_Up> const & __rhs) _NOEXCEPT
-{
- return *__lhs.resource() == *__rhs.resource();
-}
-
-template <class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator!=(polymorphic_allocator<_Tp> const & __lhs,
- polymorphic_allocator<_Up> const & __rhs) _NOEXCEPT
-{
- return !(__lhs == __rhs);
-}
-
-// 8.7, memory.resource.adaptor
-
-// 8.7.1, memory.resource.adaptor.overview
-template <class _CharAlloc>
-class _LIBCPP_TEMPLATE_VIS __resource_adaptor_imp
- : public memory_resource
-{
- using _CTraits = allocator_traits<_CharAlloc>;
- static_assert(is_same<typename _CTraits::value_type, char>::value
- && is_same<typename _CTraits::pointer, char*>::value
- && is_same<typename _CTraits::void_pointer, void*>::value, "");
-
- static const size_t _MaxAlign = _LIBCPP_ALIGNOF(max_align_t);
-
- using _Alloc = typename _CTraits::template rebind_alloc<
- typename aligned_storage<_MaxAlign, _MaxAlign>::type
- >;
-
- using _ValueType = typename _Alloc::value_type;
-
- _Alloc __alloc_;
-
-public:
- typedef _CharAlloc allocator_type;
-
- __resource_adaptor_imp() = default;
- __resource_adaptor_imp(__resource_adaptor_imp const &) = default;
- __resource_adaptor_imp(__resource_adaptor_imp &&) = default;
-
- // 8.7.2, memory.resource.adaptor.ctor
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __resource_adaptor_imp(allocator_type const & __a)
- : __alloc_(__a)
- {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __resource_adaptor_imp(allocator_type && __a)
- : __alloc_(_VSTD::move(__a))
- {}
-
- __resource_adaptor_imp &
- operator=(__resource_adaptor_imp const &) = default;
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const
- { return __alloc_; }
-
-// 8.7.3, memory.resource.adaptor.mem
-protected:
- virtual void * do_allocate(size_t __bytes, size_t)
- {
- if (__bytes > __max_size()) {
- __throw_length_error(
- "std::experimental::pmr::resource_adaptor<T>::do_allocate(size_t bytes, size_t align)"
- " 'bytes' exceeds maximum supported size");
- }
- size_t __s = __aligned_allocation_size(__bytes, _MaxAlign) / _MaxAlign;
- return __alloc_.allocate(__s);
- }
-
- virtual void do_deallocate(void * __p, size_t __bytes, size_t)
- {
- _LIBCPP_ASSERT(__bytes <= __max_size(),
- "do_deallocate called for size which exceeds the maximum allocation size");
- size_t __s = __aligned_allocation_size(__bytes, _MaxAlign) / _MaxAlign;
- __alloc_.deallocate((_ValueType*)__p, __s);
- }
-
- virtual bool do_is_equal(memory_resource const & __other) const _NOEXCEPT {
- __resource_adaptor_imp const * __p
- = dynamic_cast<__resource_adaptor_imp const *>(&__other);
- return __p ? __alloc_ == __p->__alloc_ : false;
- }
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- size_t __max_size() const _NOEXCEPT {
- return numeric_limits<size_t>::max() - _MaxAlign;
- }
-};
-
-template <class _Alloc>
-using resource_adaptor = __resource_adaptor_imp<
- typename allocator_traits<_Alloc>::template rebind_alloc<char>
- >;
-
-_LIBCPP_END_NAMESPACE_LFTS_PMR
-
-_LIBCPP_POP_MACROS
-
-#endif /* _LIBCPP_EXPERIMENTAL_MEMORY_RESOURCE */
diff --git a/lib/libcxx/include/experimental/numeric b/lib/libcxx/include/experimental/numeric
deleted file mode 100644
index 19c65313f0f..00000000000
--- a/lib/libcxx/include/experimental/numeric
+++ /dev/null
@@ -1,21 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- numeric ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#ifndef _LIBCPP_EXPERIMENTAL_NUMERIC
-#define _LIBCPP_EXPERIMENTAL_NUMERIC
-
-#include <__config>
-
-#ifdef _LIBCPP_WARNING
-_LIBCPP_WARNING("<experimental/numeric> has been removed. Use <numeric> instead.")
-#else
-# warning "<experimental/numeric> has been removed. Use <numeric> instead."
-#endif
-
-#endif // _LIBCPP_EXPERIMENTAL_NUMERIC
diff --git a/lib/libcxx/include/experimental/optional b/lib/libcxx/include/experimental/optional
deleted file mode 100644
index 6eb4a2618d2..00000000000
--- a/lib/libcxx/include/experimental/optional
+++ /dev/null
@@ -1,21 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- optional ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#ifndef _LIBCPP_EXPERIMENTAL_OPTIONAL
-#define _LIBCPP_EXPERIMENTAL_OPTIONAL
-
-#include <__config>
-
-#ifdef _LIBCPP_WARNING
-_LIBCPP_WARNING("<experimental/optional> has been removed. Use <optional> instead.")
-#else
-# warning "<experimental/optional> has been removed. Use <optional> instead."
-#endif
-
-#endif // _LIBCPP_EXPERIMENTAL_OPTIONAL
diff --git a/lib/libcxx/include/experimental/propagate_const b/lib/libcxx/include/experimental/propagate_const
deleted file mode 100644
index 188548596b8..00000000000
--- a/lib/libcxx/include/experimental/propagate_const
+++ /dev/null
@@ -1,579 +0,0 @@
-// -*- C++ -*-
-//===------------------------ propagate_const -----------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_PROPAGATE_CONST
-#define _LIBCPP_EXPERIMENTAL_PROPAGATE_CONST
-/*
- propagate_const synopsis
-
- namespace std { namespace experimental { inline namespace fundamentals_v2 {
-
- // [propagate_const]
- template <class T> class propagate_const;
-
- // [propagate_const.underlying], underlying pointer access
- constexpr const _Tp& _VSTD_LFTS_V2::get_underlying(const propagate_const<T>& pt) noexcept;
- constexpr T& _VSTD_LFTS_V2::get_underlying(propagate_const<T>& pt) noexcept;
-
- // [propagate_const.relational], relational operators
- template <class T> constexpr bool operator==(const propagate_const<T>& pt, nullptr_t);
- template <class T> constexpr bool operator==(nullptr_t, const propagate_const<T>& pu);
- template <class T> constexpr bool operator!=(const propagate_const<T>& pt, nullptr_t);
- template <class T> constexpr bool operator!=(nullptr_t, const propagate_const<T>& pu);
- template <class T, class U> constexpr bool operator==(const propagate_const<T>& pt, const propagate_const<_Up>& pu);
- template <class T, class U> constexpr bool operator!=(const propagate_const<T>& pt, const propagate_const<_Up>& pu);
- template <class T, class U> constexpr bool operator<(const propagate_const<T>& pt, const propagate_const<_Up>& pu);
- template <class T, class U> constexpr bool operator>(const propagate_const<T>& pt, const propagate_const<_Up>& pu);
- template <class T, class U> constexpr bool operator<=(const propagate_const<T>& pt, const propagate_const<_Up>& pu);
- template <class T, class U> constexpr bool operator>=(const propagate_const<T>& pt, const propagate_const<_Up>& pu);
- template <class T, class U> constexpr bool operator==(const propagate_const<T>& pt, const _Up& u);
- template <class T, class U> constexpr bool operator!=(const propagate_const<T>& pt, const _Up& u);
- template <class T, class U> constexpr bool operator<(const propagate_const<T>& pt, const _Up& u);
- template <class T, class U> constexpr bool operator>(const propagate_const<T>& pt, const _Up& u);
- template <class T, class U> constexpr bool operator<=(const propagate_const<T>& pt, const _Up& u);
- template <class T, class U> constexpr bool operator>=(const propagate_const<T>& pt, const _Up& u);
- template <class T, class U> constexpr bool operator==(const _Tp& t, const propagate_const<_Up>& pu);
- template <class T, class U> constexpr bool operator!=(const _Tp& t, const propagate_const<_Up>& pu);
- template <class T, class U> constexpr bool operator<(const _Tp& t, const propagate_const<_Up>& pu);
- template <class T, class U> constexpr bool operator>(const _Tp& t, const propagate_const<_Up>& pu);
- template <class T, class U> constexpr bool operator<=(const _Tp& t, const propagate_const<_Up>& pu);
- template <class T, class U> constexpr bool operator>=(const _Tp& t, const propagate_const<_Up>& pu);
-
- // [propagate_const.algorithms], specialized algorithms
- template <class T> constexpr void swap(propagate_const<T>& pt, propagate_const<T>& pu) noexcept(see below);
-
- template <class T>
- class propagate_const
- {
-
- public:
- typedef remove_reference_t<decltype(*declval<T&>())> element_type;
-
- // [propagate_const.ctor], constructors
- constexpr propagate_const() = default;
- propagate_const(const propagate_const& p) = delete;
- constexpr propagate_const(propagate_const&& p) = default;
- template <class U> EXPLICIT constexpr propagate_const(propagate_const<_Up>&& pu); // see below
- template <class U> EXPLICIT constexpr propagate_const(U&& u); // see below
-
- // [propagate_const.assignment], assignment
- propagate_const& operator=(const propagate_const& p) = delete;
- constexpr propagate_const& operator=(propagate_const&& p) = default;
- template <class U> constexpr propagate_const& operator=(propagate_const<_Up>&& pu);
- template <class U> constexpr propagate_const& operator=(U&& u); // see below
-
- // [propagate_const.const_observers], const observers
- explicit constexpr operator bool() const;
- constexpr const element_type* operator->() const;
- constexpr operator const element_type*() const; // Not always defined
- constexpr const element_type& operator*() const;
- constexpr const element_type* get() const;
-
- // [propagate_const.non_const_observers], non-const observers
- constexpr element_type* operator->();
- constexpr operator element_type*(); // Not always defined
- constexpr element_type& operator*();
- constexpr element_type* get();
-
- // [propagate_const.modifiers], modifiers
- constexpr void swap(propagate_const& pt) noexcept(see below)
-
- private:
- T t_; // exposition only
- };
-
- } // namespace fundamentals_v2
- } // namespace experimental
-
- // [propagate_const.hash], hash support
- template <class T> struct hash<experimental::fundamentals_v2::propagate_const<T>>;
-
- // [propagate_const.comparison_function_objects], comparison function objects
- template <class T> struct equal_to<experimental::fundamentals_v2::propagate_const<T>>;
- template <class T> struct not_equal_to<experimental::fundamentals_v2::propagate_const<T>>;
- template <class T> struct less<experimental::fundamentals_v2::propagate_const<T>>;
- template <class T> struct greater<experimental::fundamentals_v2::propagate_const<T>>;
- template <class T> struct less_equal<experimental::fundamentals_v2::propagate_const<T>>;
- template <class T> struct greater_equal<experimental::fundamentals_v2::propagate_const<T>>;
-
-} // namespace std
-
-*/
-
-#include <experimental/__config>
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#if _LIBCPP_STD_VER > 11
-
-#include <type_traits>
-#include <utility>
-#include <functional>
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS_V2
-
-
-template <class _Tp>
-class propagate_const;
-
-template <class _Up>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-const _Up& get_underlying(const propagate_const<_Up>& __pu) _NOEXCEPT;
-
-template <class _Up>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-_Up& get_underlying(propagate_const<_Up>& __pu) _NOEXCEPT;
-
-template <class _Tp>
-class propagate_const
-{
-public:
- typedef remove_reference_t<decltype(*_VSTD::declval<_Tp&>())> element_type;
-
- static_assert(!is_array<_Tp>::value,
- "Instantiation of propagate_const with an array type is ill-formed.");
- static_assert(!is_reference<_Tp>::value,
- "Instantiation of propagate_const with a reference type is ill-formed.");
- static_assert(!(is_pointer<_Tp>::value && is_function<typename remove_pointer<_Tp>::type>::value),
- "Instantiation of propagate_const with a function-pointer type is ill-formed.");
- static_assert(!(is_pointer<_Tp>::value && is_same<typename remove_cv<typename remove_pointer<_Tp>::type>::type, void>::value),
- "Instantiation of propagate_const with a pointer to (possibly cv-qualified) void is ill-formed.");
-
-private:
- template <class _Up>
- static _LIBCPP_CONSTEXPR element_type* __get_pointer(_Up* __u)
- {
- return __u;
- }
-
- template <class _Up>
- static _LIBCPP_CONSTEXPR element_type* __get_pointer(_Up& __u)
- {
- return __get_pointer(__u.get());
- }
-
- template <class _Up>
- static _LIBCPP_CONSTEXPR const element_type* __get_pointer(const _Up* __u)
- {
- return __u;
- }
-
- template <class _Up>
- static _LIBCPP_CONSTEXPR const element_type* __get_pointer(const _Up& __u)
- {
- return __get_pointer(__u.get());
- }
-
- template <class _Up>
- struct __is_propagate_const : false_type
- {
- };
-
- template <class _Up>
- struct __is_propagate_const<propagate_const<_Up>> : true_type
- {
- };
-
- _Tp __t_;
-
-public:
-
- template <class _Up> friend _LIBCPP_CONSTEXPR const _Up& ::_VSTD_LFTS_V2::get_underlying(const propagate_const<_Up>& __pu) _NOEXCEPT;
- template <class _Up> friend _LIBCPP_CONSTEXPR _Up& ::_VSTD_LFTS_V2::get_underlying(propagate_const<_Up>& __pu) _NOEXCEPT;
-
- _LIBCPP_CONSTEXPR propagate_const() = default;
-
- propagate_const(const propagate_const&) = delete;
-
- _LIBCPP_CONSTEXPR propagate_const(propagate_const&&) = default;
-
- template <class _Up, enable_if_t<!is_convertible<_Up, _Tp>::value &&
- is_constructible<_Tp, _Up&&>::value,bool> = true>
- explicit _LIBCPP_CONSTEXPR propagate_const(propagate_const<_Up>&& __pu)
- : __t_(std::move(_VSTD_LFTS_V2::get_underlying(__pu)))
- {
- }
-
- template <class _Up, enable_if_t<is_convertible<_Up&&, _Tp>::value &&
- is_constructible<_Tp, _Up&&>::value,bool> = false>
- _LIBCPP_CONSTEXPR propagate_const(propagate_const<_Up>&& __pu)
- : __t_(std::move(_VSTD_LFTS_V2::get_underlying(__pu)))
- {
- }
-
- template <class _Up, enable_if_t<!is_convertible<_Up&&, _Tp>::value &&
- is_constructible<_Tp, _Up&&>::value &&
- !__is_propagate_const<decay_t<_Up>>::value,bool> = true>
- explicit _LIBCPP_CONSTEXPR propagate_const(_Up&& __u)
- : __t_(std::forward<_Up>(__u))
- {
- }
-
- template <class _Up, enable_if_t<is_convertible<_Up&&, _Tp>::value &&
- is_constructible<_Tp, _Up&&>::value &&
- !__is_propagate_const<decay_t<_Up>>::value,bool> = false>
- _LIBCPP_CONSTEXPR propagate_const(_Up&& __u)
- : __t_(std::forward<_Up>(__u))
- {
- }
-
- propagate_const& operator=(const propagate_const&) = delete;
-
- _LIBCPP_CONSTEXPR propagate_const& operator=(propagate_const&&) = default;
-
- template <class _Up>
- _LIBCPP_CONSTEXPR propagate_const& operator=(propagate_const<_Up>&& __pu)
- {
- __t_ = std::move(_VSTD_LFTS_V2::get_underlying(__pu));
- return *this;
- }
-
- template <class _Up, class _Vp = enable_if_t<!__is_propagate_const<decay_t<_Up>>::value>>
- _LIBCPP_CONSTEXPR propagate_const& operator=(_Up&& __u)
- {
- __t_ = std::forward<_Up>(__u);
- return *this;
- }
-
- _LIBCPP_CONSTEXPR const element_type* get() const
- {
- return __get_pointer(__t_);
- }
-
- _LIBCPP_CONSTEXPR element_type* get()
- {
- return __get_pointer(__t_);
- }
-
- explicit _LIBCPP_CONSTEXPR operator bool() const
- {
- return get() != nullptr;
- }
-
- _LIBCPP_CONSTEXPR const element_type* operator->() const
- {
- return get();
- }
-
- template <class _Tp_ = _Tp, class _Up = enable_if_t<is_convertible<
- const _Tp_, const element_type *>::value>>
- _LIBCPP_CONSTEXPR operator const element_type *() const {
- return get();
- }
-
- _LIBCPP_CONSTEXPR const element_type& operator*() const
- {
- return *get();
- }
-
- _LIBCPP_CONSTEXPR element_type* operator->()
- {
- return get();
- }
-
- template <class _Tp_ = _Tp, class _Up = enable_if_t<
- is_convertible<_Tp_, element_type *>::value>>
- _LIBCPP_CONSTEXPR operator element_type *() {
- return get();
- }
-
- _LIBCPP_CONSTEXPR element_type& operator*()
- {
- return *get();
- }
-
- _LIBCPP_CONSTEXPR void swap(propagate_const& __pt) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value)
- {
- using _VSTD::swap;
- swap(__t_, __pt.__t_);
- }
-};
-
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator==(const propagate_const<_Tp>& __pt, nullptr_t)
-{
- return _VSTD_LFTS_V2::get_underlying(__pt) == nullptr;
-}
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator==(nullptr_t, const propagate_const<_Tp>& __pt)
-{
- return nullptr == _VSTD_LFTS_V2::get_underlying(__pt);
-}
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator!=(const propagate_const<_Tp>& __pt, nullptr_t)
-{
- return _VSTD_LFTS_V2::get_underlying(__pt) != nullptr;
-}
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator!=(nullptr_t, const propagate_const<_Tp>& __pt)
-{
- return nullptr != _VSTD_LFTS_V2::get_underlying(__pt);
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator==(const propagate_const<_Tp>& __pt,
- const propagate_const<_Up>& __pu)
-{
- return _VSTD_LFTS_V2::get_underlying(__pt) == _VSTD_LFTS_V2::get_underlying(__pu);
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator!=(const propagate_const<_Tp>& __pt,
- const propagate_const<_Up>& __pu)
-{
- return _VSTD_LFTS_V2::get_underlying(__pt) != _VSTD_LFTS_V2::get_underlying(__pu);
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator<(const propagate_const<_Tp>& __pt,
- const propagate_const<_Up>& __pu)
-{
- return _VSTD_LFTS_V2::get_underlying(__pt) < _VSTD_LFTS_V2::get_underlying(__pu);
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator>(const propagate_const<_Tp>& __pt,
- const propagate_const<_Up>& __pu)
-{
- return _VSTD_LFTS_V2::get_underlying(__pt) > _VSTD_LFTS_V2::get_underlying(__pu);
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator<=(const propagate_const<_Tp>& __pt,
- const propagate_const<_Up>& __pu)
-{
- return _VSTD_LFTS_V2::get_underlying(__pt) <= _VSTD_LFTS_V2::get_underlying(__pu);
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator>=(const propagate_const<_Tp>& __pt,
- const propagate_const<_Up>& __pu)
-{
- return _VSTD_LFTS_V2::get_underlying(__pt) >= _VSTD_LFTS_V2::get_underlying(__pu);
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator==(const propagate_const<_Tp>& __pt, const _Up& __u)
-{
- return _VSTD_LFTS_V2::get_underlying(__pt) == __u;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator!=(const propagate_const<_Tp>& __pt, const _Up& __u)
-{
- return _VSTD_LFTS_V2::get_underlying(__pt) != __u;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator<(const propagate_const<_Tp>& __pt, const _Up& __u)
-{
- return _VSTD_LFTS_V2::get_underlying(__pt) < __u;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator>(const propagate_const<_Tp>& __pt, const _Up& __u)
-{
- return _VSTD_LFTS_V2::get_underlying(__pt) > __u;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator<=(const propagate_const<_Tp>& __pt, const _Up& __u)
-{
- return _VSTD_LFTS_V2::get_underlying(__pt) <= __u;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator>=(const propagate_const<_Tp>& __pt, const _Up& __u)
-{
- return _VSTD_LFTS_V2::get_underlying(__pt) >= __u;
-}
-
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator==(const _Tp& __t, const propagate_const<_Up>& __pu)
-{
- return __t == _VSTD_LFTS_V2::get_underlying(__pu);
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator!=(const _Tp& __t, const propagate_const<_Up>& __pu)
-{
- return __t != _VSTD_LFTS_V2::get_underlying(__pu);
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator<(const _Tp& __t, const propagate_const<_Up>& __pu)
-{
- return __t < _VSTD_LFTS_V2::get_underlying(__pu);
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator>(const _Tp& __t, const propagate_const<_Up>& __pu)
-{
- return __t > _VSTD_LFTS_V2::get_underlying(__pu);
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator<=(const _Tp& __t, const propagate_const<_Up>& __pu)
-{
- return __t <= _VSTD_LFTS_V2::get_underlying(__pu);
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR bool operator>=(const _Tp& __t, const propagate_const<_Up>& __pu)
-{
- return __t >= _VSTD_LFTS_V2::get_underlying(__pu);
-}
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR void swap(propagate_const<_Tp>& __pc1, propagate_const<_Tp>& __pc2) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value)
-{
- __pc1.swap(__pc2);
-}
-
-template <class _Tp>
-_LIBCPP_CONSTEXPR const _Tp& get_underlying(const propagate_const<_Tp>& __pt) _NOEXCEPT
-{
- return __pt.__t_;
-}
-
-template <class _Tp>
-_LIBCPP_CONSTEXPR _Tp& get_underlying(propagate_const<_Tp>& __pt) _NOEXCEPT
-{
- return __pt.__t_;
-}
-
-_LIBCPP_END_NAMESPACE_LFTS_V2
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Tp>
-struct hash<experimental::fundamentals_v2::propagate_const<_Tp>>
-{
- typedef size_t result_type;
- typedef experimental::fundamentals_v2::propagate_const<_Tp> argument_type;
-
- size_t operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1) const
- {
- return std::hash<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1));
- }
-};
-
-template <class _Tp>
-struct equal_to<experimental::fundamentals_v2::propagate_const<_Tp>>
-{
- typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type;
- typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type;
-
- bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1,
- const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const
- {
- return std::equal_to<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2));
- }
-};
-
-template <class _Tp>
-struct not_equal_to<experimental::fundamentals_v2::propagate_const<_Tp>>
-{
- typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type;
- typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type;
-
- bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1,
- const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const
- {
- return std::not_equal_to<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2));
- }
-};
-
-template <class _Tp>
-struct less<experimental::fundamentals_v2::propagate_const<_Tp>>
-{
- typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type;
- typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type;
-
- bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1,
- const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const
- {
- return std::less<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2));
- }
-};
-
-template <class _Tp>
-struct greater<experimental::fundamentals_v2::propagate_const<_Tp>>
-{
- typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type;
- typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type;
-
- bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1,
- const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const
- {
- return std::greater<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2));
- }
-};
-
-template <class _Tp>
-struct less_equal<experimental::fundamentals_v2::propagate_const<_Tp>>
-{
- typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type;
- typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type;
-
- bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1,
- const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const
- {
- return std::less_equal<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2));
- }
-};
-
-template <class _Tp>
-struct greater_equal<experimental::fundamentals_v2::propagate_const<_Tp>>
-{
- typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type;
- typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type;
-
- bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1,
- const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const
- {
- return std::greater_equal<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2));
- }
-};
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_STD_VER > 11
-#endif // _LIBCPP_EXPERIMENTAL_PROPAGATE_CONST
-
diff --git a/lib/libcxx/include/experimental/ratio b/lib/libcxx/include/experimental/ratio
deleted file mode 100644
index 52c12004dba..00000000000
--- a/lib/libcxx/include/experimental/ratio
+++ /dev/null
@@ -1,21 +0,0 @@
-// -*- C++ -*-
-//===----------------------------- ratio ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#ifndef _LIBCPP_EXPERIMENTAL_RATIO
-#define _LIBCPP_EXPERIMENTAL_RATIO
-
-#include <__config>
-
-#ifdef _LIBCPP_WARNING
-_LIBCPP_WARNING("<experimental/ratio> has been removed. Use <ratio> instead.")
-#else
-# warning "<experimental/ratio> has been removed. Use <ratio> instead."
-#endif
-
-#endif // _LIBCPP_EXPERIMENTAL_RATIO
diff --git a/lib/libcxx/include/experimental/regex b/lib/libcxx/include/experimental/regex
deleted file mode 100644
index d38891c374b..00000000000
--- a/lib/libcxx/include/experimental/regex
+++ /dev/null
@@ -1,62 +0,0 @@
-// -*- C++ -*-
-//===----------------------------- regex ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_REGEX
-#define _LIBCPP_EXPERIMENTAL_REGEX
-/*
- experimental/regex synopsis
-
-// C++1z
-namespace std {
-namespace experimental {
-inline namespace fundamentals_v1 {
-namespace pmr {
-
- template <class BidirectionalIterator>
- using match_results =
- std::match_results<BidirectionalIterator,
- polymorphic_allocator<sub_match<BidirectionalIterator>>>;
-
- typedef match_results<const char*> cmatch;
- typedef match_results<const wchar_t*> wcmatch;
- typedef match_results<string::const_iterator> smatch;
- typedef match_results<wstring::const_iterator> wsmatch;
-
-} // namespace pmr
-} // namespace fundamentals_v1
-} // namespace experimental
-} // namespace std
-
- */
-
-#include <experimental/__config>
-#include <regex>
-#include <experimental/string>
-#include <experimental/memory_resource>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
-
-template <class _BiDirIter>
-using match_results =
- _VSTD::match_results<_BiDirIter,
- polymorphic_allocator<_VSTD::sub_match<_BiDirIter>>>;
-
-typedef match_results<const char*> cmatch;
-typedef match_results<const wchar_t*> wcmatch;
-typedef match_results<_VSTD_LFTS_PMR::string::const_iterator> smatch;
-typedef match_results<_VSTD_LFTS_PMR::wstring::const_iterator> wsmatch;
-
-_LIBCPP_END_NAMESPACE_LFTS_PMR
-
-#endif /* _LIBCPP_EXPERIMENTAL_REGEX */
diff --git a/lib/libcxx/include/experimental/set b/lib/libcxx/include/experimental/set
deleted file mode 100644
index 20cf6d4a389..00000000000
--- a/lib/libcxx/include/experimental/set
+++ /dev/null
@@ -1,57 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- list ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_SET
-#define _LIBCPP_EXPERIMENTAL_SET
-/*
- experimental/set synopsis
-
-// C++1z
-namespace std {
-namespace experimental {
-inline namespace fundamentals_v1 {
-namespace pmr {
-
- template <class Key, class T, class Compare = less<Key>>
- using set = std::set<Key, T, Compare,
- polymorphic_allocator<pair<const Key,T>>>;
-
- template <class Key, class T, class Compare = less<Key>>
- using multiset = std::multiset<Key, T, Compare,
- polymorphic_allocator<pair<const Key,T>>>;
-
-} // namespace pmr
-} // namespace fundamentals_v1
-} // namespace experimental
-} // namespace std
-
- */
-
-#include <experimental/__config>
-#include <set>
-#include <experimental/memory_resource>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
-
-template <class _Value, class _Compare = less<_Value>>
-using set = _VSTD::set<_Value, _Compare,
- polymorphic_allocator<_Value>>;
-
-template <class _Value, class _Compare = less<_Value>>
-using multiset = _VSTD::multiset<_Value, _Compare,
- polymorphic_allocator<_Value>>;
-
-_LIBCPP_END_NAMESPACE_LFTS_PMR
-
-#endif /* _LIBCPP_EXPERIMENTAL_SET */
diff --git a/lib/libcxx/include/experimental/simd b/lib/libcxx/include/experimental/simd
deleted file mode 100644
index 6580443f7b0..00000000000
--- a/lib/libcxx/include/experimental/simd
+++ /dev/null
@@ -1,1570 +0,0 @@
-// -*- C++ -*-
-//===------------------------------- simd ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#ifndef _LIBCPP_EXPERIMENTAL_SIMD
-#define _LIBCPP_EXPERIMENTAL_SIMD
-
-/*
- experimental/simd synopsis
-
-namespace std::experimental {
-
-inline namespace parallelism_v2 {
-
-namespace simd_abi {
-
-struct scalar {};
-template <int N> struct fixed_size {};
-template <typename T> inline constexpr int max_fixed_size = implementation-defined;
-template <typename T> using compatible = implementation-defined;
-template <typename T> using native = implementation-defined;
-
-} // simd_abi
-
-struct element_aligned_tag {};
-struct vector_aligned_tag {};
-template <size_t> struct overaligned_tag {};
-inline constexpr element_aligned_tag element_aligned{};
-inline constexpr vector_aligned_tag vector_aligned{};
-template <size_t N> inline constexpr overaligned_tag<N> overaligned{};
-
-// traits [simd.traits]
-template <class T> struct is_abi_tag;
-template <class T> inline constexpr bool is_abi_tag_v = is_abi_tag<T>::value;
-
-template <class T> struct is_simd;
-template <class T> inline constexpr bool is_simd_v = is_simd<T>::value;
-
-template <class T> struct is_simd_mask;
-template <class T> inline constexpr bool is_simd_mask_v = is_simd_mask<T>::value;
-
-template <class T> struct is_simd_flag_type;
-template <class T> inline constexpr bool is_simd_flag_type_v = is_simd_flag_type<T>::value;
-
-template <class T, size_t N> struct abi_for_size { using type = see below; };
-template <class T, size_t N> using abi_for_size_t = typename abi_for_size<T, N>::type;
-
-template <class T, class Abi = simd_abi::compatible<T>> struct simd_size;
-template <class T, class Abi = simd_abi::compatible<T>>
-inline constexpr size_t simd_size_v = simd_size<T, Abi>::value;
-
-template <class T, class U = typename T::value_type> struct memory_alignment;
-template <class T, class U = typename T::value_type>
-inline constexpr size_t memory_alignment_v = memory_alignment<T, U>::value;
-
-// class template simd [simd.class]
-template <class T, class Abi = simd_abi::compatible<T>> class simd;
-template <class T> using native_simd = simd<T, simd_abi::native<T>>;
-template <class T, int N> using fixed_size_simd = simd<T, simd_abi::fixed_size<N>>;
-
-// class template simd_mask [simd.mask.class]
-template <class T, class Abi = simd_abi::compatible<T>> class simd_mask;
-template <class T> using native_simd_mask = simd_mask<T, simd_abi::native<T>>;
-template <class T, int N> using fixed_size_simd_mask = simd_mask<T, simd_abi::fixed_size<N>>;
-
-// casts [simd.casts]
-template <class T, class U, class Abi> see below simd_cast(const simd<U, Abi>&);
-template <class T, class U, class Abi> see below static_simd_cast(const simd<U, Abi>&);
-
-template <class T, class Abi>
-fixed_size_simd<T, simd_size_v<T, Abi>> to_fixed_size(const simd<T, Abi>&) noexcept;
-template <class T, class Abi>
-fixed_size_simd_mask<T, simd_size_v<T, Abi>> to_fixed_size(const simd_mask<T, Abi>&) noexcept;
-template <class T, size_t N> native_simd<T> to_native(const fixed_size_simd<T, N>&) noexcept;
-template <class T, size_t N>
-native_simd_mask<T> to_native(const fixed_size_simd_mask<T, N>> &) noexcept;
-template <class T, size_t N> simd<T> to_compatible(const fixed_size_simd<T, N>&) noexcept;
-template <class T, size_t N> simd_mask<T> to_compatible(const fixed_size_simd_mask<T, N>&) noexcept;
-
-template <size_t... Sizes, class T, class Abi>
-tuple<simd<T, abi_for_size_t<Sizes>>...> split(const simd<T, Abi>&);
-template <size_t... Sizes, class T, class Abi>
-tuple<simd_mask<T, abi_for_size_t<Sizes>>...> split(const simd_mask<T, Abi>&);
-template <class V, class Abi>
-array<V, simd_size_v<typename V::value_type, Abi> / V::size()> split(
-const simd<typename V::value_type, Abi>&);
-template <class V, class Abi>
-array<V, simd_size_v<typename V::value_type, Abi> / V::size()> split(
-const simd_mask<typename V::value_type, Abi>&);
-
-template <class T, class... Abis>
-simd<T, abi_for_size_t<T, (simd_size_v<T, Abis> + ...)>> concat(const simd<T, Abis>&...);
-template <class T, class... Abis>
-simd_mask<T, abi_for_size_t<T, (simd_size_v<T, Abis> + ...)>> concat(const simd_mask<T, Abis>&...);
-
-// reductions [simd.mask.reductions]
-template <class T, class Abi> bool all_of(const simd_mask<T, Abi>&) noexcept;
-template <class T, class Abi> bool any_of(const simd_mask<T, Abi>&) noexcept;
-template <class T, class Abi> bool none_of(const simd_mask<T, Abi>&) noexcept;
-template <class T, class Abi> bool some_of(const simd_mask<T, Abi>&) noexcept;
-template <class T, class Abi> int popcount(const simd_mask<T, Abi>&) noexcept;
-template <class T, class Abi> int find_first_set(const simd_mask<T, Abi>&);
-template <class T, class Abi> int find_last_set(const simd_mask<T, Abi>&);
-
-bool all_of(see below) noexcept;
-bool any_of(see below) noexcept;
-bool none_of(see below) noexcept;
-bool some_of(see below) noexcept;
-int popcount(see below) noexcept;
-int find_first_set(see below) noexcept;
-int find_last_set(see below) noexcept;
-
-// masked assignment [simd.whereexpr]
-template <class M, class T> class const_where_expression;
-template <class M, class T> class where_expression;
-
-// masked assignment [simd.mask.where]
-template <class T> struct nodeduce { using type = T; }; // exposition only
-
-template <class T> using nodeduce_t = typename nodeduce<T>::type; // exposition only
-
-template <class T, class Abi>
-where_expression<simd_mask<T, Abi>, simd<T, Abi>>
-where(const typename simd<T, Abi>::mask_type&, simd<T, Abi>&) noexcept;
-
-template <class T, class Abi>
-const_where_expression<simd_mask<T, Abi>, const simd<T, Abi>>
-where(const typename simd<T, Abi>::mask_type&, const simd<T, Abi>&) noexcept;
-
-template <class T, class Abi>
-where_expression<simd_mask<T, Abi>, simd_mask<T, Abi>>
-where(const nodeduce_t<simd_mask<T, Abi>>&, simd_mask<T, Abi>&) noexcept;
-
-template <class T, class Abi>
-const_where_expression<simd_mask<T, Abi>, const simd_mask<T, Abi>>
-where(const nodeduce_t<simd_mask<T, Abi>>&, const simd_mask<T, Abi>&) noexcept;
-
-template <class T> where_expression<bool, T> where(see below k, T& d) noexcept;
-
-template <class T>
-const_where_expression<bool, const T> where(see below k, const T& d) noexcept;
-
-// reductions [simd.reductions]
-template <class T, class Abi, class BinaryOperation = std::plus<>>
-T reduce(const simd<T, Abi>&, BinaryOperation = BinaryOperation());
-
-template <class M, class V, class BinaryOperation>
-typename V::value_type reduce(const const_where_expression<M, V>& x,
-typename V::value_type neutral_element, BinaryOperation binary_op);
-
-template <class M, class V>
-typename V::value_type reduce(const const_where_expression<M, V>& x, plus<> binary_op = plus<>());
-
-template <class M, class V>
-typename V::value_type reduce(const const_where_expression<M, V>& x, multiplies<> binary_op);
-
-template <class M, class V>
-typename V::value_type reduce(const const_where_expression<M, V>& x, bit_and<> binary_op);
-
-template <class M, class V>
-typename V::value_type reduce(const const_where_expression<M, V>& x, bit_or<> binary_op);
-
-template <class M, class V>
-typename V::value_type reduce(const const_where_expression<M, V>& x, bit_xor<> binary_op);
-
-template <class T, class Abi> T hmin(const simd<T, Abi>&);
-template <class M, class V> T hmin(const const_where_expression<M, V>&);
-template <class T, class Abi> T hmax(const simd<T, Abi>&);
-template <class M, class V> T hmax(const const_where_expression<M, V>&);
-
-// algorithms [simd.alg]
-template <class T, class Abi> simd<T, Abi> min(const simd<T, Abi>&, const simd<T, Abi>&) noexcept;
-
-template <class T, class Abi> simd<T, Abi> max(const simd<T, Abi>&, const simd<T, Abi>&) noexcept;
-
-template <class T, class Abi>
-std::pair<simd<T, Abi>, simd<T, Abi>> minmax(const simd<T, Abi>&, const simd<T, Abi>&) noexcept;
-
-template <class T, class Abi>
-simd<T, Abi> clamp(const simd<T, Abi>& v, const simd<T, Abi>& lo, const simd<T, Abi>& hi);
-
-// [simd.whereexpr]
-template <class M, class T>
-class const_where_expression {
- const M& mask; // exposition only
- T& data; // exposition only
-public:
- const_where_expression(const const_where_expression&) = delete;
- const_where_expression& operator=(const const_where_expression&) = delete;
- remove_const_t<T> operator-() const &&;
- template <class U, class Flags> void copy_to(U* mem, Flags f) const &&;
-};
-
-template <class M, class T>
-class where_expression : public const_where_expression<M, T> {
-public:
- where_expression(const where_expression&) = delete;
- where_expression& operator=(const where_expression&) = delete;
- template <class U> void operator=(U&& x);
- template <class U> void operator+=(U&& x);
- template <class U> void operator-=(U&& x);
- template <class U> void operator*=(U&& x);
- template <class U> void operator/=(U&& x);
- template <class U> void operator%=(U&& x);
- template <class U> void operator&=(U&& x);
- template <class U> void operator|=(U&& x);
- template <class U> void operator^=(U&& x);
- template <class U> void operator<<=(U&& x);
- template <class U> void operator>>=(U&& x);
- void operator++();
- void operator++(int);
- void operator--();
- void operator--(int);
- template <class U, class Flags> void copy_from(const U* mem, Flags);
-};
-
-// [simd.class]
-template <class T, class Abi> class simd {
-public:
- using value_type = T;
- using reference = see below;
- using mask_type = simd_mask<T, Abi>;
-
- using abi_type = Abi;
- static constexpr size_t size() noexcept;
- simd() = default;
-
- // implicit type conversion constructor
- template <class U> simd(const simd<U, simd_abi::fixed_size<size()>>&);
-
- // implicit broadcast constructor (see below for constraints)
- template <class U> simd(U&& value);
-
- // generator constructor (see below for constraints)
- template <class G> explicit simd(G&& gen);
-
- // load constructor
- template <class U, class Flags> simd(const U* mem, Flags f);
-
- // loads [simd.load]
- template <class U, class Flags> void copy_from(const U* mem, Flags f);
-
- // stores [simd.store]
- template <class U, class Flags> void copy_to(U* mem, Flags f) const;
-
- // scalar access [simd.subscr]
- reference operator[](size_t);
- value_type operator[](size_t) const;
-
- // unary operators [simd.unary]
- simd& operator++();
- simd operator++(int);
- simd& operator--();
- simd operator--(int);
- mask_type operator!() const;
- simd operator~() const; // see below
- simd operator+() const;
- simd operator-() const;
-
- // binary operators [simd.binary]
- friend simd operator+ (const simd&, const simd&);
- friend simd operator- (const simd&, const simd&);
- friend simd operator* (const simd&, const simd&);
- friend simd operator/ (const simd&, const simd&);
- friend simd operator% (const simd&, const simd&);
- friend simd operator& (const simd&, const simd&);
- friend simd operator| (const simd&, const simd&);
- friend simd operator^ (const simd&, const simd&);
- friend simd operator<<(const simd&, const simd&);
- friend simd operator>>(const simd&, const simd&);
- friend simd operator<<(const simd&, int);
- friend simd operator>>(const simd&, int);
-
- // compound assignment [simd.cassign]
- friend simd& operator+= (simd&, const simd&);
- friend simd& operator-= (simd&, const simd&);
- friend simd& operator*= (simd&, const simd&);
- friend simd& operator/= (simd&, const simd&);
- friend simd& operator%= (simd&, const simd&);
-
- friend simd& operator&= (simd&, const simd&);
- friend simd& operator|= (simd&, const simd&);
- friend simd& operator^= (simd&, const simd&);
- friend simd& operator<<=(simd&, const simd&);
- friend simd& operator>>=(simd&, const simd&);
- friend simd& operator<<=(simd&, int);
- friend simd& operator>>=(simd&, int);
-
- // compares [simd.comparison]
- friend mask_type operator==(const simd&, const simd&);
- friend mask_type operator!=(const simd&, const simd&);
- friend mask_type operator>=(const simd&, const simd&);
- friend mask_type operator<=(const simd&, const simd&);
- friend mask_type operator> (const simd&, const simd&);
- friend mask_type operator< (const simd&, const simd&);
-};
-
-// [simd.math]
-template <class Abi> using scharv = simd<signed char, Abi>; // exposition only
-template <class Abi> using shortv = simd<short, Abi>; // exposition only
-template <class Abi> using intv = simd<int, Abi>; // exposition only
-template <class Abi> using longv = simd<long int, Abi>; // exposition only
-template <class Abi> using llongv = simd<long long int, Abi>; // exposition only
-template <class Abi> using floatv = simd<float, Abi>; // exposition only
-template <class Abi> using doublev = simd<double, Abi>; // exposition only
-template <class Abi> using ldoublev = simd<long double, Abi>; // exposition only
-template <class T, class V> using samesize = fixed_size_simd<T, V::size()>; // exposition only
-
-template <class Abi> floatv<Abi> acos(floatv<Abi> x);
-template <class Abi> doublev<Abi> acos(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> acos(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> asin(floatv<Abi> x);
-template <class Abi> doublev<Abi> asin(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> asin(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> atan(floatv<Abi> x);
-template <class Abi> doublev<Abi> atan(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> atan(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> atan2(floatv<Abi> y, floatv<Abi> x);
-template <class Abi> doublev<Abi> atan2(doublev<Abi> y, doublev<Abi> x);
-template <class Abi> ldoublev<Abi> atan2(ldoublev<Abi> y, ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> cos(floatv<Abi> x);
-template <class Abi> doublev<Abi> cos(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> cos(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> sin(floatv<Abi> x);
-template <class Abi> doublev<Abi> sin(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> sin(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> tan(floatv<Abi> x);
-template <class Abi> doublev<Abi> tan(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> tan(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> acosh(floatv<Abi> x);
-template <class Abi> doublev<Abi> acosh(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> acosh(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> asinh(floatv<Abi> x);
-template <class Abi> doublev<Abi> asinh(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> asinh(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> atanh(floatv<Abi> x);
-template <class Abi> doublev<Abi> atanh(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> atanh(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> cosh(floatv<Abi> x);
-template <class Abi> doublev<Abi> cosh(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> cosh(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> sinh(floatv<Abi> x);
-template <class Abi> doublev<Abi> sinh(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> sinh(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> tanh(floatv<Abi> x);
-template <class Abi> doublev<Abi> tanh(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> tanh(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> exp(floatv<Abi> x);
-template <class Abi> doublev<Abi> exp(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> exp(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> exp2(floatv<Abi> x);
-template <class Abi> doublev<Abi> exp2(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> exp2(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> expm1(floatv<Abi> x);
-template <class Abi> doublev<Abi> expm1(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> expm1(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> frexp(floatv<Abi> value, samesize<int, floatv<Abi>>* exp);
-template <class Abi> doublev<Abi> frexp(doublev<Abi> value, samesize<int, doublev<Abi>>* exp);
-template <class Abi> ldoublev<Abi> frexp(ldoublev<Abi> value, samesize<int, ldoublev<Abi>>* exp);
-
-template <class Abi> samesize<int, floatv<Abi>> ilogb(floatv<Abi> x);
-template <class Abi> samesize<int, doublev<Abi>> ilogb(doublev<Abi> x);
-template <class Abi> samesize<int, ldoublev<Abi>> ilogb(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> ldexp(floatv<Abi> x, samesize<int, floatv<Abi>> exp);
-template <class Abi> doublev<Abi> ldexp(doublev<Abi> x, samesize<int, doublev<Abi>> exp);
-template <class Abi> ldoublev<Abi> ldexp(ldoublev<Abi> x, samesize<int, ldoublev<Abi>> exp);
-
-template <class Abi> floatv<Abi> log(floatv<Abi> x);
-template <class Abi> doublev<Abi> log(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> log(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> log10(floatv<Abi> x);
-template <class Abi> doublev<Abi> log10(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> log10(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> log1p(floatv<Abi> x);
-template <class Abi> doublev<Abi> log1p(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> log1p(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> log2(floatv<Abi> x);
-template <class Abi> doublev<Abi> log2(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> log2(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> logb(floatv<Abi> x);
-template <class Abi> doublev<Abi> logb(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> logb(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> modf(floatv<Abi> value, floatv<Abi>* iptr);
-template <class Abi> doublev<Abi> modf(doublev<Abi> value, doublev<Abi>* iptr);
-template <class Abi> ldoublev<Abi> modf(ldoublev<Abi> value, ldoublev<Abi>* iptr);
-
-template <class Abi> floatv<Abi> scalbn(floatv<Abi> x, samesize<int, floatv<Abi>> n);
-template <class Abi> doublev<Abi> scalbn(doublev<Abi> x, samesize<int, doublev<Abi>> n);
-template <class Abi> ldoublev<Abi> scalbn(ldoublev<Abi> x, samesize<int, ldoublev<Abi>> n);
-template <class Abi> floatv<Abi> scalbln(floatv<Abi> x, samesize<long int, floatv<Abi>> n);
-template <class Abi> doublev<Abi> scalbln(doublev<Abi> x, samesize<long int, doublev<Abi>> n);
-template <class Abi> ldoublev<Abi> scalbln(ldoublev<Abi> x, samesize<long int, ldoublev<Abi>> n);
-
-template <class Abi> floatv<Abi> cbrt(floatv<Abi> x);
-template <class Abi> doublev<Abi> cbrt(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> cbrt(ldoublev<Abi> x);
-
-template <class Abi> scharv<Abi> abs(scharv<Abi> j);
-template <class Abi> shortv<Abi> abs(shortv<Abi> j);
-template <class Abi> intv<Abi> abs(intv<Abi> j);
-template <class Abi> longv<Abi> abs(longv<Abi> j);
-template <class Abi> llongv<Abi> abs(llongv<Abi> j);
-template <class Abi> floatv<Abi> abs(floatv<Abi> j);
-template <class Abi> doublev<Abi> abs(doublev<Abi> j);
-template <class Abi> ldoublev<Abi> abs(ldoublev<Abi> j);
-
-template <class Abi> floatv<Abi> hypot(floatv<Abi> x, floatv<Abi> y);
-template <class Abi> doublev<Abi> hypot(doublev<Abi> x, doublev<Abi> y);
-template <class Abi> ldoublev<Abi> hypot(doublev<Abi> x, doublev<Abi> y);
-template <class Abi> floatv<Abi> hypot(floatv<Abi> x, floatv<Abi> y, floatv<Abi> z);
-template <class Abi> doublev<Abi> hypot(doublev<Abi> x, doublev<Abi> y, doublev<Abi> z);
-template <class Abi> ldoublev<Abi> hypot(ldoublev<Abi> x, ldoublev<Abi> y, ldoublev<Abi> z);
-
-template <class Abi> floatv<Abi> pow(floatv<Abi> x, floatv<Abi> y);
-template <class Abi> doublev<Abi> pow(doublev<Abi> x, doublev<Abi> y);
-template <class Abi> ldoublev<Abi> pow(ldoublev<Abi> x, ldoublev<Abi> y);
-
-template <class Abi> floatv<Abi> sqrt(floatv<Abi> x);
-template <class Abi> doublev<Abi> sqrt(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> sqrt(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> erf(floatv<Abi> x);
-template <class Abi> doublev<Abi> erf(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> erf(ldoublev<Abi> x);
-template <class Abi> floatv<Abi> erfc(floatv<Abi> x);
-template <class Abi> doublev<Abi> erfc(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> erfc(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> lgamma(floatv<Abi> x);
-template <class Abi> doublev<Abi> lgamma(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> lgamma(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> tgamma(floatv<Abi> x);
-template <class Abi> doublev<Abi> tgamma(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> tgamma(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> ceil(floatv<Abi> x);
-template <class Abi> doublev<Abi> ceil(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> ceil(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> floor(floatv<Abi> x);
-template <class Abi> doublev<Abi> floor(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> floor(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> nearbyint(floatv<Abi> x);
-template <class Abi> doublev<Abi> nearbyint(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> nearbyint(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> rint(floatv<Abi> x);
-template <class Abi> doublev<Abi> rint(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> rint(ldoublev<Abi> x);
-
-template <class Abi> samesize<long int, floatv<Abi>> lrint(floatv<Abi> x);
-template <class Abi> samesize<long int, doublev<Abi>> lrint(doublev<Abi> x);
-template <class Abi> samesize<long int, ldoublev<Abi>> lrint(ldoublev<Abi> x);
-template <class Abi> samesize<long long int, floatv<Abi>> llrint(floatv<Abi> x);
-template <class Abi> samesize<long long int, doublev<Abi>> llrint(doublev<Abi> x);
-template <class Abi> samesize<long long int, ldoublev<Abi>> llrint(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> round(floatv<Abi> x);
-template <class Abi> doublev<Abi> round(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> round(ldoublev<Abi> x);
-template <class Abi> samesize<long int, floatv<Abi>> lround(floatv<Abi> x);
-template <class Abi> samesize<long int, doublev<Abi>> lround(doublev<Abi> x);
-template <class Abi> samesize<long int, ldoublev<Abi>> lround(ldoublev<Abi> x);
-template <class Abi> samesize<long long int, floatv<Abi>> llround(floatv<Abi> x);
-template <class Abi> samesize<long long int, doublev<Abi>> llround(doublev<Abi> x);
-template <class Abi> samesize<long long int, ldoublev<Abi>> llround(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> trunc(floatv<Abi> x);
-template <class Abi> doublev<Abi> trunc(doublev<Abi> x);
-template <class Abi> ldoublev<Abi> trunc(ldoublev<Abi> x);
-
-template <class Abi> floatv<Abi> fmod(floatv<Abi> x, floatv<Abi> y);
-template <class Abi> doublev<Abi> fmod(doublev<Abi> x, doublev<Abi> y);
-template <class Abi> ldoublev<Abi> fmod(ldoublev<Abi> x, ldoublev<Abi> y);
-
-template <class Abi> floatv<Abi> remainder(floatv<Abi> x, floatv<Abi> y);
-template <class Abi> doublev<Abi> remainder(doublev<Abi> x, doublev<Abi> y);
-template <class Abi> ldoublev<Abi> remainder(ldoublev<Abi> x, ldoublev<Abi> y);
-
-template <class Abi> floatv<Abi> remquo(floatv<Abi> x, floatv<Abi> y, samesize<int, floatv<Abi>>* quo);
-template <class Abi> doublev<Abi> remquo(doublev<Abi> x, doublev<Abi> y, samesize<int, doublev<Abi>>* quo);
-template <class Abi> ldoublev<Abi> remquo(ldoublev<Abi> x, ldoublev<Abi> y, samesize<int, ldoublev<Abi>>* quo);
-
-template <class Abi> floatv<Abi> copysign(floatv<Abi> x, floatv<Abi> y);
-template <class Abi> doublev<Abi> copysign(doublev<Abi> x, doublev<Abi> y);
-template <class Abi> ldoublev<Abi> copysign(ldoublev<Abi> x, ldoublev<Abi> y);
-
-template <class Abi> doublev<Abi> nan(const char* tagp);
-template <class Abi> floatv<Abi> nanf(const char* tagp);
-template <class Abi> ldoublev<Abi> nanl(const char* tagp);
-
-template <class Abi> floatv<Abi> nextafter(floatv<Abi> x, floatv<Abi> y);
-template <class Abi> doublev<Abi> nextafter(doublev<Abi> x, doublev<Abi> y);
-template <class Abi> ldoublev<Abi> nextafter(ldoublev<Abi> x, ldoublev<Abi> y);
-
-template <class Abi> floatv<Abi> nexttoward(floatv<Abi> x, ldoublev<Abi> y);
-template <class Abi> doublev<Abi> nexttoward(doublev<Abi> x, ldoublev<Abi> y);
-template <class Abi> ldoublev<Abi> nexttoward(ldoublev<Abi> x, ldoublev<Abi> y);
-
-template <class Abi> floatv<Abi> fdim(floatv<Abi> x, floatv<Abi> y);
-template <class Abi> doublev<Abi> fdim(doublev<Abi> x, doublev<Abi> y);
-template <class Abi> ldoublev<Abi> fdim(ldoublev<Abi> x, ldoublev<Abi> y);
-
-template <class Abi> floatv<Abi> fmax(floatv<Abi> x, floatv<Abi> y);
-template <class Abi> doublev<Abi> fmax(doublev<Abi> x, doublev<Abi> y);
-template <class Abi> ldoublev<Abi> fmax(ldoublev<Abi> x, ldoublev<Abi> y);
-
-template <class Abi> floatv<Abi> fmin(floatv<Abi> x, floatv<Abi> y);
-template <class Abi> doublev<Abi> fmin(doublev<Abi> x, doublev<Abi> y);
-template <class Abi> ldoublev<Abi> fmin(ldoublev<Abi> x, ldoublev<Abi> y);
-
-template <class Abi> floatv<Abi> fma(floatv<Abi> x, floatv<Abi> y, floatv<Abi> z);
-template <class Abi> doublev<Abi> fma(doublev<Abi> x, doublev<Abi> y, doublev<Abi> z);
-template <class Abi> ldoublev<Abi> fma(ldoublev<Abi> x, ldoublev<Abi> y, ldoublev<Abi> z);
-
-template <class Abi> samesize<int, floatv<Abi>> fpclassify(floatv<Abi> x);
-template <class Abi> samesize<int, doublev<Abi>> fpclassify(doublev<Abi> x);
-template <class Abi> samesize<int, ldoublev<Abi>> fpclassify(ldoublev<Abi> x);
-
-template <class Abi> simd_mask<float, Abi> isfinite(floatv<Abi> x);
-template <class Abi> simd_mask<double, Abi> isfinite(doublev<Abi> x);
-template <class Abi> simd_mask<long double, Abi> isfinite(ldoublev<Abi> x);
-
-template <class Abi> simd_mask<float, Abi> isinf(floatv<Abi> x);
-template <class Abi> simd_mask<double, Abi> isinf(doublev<Abi> x);
-template <class Abi> simd_mask<long double, Abi> isinf(ldoublev<Abi> x);
-
-template <class Abi> simd_mask<float, Abi> isnan(floatv<Abi> x);
-template <class Abi> simd_mask<double, Abi> isnan(doublev<Abi> x);
-template <class Abi> simd_mask<long double, Abi> isnan(ldoublev<Abi> x);
-
-template <class Abi> simd_mask<float, Abi> isnormal(floatv<Abi> x);
-template <class Abi> simd_mask<double, Abi> isnormal(doublev<Abi> x);
-template <class Abi> simd_mask<long double, Abi> isnormal(ldoublev<Abi> x);
-
-template <class Abi> simd_mask<float, Abi> signbit(floatv<Abi> x);
-template <class Abi> simd_mask<double, Abi> signbit(doublev<Abi> x);
-template <class Abi> simd_mask<long double, Abi> signbit(ldoublev<Abi> x);
-
-template <class Abi> simd_mask<float, Abi> isgreater(floatv<Abi> x, floatv<Abi> y);
-template <class Abi> simd_mask<double, Abi> isgreater(doublev<Abi> x, doublev<Abi> y);
-template <class Abi> simd_mask<long double, Abi> isgreater(ldoublev<Abi> x, ldoublev<Abi> y);
-
-template <class Abi> simd_mask<float, Abi> isgreaterequal(floatv<Abi> x, floatv<Abi> y);
-template <class Abi> simd_mask<double, Abi> isgreaterequal(doublev<Abi> x, doublev<Abi> y);
-template <class Abi> simd_mask<long double, Abi> isgreaterequal(ldoublev<Abi> x, ldoublev<Abi> y);
-
-template <class Abi> simd_mask<float, Abi> isless(floatv<Abi> x, floatv<Abi> y);
-template <class Abi> simd_mask<double, Abi> isless(doublev<Abi> x, doublev<Abi> y);
-template <class Abi> simd_mask<long double, Abi> isless(ldoublev<Abi> x, ldoublev<Abi> y);
-
-template <class Abi> simd_mask<float, Abi> islessequal(floatv<Abi> x, floatv<Abi> y);
-template <class Abi> simd_mask<double, Abi> islessequal(doublev<Abi> x, doublev<Abi> y);
-template <class Abi> simd_mask<long double, Abi> islessequal(ldoublev<Abi> x, ldoublev<Abi> y);
-
-template <class Abi> simd_mask<float, Abi> islessgreater(floatv<Abi> x, floatv<Abi> y);
-template <class Abi> simd_mask<double, Abi> islessgreater(doublev<Abi> x, doublev<Abi> y);
-template <class Abi> simd_mask<long double, Abi> islessgreater(ldoublev<Abi> x, ldoublev<Abi> y);
-
-template <class Abi> simd_mask<float, Abi> isunordered(floatv<Abi> x, floatv<Abi> y);
-template <class Abi> simd_mask<double, Abi> isunordered(doublev<Abi> x, doublev<Abi> y);
-template <class Abi> simd_mask<long double, Abi> isunordered(ldoublev<Abi> x, ldoublev<Abi> y);
-
-template <class V> struct simd_div_t { V quot, rem; };
-template <class Abi> simd_div_t<scharv<Abi>> div(scharv<Abi> numer, scharv<Abi> denom);
-template <class Abi> simd_div_t<shortv<Abi>> div(shortv<Abi> numer, shortv<Abi> denom);
-template <class Abi> simd_div_t<intv<Abi>> div(intv<Abi> numer, intv<Abi> denom);
-template <class Abi> simd_div_t<longv<Abi>> div(longv<Abi> numer, longv<Abi> denom);
-template <class Abi> simd_div_t<llongv<Abi>> div(llongv<Abi> numer, llongv<Abi> denom);
-
-// [simd.mask.class]
-template <class T, class Abi>
-class simd_mask {
-public:
- using value_type = bool;
- using reference = see below;
- using simd_type = simd<T, Abi>;
- using abi_type = Abi;
- static constexpr size_t size() noexcept;
- simd_mask() = default;
-
- // broadcast constructor
- explicit simd_mask(value_type) noexcept;
-
- // implicit type conversion constructor
- template <class U> simd_mask(const simd_mask<U, simd_abi::fixed_size<size()>>&) noexcept;
-
- // load constructor
- template <class Flags> simd_mask(const value_type* mem, Flags);
-
- // loads [simd.mask.copy]
- template <class Flags> void copy_from(const value_type* mem, Flags);
- template <class Flags> void copy_to(value_type* mem, Flags) const;
-
- // scalar access [simd.mask.subscr]
- reference operator[](size_t);
- value_type operator[](size_t) const;
-
- // unary operators [simd.mask.unary]
- simd_mask operator!() const noexcept;
-
- // simd_mask binary operators [simd.mask.binary]
- friend simd_mask operator&&(const simd_mask&, const simd_mask&) noexcept;
- friend simd_mask operator||(const simd_mask&, const simd_mask&) noexcept;
- friend simd_mask operator& (const simd_mask&, const simd_mask&) noexcept;
- friend simd_mask operator| (const simd_mask&, const simd_mask&) noexcept;
- friend simd_mask operator^ (const simd_mask&, const simd_mask&) noexcept;
-
- // simd_mask compound assignment [simd.mask.cassign]
- friend simd_mask& operator&=(simd_mask&, const simd_mask&) noexcept;
- friend simd_mask& operator|=(simd_mask&, const simd_mask&) noexcept;
- friend simd_mask& operator^=(simd_mask&, const simd_mask&) noexcept;
-
- // simd_mask compares [simd.mask.comparison]
- friend simd_mask operator==(const simd_mask&, const simd_mask&) noexcept;
- friend simd_mask operator!=(const simd_mask&, const simd_mask&) noexcept;
-};
-
-} // parallelism_v2
-} // std::experimental
-
-*/
-
-#include <experimental/__config>
-#include <algorithm>
-#include <array>
-#include <cstddef>
-#include <functional>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_SIMD
-
-#if _LIBCPP_STD_VER >= 17
-
-enum class _StorageKind {
- _Scalar,
- _Array,
- _VecExt,
-};
-
-template <_StorageKind __kind, int _Np>
-struct __simd_abi {};
-
-template <class _Tp, class _Abi>
-class __simd_storage {};
-
-template <class _Tp, int __num_element>
-class __simd_storage<_Tp, __simd_abi<_StorageKind::_Array, __num_element>> {
- std::array<_Tp, __num_element> __storage_;
-
- template <class, class>
- friend struct simd;
-
- template <class, class>
- friend struct simd_mask;
-
-public:
- _Tp __get(size_t __index) const noexcept { return __storage_[__index]; };
- void __set(size_t __index, _Tp __val) noexcept {
- __storage_[__index] = __val;
- }
-};
-
-template <class _Tp>
-class __simd_storage<_Tp, __simd_abi<_StorageKind::_Scalar, 1>> {
- _Tp __storage_;
-
- template <class, class>
- friend struct simd;
-
- template <class, class>
- friend struct simd_mask;
-
-public:
- _Tp __get(size_t __index) const noexcept { return (&__storage_)[__index]; };
- void __set(size_t __index, _Tp __val) noexcept {
- (&__storage_)[__index] = __val;
- }
-};
-
-#ifndef _LIBCPP_HAS_NO_VECTOR_EXTENSION
-
-constexpr size_t __floor_pow_of_2(size_t __val) {
- return ((__val - 1) & __val) == 0 ? __val
- : __floor_pow_of_2((__val - 1) & __val);
-}
-
-constexpr size_t __ceil_pow_of_2(size_t __val) {
- return __val == 1 ? 1 : __floor_pow_of_2(__val - 1) << 1;
-}
-
-template <class _Tp, size_t __bytes>
-struct __vec_ext_traits {
-#if !defined(_LIBCPP_COMPILER_CLANG)
- typedef _Tp type __attribute__((vector_size(__ceil_pow_of_2(__bytes))));
-#endif
-};
-
-#if defined(_LIBCPP_COMPILER_CLANG)
-#define _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, _NUM_ELEMENT) \
- template <> \
- struct __vec_ext_traits<_TYPE, sizeof(_TYPE) * _NUM_ELEMENT> { \
- using type = \
- _TYPE __attribute__((vector_size(sizeof(_TYPE) * _NUM_ELEMENT))); \
- }
-
-#define _LIBCPP_SPECIALIZE_VEC_EXT_32(_TYPE) \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 1); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 2); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 3); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 4); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 5); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 6); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 7); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 8); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 9); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 10); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 11); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 12); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 13); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 14); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 15); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 16); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 17); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 18); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 19); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 20); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 21); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 22); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 23); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 24); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 25); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 26); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 27); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 28); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 29); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 30); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 31); \
- _LIBCPP_SPECIALIZE_VEC_EXT(_TYPE, 32);
-
-_LIBCPP_SPECIALIZE_VEC_EXT_32(char);
-_LIBCPP_SPECIALIZE_VEC_EXT_32(char16_t);
-_LIBCPP_SPECIALIZE_VEC_EXT_32(char32_t);
-_LIBCPP_SPECIALIZE_VEC_EXT_32(wchar_t);
-_LIBCPP_SPECIALIZE_VEC_EXT_32(signed char);
-_LIBCPP_SPECIALIZE_VEC_EXT_32(signed short);
-_LIBCPP_SPECIALIZE_VEC_EXT_32(signed int);
-_LIBCPP_SPECIALIZE_VEC_EXT_32(signed long);
-_LIBCPP_SPECIALIZE_VEC_EXT_32(signed long long);
-_LIBCPP_SPECIALIZE_VEC_EXT_32(unsigned char);
-_LIBCPP_SPECIALIZE_VEC_EXT_32(unsigned short);
-_LIBCPP_SPECIALIZE_VEC_EXT_32(unsigned int);
-_LIBCPP_SPECIALIZE_VEC_EXT_32(unsigned long);
-_LIBCPP_SPECIALIZE_VEC_EXT_32(unsigned long long);
-_LIBCPP_SPECIALIZE_VEC_EXT_32(float);
-_LIBCPP_SPECIALIZE_VEC_EXT_32(double);
-_LIBCPP_SPECIALIZE_VEC_EXT_32(long double);
-
-#undef _LIBCPP_SPECIALIZE_VEC_EXT_32
-#undef _LIBCPP_SPECIALIZE_VEC_EXT
-#endif
-
-template <class _Tp, int __num_element>
-class __simd_storage<_Tp, __simd_abi<_StorageKind::_VecExt, __num_element>> {
- using _StorageType =
- typename __vec_ext_traits<_Tp, sizeof(_Tp) * __num_element>::type;
-
- _StorageType __storage_;
-
- template <class, class>
- friend struct simd;
-
- template <class, class>
- friend struct simd_mask;
-
-public:
- _Tp __get(size_t __index) const noexcept { return __storage_[__index]; };
- void __set(size_t __index, _Tp __val) noexcept {
- __storage_[__index] = __val;
- }
-};
-
-#endif // _LIBCPP_HAS_NO_VECTOR_EXTENSION
-
-template <class _Vp, class _Tp, class _Abi>
-class __simd_reference {
- static_assert(std::is_same<_Vp, _Tp>::value, "");
-
- template <class, class>
- friend struct simd;
-
- template <class, class>
- friend struct simd_mask;
-
- __simd_storage<_Tp, _Abi>* __ptr_;
- size_t __index_;
-
- __simd_reference(__simd_storage<_Tp, _Abi>* __ptr, size_t __index)
- : __ptr_(__ptr), __index_(__index) {}
-
- __simd_reference(const __simd_reference&) = default;
-
-public:
- __simd_reference() = delete;
- __simd_reference& operator=(const __simd_reference&) = delete;
-
- operator _Vp() const { return __ptr_->__get(__index_); }
-
- __simd_reference operator=(_Vp __value) && {
- __ptr_->__set(__index_, __value);
- return *this;
- }
-
- __simd_reference operator++() && {
- return std::move(*this) = __ptr_->__get(__index_) + 1;
- }
-
- _Vp operator++(int) && {
- auto __val = __ptr_->__get(__index_);
- __ptr_->__set(__index_, __val + 1);
- return __val;
- }
-
- __simd_reference operator--() && {
- return std::move(*this) = __ptr_->__get(__index_) - 1;
- }
-
- _Vp operator--(int) && {
- auto __val = __ptr_->__get(__index_);
- __ptr_->__set(__index_, __val - 1);
- return __val;
- }
-
- __simd_reference operator+=(_Vp __value) && {
- return std::move(*this) = __ptr_->__get(__index_) + __value;
- }
-
- __simd_reference operator-=(_Vp __value) && {
- return std::move(*this) = __ptr_->__get(__index_) - __value;
- }
-
- __simd_reference operator*=(_Vp __value) && {
- return std::move(*this) = __ptr_->__get(__index_) * __value;
- }
-
- __simd_reference operator/=(_Vp __value) && {
- return std::move(*this) = __ptr_->__get(__index_) / __value;
- }
-
- __simd_reference operator%=(_Vp __value) && {
- return std::move(*this) = __ptr_->__get(__index_) % __value;
- }
-
- __simd_reference operator>>=(_Vp __value) && {
- return std::move(*this) = __ptr_->__get(__index_) >> __value;
- }
-
- __simd_reference operator<<=(_Vp __value) && {
- return std::move(*this) = __ptr_->__get(__index_) << __value;
- }
-
- __simd_reference operator&=(_Vp __value) && {
- return std::move(*this) = __ptr_->__get(__index_) & __value;
- }
-
- __simd_reference operator|=(_Vp __value) && {
- return std::move(*this) = __ptr_->__get(__index_) | __value;
- }
-
- __simd_reference operator^=(_Vp __value) && {
- return std::move(*this) = __ptr_->__get(__index_) ^ __value;
- }
-};
-
-template <class _To, class _From>
-constexpr decltype(_To{std::declval<_From>()}, true)
-__is_non_narrowing_convertible_impl(_From) {
- return true;
-}
-
-template <class _To>
-constexpr bool __is_non_narrowing_convertible_impl(...) {
- return false;
-}
-
-template <class _From, class _To>
-constexpr typename std::enable_if<std::is_arithmetic<_To>::value &&
- std::is_arithmetic<_From>::value,
- bool>::type
-__is_non_narrowing_arithmetic_convertible() {
- return __is_non_narrowing_convertible_impl<_To>(_From{});
-}
-
-template <class _From, class _To>
-constexpr typename std::enable_if<!(std::is_arithmetic<_To>::value &&
- std::is_arithmetic<_From>::value),
- bool>::type
-__is_non_narrowing_arithmetic_convertible() {
- return false;
-}
-
-template <class _Tp>
-constexpr _Tp __variadic_sum() {
- return _Tp{};
-}
-
-template <class _Tp, class _Up, class... _Args>
-constexpr _Tp __variadic_sum(_Up __first, _Args... __rest) {
- return static_cast<_Tp>(__first) + __variadic_sum<_Tp>(__rest...);
-}
-
-template <class _Tp>
-struct __nodeduce {
- using type = _Tp;
-};
-
-template <class _Tp>
-constexpr bool __vectorizable() {
- return std::is_arithmetic<_Tp>::value && !std::is_const<_Tp>::value &&
- !std::is_volatile<_Tp>::value && !std::is_same<_Tp, bool>::value;
-}
-
-_LIBCPP_END_NAMESPACE_EXPERIMENTAL_SIMD
-_LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_SIMD_ABI
-
-using scalar = __simd_abi<_StorageKind::_Scalar, 1>;
-
-template <int _Np>
-using fixed_size = __simd_abi<_StorageKind::_Array, _Np>;
-
-template <class _Tp>
-_LIBCPP_INLINE_VAR constexpr size_t max_fixed_size = 32;
-
-template <class _Tp>
-using compatible = fixed_size<16 / sizeof(_Tp)>;
-
-#ifndef _LIBCPP_HAS_NO_VECTOR_EXTENSION
-template <class _Tp>
-using native = __simd_abi<_StorageKind::_VecExt,
- _LIBCPP_NATIVE_SIMD_WIDTH_IN_BYTES / sizeof(_Tp)>;
-#else
-template <class _Tp>
-using native =
- fixed_size<_Tp, _LIBCPP_NATIVE_SIMD_WIDTH_IN_BYTES / sizeof(_Tp)>;
-#endif // _LIBCPP_HAS_NO_VECTOR_EXTENSION
-
-_LIBCPP_END_NAMESPACE_EXPERIMENTAL_SIMD_ABI
-_LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_SIMD
-
-template <class _Tp, class _Abi = simd_abi::compatible<_Tp>>
-class simd;
-template <class _Tp, class _Abi = simd_abi::compatible<_Tp>>
-class simd_mask;
-
-struct element_aligned_tag {};
-struct vector_aligned_tag {};
-template <size_t>
-struct overaligned_tag {};
-_LIBCPP_INLINE_VAR constexpr element_aligned_tag element_aligned{};
-_LIBCPP_INLINE_VAR constexpr vector_aligned_tag vector_aligned{};
-template <size_t _Np>
-_LIBCPP_INLINE_VAR constexpr overaligned_tag<_Np> overaligned{};
-
-// traits [simd.traits]
-template <class _Tp>
-struct is_abi_tag : std::integral_constant<bool, false> {};
-
-template <_StorageKind __kind, int _Np>
-struct is_abi_tag<__simd_abi<__kind, _Np>>
- : std::integral_constant<bool, true> {};
-
-template <class _Tp>
-struct is_simd : std::integral_constant<bool, false> {};
-
-template <class _Tp, class _Abi>
-struct is_simd<simd<_Tp, _Abi>> : std::integral_constant<bool, true> {};
-
-template <class _Tp>
-struct is_simd_mask : std::integral_constant<bool, false> {};
-
-template <class _Tp, class _Abi>
-struct is_simd_mask<simd_mask<_Tp, _Abi>> : std::integral_constant<bool, true> {
-};
-
-template <class _Tp>
-struct is_simd_flag_type : std::integral_constant<bool, false> {};
-
-template <>
-struct is_simd_flag_type<element_aligned_tag>
- : std::integral_constant<bool, true> {};
-
-template <>
-struct is_simd_flag_type<vector_aligned_tag>
- : std::integral_constant<bool, true> {};
-
-template <size_t _Align>
-struct is_simd_flag_type<overaligned_tag<_Align>>
- : std::integral_constant<bool, true> {};
-
-template <class _Tp>
-_LIBCPP_INLINE_VAR constexpr bool is_abi_tag_v = is_abi_tag<_Tp>::value;
-template <class _Tp>
-_LIBCPP_INLINE_VAR constexpr bool is_simd_v = is_simd<_Tp>::value;
-template <class _Tp>
-_LIBCPP_INLINE_VAR constexpr bool is_simd_mask_v = is_simd_mask<_Tp>::value;
-template <class _Tp>
-_LIBCPP_INLINE_VAR constexpr bool is_simd_flag_type_v =
- is_simd_flag_type<_Tp>::value;
-template <class _Tp, size_t _Np>
-struct abi_for_size {
- using type = simd_abi::fixed_size<_Np>;
-};
-template <class _Tp, size_t _Np>
-using abi_for_size_t = typename abi_for_size<_Tp, _Np>::type;
-
-template <class _Tp, class _Abi = simd_abi::compatible<_Tp>>
-struct simd_size;
-
-template <class _Tp, _StorageKind __kind, int _Np>
-struct simd_size<_Tp, __simd_abi<__kind, _Np>>
- : std::integral_constant<size_t, _Np> {
- static_assert(
- std::is_arithmetic<_Tp>::value &&
- !std::is_same<typename std::remove_const<_Tp>::type, bool>::value,
- "Element type should be vectorizable");
-};
-
-// TODO: implement it.
-template <class _Tp, class _Up = typename _Tp::value_type>
-struct memory_alignment;
-
-template <class _Tp, class _Abi = simd_abi::compatible<_Tp>>
-_LIBCPP_INLINE_VAR constexpr size_t simd_size_v = simd_size<_Tp, _Abi>::value;
-
-template <class _Tp, class _Up = typename _Tp::value_type>
-_LIBCPP_INLINE_VAR constexpr size_t memory_alignment_v =
- memory_alignment<_Tp, _Up>::value;
-
-// class template simd [simd.class]
-template <class _Tp>
-using native_simd = simd<_Tp, simd_abi::native<_Tp>>;
-template <class _Tp, int _Np>
-using fixed_size_simd = simd<_Tp, simd_abi::fixed_size<_Np>>;
-
-// class template simd_mask [simd.mask.class]
-template <class _Tp>
-using native_simd_mask = simd_mask<_Tp, simd_abi::native<_Tp>>;
-
-template <class _Tp, int _Np>
-using fixed_size_simd_mask = simd_mask<_Tp, simd_abi::fixed_size<_Np>>;
-
-// casts [simd.casts]
-template <class _Tp>
-struct __static_simd_cast_traits {
- template <class _Up, class _Abi>
- static simd<_Tp, _Abi> __apply(const simd<_Up, _Abi>& __v);
-};
-
-template <class _Tp, class _NewAbi>
-struct __static_simd_cast_traits<simd<_Tp, _NewAbi>> {
- template <class _Up, class _Abi>
- static typename std::enable_if<simd<_Up, _Abi>::size() ==
- simd<_Tp, _NewAbi>::size(),
- simd<_Tp, _NewAbi>>::type
- __apply(const simd<_Up, _Abi>& __v);
-};
-
-template <class _Tp>
-struct __simd_cast_traits {
- template <class _Up, class _Abi>
- static typename std::enable_if<
- __is_non_narrowing_arithmetic_convertible<_Up, _Tp>(),
- simd<_Tp, _Abi>>::type
- __apply(const simd<_Up, _Abi>& __v);
-};
-
-template <class _Tp, class _NewAbi>
-struct __simd_cast_traits<simd<_Tp, _NewAbi>> {
- template <class _Up, class _Abi>
- static typename std::enable_if<
- __is_non_narrowing_arithmetic_convertible<_Up, _Tp>() &&
- simd<_Up, _Abi>::size() == simd<_Tp, _NewAbi>::size(),
- simd<_Tp, _NewAbi>>::type
- __apply(const simd<_Up, _Abi>& __v);
-};
-
-template <class _Tp, class _Up, class _Abi>
-auto simd_cast(const simd<_Up, _Abi>& __v)
- -> decltype(__simd_cast_traits<_Tp>::__apply(__v)) {
- return __simd_cast_traits<_Tp>::__apply(__v);
-}
-
-template <class _Tp, class _Up, class _Abi>
-auto static_simd_cast(const simd<_Up, _Abi>& __v)
- -> decltype(__static_simd_cast_traits<_Tp>::__apply(__v)) {
- return __static_simd_cast_traits<_Tp>::__apply(__v);
-}
-
-template <class _Tp, class _Abi>
-fixed_size_simd<_Tp, simd_size<_Tp, _Abi>::value>
-to_fixed_size(const simd<_Tp, _Abi>&) noexcept;
-
-template <class _Tp, class _Abi>
-fixed_size_simd_mask<_Tp, simd_size<_Tp, _Abi>::value>
-to_fixed_size(const simd_mask<_Tp, _Abi>&) noexcept;
-
-template <class _Tp, size_t _Np>
-native_simd<_Tp> to_native(const fixed_size_simd<_Tp, _Np>&) noexcept;
-
-template <class _Tp, size_t _Np>
-native_simd_mask<_Tp> to_native(const fixed_size_simd_mask<_Tp, _Np>&) noexcept;
-
-template <class _Tp, size_t _Np>
-simd<_Tp> to_compatible(const fixed_size_simd<_Tp, _Np>&) noexcept;
-
-template <class _Tp, size_t _Np>
-simd_mask<_Tp> to_compatible(const fixed_size_simd_mask<_Tp, _Np>&) noexcept;
-
-template <size_t... __sizes, class _Tp, class _Abi>
-tuple<simd<_Tp, abi_for_size_t<_Tp, __sizes>>...> split(const simd<_Tp, _Abi>&);
-
-template <size_t... __sizes, class _Tp, class _Abi>
-tuple<simd_mask<_Tp, abi_for_size_t<_Tp, __sizes>>...>
-split(const simd_mask<_Tp, _Abi>&);
-
-template <class _SimdType, class _Abi>
-array<_SimdType, simd_size<typename _SimdType::value_type, _Abi>::value /
- _SimdType::size()>
-split(const simd<typename _SimdType::value_type, _Abi>&);
-
-template <class _SimdType, class _Abi>
-array<_SimdType, simd_size<typename _SimdType::value_type, _Abi>::value /
- _SimdType::size()>
-split(const simd_mask<typename _SimdType::value_type, _Abi>&);
-
-template <class _Tp, class... _Abis>
-simd<_Tp, abi_for_size_t<_Tp, __variadic_sum(simd_size<_Tp, _Abis>::value...)>>
-concat(const simd<_Tp, _Abis>&...);
-
-template <class _Tp, class... _Abis>
-simd_mask<_Tp,
- abi_for_size_t<_Tp, __variadic_sum(simd_size<_Tp, _Abis>::value...)>>
-concat(const simd_mask<_Tp, _Abis>&...);
-
-// reductions [simd.mask.reductions]
-template <class _Tp, class _Abi>
-bool all_of(const simd_mask<_Tp, _Abi>&) noexcept;
-template <class _Tp, class _Abi>
-bool any_of(const simd_mask<_Tp, _Abi>&) noexcept;
-template <class _Tp, class _Abi>
-bool none_of(const simd_mask<_Tp, _Abi>&) noexcept;
-template <class _Tp, class _Abi>
-bool some_of(const simd_mask<_Tp, _Abi>&) noexcept;
-template <class _Tp, class _Abi>
-int popcount(const simd_mask<_Tp, _Abi>&) noexcept;
-template <class _Tp, class _Abi>
-int find_first_set(const simd_mask<_Tp, _Abi>&);
-template <class _Tp, class _Abi>
-int find_last_set(const simd_mask<_Tp, _Abi>&);
-bool all_of(bool) noexcept;
-bool any_of(bool) noexcept;
-bool none_of(bool) noexcept;
-bool some_of(bool) noexcept;
-int popcount(bool) noexcept;
-int find_first_set(bool) noexcept;
-int find_last_set(bool) noexcept;
-
-// masked assignment [simd.whereexpr]
-template <class _MaskType, class _Tp>
-class const_where_expression;
-template <class _MaskType, class _Tp>
-class where_expression;
-
-// masked assignment [simd.mask.where]
-template <class _Tp, class _Abi>
-where_expression<simd_mask<_Tp, _Abi>, simd<_Tp, _Abi>>
-where(const typename simd<_Tp, _Abi>::mask_type&, simd<_Tp, _Abi>&) noexcept;
-
-template <class _Tp, class _Abi>
-const_where_expression<simd_mask<_Tp, _Abi>, const simd<_Tp, _Abi>>
-where(const typename simd<_Tp, _Abi>::mask_type&,
- const simd<_Tp, _Abi>&) noexcept;
-
-template <class _Tp, class _Abi>
-where_expression<simd_mask<_Tp, _Abi>, simd_mask<_Tp, _Abi>>
-where(const typename __nodeduce<simd_mask<_Tp, _Abi>>::type&,
- simd_mask<_Tp, _Abi>&) noexcept;
-
-template <class _Tp, class _Abi>
-const_where_expression<simd_mask<_Tp, _Abi>, const simd_mask<_Tp, _Abi>>
-where(const typename __nodeduce<simd_mask<_Tp, _Abi>>::type&,
- const simd_mask<_Tp, _Abi>&) noexcept;
-
-template <class _Tp>
-where_expression<bool, _Tp> where(bool, _Tp&) noexcept;
-
-template <class _Tp>
-const_where_expression<bool, const _Tp> where(bool, const _Tp&) noexcept;
-
-// reductions [simd.reductions]
-template <class _Tp, class _Abi, class _BinaryOp = std::plus<_Tp>>
-_Tp reduce(const simd<_Tp, _Abi>&, _BinaryOp = _BinaryOp());
-
-template <class _MaskType, class _SimdType, class _BinaryOp>
-typename _SimdType::value_type
-reduce(const const_where_expression<_MaskType, _SimdType>&,
- typename _SimdType::value_type neutral_element, _BinaryOp binary_op);
-
-template <class _MaskType, class _SimdType>
-typename _SimdType::value_type
-reduce(const const_where_expression<_MaskType, _SimdType>&,
- plus<typename _SimdType::value_type> binary_op = {});
-
-template <class _MaskType, class _SimdType>
-typename _SimdType::value_type
-reduce(const const_where_expression<_MaskType, _SimdType>&,
- multiplies<typename _SimdType::value_type> binary_op);
-
-template <class _MaskType, class _SimdType>
-typename _SimdType::value_type
-reduce(const const_where_expression<_MaskType, _SimdType>&,
- bit_and<typename _SimdType::value_type> binary_op);
-
-template <class _MaskType, class _SimdType>
-typename _SimdType::value_type
-reduce(const const_where_expression<_MaskType, _SimdType>&,
- bit_or<typename _SimdType::value_type> binary_op);
-
-template <class _MaskType, class _SimdType>
-typename _SimdType::value_type
-reduce(const const_where_expression<_MaskType, _SimdType>&,
- bit_xor<typename _SimdType::value_type> binary_op);
-
-template <class _Tp, class _Abi>
-_Tp hmin(const simd<_Tp, _Abi>&);
-template <class _MaskType, class _SimdType>
-typename _SimdType::value_type
-hmin(const const_where_expression<_MaskType, _SimdType>&);
-template <class _Tp, class _Abi>
-_Tp hmax(const simd<_Tp, _Abi>&);
-template <class _MaskType, class _SimdType>
-typename _SimdType::value_type
-hmax(const const_where_expression<_MaskType, _SimdType>&);
-
-// algorithms [simd.alg]
-template <class _Tp, class _Abi>
-simd<_Tp, _Abi> min(const simd<_Tp, _Abi>&, const simd<_Tp, _Abi>&) noexcept;
-
-template <class _Tp, class _Abi>
-simd<_Tp, _Abi> max(const simd<_Tp, _Abi>&, const simd<_Tp, _Abi>&) noexcept;
-
-template <class _Tp, class _Abi>
-std::pair<simd<_Tp, _Abi>, simd<_Tp, _Abi>>
-minmax(const simd<_Tp, _Abi>&, const simd<_Tp, _Abi>&) noexcept;
-
-template <class _Tp, class _Abi>
-simd<_Tp, _Abi> clamp(const simd<_Tp, _Abi>&, const simd<_Tp, _Abi>&,
- const simd<_Tp, _Abi>&);
-
-// [simd.whereexpr]
-// TODO implement where expressions.
-template <class _MaskType, class _Tp>
-class const_where_expression {
-public:
- const_where_expression(const const_where_expression&) = delete;
- const_where_expression& operator=(const const_where_expression&) = delete;
- typename remove_const<_Tp>::type operator-() const&&;
- template <class _Up, class _Flags>
- void copy_to(_Up*, _Flags) const&&;
-};
-
-template <class _MaskType, class _Tp>
-class where_expression : public const_where_expression<_MaskType, _Tp> {
-public:
- where_expression(const where_expression&) = delete;
- where_expression& operator=(const where_expression&) = delete;
- template <class _Up>
- void operator=(_Up&&);
- template <class _Up>
- void operator+=(_Up&&);
- template <class _Up>
- void operator-=(_Up&&);
- template <class _Up>
- void operator*=(_Up&&);
- template <class _Up>
- void operator/=(_Up&&);
- template <class _Up>
- void operator%=(_Up&&);
- template <class _Up>
- void operator&=(_Up&&);
- template <class _Up>
- void operator|=(_Up&&);
- template <class _Up>
- void operator^=(_Up&&);
- template <class _Up>
- void operator<<=(_Up&&);
- template <class _Up>
- void operator>>=(_Up&&);
- void operator++();
- void operator++(int);
- void operator--();
- void operator--(int);
- template <class _Up, class _Flags>
- void copy_from(const _Up*, _Flags);
-};
-
-// [simd.class]
-// TODO: implement simd
-template <class _Tp, class _Abi>
-class simd {
-public:
- using value_type = _Tp;
- using reference = __simd_reference<_Tp, _Tp, _Abi>;
- using mask_type = simd_mask<_Tp, _Abi>;
- using abi_type = _Abi;
-
- simd() = default;
- simd(const simd&) = default;
- simd& operator=(const simd&) = default;
-
- static constexpr size_t size() noexcept {
- return simd_size<_Tp, _Abi>::value;
- }
-
-private:
- __simd_storage<_Tp, _Abi> __s_;
-
- template <class _Up>
- static constexpr bool __can_broadcast() {
- return (std::is_arithmetic<_Up>::value &&
- __is_non_narrowing_arithmetic_convertible<_Up, _Tp>()) ||
- (!std::is_arithmetic<_Up>::value &&
- std::is_convertible<_Up, _Tp>::value) ||
- std::is_same<typename std::remove_const<_Up>::type, int>::value ||
- (std::is_same<typename std::remove_const<_Up>::type,
- unsigned int>::value &&
- std::is_unsigned<_Tp>::value);
- }
-
- template <class _Generator, size_t... __indicies>
- static constexpr decltype(
- std::forward_as_tuple(std::declval<_Generator>()(
- std::integral_constant<size_t, __indicies>())...),
- bool())
- __can_generate(std::index_sequence<__indicies...>) {
- return !__variadic_sum<bool>(
- !__can_broadcast<decltype(std::declval<_Generator>()(
- std::integral_constant<size_t, __indicies>()))>()...);
- }
-
- template <class _Generator>
- static bool __can_generate(...) {
- return false;
- }
-
- template <class _Generator, size_t... __indicies>
- void __generator_init(_Generator&& __g, std::index_sequence<__indicies...>) {
- int __not_used[]{((*this)[__indicies] =
- __g(std::integral_constant<size_t, __indicies>()),
- 0)...};
- (void)__not_used;
- }
-
-public:
- // implicit type conversion constructor
- template <class _Up,
- class = typename std::enable_if<
- std::is_same<_Abi, simd_abi::fixed_size<size()>>::value &&
- __is_non_narrowing_arithmetic_convertible<_Up, _Tp>()>::type>
- simd(const simd<_Up, simd_abi::fixed_size<size()>>& __v) {
- for (size_t __i = 0; __i < size(); __i++) {
- (*this)[__i] = static_cast<_Tp>(__v[__i]);
- }
- }
-
- // implicit broadcast constructor
- template <class _Up,
- class = typename std::enable_if<__can_broadcast<_Up>()>::type>
- simd(_Up&& __rv) {
- auto __v = static_cast<_Tp>(__rv);
- for (size_t __i = 0; __i < size(); __i++) {
- (*this)[__i] = __v;
- }
- }
-
- // generator constructor
- template <class _Generator,
- int = typename std::enable_if<
- __can_generate<_Generator>(std::make_index_sequence<size()>()),
- int>::type()>
- explicit simd(_Generator&& __g) {
- __generator_init(std::forward<_Generator>(__g),
- std::make_index_sequence<size()>());
- }
-
- // load constructor
- template <
- class _Up, class _Flags,
- class = typename std::enable_if<__vectorizable<_Up>()>::type,
- class = typename std::enable_if<is_simd_flag_type<_Flags>::value>::type>
- simd(const _Up* __buffer, _Flags) {
- // TODO: optimize for overaligned flags
- for (size_t __i = 0; __i < size(); __i++) {
- (*this)[__i] = static_cast<_Tp>(__buffer[__i]);
- }
- }
-
- // loads [simd.load]
- template <class _Up, class _Flags>
- typename std::enable_if<__vectorizable<_Up>() &&
- is_simd_flag_type<_Flags>::value>::type
- copy_from(const _Up* __buffer, _Flags) {
- *this = simd(__buffer, _Flags());
- }
-
- // stores [simd.store]
- template <class _Up, class _Flags>
- typename std::enable_if<__vectorizable<_Up>() &&
- is_simd_flag_type<_Flags>::value>::type
- copy_to(_Up* __buffer, _Flags) const {
- // TODO: optimize for overaligned flags
- for (size_t __i = 0; __i < size(); __i++) {
- __buffer[__i] = static_cast<_Up>((*this)[__i]);
- }
- }
-
- // scalar access [simd.subscr]
- reference operator[](size_t __i) { return reference(&__s_, __i); }
-
- value_type operator[](size_t __i) const { return __s_.__get(__i); }
-
- // unary operators [simd.unary]
- simd& operator++();
- simd operator++(int);
- simd& operator--();
- simd operator--(int);
- mask_type operator!() const;
- simd operator~() const;
- simd operator+() const;
- simd operator-() const;
-
- // binary operators [simd.binary]
- friend simd operator+(const simd&, const simd&);
- friend simd operator-(const simd&, const simd&);
- friend simd operator*(const simd&, const simd&);
- friend simd operator/(const simd&, const simd&);
- friend simd operator%(const simd&, const simd&);
- friend simd operator&(const simd&, const simd&);
- friend simd operator|(const simd&, const simd&);
- friend simd operator^(const simd&, const simd&);
- friend simd operator<<(const simd&, const simd&);
- friend simd operator>>(const simd&, const simd&);
- friend simd operator<<(const simd&, int);
- friend simd operator>>(const simd&, int);
-
- // compound assignment [simd.cassign]
- friend simd& operator+=(simd&, const simd&);
- friend simd& operator-=(simd&, const simd&);
- friend simd& operator*=(simd&, const simd&);
- friend simd& operator/=(simd&, const simd&);
- friend simd& operator%=(simd&, const simd&);
-
- friend simd& operator&=(simd&, const simd&);
- friend simd& operator|=(simd&, const simd&);
- friend simd& operator^=(simd&, const simd&);
- friend simd& operator<<=(simd&, const simd&);
- friend simd& operator>>=(simd&, const simd&);
- friend simd& operator<<=(simd&, int);
- friend simd& operator>>=(simd&, int);
-
- // compares [simd.comparison]
- friend mask_type operator==(const simd&, const simd&);
- friend mask_type operator!=(const simd&, const simd&);
- friend mask_type operator>=(const simd&, const simd&);
- friend mask_type operator<=(const simd&, const simd&);
- friend mask_type operator>(const simd&, const simd&);
- friend mask_type operator<(const simd&, const simd&);
-};
-
-// [simd.mask.class]
-template <class _Tp, class _Abi>
-// TODO: implement simd_mask
-class simd_mask {
-public:
- using value_type = bool;
- // TODO: this is strawman implementation. Turn it into a proxy type.
- using reference = bool&;
- using simd_type = simd<_Tp, _Abi>;
- using abi_type = _Abi;
- static constexpr size_t size() noexcept;
- simd_mask() = default;
-
- // broadcast constructor
- explicit simd_mask(value_type) noexcept;
-
- // implicit type conversion constructor
- template <class _Up>
- simd_mask(const simd_mask<_Up, simd_abi::fixed_size<size()>>&) noexcept;
-
- // load constructor
- template <class _Flags>
- simd_mask(const value_type*, _Flags);
-
- // loads [simd.mask.copy]
- template <class _Flags>
- void copy_from(const value_type*, _Flags);
- template <class _Flags>
- void copy_to(value_type*, _Flags) const;
-
- // scalar access [simd.mask.subscr]
- reference operator[](size_t);
- value_type operator[](size_t) const;
-
- // unary operators [simd.mask.unary]
- simd_mask operator!() const noexcept;
-
- // simd_mask binary operators [simd.mask.binary]
- friend simd_mask operator&&(const simd_mask&, const simd_mask&) noexcept;
- friend simd_mask operator||(const simd_mask&, const simd_mask&) noexcept;
- friend simd_mask operator&(const simd_mask&, const simd_mask&)noexcept;
- friend simd_mask operator|(const simd_mask&, const simd_mask&) noexcept;
- friend simd_mask operator^(const simd_mask&, const simd_mask&) noexcept;
-
- // simd_mask compound assignment [simd.mask.cassign]
- friend simd_mask& operator&=(simd_mask&, const simd_mask&) noexcept;
- friend simd_mask& operator|=(simd_mask&, const simd_mask&) noexcept;
- friend simd_mask& operator^=(simd_mask&, const simd_mask&) noexcept;
-
- // simd_mask compares [simd.mask.comparison]
- friend simd_mask operator==(const simd_mask&, const simd_mask&) noexcept;
- friend simd_mask operator!=(const simd_mask&, const simd_mask&) noexcept;
-};
-
-#endif // _LIBCPP_STD_VER >= 17
-
-_LIBCPP_END_NAMESPACE_EXPERIMENTAL_SIMD
-
-#endif /* _LIBCPP_EXPERIMENTAL_SIMD */
diff --git a/lib/libcxx/include/experimental/string b/lib/libcxx/include/experimental/string
deleted file mode 100644
index 8b8545128f2..00000000000
--- a/lib/libcxx/include/experimental/string
+++ /dev/null
@@ -1,62 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- string ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_STRING
-#define _LIBCPP_EXPERIMENTAL_STRING
-/*
- experimental/string synopsis
-
-// C++1z
-namespace std {
-namespace experimental {
-inline namespace fundamentals_v1 {
-namespace pmr {
-
- // basic_string using polymorphic allocator in namespace pmr
- template <class charT, class traits = char_traits<charT>>
- using basic_string =
- std::basic_string<charT, traits, polymorphic_allocator<charT>>;
-
- // basic_string typedef names using polymorphic allocator in namespace
- // std::experimental::pmr
- typedef basic_string<char> string;
- typedef basic_string<char16_t> u16string;
- typedef basic_string<char32_t> u32string;
- typedef basic_string<wchar_t> wstring;
-
-} // namespace pmr
-} // namespace fundamentals_v1
-} // namespace experimental
-} // namespace std
-
- */
-
-#include <experimental/__config>
-#include <string>
-#include <experimental/memory_resource>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
-
-template <class _CharT, class _Traits = char_traits<_CharT>>
-using basic_string =
- _VSTD::basic_string<_CharT, _Traits, polymorphic_allocator<_CharT>>;
-
-typedef basic_string<char> string;
-typedef basic_string<char16_t> u16string;
-typedef basic_string<char32_t> u32string;
-typedef basic_string<wchar_t> wstring;
-
-_LIBCPP_END_NAMESPACE_LFTS_PMR
-
-#endif /* _LIBCPP_EXPERIMENTAL_STRING */
diff --git a/lib/libcxx/include/experimental/string_view b/lib/libcxx/include/experimental/string_view
deleted file mode 100644
index 100bdfe7273..00000000000
--- a/lib/libcxx/include/experimental/string_view
+++ /dev/null
@@ -1,21 +0,0 @@
-// -*- C++ -*-
-//===------------------------ string_view ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#ifndef _LIBCPP_EXPERIMENTAL_STRING_VIEW
-#define _LIBCPP_EXPERIMENTAL_STRING_VIEW
-
-#include <__config>
-
-#ifdef _LIBCPP_WARNING
-_LIBCPP_WARNING("<experimental/string_view> has been removed. Use <string_view> instead.")
-#else
-# warning "<experimental/string_view> has been removed. Use <string_view> instead."
-#endif
-
-#endif // _LIBCPP_EXPERIMENTAL_STRING_VIEW
diff --git a/lib/libcxx/include/experimental/system_error b/lib/libcxx/include/experimental/system_error
deleted file mode 100644
index 1cf84ee0125..00000000000
--- a/lib/libcxx/include/experimental/system_error
+++ /dev/null
@@ -1,21 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- system_error ------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#ifndef _LIBCPP_EXPERIMENTAL_SYSTEM_ERROR
-#define _LIBCPP_EXPERIMENTAL_SYSTEM_ERROR
-
-#include <__config>
-
-#ifdef _LIBCPP_WARNING
-_LIBCPP_WARNING("<experimental/system_error> has been removed. Use <system_error> instead.")
-#else
-# warning "<experimental/system_error> has been removed. Use <system_error> instead."
-#endif
-
-#endif // _LIBCPP_EXPERIMENTAL_SYSTEM_ERROR
diff --git a/lib/libcxx/include/experimental/tuple b/lib/libcxx/include/experimental/tuple
deleted file mode 100644
index 6d71bb559b0..00000000000
--- a/lib/libcxx/include/experimental/tuple
+++ /dev/null
@@ -1,21 +0,0 @@
-// -*- C++ -*-
-//===----------------------------- tuple ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#ifndef _LIBCPP_EXPERIMENTAL_TUPLE
-#define _LIBCPP_EXPERIMENTAL_TUPLE
-
-#include <__config>
-
-#ifdef _LIBCPP_WARNING
-_LIBCPP_WARNING("<experimental/tuple> has been removed. Use <tuple> instead.")
-#else
-# warning "<experimental/tuple> has been removed. Use <tuple> instead."
-#endif
-
-#endif // _LIBCPP_EXPERIMENTAL_TUPLE
diff --git a/lib/libcxx/include/experimental/type_traits b/lib/libcxx/include/experimental/type_traits
deleted file mode 100644
index afe491567ce..00000000000
--- a/lib/libcxx/include/experimental/type_traits
+++ /dev/null
@@ -1,155 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- type_traits -------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_TYPE_TRAITS
-#define _LIBCPP_EXPERIMENTAL_TYPE_TRAITS
-
-/**
- experimental/type_traits synopsis
-
-// C++1y
-#include <type_traits>
-
-namespace std {
-namespace experimental {
-inline namespace fundamentals_v1 {
-
- // 3.3.2, Other type transformations
- template <class> class invocation_type; // not defined
- template <class F, class... ArgTypes> class invocation_type<F(ArgTypes...)>;
- template <class> class raw_invocation_type; // not defined
- template <class F, class... ArgTypes> class raw_invocation_type<F(ArgTypes...)>;
-
- template <class T>
- using invocation_type_t = typename invocation_type<T>::type;
- template <class T>
- using raw_invocation_type_t = typename raw_invocation_type<T>::type;
-
- // 3.3.4, Detection idiom
- template <class...> using void_t = void;
-
- struct nonesuch {
- nonesuch() = delete;
- ~nonesuch() = delete;
- nonesuch(nonesuch const&) = delete;
- void operator=(nonesuch const&) = delete;
- };
-
- template <template<class...> class Op, class... Args>
- using is_detected = see below;
- template <template<class...> class Op, class... Args>
- constexpr bool is_detected_v = is_detected<Op, Args...>::value;
- template <template<class...> class Op, class... Args>
- using detected_t = see below;
- template <class Default, template<class...> class Op, class... Args>
- using detected_or = see below;
- template <class Default, template<class...> class Op, class... Args>
- using detected_or_t = typename detected_or<Default, Op, Args...>::type;
- template <class Expected, template<class...> class Op, class... Args>
- using is_detected_exact = is_same<Expected, detected_t<Op, Args...>>;
- template <class Expected, template<class...> class Op, class... Args>
- constexpr bool is_detected_exact_v
- = is_detected_exact<Expected, Op, Args...>::value;
- template <class To, template<class...> class Op, class... Args>
- using is_detected_convertible = is_convertible<detected_t<Op, Args...>, To>;
- template <class To, template<class...> class Op, class... Args>
- constexpr bool is_detected_convertible_v
- = is_detected_convertible<To, Op, Args...>::value;
-
-} // namespace fundamentals_v1
-} // namespace experimental
-} // namespace std
-
- */
-
-#include <experimental/__config>
-
-#if _LIBCPP_STD_VER > 11
-
-#include <type_traits>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS
-
-// 3.3.2, Other type transformations
-/*
-template <class>
-class _LIBCPP_TEMPLATE_VIS raw_invocation_type;
-
-template <class _Fn, class ..._Args>
-class _LIBCPP_TEMPLATE_VIS raw_invocation_type<_Fn(_Args...)>;
-
-template <class>
-class _LIBCPP_TEMPLATE_VIS invokation_type;
-
-template <class _Fn, class ..._Args>
-class _LIBCPP_TEMPLATE_VIS invokation_type<_Fn(_Args...)>;
-
-template <class _Tp>
-using invokation_type_t = typename invokation_type<_Tp>::type;
-
-template <class _Tp>
-using raw_invocation_type_t = typename raw_invocation_type<_Tp>::type;
-*/
-
-// 3.3.4, Detection idiom
-template <class...> using void_t = void;
-
-struct nonesuch {
- nonesuch() = delete;
- ~nonesuch() = delete;
- nonesuch (nonesuch const&) = delete;
- void operator=(nonesuch const&) = delete;
- };
-
-template <class _Default, class _AlwaysVoid, template <class...> class _Op, class... _Args>
-struct _DETECTOR {
- using value_t = false_type;
- using type = _Default;
- };
-
-template <class _Default, template <class...> class _Op, class... _Args>
-struct _DETECTOR<_Default, void_t<_Op<_Args...>>, _Op, _Args...> {
- using value_t = true_type;
- using type = _Op<_Args...>;
- };
-
-
-template <template<class...> class _Op, class... _Args>
- using is_detected = typename _DETECTOR<nonesuch, void, _Op, _Args...>::value_t;
-template <template<class...> class _Op, class... _Args>
- using detected_t = typename _DETECTOR<nonesuch, void, _Op, _Args...>::type;
-template <template<class...> class _Op, class... _Args>
- _LIBCPP_CONSTEXPR bool is_detected_v = is_detected<_Op, _Args...>::value;
-
-template <class Default, template<class...> class _Op, class... _Args>
- using detected_or = _DETECTOR<Default, void, _Op, _Args...>;
-template <class Default, template<class...> class _Op, class... _Args>
- using detected_or_t = typename detected_or<Default, _Op, _Args...>::type;
-
-template <class Expected, template<class...> class _Op, class... _Args>
- using is_detected_exact = is_same<Expected, detected_t<_Op, _Args...>>;
-template <class Expected, template<class...> class _Op, class... _Args>
- _LIBCPP_CONSTEXPR bool is_detected_exact_v = is_detected_exact<Expected, _Op, _Args...>::value;
-
-template <class To, template<class...> class _Op, class... _Args>
- using is_detected_convertible = is_convertible<detected_t<_Op, _Args...>, To>;
-template <class To, template<class...> class _Op, class... _Args>
- _LIBCPP_CONSTEXPR bool is_detected_convertible_v = is_detected_convertible<To, _Op, _Args...>::value;
-
-
-_LIBCPP_END_NAMESPACE_LFTS
-
-#endif /* _LIBCPP_STD_VER > 11 */
-
-#endif /* _LIBCPP_EXPERIMENTAL_TYPE_TRAITS */
diff --git a/lib/libcxx/include/experimental/unordered_map b/lib/libcxx/include/experimental/unordered_map
deleted file mode 100644
index 1f998c2d4c7..00000000000
--- a/lib/libcxx/include/experimental/unordered_map
+++ /dev/null
@@ -1,65 +0,0 @@
-// -*- C++ -*-
-//===------------------------- unordered_map ------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_UNORDERED_MAP
-#define _LIBCPP_EXPERIMENTAL_UNORDERED_MAP
-/*
- experimental/unordered_map synopsis
-
-// C++1z
-namespace std {
-namespace experimental {
-inline namespace fundamentals_v1 {
-namespace pmr {
-
- template <class Key, class T,
- class Hash = hash<Key>,
- class Pred = equal_to<Key>>
- using unordered_map =
- std::unordered_map<Key, T, Hash, Pred,
- polymorphic_allocator<pair<const Key,T>>>;
-
- template <class Key, class T,
- class Hash = hash<Key>,
- class Pred = equal_to<Key>>
- using unordered_multimap =
- std::unordered_multimap<Key, T, Hash, Pred,
- polymorphic_allocator<pair<const Key,T>>>;
-
-} // namespace pmr
-} // namespace fundamentals_v1
-} // namespace experimental
-} // namespace std
-
- */
-
-#include <experimental/__config>
-#include <unordered_map>
-#include <experimental/memory_resource>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
-
-template <class _Key, class _Value,
- class _Hash = hash<_Key>, class _Pred = equal_to<_Key>>
-using unordered_map = _VSTD::unordered_map<_Key, _Value, _Hash, _Pred,
- polymorphic_allocator<pair<const _Key, _Value>>>;
-
-template <class _Key, class _Value,
- class _Hash = hash<_Key>, class _Pred = equal_to<_Key>>
-using unordered_multimap = _VSTD::unordered_multimap<_Key, _Value, _Hash, _Pred,
- polymorphic_allocator<pair<const _Key, _Value>>>;
-
-_LIBCPP_END_NAMESPACE_LFTS_PMR
-
-#endif /* _LIBCPP_EXPERIMENTAL_UNORDERED_MAP */
diff --git a/lib/libcxx/include/experimental/unordered_set b/lib/libcxx/include/experimental/unordered_set
deleted file mode 100644
index d00a8375340..00000000000
--- a/lib/libcxx/include/experimental/unordered_set
+++ /dev/null
@@ -1,59 +0,0 @@
-// -*- C++ -*-
-//===------------------------- unordered_set ------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_UNORDERED_SET
-#define _LIBCPP_EXPERIMENTAL_UNORDERED_SET
-/*
- experimental/unordered_set synopsis
-
-// C++1z
-namespace std {
-namespace experimental {
-inline namespace fundamentals_v1 {
-namespace pmr {
-
- template <class T, class Hash = hash<T>, class Pred = equal_to<T>>
- using unordered_set = std::unordered_set<T, Hash, Pred,
- polymorphic_allocator<T>>;
-
- template <class T, class Hash = hash<T>, class Pred = equal_to<T>>
- using unordered_multiset = std::unordered_multiset<T, Hash, Pred,
- polymorphic_allocator<T>>;
-
-} // namespace pmr
-} // namespace fundamentals_v1
-} // namespace experimental
-} // namespace std
-
- */
-
-#include <experimental/__config>
-#include <unordered_set>
-#include <experimental/memory_resource>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
-
-template <class _Value,
- class _Hash = hash<_Value>, class _Pred = equal_to<_Value>>
-using unordered_set = _VSTD::unordered_set<_Value, _Hash, _Pred,
- polymorphic_allocator<_Value>>;
-
-template <class _Value,
- class _Hash = hash<_Value>, class _Pred = equal_to<_Value>>
-using unordered_multiset = _VSTD::unordered_multiset<_Value, _Hash, _Pred,
- polymorphic_allocator<_Value>>;
-
-_LIBCPP_END_NAMESPACE_LFTS_PMR
-
-#endif /* _LIBCPP_EXPERIMENTAL_UNORDERED_SET */
diff --git a/lib/libcxx/include/experimental/utility b/lib/libcxx/include/experimental/utility
deleted file mode 100644
index 8effa71c131..00000000000
--- a/lib/libcxx/include/experimental/utility
+++ /dev/null
@@ -1,47 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- utility ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_UTILITY
-#define _LIBCPP_EXPERIMENTAL_UTILITY
-
-/*
- experimental/utility synopsis
-
-// C++1y
-
-#include <utility>
-
-namespace std {
-namespace experimental {
-inline namespace fundamentals_v1 {
-
- 3.1.2, erased-type placeholder
- struct erased_type { };
-
-} // namespace fundamentals_v1
-} // namespace experimental
-} // namespace std
-
- */
-
-#include <experimental/__config>
-#include <utility>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS
-
- struct _LIBCPP_TEMPLATE_VIS erased_type { };
-
-_LIBCPP_END_NAMESPACE_LFTS
-
-#endif /* _LIBCPP_EXPERIMENTAL_UTILITY */
diff --git a/lib/libcxx/include/experimental/vector b/lib/libcxx/include/experimental/vector
deleted file mode 100644
index bd10492bfef..00000000000
--- a/lib/libcxx/include/experimental/vector
+++ /dev/null
@@ -1,47 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- vector ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXPERIMENTAL_VECTOR
-#define _LIBCPP_EXPERIMENTAL_VECTOR
-/*
- experimental/vector synopsis
-
-// C++1z
-namespace std {
-namespace experimental {
-inline namespace fundamentals_v1 {
-namespace pmr {
-
- template <class T>
- using vector = std::vector<T, polymorphic_allocator<T>>;
-
-} // namespace pmr
-} // namespace fundamentals_v1
-} // namespace experimental
-} // namespace std
-
- */
-
-#include <experimental/__config>
-#include <vector>
-#include <experimental/memory_resource>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
-
-template <class _ValueT>
-using vector = _VSTD::vector<_ValueT, polymorphic_allocator<_ValueT>>;
-
-_LIBCPP_END_NAMESPACE_LFTS_PMR
-
-#endif /* _LIBCPP_EXPERIMENTAL_VECTOR */
diff --git a/lib/libcxx/include/ext/__hash b/lib/libcxx/include/ext/__hash
deleted file mode 100644
index 318cb1f97b0..00000000000
--- a/lib/libcxx/include/ext/__hash
+++ /dev/null
@@ -1,135 +0,0 @@
-// -*- C++ -*-
-//===------------------------- hash_set ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_EXT_HASH
-#define _LIBCPP_EXT_HASH
-
-#pragma GCC system_header
-
-#include <string>
-#include <cstring>
-
-namespace __gnu_cxx {
-using namespace std;
-
-template <typename _Tp> struct _LIBCPP_TEMPLATE_VIS hash { };
-
-template <> struct _LIBCPP_TEMPLATE_VIS hash<const char*>
- : public unary_function<const char*, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(const char *__c) const _NOEXCEPT
- {
- return __do_string_hash(__c, __c + strlen(__c));
- }
-};
-
-template <> struct _LIBCPP_TEMPLATE_VIS hash<char *>
- : public unary_function<char*, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(char *__c) const _NOEXCEPT
- {
- return __do_string_hash<const char *>(__c, __c + strlen(__c));
- }
-};
-
-template <> struct _LIBCPP_TEMPLATE_VIS hash<char>
- : public unary_function<char, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(char __c) const _NOEXCEPT
- {
- return __c;
- }
-};
-
-template <> struct _LIBCPP_TEMPLATE_VIS hash<signed char>
- : public unary_function<signed char, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(signed char __c) const _NOEXCEPT
- {
- return __c;
- }
-};
-
-template <> struct _LIBCPP_TEMPLATE_VIS hash<unsigned char>
- : public unary_function<unsigned char, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(unsigned char __c) const _NOEXCEPT
- {
- return __c;
- }
-};
-
-template <> struct _LIBCPP_TEMPLATE_VIS hash<short>
- : public unary_function<short, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(short __c) const _NOEXCEPT
- {
- return __c;
- }
-};
-
-template <> struct _LIBCPP_TEMPLATE_VIS hash<unsigned short>
- : public unary_function<unsigned short, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(unsigned short __c) const _NOEXCEPT
- {
- return __c;
- }
-};
-
-template <> struct _LIBCPP_TEMPLATE_VIS hash<int>
- : public unary_function<int, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(int __c) const _NOEXCEPT
- {
- return __c;
- }
-};
-
-template <> struct _LIBCPP_TEMPLATE_VIS hash<unsigned int>
- : public unary_function<unsigned int, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(unsigned int __c) const _NOEXCEPT
- {
- return __c;
- }
-};
-
-template <> struct _LIBCPP_TEMPLATE_VIS hash<long>
- : public unary_function<long, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(long __c) const _NOEXCEPT
- {
- return __c;
- }
-};
-
-template <> struct _LIBCPP_TEMPLATE_VIS hash<unsigned long>
- : public unary_function<unsigned long, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(unsigned long __c) const _NOEXCEPT
- {
- return __c;
- }
-};
-}
-
-#endif // _LIBCPP_EXT_HASH
diff --git a/lib/libcxx/include/ext/hash_map b/lib/libcxx/include/ext/hash_map
deleted file mode 100644
index 998e8f65994..00000000000
--- a/lib/libcxx/include/ext/hash_map
+++ /dev/null
@@ -1,984 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- hash_map ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_HASH_MAP
-#define _LIBCPP_HASH_MAP
-
-/*
-
- hash_map synopsis
-
-namespace __gnu_cxx
-{
-
-template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
- class Alloc = allocator<pair<const Key, T>>>
-class hash_map
-{
-public:
- // types
- typedef Key key_type;
- typedef T mapped_type;
- typedef Hash hasher;
- typedef Pred key_equal;
- typedef Alloc allocator_type;
- typedef pair<const key_type, mapped_type> value_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename allocator_traits<allocator_type>::pointer pointer;
- typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
- typedef typename allocator_traits<allocator_type>::size_type size_type;
- typedef typename allocator_traits<allocator_type>::difference_type difference_type;
-
- typedef /unspecified/ iterator;
- typedef /unspecified/ const_iterator;
-
- explicit hash_map(size_type n = 193, const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- template <class InputIterator>
- hash_map(InputIterator f, InputIterator l,
- size_type n = 193, const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- hash_map(const hash_map&);
- ~hash_map();
- hash_map& operator=(const hash_map&);
-
- allocator_type get_allocator() const;
-
- bool empty() const;
- size_type size() const;
- size_type max_size() const;
-
- iterator begin();
- iterator end();
- const_iterator begin() const;
- const_iterator end() const;
-
- pair<iterator, bool> insert(const value_type& obj);
- template <class InputIterator>
- void insert(InputIterator first, InputIterator last);
-
- void erase(const_iterator position);
- size_type erase(const key_type& k);
- void erase(const_iterator first, const_iterator last);
- void clear();
-
- void swap(hash_map&);
-
- hasher hash_funct() const;
- key_equal key_eq() const;
-
- iterator find(const key_type& k);
- const_iterator find(const key_type& k) const;
- size_type count(const key_type& k) const;
- pair<iterator, iterator> equal_range(const key_type& k);
- pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
-
- mapped_type& operator[](const key_type& k);
-
- size_type bucket_count() const;
- size_type max_bucket_count() const;
-
- size_type elems_in_bucket(size_type n) const;
-
- void resize(size_type n);
-};
-
-template <class Key, class T, class Hash, class Pred, class Alloc>
- void swap(hash_map<Key, T, Hash, Pred, Alloc>& x,
- hash_map<Key, T, Hash, Pred, Alloc>& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc>
- bool
- operator==(const hash_map<Key, T, Hash, Pred, Alloc>& x,
- const hash_map<Key, T, Hash, Pred, Alloc>& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc>
- bool
- operator!=(const hash_map<Key, T, Hash, Pred, Alloc>& x,
- const hash_map<Key, T, Hash, Pred, Alloc>& y);
-
-template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
- class Alloc = allocator<pair<const Key, T>>>
-class hash_multimap
-{
-public:
- // types
- typedef Key key_type;
- typedef T mapped_type;
- typedef Hash hasher;
- typedef Pred key_equal;
- typedef Alloc allocator_type;
- typedef pair<const key_type, mapped_type> value_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename allocator_traits<allocator_type>::pointer pointer;
- typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
- typedef typename allocator_traits<allocator_type>::size_type size_type;
- typedef typename allocator_traits<allocator_type>::difference_type difference_type;
-
- typedef /unspecified/ iterator;
- typedef /unspecified/ const_iterator;
-
- explicit hash_multimap(size_type n = 193, const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- template <class InputIterator>
- hash_multimap(InputIterator f, InputIterator l,
- size_type n = 193, const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- explicit hash_multimap(const allocator_type&);
- hash_multimap(const hash_multimap&);
- ~hash_multimap();
- hash_multimap& operator=(const hash_multimap&);
-
- allocator_type get_allocator() const;
-
- bool empty() const;
- size_type size() const;
- size_type max_size() const;
-
- iterator begin();
- iterator end();
- const_iterator begin() const;
- const_iterator end() const;
-
- iterator insert(const value_type& obj);
- template <class InputIterator>
- void insert(InputIterator first, InputIterator last);
-
- void erase(const_iterator position);
- size_type erase(const key_type& k);
- void erase(const_iterator first, const_iterator last);
- void clear();
-
- void swap(hash_multimap&);
-
- hasher hash_funct() const;
- key_equal key_eq() const;
-
- iterator find(const key_type& k);
- const_iterator find(const key_type& k) const;
- size_type count(const key_type& k) const;
- pair<iterator, iterator> equal_range(const key_type& k);
- pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
-
- size_type bucket_count() const;
- size_type max_bucket_count() const;
-
- size_type elems_in_bucket(size_type n) const;
-
- void resize(size_type n);
-};
-
-template <class Key, class T, class Hash, class Pred, class Alloc>
- void swap(hash_multimap<Key, T, Hash, Pred, Alloc>& x,
- hash_multimap<Key, T, Hash, Pred, Alloc>& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc>
- bool
- operator==(const hash_multimap<Key, T, Hash, Pred, Alloc>& x,
- const hash_multimap<Key, T, Hash, Pred, Alloc>& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc>
- bool
- operator!=(const hash_multimap<Key, T, Hash, Pred, Alloc>& x,
- const hash_multimap<Key, T, Hash, Pred, Alloc>& y);
-
-} // __gnu_cxx
-
-*/
-
-#include <__config>
-#include <__hash_table>
-#include <functional>
-#include <stdexcept>
-#include <type_traits>
-#include <ext/__hash>
-
-#if __DEPRECATED
-#if defined(_LIBCPP_WARNING)
- _LIBCPP_WARNING("Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map>")
-#else
-# warning Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map>
-#endif
-#endif
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-namespace __gnu_cxx {
-
-using namespace std;
-
-template <class _Tp, class _Hash,
- bool = is_empty<_Hash>::value && !__libcpp_is_final<_Hash>::value
- >
-class __hash_map_hasher
- : private _Hash
-{
-public:
- _LIBCPP_INLINE_VISIBILITY __hash_map_hasher() : _Hash() {}
- _LIBCPP_INLINE_VISIBILITY __hash_map_hasher(const _Hash& __h) : _Hash(__h) {}
- _LIBCPP_INLINE_VISIBILITY const _Hash& hash_function() const {return *this;}
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(const _Tp& __x) const
- {return static_cast<const _Hash&>(*this)(__x.first);}
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(const typename _Tp::first_type& __x) const
- {return static_cast<const _Hash&>(*this)(__x);}
-};
-
-template <class _Tp, class _Hash>
-class __hash_map_hasher<_Tp, _Hash, false>
-{
- _Hash __hash_;
-public:
- _LIBCPP_INLINE_VISIBILITY __hash_map_hasher() : __hash_() {}
- _LIBCPP_INLINE_VISIBILITY __hash_map_hasher(const _Hash& __h) : __hash_(__h) {}
- _LIBCPP_INLINE_VISIBILITY const _Hash& hash_function() const {return __hash_;}
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(const _Tp& __x) const
- {return __hash_(__x.first);}
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(const typename _Tp::first_type& __x) const
- {return __hash_(__x);}
-};
-
-template <class _Tp, class _Pred,
- bool = is_empty<_Pred>::value && !__libcpp_is_final<_Pred>::value
- >
-class __hash_map_equal
- : private _Pred
-{
-public:
- _LIBCPP_INLINE_VISIBILITY __hash_map_equal() : _Pred() {}
- _LIBCPP_INLINE_VISIBILITY __hash_map_equal(const _Pred& __p) : _Pred(__p) {}
- _LIBCPP_INLINE_VISIBILITY const _Pred& key_eq() const {return *this;}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return static_cast<const _Pred&>(*this)(__x.first, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const typename _Tp::first_type& __x, const _Tp& __y) const
- {return static_cast<const _Pred&>(*this)(__x, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const typename _Tp::first_type& __y) const
- {return static_cast<const _Pred&>(*this)(__x.first, __y);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const typename _Tp::first_type& __x,
- const typename _Tp::first_type& __y) const
- {return static_cast<const _Pred&>(*this)(__x, __y);}
-};
-
-template <class _Tp, class _Pred>
-class __hash_map_equal<_Tp, _Pred, false>
-{
- _Pred __pred_;
-public:
- _LIBCPP_INLINE_VISIBILITY __hash_map_equal() : __pred_() {}
- _LIBCPP_INLINE_VISIBILITY __hash_map_equal(const _Pred& __p) : __pred_(__p) {}
- _LIBCPP_INLINE_VISIBILITY const _Pred& key_eq() const {return __pred_;}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return __pred_(__x.first, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const typename _Tp::first_type& __x, const _Tp& __y) const
- {return __pred_(__x, __y.first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const typename _Tp::first_type& __y) const
- {return __pred_(__x.first, __y);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const typename _Tp::first_type& __x,
- const typename _Tp::first_type& __y) const
- {return __pred_(__x, __y);}
-};
-
-template <class _Alloc>
-class __hash_map_node_destructor
-{
- typedef _Alloc allocator_type;
- typedef allocator_traits<allocator_type> __alloc_traits;
- typedef typename __alloc_traits::value_type::__node_value_type value_type;
-public:
- typedef typename __alloc_traits::pointer pointer;
-private:
- typedef typename value_type::first_type first_type;
- typedef typename value_type::second_type second_type;
-
- allocator_type& __na_;
-
- __hash_map_node_destructor& operator=(const __hash_map_node_destructor&);
-
-public:
- bool __first_constructed;
- bool __second_constructed;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __hash_map_node_destructor(allocator_type& __na)
- : __na_(__na),
- __first_constructed(false),
- __second_constructed(false)
- {}
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x)
- : __na_(__x.__na_),
- __first_constructed(__x.__value_constructed),
- __second_constructed(__x.__value_constructed)
- {
- __x.__value_constructed = false;
- }
-#else // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x)
- : __na_(__x.__na_),
- __first_constructed(__x.__value_constructed),
- __second_constructed(__x.__value_constructed)
- {
- const_cast<bool&>(__x.__value_constructed) = false;
- }
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- void operator()(pointer __p)
- {
- if (__second_constructed)
- __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.second));
- if (__first_constructed)
- __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.first));
- if (__p)
- __alloc_traits::deallocate(__na_, __p, 1);
- }
-};
-
-template <class _HashIterator>
-class _LIBCPP_TEMPLATE_VIS __hash_map_iterator
-{
- _HashIterator __i_;
-
- typedef const typename _HashIterator::value_type::first_type key_type;
- typedef typename _HashIterator::value_type::second_type mapped_type;
-public:
- typedef forward_iterator_tag iterator_category;
- typedef pair<key_type, mapped_type> value_type;
- typedef typename _HashIterator::difference_type difference_type;
- typedef value_type& reference;
- typedef typename __rebind_pointer<typename _HashIterator::pointer, value_type>::type
- pointer;
-
- _LIBCPP_INLINE_VISIBILITY __hash_map_iterator() {}
-
- _LIBCPP_INLINE_VISIBILITY __hash_map_iterator(_HashIterator __i) : __i_(__i) {}
-
- _LIBCPP_INLINE_VISIBILITY reference operator*() const {return *operator->();}
- _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return (pointer)__i_.operator->();}
-
- _LIBCPP_INLINE_VISIBILITY __hash_map_iterator& operator++() {++__i_; return *this;}
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_iterator operator++(int)
- {
- __hash_map_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
- {return __x.__i_ == __y.__i_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
- {return __x.__i_ != __y.__i_;}
-
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS hash_map;
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS hash_multimap;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
-};
-
-template <class _HashIterator>
-class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator
-{
- _HashIterator __i_;
-
- typedef const typename _HashIterator::value_type::first_type key_type;
- typedef typename _HashIterator::value_type::second_type mapped_type;
-public:
- typedef forward_iterator_tag iterator_category;
- typedef pair<key_type, mapped_type> value_type;
- typedef typename _HashIterator::difference_type difference_type;
- typedef const value_type& reference;
- typedef typename __rebind_pointer<typename _HashIterator::pointer, const value_type>::type
- pointer;
-
- _LIBCPP_INLINE_VISIBILITY __hash_map_const_iterator() {}
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_const_iterator(_HashIterator __i) : __i_(__i) {}
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_const_iterator(
- __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i)
- : __i_(__i.__i_) {}
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {return *operator->();}
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return (pointer)__i_.operator->();}
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_const_iterator& operator++() {++__i_; return *this;}
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_const_iterator operator++(int)
- {
- __hash_map_const_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
- {return __x.__i_ == __y.__i_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
- {return __x.__i_ != __y.__i_;}
-
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS hash_map;
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS hash_multimap;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
-};
-
-template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
- class _Alloc = allocator<pair<const _Key, _Tp> > >
-class _LIBCPP_TEMPLATE_VIS hash_map
-{
-public:
- // types
- typedef _Key key_type;
- typedef _Tp mapped_type;
- typedef _Tp data_type;
- typedef _Hash hasher;
- typedef _Pred key_equal;
- typedef _Alloc allocator_type;
- typedef pair<const key_type, mapped_type> value_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
-
-private:
- typedef pair<key_type, mapped_type> __value_type;
- typedef __hash_map_hasher<__value_type, hasher> __hasher;
- typedef __hash_map_equal<__value_type, key_equal> __key_equal;
- typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, __value_type>::type __allocator_type;
-
- typedef __hash_table<__value_type, __hasher,
- __key_equal, __allocator_type> __table;
-
- __table __table_;
-
- typedef typename __table::__node_pointer __node_pointer;
- typedef typename __table::__node_const_pointer __node_const_pointer;
- typedef typename __table::__node_traits __node_traits;
- typedef typename __table::__node_allocator __node_allocator;
- typedef typename __table::__node __node;
- typedef __hash_map_node_destructor<__node_allocator> _Dp;
- typedef unique_ptr<__node, _Dp> __node_holder;
- typedef allocator_traits<allocator_type> __alloc_traits;
-public:
- typedef typename __alloc_traits::pointer pointer;
- typedef typename __alloc_traits::const_pointer const_pointer;
- typedef typename __alloc_traits::size_type size_type;
- typedef typename __alloc_traits::difference_type difference_type;
-
- typedef __hash_map_iterator<typename __table::iterator> iterator;
- typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
-
- _LIBCPP_INLINE_VISIBILITY hash_map() {__table_.rehash(193);}
- explicit hash_map(size_type __n, const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- hash_map(size_type __n, const hasher& __hf,
- const key_equal& __eql,
- const allocator_type& __a);
- template <class _InputIterator>
- hash_map(_InputIterator __first, _InputIterator __last);
- template <class _InputIterator>
- hash_map(_InputIterator __first, _InputIterator __last,
- size_type __n, const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- template <class _InputIterator>
- hash_map(_InputIterator __first, _InputIterator __last,
- size_type __n, const hasher& __hf,
- const key_equal& __eql,
- const allocator_type& __a);
- hash_map(const hash_map& __u);
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const
- {return allocator_type(__table_.__node_alloc());}
-
- _LIBCPP_INLINE_VISIBILITY
- bool empty() const {return __table_.size() == 0;}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const {return __table_.size();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const {return __table_.max_size();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() {return __table_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const {return __table_.end();}
-
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> insert(const value_type& __x)
- {return __table_.__insert_unique(__x);}
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator, const value_type& __x) {return insert(__x).first;}
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- void insert(_InputIterator __first, _InputIterator __last);
-
- _LIBCPP_INLINE_VISIBILITY
- void erase(const_iterator __p) {__table_.erase(__p.__i_);}
- _LIBCPP_INLINE_VISIBILITY
- size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
- _LIBCPP_INLINE_VISIBILITY
- void erase(const_iterator __first, const_iterator __last)
- {__table_.erase(__first.__i_, __last.__i_);}
- _LIBCPP_INLINE_VISIBILITY
- void clear() {__table_.clear();}
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(hash_map& __u) {__table_.swap(__u.__table_);}
-
- _LIBCPP_INLINE_VISIBILITY
- hasher hash_funct() const
- {return __table_.hash_function().hash_function();}
- _LIBCPP_INLINE_VISIBILITY
- key_equal key_eq() const
- {return __table_.key_eq().key_eq();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator find(const key_type& __k) {return __table_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator find(const key_type& __k) const {return __table_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, iterator> equal_range(const key_type& __k)
- {return __table_.__equal_range_unique(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
- {return __table_.__equal_range_unique(__k);}
-
- mapped_type& operator[](const key_type& __k);
-
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket_count() const {return __table_.bucket_count();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_bucket_count() const {return __table_.max_bucket_count();}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type elems_in_bucket(size_type __n) const
- {return __table_.bucket_size(__n);}
-
- _LIBCPP_INLINE_VISIBILITY
- void resize(size_type __n) {__table_.rehash(__n);}
-
-private:
- __node_holder __construct_node(const key_type& __k);
-};
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map(
- size_type __n, const hasher& __hf, const key_equal& __eql)
- : __table_(__hf, __eql)
-{
- __table_.rehash(__n);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map(
- size_type __n, const hasher& __hf, const key_equal& __eql,
- const allocator_type& __a)
- : __table_(__hf, __eql, __a)
-{
- __table_.rehash(__n);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map(
- _InputIterator __first, _InputIterator __last)
-{
- __table_.rehash(193);
- insert(__first, __last);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map(
- _InputIterator __first, _InputIterator __last, size_type __n,
- const hasher& __hf, const key_equal& __eql)
- : __table_(__hf, __eql)
-{
- __table_.rehash(__n);
- insert(__first, __last);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map(
- _InputIterator __first, _InputIterator __last, size_type __n,
- const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
- : __table_(__hf, __eql, __a)
-{
- __table_.rehash(__n);
- insert(__first, __last);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map(
- const hash_map& __u)
- : __table_(__u.__table_)
-{
- __table_.rehash(__u.bucket_count());
- insert(__u.begin(), __u.end());
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-typename hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
-hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(const key_type& __k)
-{
- __node_allocator& __na = __table_.__node_alloc();
- __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first), __k);
- __h.get_deleter().__first_constructed = true;
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second));
- __h.get_deleter().__second_constructed = true;
- return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-inline
-void
-hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
- _InputIterator __last)
-{
- for (; __first != __last; ++__first)
- __table_.__insert_unique(*__first);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-_Tp&
-hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
-{
- iterator __i = find(__k);
- if (__i != end())
- return __i->second;
- __node_holder __h = __construct_node(__k);
- pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
- __h.release();
- return __r.first->second;
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
- hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
-{
- __x.swap(__y);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-bool
-operator==(const hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
- const hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
-{
- if (__x.size() != __y.size())
- return false;
- typedef typename hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
- const_iterator;
- for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
- __i != __ex; ++__i)
- {
- const_iterator __j = __y.find(__i->first);
- if (__j == __ey || !(*__i == *__j))
- return false;
- }
- return true;
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
- const hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
- class _Alloc = allocator<pair<const _Key, _Tp> > >
-class _LIBCPP_TEMPLATE_VIS hash_multimap
-{
-public:
- // types
- typedef _Key key_type;
- typedef _Tp mapped_type;
- typedef _Tp data_type;
- typedef _Hash hasher;
- typedef _Pred key_equal;
- typedef _Alloc allocator_type;
- typedef pair<const key_type, mapped_type> value_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
-
-private:
- typedef pair<key_type, mapped_type> __value_type;
- typedef __hash_map_hasher<__value_type, hasher> __hasher;
- typedef __hash_map_equal<__value_type, key_equal> __key_equal;
- typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, __value_type>::type __allocator_type;
-
- typedef __hash_table<__value_type, __hasher,
- __key_equal, __allocator_type> __table;
-
- __table __table_;
-
- typedef typename __table::__node_traits __node_traits;
- typedef typename __table::__node_allocator __node_allocator;
- typedef typename __table::__node __node;
- typedef __hash_map_node_destructor<__node_allocator> _Dp;
- typedef unique_ptr<__node, _Dp> __node_holder;
- typedef allocator_traits<allocator_type> __alloc_traits;
-public:
- typedef typename __alloc_traits::pointer pointer;
- typedef typename __alloc_traits::const_pointer const_pointer;
- typedef typename __alloc_traits::size_type size_type;
- typedef typename __alloc_traits::difference_type difference_type;
-
- typedef __hash_map_iterator<typename __table::iterator> iterator;
- typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
-
- _LIBCPP_INLINE_VISIBILITY
- hash_multimap() {__table_.rehash(193);}
- explicit hash_multimap(size_type __n, const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- hash_multimap(size_type __n, const hasher& __hf,
- const key_equal& __eql,
- const allocator_type& __a);
- template <class _InputIterator>
- hash_multimap(_InputIterator __first, _InputIterator __last);
- template <class _InputIterator>
- hash_multimap(_InputIterator __first, _InputIterator __last,
- size_type __n, const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- template <class _InputIterator>
- hash_multimap(_InputIterator __first, _InputIterator __last,
- size_type __n, const hasher& __hf,
- const key_equal& __eql,
- const allocator_type& __a);
- hash_multimap(const hash_multimap& __u);
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const
- {return allocator_type(__table_.__node_alloc());}
-
- _LIBCPP_INLINE_VISIBILITY
- bool empty() const {return __table_.size() == 0;}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const {return __table_.size();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const {return __table_.max_size();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() {return __table_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const {return __table_.end();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator, const value_type& __x) {return insert(__x);}
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- void insert(_InputIterator __first, _InputIterator __last);
-
- _LIBCPP_INLINE_VISIBILITY
- void erase(const_iterator __p) {__table_.erase(__p.__i_);}
- _LIBCPP_INLINE_VISIBILITY
- size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
- _LIBCPP_INLINE_VISIBILITY
- void erase(const_iterator __first, const_iterator __last)
- {__table_.erase(__first.__i_, __last.__i_);}
- _LIBCPP_INLINE_VISIBILITY
- void clear() {__table_.clear();}
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(hash_multimap& __u) {__table_.swap(__u.__table_);}
-
- _LIBCPP_INLINE_VISIBILITY
- hasher hash_funct() const
- {return __table_.hash_function().hash_function();}
- _LIBCPP_INLINE_VISIBILITY
- key_equal key_eq() const
- {return __table_.key_eq().key_eq();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator find(const key_type& __k) {return __table_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator find(const key_type& __k) const {return __table_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, iterator> equal_range(const key_type& __k)
- {return __table_.__equal_range_multi(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
- {return __table_.__equal_range_multi(__k);}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket_count() const {return __table_.bucket_count();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_bucket_count() const {return __table_.max_bucket_count();}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type elems_in_bucket(size_type __n) const
- {return __table_.bucket_size(__n);}
-
- _LIBCPP_INLINE_VISIBILITY
- void resize(size_type __n) {__table_.rehash(__n);}
-};
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap(
- size_type __n, const hasher& __hf, const key_equal& __eql)
- : __table_(__hf, __eql)
-{
- __table_.rehash(__n);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap(
- size_type __n, const hasher& __hf, const key_equal& __eql,
- const allocator_type& __a)
- : __table_(__hf, __eql, __a)
-{
- __table_.rehash(__n);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap(
- _InputIterator __first, _InputIterator __last)
-{
- __table_.rehash(193);
- insert(__first, __last);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap(
- _InputIterator __first, _InputIterator __last, size_type __n,
- const hasher& __hf, const key_equal& __eql)
- : __table_(__hf, __eql)
-{
- __table_.rehash(__n);
- insert(__first, __last);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap(
- _InputIterator __first, _InputIterator __last, size_type __n,
- const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
- : __table_(__hf, __eql, __a)
-{
- __table_.rehash(__n);
- insert(__first, __last);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap(
- const hash_multimap& __u)
- : __table_(__u.__table_)
-{
- __table_.rehash(__u.bucket_count());
- insert(__u.begin(), __u.end());
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-inline
-void
-hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
- _InputIterator __last)
-{
- for (; __first != __last; ++__first)
- __table_.__insert_multi(*__first);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
- hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
-{
- __x.swap(__y);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-bool
-operator==(const hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
- const hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
-{
- if (__x.size() != __y.size())
- return false;
- typedef typename hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
- const_iterator;
- typedef pair<const_iterator, const_iterator> _EqRng;
- for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
- {
- _EqRng __xeq = __x.equal_range(__i->first);
- _EqRng __yeq = __y.equal_range(__i->first);
- if (_VSTD::distance(__xeq.first, __xeq.second) !=
- _VSTD::distance(__yeq.first, __yeq.second) ||
- !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
- return false;
- __i = __xeq.second;
- }
- return true;
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
- const hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
-{
- return !(__x == __y);
-}
-
-} // __gnu_cxx
-
-#endif // _LIBCPP_HASH_MAP
diff --git a/lib/libcxx/include/ext/hash_set b/lib/libcxx/include/ext/hash_set
deleted file mode 100644
index 38f81ed3b5c..00000000000
--- a/lib/libcxx/include/ext/hash_set
+++ /dev/null
@@ -1,663 +0,0 @@
-// -*- C++ -*-
-//===------------------------- hash_set ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_HASH_SET
-#define _LIBCPP_HASH_SET
-
-/*
-
- hash_set synopsis
-
-namespace __gnu_cxx
-{
-
-template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
- class Alloc = allocator<Value>>
-class hash_set
-{
-public:
- // types
- typedef Value key_type;
- typedef key_type value_type;
- typedef Hash hasher;
- typedef Pred key_equal;
- typedef Alloc allocator_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename allocator_traits<allocator_type>::pointer pointer;
- typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
- typedef typename allocator_traits<allocator_type>::size_type size_type;
- typedef typename allocator_traits<allocator_type>::difference_type difference_type;
-
- typedef /unspecified/ iterator;
- typedef /unspecified/ const_iterator;
-
- explicit hash_set(size_type n = 193, const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- template <class InputIterator>
- hash_set(InputIterator f, InputIterator l,
- size_type n = 193, const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- hash_set(const hash_set&);
- ~hash_set();
- hash_set& operator=(const hash_set&);
-
- allocator_type get_allocator() const;
-
- bool empty() const;
- size_type size() const;
- size_type max_size() const;
-
- iterator begin();
- iterator end();
- const_iterator begin() const;
- const_iterator end() const;
-
- pair<iterator, bool> insert(const value_type& obj);
- template <class InputIterator>
- void insert(InputIterator first, InputIterator last);
-
- void erase(const_iterator position);
- size_type erase(const key_type& k);
- void erase(const_iterator first, const_iterator last);
- void clear();
-
- void swap(hash_set&);
-
- hasher hash_funct() const;
- key_equal key_eq() const;
-
- iterator find(const key_type& k);
- const_iterator find(const key_type& k) const;
- size_type count(const key_type& k) const;
- pair<iterator, iterator> equal_range(const key_type& k);
- pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
-
- size_type bucket_count() const;
- size_type max_bucket_count() const;
-
- size_type elems_in_bucket(size_type n) const;
-
- void resize(size_type n);
-};
-
-template <class Value, class Hash, class Pred, class Alloc>
- void swap(hash_set<Value, Hash, Pred, Alloc>& x,
- hash_set<Value, Hash, Pred, Alloc>& y);
-
-template <class Value, class Hash, class Pred, class Alloc>
- bool
- operator==(const hash_set<Value, Hash, Pred, Alloc>& x,
- const hash_set<Value, Hash, Pred, Alloc>& y);
-
-template <class Value, class Hash, class Pred, class Alloc>
- bool
- operator!=(const hash_set<Value, Hash, Pred, Alloc>& x,
- const hash_set<Value, Hash, Pred, Alloc>& y);
-
-template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
- class Alloc = allocator<Value>>
-class hash_multiset
-{
-public:
- // types
- typedef Value key_type;
- typedef key_type value_type;
- typedef Hash hasher;
- typedef Pred key_equal;
- typedef Alloc allocator_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename allocator_traits<allocator_type>::pointer pointer;
- typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
- typedef typename allocator_traits<allocator_type>::size_type size_type;
- typedef typename allocator_traits<allocator_type>::difference_type difference_type;
-
- typedef /unspecified/ iterator;
- typedef /unspecified/ const_iterator;
-
- explicit hash_multiset(size_type n = 193, const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- template <class InputIterator>
- hash_multiset(InputIterator f, InputIterator l,
- size_type n = 193, const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- hash_multiset(const hash_multiset&);
- ~hash_multiset();
- hash_multiset& operator=(const hash_multiset&);
-
- allocator_type get_allocator() const;
-
- bool empty() const;
- size_type size() const;
- size_type max_size() const;
-
- iterator begin();
- iterator end();
- const_iterator begin() const;
- const_iterator end() const;
-
- iterator insert(const value_type& obj);
- template <class InputIterator>
- void insert(InputIterator first, InputIterator last);
-
- void erase(const_iterator position);
- size_type erase(const key_type& k);
- void erase(const_iterator first, const_iterator last);
- void clear();
-
- void swap(hash_multiset&);
-
- hasher hash_funct() const;
- key_equal key_eq() const;
-
- iterator find(const key_type& k);
- const_iterator find(const key_type& k) const;
- size_type count(const key_type& k) const;
- pair<iterator, iterator> equal_range(const key_type& k);
- pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
-
- size_type bucket_count() const;
- size_type max_bucket_count() const;
-
- size_type elems_in_bucket(size_type n) const;
-
- void resize(size_type n);
-};
-
-template <class Value, class Hash, class Pred, class Alloc>
- void swap(hash_multiset<Value, Hash, Pred, Alloc>& x,
- hash_multiset<Value, Hash, Pred, Alloc>& y);
-
-template <class Value, class Hash, class Pred, class Alloc>
- bool
- operator==(const hash_multiset<Value, Hash, Pred, Alloc>& x,
- const hash_multiset<Value, Hash, Pred, Alloc>& y);
-
-template <class Value, class Hash, class Pred, class Alloc>
- bool
- operator!=(const hash_multiset<Value, Hash, Pred, Alloc>& x,
- const hash_multiset<Value, Hash, Pred, Alloc>& y);
-} // __gnu_cxx
-
-*/
-
-#include <__config>
-#include <__hash_table>
-#include <functional>
-#include <ext/__hash>
-
-#if __DEPRECATED
-#if defined(_LIBCPP_WARNING)
- _LIBCPP_WARNING("Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set>")
-#else
-# warning Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set>
-#endif
-#endif
-
-namespace __gnu_cxx {
-
-using namespace std;
-
-template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
- class _Alloc = allocator<_Value> >
-class _LIBCPP_TEMPLATE_VIS hash_set
-{
-public:
- // types
- typedef _Value key_type;
- typedef key_type value_type;
- typedef _Hash hasher;
- typedef _Pred key_equal;
- typedef _Alloc allocator_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
-
-private:
- typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
-
- __table __table_;
-
-public:
- typedef typename __table::pointer pointer;
- typedef typename __table::const_pointer const_pointer;
- typedef typename __table::size_type size_type;
- typedef typename __table::difference_type difference_type;
-
- typedef typename __table::const_iterator iterator;
- typedef typename __table::const_iterator const_iterator;
-
- _LIBCPP_INLINE_VISIBILITY
- hash_set() {__table_.rehash(193);}
- explicit hash_set(size_type __n, const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- hash_set(size_type __n, const hasher& __hf, const key_equal& __eql,
- const allocator_type& __a);
- template <class _InputIterator>
- hash_set(_InputIterator __first, _InputIterator __last);
- template <class _InputIterator>
- hash_set(_InputIterator __first, _InputIterator __last,
- size_type __n, const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- template <class _InputIterator>
- hash_set(_InputIterator __first, _InputIterator __last,
- size_type __n, const hasher& __hf, const key_equal& __eql,
- const allocator_type& __a);
- hash_set(const hash_set& __u);
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const
- {return allocator_type(__table_.__node_alloc());}
-
- _LIBCPP_INLINE_VISIBILITY
- bool empty() const {return __table_.size() == 0;}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const {return __table_.size();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const {return __table_.max_size();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() {return __table_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const {return __table_.end();}
-
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> insert(const value_type& __x)
- {return __table_.__insert_unique(__x);}
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator, const value_type& __x) {return insert(__x).first;}
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- void insert(_InputIterator __first, _InputIterator __last);
-
- _LIBCPP_INLINE_VISIBILITY
- void erase(const_iterator __p) {__table_.erase(__p);}
- _LIBCPP_INLINE_VISIBILITY
- size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
- _LIBCPP_INLINE_VISIBILITY
- void erase(const_iterator __first, const_iterator __last)
- {__table_.erase(__first, __last);}
- _LIBCPP_INLINE_VISIBILITY
- void clear() {__table_.clear();}
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(hash_set& __u) {__table_.swap(__u.__table_);}
-
- _LIBCPP_INLINE_VISIBILITY
- hasher hash_funct() const {return __table_.hash_function();}
- _LIBCPP_INLINE_VISIBILITY
- key_equal key_eq() const {return __table_.key_eq();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator find(const key_type& __k) {return __table_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator find(const key_type& __k) const {return __table_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, iterator> equal_range(const key_type& __k)
- {return __table_.__equal_range_unique(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
- {return __table_.__equal_range_unique(__k);}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket_count() const {return __table_.bucket_count();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_bucket_count() const {return __table_.max_bucket_count();}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type elems_in_bucket(size_type __n) const {return __table_.bucket_size(__n);}
-
- _LIBCPP_INLINE_VISIBILITY
- void resize(size_type __n) {__table_.rehash(__n);}
-};
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(size_type __n,
- const hasher& __hf, const key_equal& __eql)
- : __table_(__hf, __eql)
-{
- __table_.rehash(__n);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(size_type __n,
- const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
- : __table_(__hf, __eql, __a)
-{
- __table_.rehash(__n);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(
- _InputIterator __first, _InputIterator __last)
-{
- __table_.rehash(193);
- insert(__first, __last);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(
- _InputIterator __first, _InputIterator __last, size_type __n,
- const hasher& __hf, const key_equal& __eql)
- : __table_(__hf, __eql)
-{
- __table_.rehash(__n);
- insert(__first, __last);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(
- _InputIterator __first, _InputIterator __last, size_type __n,
- const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
- : __table_(__hf, __eql, __a)
-{
- __table_.rehash(__n);
- insert(__first, __last);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(
- const hash_set& __u)
- : __table_(__u.__table_)
-{
- __table_.rehash(__u.bucket_count());
- insert(__u.begin(), __u.end());
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-inline
-void
-hash_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
- _InputIterator __last)
-{
- for (; __first != __last; ++__first)
- __table_.__insert_unique(*__first);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(hash_set<_Value, _Hash, _Pred, _Alloc>& __x,
- hash_set<_Value, _Hash, _Pred, _Alloc>& __y)
-{
- __x.swap(__y);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-bool
-operator==(const hash_set<_Value, _Hash, _Pred, _Alloc>& __x,
- const hash_set<_Value, _Hash, _Pred, _Alloc>& __y)
-{
- if (__x.size() != __y.size())
- return false;
- typedef typename hash_set<_Value, _Hash, _Pred, _Alloc>::const_iterator
- const_iterator;
- for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
- __i != __ex; ++__i)
- {
- const_iterator __j = __y.find(*__i);
- if (__j == __ey || !(*__i == *__j))
- return false;
- }
- return true;
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const hash_set<_Value, _Hash, _Pred, _Alloc>& __x,
- const hash_set<_Value, _Hash, _Pred, _Alloc>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
- class _Alloc = allocator<_Value> >
-class _LIBCPP_TEMPLATE_VIS hash_multiset
-{
-public:
- // types
- typedef _Value key_type;
- typedef key_type value_type;
- typedef _Hash hasher;
- typedef _Pred key_equal;
- typedef _Alloc allocator_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
-
-private:
- typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
-
- __table __table_;
-
-public:
- typedef typename __table::pointer pointer;
- typedef typename __table::const_pointer const_pointer;
- typedef typename __table::size_type size_type;
- typedef typename __table::difference_type difference_type;
-
- typedef typename __table::const_iterator iterator;
- typedef typename __table::const_iterator const_iterator;
-
- _LIBCPP_INLINE_VISIBILITY
- hash_multiset() {__table_.rehash(193);}
- explicit hash_multiset(size_type __n, const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- hash_multiset(size_type __n, const hasher& __hf,
- const key_equal& __eql, const allocator_type& __a);
- template <class _InputIterator>
- hash_multiset(_InputIterator __first, _InputIterator __last);
- template <class _InputIterator>
- hash_multiset(_InputIterator __first, _InputIterator __last,
- size_type __n, const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- template <class _InputIterator>
- hash_multiset(_InputIterator __first, _InputIterator __last,
- size_type __n , const hasher& __hf,
- const key_equal& __eql, const allocator_type& __a);
- hash_multiset(const hash_multiset& __u);
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const
- {return allocator_type(__table_.__node_alloc());}
-
- _LIBCPP_INLINE_VISIBILITY
- bool empty() const {return __table_.size() == 0;}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const {return __table_.size();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const {return __table_.max_size();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() {return __table_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const {return __table_.end();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator, const value_type& __x) {return insert(__x);}
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- void insert(_InputIterator __first, _InputIterator __last);
-
- _LIBCPP_INLINE_VISIBILITY
- void erase(const_iterator __p) {__table_.erase(__p);}
- _LIBCPP_INLINE_VISIBILITY
- size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
- _LIBCPP_INLINE_VISIBILITY
- void erase(const_iterator __first, const_iterator __last)
- {__table_.erase(__first, __last);}
- _LIBCPP_INLINE_VISIBILITY
- void clear() {__table_.clear();}
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(hash_multiset& __u) {__table_.swap(__u.__table_);}
-
- _LIBCPP_INLINE_VISIBILITY
- hasher hash_funct() const {return __table_.hash_function();}
- _LIBCPP_INLINE_VISIBILITY
- key_equal key_eq() const {return __table_.key_eq();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator find(const key_type& __k) {return __table_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator find(const key_type& __k) const {return __table_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, iterator> equal_range(const key_type& __k)
- {return __table_.__equal_range_multi(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
- {return __table_.__equal_range_multi(__k);}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket_count() const {return __table_.bucket_count();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_bucket_count() const {return __table_.max_bucket_count();}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type elems_in_bucket(size_type __n) const {return __table_.bucket_size(__n);}
-
- _LIBCPP_INLINE_VISIBILITY
- void resize(size_type __n) {__table_.rehash(__n);}
-};
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
- size_type __n, const hasher& __hf, const key_equal& __eql)
- : __table_(__hf, __eql)
-{
- __table_.rehash(__n);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
- size_type __n, const hasher& __hf, const key_equal& __eql,
- const allocator_type& __a)
- : __table_(__hf, __eql, __a)
-{
- __table_.rehash(__n);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
- _InputIterator __first, _InputIterator __last)
-{
- __table_.rehash(193);
- insert(__first, __last);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
- _InputIterator __first, _InputIterator __last, size_type __n,
- const hasher& __hf, const key_equal& __eql)
- : __table_(__hf, __eql)
-{
- __table_.rehash(__n);
- insert(__first, __last);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
- _InputIterator __first, _InputIterator __last, size_type __n,
- const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
- : __table_(__hf, __eql, __a)
-{
- __table_.rehash(__n);
- insert(__first, __last);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
- const hash_multiset& __u)
- : __table_(__u.__table_)
-{
- __table_.rehash(__u.bucket_count());
- insert(__u.begin(), __u.end());
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-inline
-void
-hash_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
- _InputIterator __last)
-{
- for (; __first != __last; ++__first)
- __table_.__insert_multi(*__first);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(hash_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
- hash_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
-{
- __x.swap(__y);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-bool
-operator==(const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
- const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
-{
- if (__x.size() != __y.size())
- return false;
- typedef typename hash_multiset<_Value, _Hash, _Pred, _Alloc>::const_iterator
- const_iterator;
- typedef pair<const_iterator, const_iterator> _EqRng;
- for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
- {
- _EqRng __xeq = __x.equal_range(*__i);
- _EqRng __yeq = __y.equal_range(*__i);
- if (_VSTD::distance(__xeq.first, __xeq.second) !=
- _VSTD::distance(__yeq.first, __yeq.second) ||
- !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
- return false;
- __i = __xeq.second;
- }
- return true;
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
- const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
-{
- return !(__x == __y);
-}
-
-} // __gnu_cxx
-
-#endif // _LIBCPP_HASH_SET
diff --git a/lib/libcxx/include/filesystem b/lib/libcxx/include/filesystem
deleted file mode 100644
index af713a06358..00000000000
--- a/lib/libcxx/include/filesystem
+++ /dev/null
@@ -1,2637 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- filesystem -------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#ifndef _LIBCPP_FILESYSTEM
-#define _LIBCPP_FILESYSTEM
-/*
- filesystem synopsis
-
- namespace std { namespace filesystem {
-
- class path;
-
- void swap(path& lhs, path& rhs) noexcept;
- size_t hash_value(const path& p) noexcept;
-
- bool operator==(const path& lhs, const path& rhs) noexcept;
- bool operator!=(const path& lhs, const path& rhs) noexcept;
- bool operator< (const path& lhs, const path& rhs) noexcept;
- bool operator<=(const path& lhs, const path& rhs) noexcept;
- bool operator> (const path& lhs, const path& rhs) noexcept;
- bool operator>=(const path& lhs, const path& rhs) noexcept;
-
- path operator/ (const path& lhs, const path& rhs);
-
- // fs.path.io operators are friends of path.
- template <class charT, class traits>
- friend basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os, const path& p);
-
- template <class charT, class traits>
- friend basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is, path& p);
-
- template <class Source>
- path u8path(const Source& source);
- template <class InputIterator>
- path u8path(InputIterator first, InputIterator last);
-
- class filesystem_error;
- class directory_entry;
-
- class directory_iterator;
-
- // enable directory_iterator range-based for statements
- directory_iterator begin(directory_iterator iter) noexcept;
- directory_iterator end(const directory_iterator&) noexcept;
-
- class recursive_directory_iterator;
-
- // enable recursive_directory_iterator range-based for statements
- recursive_directory_iterator begin(recursive_directory_iterator iter) noexcept;
- recursive_directory_iterator end(const recursive_directory_iterator&) noexcept;
-
- class file_status;
-
- struct space_info
- {
- uintmax_t capacity;
- uintmax_t free;
- uintmax_t available;
- };
-
- enum class file_type;
- enum class perms;
- enum class perm_options;
- enum class copy_options;
- enum class directory_options;
-
- typedef chrono::time_point<trivial-clock> file_time_type;
-
- // operational functions
-
- path absolute(const path& p);
- path absolute(const path& p, error_code &ec);
-
- path canonical(const path& p);
- path canonical(const path& p, error_code& ec);
-
- void copy(const path& from, const path& to);
- void copy(const path& from, const path& to, error_code& ec);
- void copy(const path& from, const path& to, copy_options options);
- void copy(const path& from, const path& to, copy_options options,
- error_code& ec);
-
- bool copy_file(const path& from, const path& to);
- bool copy_file(const path& from, const path& to, error_code& ec);
- bool copy_file(const path& from, const path& to, copy_options option);
- bool copy_file(const path& from, const path& to, copy_options option,
- error_code& ec);
-
- void copy_symlink(const path& existing_symlink, const path& new_symlink);
- void copy_symlink(const path& existing_symlink, const path& new_symlink,
- error_code& ec) noexcept;
-
- bool create_directories(const path& p);
- bool create_directories(const path& p, error_code& ec);
-
- bool create_directory(const path& p);
- bool create_directory(const path& p, error_code& ec) noexcept;
-
- bool create_directory(const path& p, const path& attributes);
- bool create_directory(const path& p, const path& attributes,
- error_code& ec) noexcept;
-
- void create_directory_symlink(const path& to, const path& new_symlink);
- void create_directory_symlink(const path& to, const path& new_symlink,
- error_code& ec) noexcept;
-
- void create_hard_link(const path& to, const path& new_hard_link);
- void create_hard_link(const path& to, const path& new_hard_link,
- error_code& ec) noexcept;
-
- void create_symlink(const path& to, const path& new_symlink);
- void create_symlink(const path& to, const path& new_symlink,
- error_code& ec) noexcept;
-
- path current_path();
- path current_path(error_code& ec);
- void current_path(const path& p);
- void current_path(const path& p, error_code& ec) noexcept;
-
- bool exists(file_status s) noexcept;
- bool exists(const path& p);
- bool exists(const path& p, error_code& ec) noexcept;
-
- bool equivalent(const path& p1, const path& p2);
- bool equivalent(const path& p1, const path& p2, error_code& ec) noexcept;
-
- uintmax_t file_size(const path& p);
- uintmax_t file_size(const path& p, error_code& ec) noexcept;
-
- uintmax_t hard_link_count(const path& p);
- uintmax_t hard_link_count(const path& p, error_code& ec) noexcept;
-
- bool is_block_file(file_status s) noexcept;
- bool is_block_file(const path& p);
- bool is_block_file(const path& p, error_code& ec) noexcept;
-
- bool is_character_file(file_status s) noexcept;
- bool is_character_file(const path& p);
- bool is_character_file(const path& p, error_code& ec) noexcept;
-
- bool is_directory(file_status s) noexcept;
- bool is_directory(const path& p);
- bool is_directory(const path& p, error_code& ec) noexcept;
-
- bool is_empty(const path& p);
- bool is_empty(const path& p, error_code& ec) noexcept;
-
- bool is_fifo(file_status s) noexcept;
- bool is_fifo(const path& p);
- bool is_fifo(const path& p, error_code& ec) noexcept;
-
- bool is_other(file_status s) noexcept;
- bool is_other(const path& p);
- bool is_other(const path& p, error_code& ec) noexcept;
-
- bool is_regular_file(file_status s) noexcept;
- bool is_regular_file(const path& p);
- bool is_regular_file(const path& p, error_code& ec) noexcept;
-
- bool is_socket(file_status s) noexcept;
- bool is_socket(const path& p);
- bool is_socket(const path& p, error_code& ec) noexcept;
-
- bool is_symlink(file_status s) noexcept;
- bool is_symlink(const path& p);
- bool is_symlink(const path& p, error_code& ec) noexcept;
-
- file_time_type last_write_time(const path& p);
- file_time_type last_write_time(const path& p, error_code& ec) noexcept;
- void last_write_time(const path& p, file_time_type new_time);
- void last_write_time(const path& p, file_time_type new_time,
- error_code& ec) noexcept;
-
- void permissions(const path& p, perms prms,
- perm_options opts=perm_options::replace);
- void permissions(const path& p, perms prms, error_code& ec) noexcept;
- void permissions(const path& p, perms prms, perm_options opts,
- error_code& ec);
-
- path proximate(const path& p, error_code& ec);
- path proximate(const path& p, const path& base = current_path());
- path proximate(const path& p, const path& base, error_code &ec);
-
- path read_symlink(const path& p);
- path read_symlink(const path& p, error_code& ec);
-
- path relative(const path& p, error_code& ec);
- path relative(const path& p, const path& base=current_path());
- path relative(const path& p, const path& base, error_code& ec);
-
- bool remove(const path& p);
- bool remove(const path& p, error_code& ec) noexcept;
-
- uintmax_t remove_all(const path& p);
- uintmax_t remove_all(const path& p, error_code& ec);
-
- void rename(const path& from, const path& to);
- void rename(const path& from, const path& to, error_code& ec) noexcept;
-
- void resize_file(const path& p, uintmax_t size);
- void resize_file(const path& p, uintmax_t size, error_code& ec) noexcept;
-
- space_info space(const path& p);
- space_info space(const path& p, error_code& ec) noexcept;
-
- file_status status(const path& p);
- file_status status(const path& p, error_code& ec) noexcept;
-
- bool status_known(file_status s) noexcept;
-
- file_status symlink_status(const path& p);
- file_status symlink_status(const path& p, error_code& ec) noexcept;
-
- path temp_directory_path();
- path temp_directory_path(error_code& ec);
-
- path weakly_canonical(path const& p);
- path weakly_canonical(path const& p, error_code& ec);
-
-
-} } // namespaces std::filesystem
-
-*/
-
-#include <__config>
-#include <cstddef>
-#include <cstdlib>
-#include <chrono>
-#include <iterator>
-#include <iosfwd>
-#include <locale>
-#include <memory>
-#include <stack>
-#include <string>
-#include <system_error>
-#include <utility>
-#include <iomanip> // for quoted
-#include <string_view>
-#include <version>
-
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-#ifndef _LIBCPP_CXX03_LANG
-
-_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM
-
-typedef chrono::time_point<_FilesystemClock> file_time_type;
-
-struct _LIBCPP_TYPE_VIS space_info {
- uintmax_t capacity;
- uintmax_t free;
- uintmax_t available;
-};
-
-enum class _LIBCPP_ENUM_VIS file_type : signed char {
- none = 0,
- not_found = -1,
- regular = 1,
- directory = 2,
- symlink = 3,
- block = 4,
- character = 5,
- fifo = 6,
- socket = 7,
- unknown = 8
-};
-
-enum class _LIBCPP_ENUM_VIS perms : unsigned {
- none = 0,
-
- owner_read = 0400,
- owner_write = 0200,
- owner_exec = 0100,
- owner_all = 0700,
-
- group_read = 040,
- group_write = 020,
- group_exec = 010,
- group_all = 070,
-
- others_read = 04,
- others_write = 02,
- others_exec = 01,
- others_all = 07,
-
- all = 0777,
-
- set_uid = 04000,
- set_gid = 02000,
- sticky_bit = 01000,
- mask = 07777,
- unknown = 0xFFFF,
-};
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr perms operator&(perms _LHS, perms _RHS) {
- return static_cast<perms>(static_cast<unsigned>(_LHS) &
- static_cast<unsigned>(_RHS));
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr perms operator|(perms _LHS, perms _RHS) {
- return static_cast<perms>(static_cast<unsigned>(_LHS) |
- static_cast<unsigned>(_RHS));
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr perms operator^(perms _LHS, perms _RHS) {
- return static_cast<perms>(static_cast<unsigned>(_LHS) ^
- static_cast<unsigned>(_RHS));
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr perms operator~(perms _LHS) {
- return static_cast<perms>(~static_cast<unsigned>(_LHS));
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline perms& operator&=(perms& _LHS, perms _RHS) { return _LHS = _LHS & _RHS; }
-
-_LIBCPP_INLINE_VISIBILITY
-inline perms& operator|=(perms& _LHS, perms _RHS) { return _LHS = _LHS | _RHS; }
-
-_LIBCPP_INLINE_VISIBILITY
-inline perms& operator^=(perms& _LHS, perms _RHS) { return _LHS = _LHS ^ _RHS; }
-
-enum class _LIBCPP_ENUM_VIS perm_options : unsigned char {
- replace = 1,
- add = 2,
- remove = 4,
- nofollow = 8
-};
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr perm_options operator&(perm_options _LHS, perm_options _RHS) {
- return static_cast<perm_options>(static_cast<unsigned>(_LHS) &
- static_cast<unsigned>(_RHS));
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr perm_options operator|(perm_options _LHS, perm_options _RHS) {
- return static_cast<perm_options>(static_cast<unsigned>(_LHS) |
- static_cast<unsigned>(_RHS));
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr perm_options operator^(perm_options _LHS, perm_options _RHS) {
- return static_cast<perm_options>(static_cast<unsigned>(_LHS) ^
- static_cast<unsigned>(_RHS));
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr perm_options operator~(perm_options _LHS) {
- return static_cast<perm_options>(~static_cast<unsigned>(_LHS));
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline perm_options& operator&=(perm_options& _LHS, perm_options _RHS) {
- return _LHS = _LHS & _RHS;
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline perm_options& operator|=(perm_options& _LHS, perm_options _RHS) {
- return _LHS = _LHS | _RHS;
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline perm_options& operator^=(perm_options& _LHS, perm_options _RHS) {
- return _LHS = _LHS ^ _RHS;
-}
-
-enum class _LIBCPP_ENUM_VIS copy_options : unsigned short {
- none = 0,
- skip_existing = 1,
- overwrite_existing = 2,
- update_existing = 4,
- recursive = 8,
- copy_symlinks = 16,
- skip_symlinks = 32,
- directories_only = 64,
- create_symlinks = 128,
- create_hard_links = 256,
- __in_recursive_copy = 512,
-};
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr copy_options operator&(copy_options _LHS, copy_options _RHS) {
- return static_cast<copy_options>(static_cast<unsigned short>(_LHS) &
- static_cast<unsigned short>(_RHS));
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr copy_options operator|(copy_options _LHS, copy_options _RHS) {
- return static_cast<copy_options>(static_cast<unsigned short>(_LHS) |
- static_cast<unsigned short>(_RHS));
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr copy_options operator^(copy_options _LHS, copy_options _RHS) {
- return static_cast<copy_options>(static_cast<unsigned short>(_LHS) ^
- static_cast<unsigned short>(_RHS));
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr copy_options operator~(copy_options _LHS) {
- return static_cast<copy_options>(~static_cast<unsigned short>(_LHS));
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline copy_options& operator&=(copy_options& _LHS, copy_options _RHS) {
- return _LHS = _LHS & _RHS;
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline copy_options& operator|=(copy_options& _LHS, copy_options _RHS) {
- return _LHS = _LHS | _RHS;
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline copy_options& operator^=(copy_options& _LHS, copy_options _RHS) {
- return _LHS = _LHS ^ _RHS;
-}
-
-enum class _LIBCPP_ENUM_VIS directory_options : unsigned char {
- none = 0,
- follow_directory_symlink = 1,
- skip_permission_denied = 2
-};
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr directory_options operator&(directory_options _LHS,
- directory_options _RHS) {
- return static_cast<directory_options>(static_cast<unsigned char>(_LHS) &
- static_cast<unsigned char>(_RHS));
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr directory_options operator|(directory_options _LHS,
- directory_options _RHS) {
- return static_cast<directory_options>(static_cast<unsigned char>(_LHS) |
- static_cast<unsigned char>(_RHS));
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr directory_options operator^(directory_options _LHS,
- directory_options _RHS) {
- return static_cast<directory_options>(static_cast<unsigned char>(_LHS) ^
- static_cast<unsigned char>(_RHS));
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline constexpr directory_options operator~(directory_options _LHS) {
- return static_cast<directory_options>(~static_cast<unsigned char>(_LHS));
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline directory_options& operator&=(directory_options& _LHS,
- directory_options _RHS) {
- return _LHS = _LHS & _RHS;
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline directory_options& operator|=(directory_options& _LHS,
- directory_options _RHS) {
- return _LHS = _LHS | _RHS;
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline directory_options& operator^=(directory_options& _LHS,
- directory_options _RHS) {
- return _LHS = _LHS ^ _RHS;
-}
-
-class _LIBCPP_TYPE_VIS file_status {
-public:
- // constructors
- _LIBCPP_INLINE_VISIBILITY
- file_status() noexcept : file_status(file_type::none) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit file_status(file_type __ft, perms __prms = perms::unknown) noexcept
- : __ft_(__ft),
- __prms_(__prms) {}
-
- file_status(const file_status&) noexcept = default;
- file_status(file_status&&) noexcept = default;
-
- _LIBCPP_INLINE_VISIBILITY
- ~file_status() {}
-
- file_status& operator=(const file_status&) noexcept = default;
- file_status& operator=(file_status&&) noexcept = default;
-
- // observers
- _LIBCPP_INLINE_VISIBILITY
- file_type type() const noexcept { return __ft_; }
-
- _LIBCPP_INLINE_VISIBILITY
- perms permissions() const noexcept { return __prms_; }
-
- // modifiers
- _LIBCPP_INLINE_VISIBILITY
- void type(file_type __ft) noexcept { __ft_ = __ft; }
-
- _LIBCPP_INLINE_VISIBILITY
- void permissions(perms __p) noexcept { __prms_ = __p; }
-
-private:
- file_type __ft_;
- perms __prms_;
-};
-
-class _LIBCPP_TYPE_VIS directory_entry;
-
-template <class _Tp>
-struct __can_convert_char {
- static const bool value = false;
-};
-template <class _Tp>
-struct __can_convert_char<const _Tp> : public __can_convert_char<_Tp> {};
-template <>
-struct __can_convert_char<char> {
- static const bool value = true;
- using __char_type = char;
-};
-template <>
-struct __can_convert_char<wchar_t> {
- static const bool value = true;
- using __char_type = wchar_t;
-};
-template <>
-struct __can_convert_char<char16_t> {
- static const bool value = true;
- using __char_type = char16_t;
-};
-template <>
-struct __can_convert_char<char32_t> {
- static const bool value = true;
- using __char_type = char32_t;
-};
-
-template <class _ECharT>
-typename enable_if<__can_convert_char<_ECharT>::value, bool>::type
-__is_separator(_ECharT __e) {
- return __e == _ECharT('/');
-}
-
-struct _NullSentinal {};
-
-template <class _Tp>
-using _Void = void;
-
-template <class _Tp, class = void>
-struct __is_pathable_string : public false_type {};
-
-template <class _ECharT, class _Traits, class _Alloc>
-struct __is_pathable_string<
- basic_string<_ECharT, _Traits, _Alloc>,
- _Void<typename __can_convert_char<_ECharT>::__char_type> >
- : public __can_convert_char<_ECharT> {
- using _Str = basic_string<_ECharT, _Traits, _Alloc>;
- using _Base = __can_convert_char<_ECharT>;
- static _ECharT const* __range_begin(_Str const& __s) { return __s.data(); }
- static _ECharT const* __range_end(_Str const& __s) {
- return __s.data() + __s.length();
- }
- static _ECharT __first_or_null(_Str const& __s) {
- return __s.empty() ? _ECharT{} : __s[0];
- }
-};
-
-template <class _ECharT, class _Traits>
-struct __is_pathable_string<
- basic_string_view<_ECharT, _Traits>,
- _Void<typename __can_convert_char<_ECharT>::__char_type> >
- : public __can_convert_char<_ECharT> {
- using _Str = basic_string_view<_ECharT, _Traits>;
- using _Base = __can_convert_char<_ECharT>;
- static _ECharT const* __range_begin(_Str const& __s) { return __s.data(); }
- static _ECharT const* __range_end(_Str const& __s) {
- return __s.data() + __s.length();
- }
- static _ECharT __first_or_null(_Str const& __s) {
- return __s.empty() ? _ECharT{} : __s[0];
- }
-};
-
-template <class _Source, class _DS = typename decay<_Source>::type,
- class _UnqualPtrType =
- typename remove_const<typename remove_pointer<_DS>::type>::type,
- bool _IsCharPtr = is_pointer<_DS>::value&&
- __can_convert_char<_UnqualPtrType>::value>
-struct __is_pathable_char_array : false_type {};
-
-template <class _Source, class _ECharT, class _UPtr>
-struct __is_pathable_char_array<_Source, _ECharT*, _UPtr, true>
- : __can_convert_char<typename remove_const<_ECharT>::type> {
- using _Base = __can_convert_char<typename remove_const<_ECharT>::type>;
-
- static _ECharT const* __range_begin(const _ECharT* __b) { return __b; }
- static _ECharT const* __range_end(const _ECharT* __b) {
- using _Iter = const _ECharT*;
- const _ECharT __sentinal = _ECharT{};
- _Iter __e = __b;
- for (; *__e != __sentinal; ++__e)
- ;
- return __e;
- }
-
- static _ECharT __first_or_null(const _ECharT* __b) { return *__b; }
-};
-
-template <class _Iter, bool _IsIt = __is_input_iterator<_Iter>::value,
- class = void>
-struct __is_pathable_iter : false_type {};
-
-template <class _Iter>
-struct __is_pathable_iter<
- _Iter, true,
- _Void<typename __can_convert_char<
- typename iterator_traits<_Iter>::value_type>::__char_type> >
- : __can_convert_char<typename iterator_traits<_Iter>::value_type> {
- using _ECharT = typename iterator_traits<_Iter>::value_type;
- using _Base = __can_convert_char<_ECharT>;
-
- static _Iter __range_begin(_Iter __b) { return __b; }
- static _NullSentinal __range_end(_Iter) { return _NullSentinal{}; }
-
- static _ECharT __first_or_null(_Iter __b) { return *__b; }
-};
-
-template <class _Tp, bool _IsStringT = __is_pathable_string<_Tp>::value,
- bool _IsCharIterT = __is_pathable_char_array<_Tp>::value,
- bool _IsIterT = !_IsCharIterT && __is_pathable_iter<_Tp>::value>
-struct __is_pathable : false_type {
- static_assert(!_IsStringT && !_IsCharIterT && !_IsIterT, "Must all be false");
-};
-
-template <class _Tp>
-struct __is_pathable<_Tp, true, false, false> : __is_pathable_string<_Tp> {};
-
-template <class _Tp>
-struct __is_pathable<_Tp, false, true, false> : __is_pathable_char_array<_Tp> {
-};
-
-template <class _Tp>
-struct __is_pathable<_Tp, false, false, true> : __is_pathable_iter<_Tp> {};
-
-template <class _ECharT>
-struct _PathCVT {
- static_assert(__can_convert_char<_ECharT>::value,
- "Char type not convertible");
-
- typedef __narrow_to_utf8<sizeof(_ECharT) * __CHAR_BIT__> _Narrower;
-
- static void __append_range(string& __dest, _ECharT const* __b,
- _ECharT const* __e) {
- _Narrower()(back_inserter(__dest), __b, __e);
- }
-
- template <class _Iter>
- static void __append_range(string& __dest, _Iter __b, _Iter __e) {
- static_assert(!is_same<_Iter, _ECharT*>::value, "Call const overload");
- if (__b == __e)
- return;
- basic_string<_ECharT> __tmp(__b, __e);
- _Narrower()(back_inserter(__dest), __tmp.data(),
- __tmp.data() + __tmp.length());
- }
-
- template <class _Iter>
- static void __append_range(string& __dest, _Iter __b, _NullSentinal) {
- static_assert(!is_same<_Iter, _ECharT*>::value, "Call const overload");
- const _ECharT __sentinal = _ECharT{};
- if (*__b == __sentinal)
- return;
- basic_string<_ECharT> __tmp;
- for (; *__b != __sentinal; ++__b)
- __tmp.push_back(*__b);
- _Narrower()(back_inserter(__dest), __tmp.data(),
- __tmp.data() + __tmp.length());
- }
-
- template <class _Source>
- static void __append_source(string& __dest, _Source const& __s) {
- using _Traits = __is_pathable<_Source>;
- __append_range(__dest, _Traits::__range_begin(__s),
- _Traits::__range_end(__s));
- }
-};
-
-template <>
-struct _PathCVT<char> {
-
- template <class _Iter>
- static typename enable_if<__is_exactly_input_iterator<_Iter>::value>::type
- __append_range(string& __dest, _Iter __b, _Iter __e) {
- for (; __b != __e; ++__b)
- __dest.push_back(*__b);
- }
-
- template <class _Iter>
- static typename enable_if<__is_forward_iterator<_Iter>::value>::type
- __append_range(string& __dest, _Iter __b, _Iter __e) {
- __dest.__append_forward_unsafe(__b, __e);
- }
-
- template <class _Iter>
- static void __append_range(string& __dest, _Iter __b, _NullSentinal) {
- const char __sentinal = char{};
- for (; *__b != __sentinal; ++__b)
- __dest.push_back(*__b);
- }
-
- template <class _Source>
- static void __append_source(string& __dest, _Source const& __s) {
- using _Traits = __is_pathable<_Source>;
- __append_range(__dest, _Traits::__range_begin(__s),
- _Traits::__range_end(__s));
- }
-};
-
-class _LIBCPP_TYPE_VIS path {
- template <class _SourceOrIter, class _Tp = path&>
- using _EnableIfPathable =
- typename enable_if<__is_pathable<_SourceOrIter>::value, _Tp>::type;
-
- template <class _Tp>
- using _SourceChar = typename __is_pathable<_Tp>::__char_type;
-
- template <class _Tp>
- using _SourceCVT = _PathCVT<_SourceChar<_Tp> >;
-
-public:
- typedef char value_type;
- typedef basic_string<value_type> string_type;
- typedef _VSTD::string_view __string_view;
- static constexpr value_type preferred_separator = '/';
-
- enum class _LIBCPP_ENUM_VIS format : unsigned char {
- auto_format,
- native_format,
- generic_format
- };
-
- // constructors and destructor
- _LIBCPP_INLINE_VISIBILITY path() noexcept {}
- _LIBCPP_INLINE_VISIBILITY path(const path& __p) : __pn_(__p.__pn_) {}
- _LIBCPP_INLINE_VISIBILITY path(path&& __p) noexcept
- : __pn_(_VSTD::move(__p.__pn_)) {}
-
- _LIBCPP_INLINE_VISIBILITY
- path(string_type&& __s, format = format::auto_format) noexcept
- : __pn_(_VSTD::move(__s)) {}
-
- template <class _Source, class = _EnableIfPathable<_Source, void> >
- path(const _Source& __src, format = format::auto_format) {
- _SourceCVT<_Source>::__append_source(__pn_, __src);
- }
-
- template <class _InputIt>
- path(_InputIt __first, _InputIt __last, format = format::auto_format) {
- typedef typename iterator_traits<_InputIt>::value_type _ItVal;
- _PathCVT<_ItVal>::__append_range(__pn_, __first, __last);
- }
-
- // TODO Implement locale conversions.
- template <class _Source, class = _EnableIfPathable<_Source, void> >
- path(const _Source& __src, const locale& __loc, format = format::auto_format);
- template <class _InputIt>
- path(_InputIt __first, _InputIt _last, const locale& __loc,
- format = format::auto_format);
-
- _LIBCPP_INLINE_VISIBILITY
- ~path() = default;
-
- // assignments
- _LIBCPP_INLINE_VISIBILITY
- path& operator=(const path& __p) {
- __pn_ = __p.__pn_;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- path& operator=(path&& __p) noexcept {
- __pn_ = _VSTD::move(__p.__pn_);
- return *this;
- }
-
- template <class = void>
- _LIBCPP_INLINE_VISIBILITY path& operator=(string_type&& __s) noexcept {
- __pn_ = _VSTD::move(__s);
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- path& assign(string_type&& __s) noexcept {
- __pn_ = _VSTD::move(__s);
- return *this;
- }
-
- template <class _Source>
- _LIBCPP_INLINE_VISIBILITY _EnableIfPathable<_Source>
- operator=(const _Source& __src) {
- return this->assign(__src);
- }
-
- template <class _Source>
- _EnableIfPathable<_Source> assign(const _Source& __src) {
- __pn_.clear();
- _SourceCVT<_Source>::__append_source(__pn_, __src);
- return *this;
- }
-
- template <class _InputIt>
- path& assign(_InputIt __first, _InputIt __last) {
- typedef typename iterator_traits<_InputIt>::value_type _ItVal;
- __pn_.clear();
- _PathCVT<_ItVal>::__append_range(__pn_, __first, __last);
- return *this;
- }
-
-private:
- template <class _ECharT>
- static bool __source_is_absolute(_ECharT __first_or_null) {
- return __is_separator(__first_or_null);
- }
-
-public:
- // appends
- path& operator/=(const path& __p) {
- if (__p.is_absolute()) {
- __pn_ = __p.__pn_;
- return *this;
- }
- if (has_filename())
- __pn_ += preferred_separator;
- __pn_ += __p.native();
- return *this;
- }
-
- // FIXME: Use _LIBCPP_DIAGNOSE_WARNING to produce a diagnostic when __src
- // is known at compile time to be "/' since the user almost certainly intended
- // to append a separator instead of overwriting the path with "/"
- template <class _Source>
- _LIBCPP_INLINE_VISIBILITY _EnableIfPathable<_Source>
- operator/=(const _Source& __src) {
- return this->append(__src);
- }
-
- template <class _Source>
- _EnableIfPathable<_Source> append(const _Source& __src) {
- using _Traits = __is_pathable<_Source>;
- using _CVT = _PathCVT<_SourceChar<_Source> >;
- if (__source_is_absolute(_Traits::__first_or_null(__src)))
- __pn_.clear();
- else if (has_filename())
- __pn_ += preferred_separator;
- _CVT::__append_source(__pn_, __src);
- return *this;
- }
-
- template <class _InputIt>
- path& append(_InputIt __first, _InputIt __last) {
- typedef typename iterator_traits<_InputIt>::value_type _ItVal;
- static_assert(__can_convert_char<_ItVal>::value, "Must convertible");
- using _CVT = _PathCVT<_ItVal>;
- if (__first != __last && __source_is_absolute(*__first))
- __pn_.clear();
- else if (has_filename())
- __pn_ += preferred_separator;
- _CVT::__append_range(__pn_, __first, __last);
- return *this;
- }
-
- // concatenation
- _LIBCPP_INLINE_VISIBILITY
- path& operator+=(const path& __x) {
- __pn_ += __x.__pn_;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- path& operator+=(const string_type& __x) {
- __pn_ += __x;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- path& operator+=(__string_view __x) {
- __pn_ += __x;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- path& operator+=(const value_type* __x) {
- __pn_ += __x;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- path& operator+=(value_type __x) {
- __pn_ += __x;
- return *this;
- }
-
- template <class _ECharT>
- typename enable_if<__can_convert_char<_ECharT>::value, path&>::type
- operator+=(_ECharT __x) {
- basic_string<_ECharT> __tmp;
- __tmp += __x;
- _PathCVT<_ECharT>::__append_source(__pn_, __tmp);
- return *this;
- }
-
- template <class _Source>
- _EnableIfPathable<_Source> operator+=(const _Source& __x) {
- return this->concat(__x);
- }
-
- template <class _Source>
- _EnableIfPathable<_Source> concat(const _Source& __x) {
- _SourceCVT<_Source>::__append_source(__pn_, __x);
- return *this;
- }
-
- template <class _InputIt>
- path& concat(_InputIt __first, _InputIt __last) {
- typedef typename iterator_traits<_InputIt>::value_type _ItVal;
- _PathCVT<_ItVal>::__append_range(__pn_, __first, __last);
- return *this;
- }
-
- // modifiers
- _LIBCPP_INLINE_VISIBILITY
- void clear() noexcept { __pn_.clear(); }
-
- path& make_preferred() { return *this; }
-
- _LIBCPP_INLINE_VISIBILITY
- path& remove_filename() {
- auto __fname = __filename();
- if (!__fname.empty())
- __pn_.erase(__fname.data() - __pn_.data());
- return *this;
- }
-
- path& replace_filename(const path& __replacement) {
- remove_filename();
- return (*this /= __replacement);
- }
-
- path& replace_extension(const path& __replacement = path());
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(path& __rhs) noexcept { __pn_.swap(__rhs.__pn_); }
-
- // private helper to allow reserving memory in the path
- _LIBCPP_INLINE_VISIBILITY
- void __reserve(size_t __s) { __pn_.reserve(__s); }
-
- // native format observers
- _LIBCPP_INLINE_VISIBILITY
- const string_type& native() const noexcept { return __pn_; }
-
- _LIBCPP_INLINE_VISIBILITY
- const value_type* c_str() const noexcept { return __pn_.c_str(); }
-
- _LIBCPP_INLINE_VISIBILITY operator string_type() const { return __pn_; }
-
- template <class _ECharT, class _Traits = char_traits<_ECharT>,
- class _Allocator = allocator<_ECharT> >
- basic_string<_ECharT, _Traits, _Allocator>
- string(const _Allocator& __a = _Allocator()) const {
- using _CVT = __widen_from_utf8<sizeof(_ECharT) * __CHAR_BIT__>;
- using _Str = basic_string<_ECharT, _Traits, _Allocator>;
- _Str __s(__a);
- __s.reserve(__pn_.size());
- _CVT()(back_inserter(__s), __pn_.data(), __pn_.data() + __pn_.size());
- return __s;
- }
-
- _LIBCPP_INLINE_VISIBILITY std::string string() const { return __pn_; }
- _LIBCPP_INLINE_VISIBILITY std::wstring wstring() const {
- return string<wchar_t>();
- }
- _LIBCPP_INLINE_VISIBILITY std::string u8string() const { return __pn_; }
- _LIBCPP_INLINE_VISIBILITY std::u16string u16string() const {
- return string<char16_t>();
- }
- _LIBCPP_INLINE_VISIBILITY std::u32string u32string() const {
- return string<char32_t>();
- }
-
- // generic format observers
- template <class _ECharT, class _Traits = char_traits<_ECharT>,
- class _Allocator = allocator<_ECharT> >
- basic_string<_ECharT, _Traits, _Allocator>
- generic_string(const _Allocator& __a = _Allocator()) const {
- return string<_ECharT, _Traits, _Allocator>(__a);
- }
-
- std::string generic_string() const { return __pn_; }
- std::wstring generic_wstring() const { return string<wchar_t>(); }
- std::string generic_u8string() const { return __pn_; }
- std::u16string generic_u16string() const { return string<char16_t>(); }
- std::u32string generic_u32string() const { return string<char32_t>(); }
-
-private:
- int __compare(__string_view) const;
- __string_view __root_name() const;
- __string_view __root_directory() const;
- __string_view __root_path_raw() const;
- __string_view __relative_path() const;
- __string_view __parent_path() const;
- __string_view __filename() const;
- __string_view __stem() const;
- __string_view __extension() const;
-
-public:
- // compare
- _LIBCPP_INLINE_VISIBILITY int compare(const path& __p) const noexcept {
- return __compare(__p.__pn_);
- }
- _LIBCPP_INLINE_VISIBILITY int compare(const string_type& __s) const {
- return __compare(__s);
- }
- _LIBCPP_INLINE_VISIBILITY int compare(__string_view __s) const {
- return __compare(__s);
- }
- _LIBCPP_INLINE_VISIBILITY int compare(const value_type* __s) const {
- return __compare(__s);
- }
-
- // decomposition
- _LIBCPP_INLINE_VISIBILITY path root_name() const {
- return string_type(__root_name());
- }
- _LIBCPP_INLINE_VISIBILITY path root_directory() const {
- return string_type(__root_directory());
- }
- _LIBCPP_INLINE_VISIBILITY path root_path() const {
- return root_name().append(string_type(__root_directory()));
- }
- _LIBCPP_INLINE_VISIBILITY path relative_path() const {
- return string_type(__relative_path());
- }
- _LIBCPP_INLINE_VISIBILITY path parent_path() const {
- return string_type(__parent_path());
- }
- _LIBCPP_INLINE_VISIBILITY path filename() const {
- return string_type(__filename());
- }
- _LIBCPP_INLINE_VISIBILITY path stem() const { return string_type(__stem()); }
- _LIBCPP_INLINE_VISIBILITY path extension() const {
- return string_type(__extension());
- }
-
- // query
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY bool
- empty() const noexcept {
- return __pn_.empty();
- }
-
- _LIBCPP_INLINE_VISIBILITY bool has_root_name() const {
- return !__root_name().empty();
- }
- _LIBCPP_INLINE_VISIBILITY bool has_root_directory() const {
- return !__root_directory().empty();
- }
- _LIBCPP_INLINE_VISIBILITY bool has_root_path() const {
- return !__root_path_raw().empty();
- }
- _LIBCPP_INLINE_VISIBILITY bool has_relative_path() const {
- return !__relative_path().empty();
- }
- _LIBCPP_INLINE_VISIBILITY bool has_parent_path() const {
- return !__parent_path().empty();
- }
- _LIBCPP_INLINE_VISIBILITY bool has_filename() const {
- return !__filename().empty();
- }
- _LIBCPP_INLINE_VISIBILITY bool has_stem() const { return !__stem().empty(); }
- _LIBCPP_INLINE_VISIBILITY bool has_extension() const {
- return !__extension().empty();
- }
-
- _LIBCPP_INLINE_VISIBILITY bool is_absolute() const {
- return has_root_directory();
- }
- _LIBCPP_INLINE_VISIBILITY bool is_relative() const { return !is_absolute(); }
-
- // relative paths
- path lexically_normal() const;
- path lexically_relative(const path& __base) const;
-
- _LIBCPP_INLINE_VISIBILITY path lexically_proximate(const path& __base) const {
- path __result = this->lexically_relative(__base);
- if (__result.native().empty())
- return *this;
- return __result;
- }
-
- // iterators
- class _LIBCPP_TYPE_VIS iterator;
- typedef iterator const_iterator;
-
- iterator begin() const;
- iterator end() const;
-
- template <class _CharT, class _Traits>
- _LIBCPP_INLINE_VISIBILITY friend
- typename enable_if<is_same<_CharT, char>::value &&
- is_same<_Traits, char_traits<char> >::value,
- basic_ostream<_CharT, _Traits>&>::type
- operator<<(basic_ostream<_CharT, _Traits>& __os, const path& __p) {
- __os << std::__quoted(__p.native());
- return __os;
- }
-
- template <class _CharT, class _Traits>
- _LIBCPP_INLINE_VISIBILITY friend
- typename enable_if<!is_same<_CharT, char>::value ||
- !is_same<_Traits, char_traits<char> >::value,
- basic_ostream<_CharT, _Traits>&>::type
- operator<<(basic_ostream<_CharT, _Traits>& __os, const path& __p) {
- __os << std::__quoted(__p.string<_CharT, _Traits>());
- return __os;
- }
-
- template <class _CharT, class _Traits>
- _LIBCPP_INLINE_VISIBILITY friend basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is, path& __p) {
- basic_string<_CharT, _Traits> __tmp;
- __is >> __quoted(__tmp);
- __p = __tmp;
- return __is;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY bool operator==(const path& __lhs, const path& __rhs) noexcept {
- return __lhs.compare(__rhs) == 0;
- }
- friend _LIBCPP_INLINE_VISIBILITY bool operator!=(const path& __lhs, const path& __rhs) noexcept {
- return __lhs.compare(__rhs) != 0;
- }
- friend _LIBCPP_INLINE_VISIBILITY bool operator<(const path& __lhs, const path& __rhs) noexcept {
- return __lhs.compare(__rhs) < 0;
- }
- friend _LIBCPP_INLINE_VISIBILITY bool operator<=(const path& __lhs, const path& __rhs) noexcept {
- return __lhs.compare(__rhs) <= 0;
- }
- friend _LIBCPP_INLINE_VISIBILITY bool operator>(const path& __lhs, const path& __rhs) noexcept {
- return __lhs.compare(__rhs) > 0;
- }
- friend _LIBCPP_INLINE_VISIBILITY bool operator>=(const path& __lhs, const path& __rhs) noexcept {
- return __lhs.compare(__rhs) >= 0;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY path operator/(const path& __lhs,
- const path& __rhs) {
- path __result(__lhs);
- __result /= __rhs;
- return __result;
- }
-private:
- inline _LIBCPP_INLINE_VISIBILITY path&
- __assign_view(__string_view const& __s) noexcept {
- __pn_ = string_type(__s);
- return *this;
- }
- string_type __pn_;
-};
-
-inline _LIBCPP_INLINE_VISIBILITY void swap(path& __lhs, path& __rhs) noexcept {
- __lhs.swap(__rhs);
-}
-
-_LIBCPP_FUNC_VIS
-size_t hash_value(const path& __p) noexcept;
-
-template <class _Source>
-_LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_pathable<_Source>::value, path>::type
- u8path(const _Source& __s) {
- static_assert(
- is_same<typename __is_pathable<_Source>::__char_type, char>::value,
- "u8path(Source const&) requires Source have a character type of type "
- "'char'");
- return path(__s);
-}
-
-template <class _InputIt>
-_LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_pathable<_InputIt>::value, path>::type
- u8path(_InputIt __f, _InputIt __l) {
- static_assert(
- is_same<typename __is_pathable<_InputIt>::__char_type, char>::value,
- "u8path(Iter, Iter) requires Iter have a value_type of type 'char'");
- return path(__f, __l);
-}
-
-class _LIBCPP_TYPE_VIS path::iterator {
-public:
- enum _ParserState : unsigned char {
- _Singular,
- _BeforeBegin,
- _InRootName,
- _InRootDir,
- _InFilenames,
- _InTrailingSep,
- _AtEnd
- };
-
-public:
- typedef bidirectional_iterator_tag iterator_category;
-
- typedef path value_type;
- typedef std::ptrdiff_t difference_type;
- typedef const path* pointer;
- typedef const path& reference;
-
- typedef void
- __stashing_iterator_tag; // See reverse_iterator and __is_stashing_iterator
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- iterator()
- : __stashed_elem_(), __path_ptr_(nullptr), __entry_(),
- __state_(_Singular) {}
-
- iterator(const iterator&) = default;
- ~iterator() = default;
-
- iterator& operator=(const iterator&) = default;
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const { return __stashed_elem_; }
-
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const { return &__stashed_elem_; }
-
- _LIBCPP_INLINE_VISIBILITY
- iterator& operator++() {
- _LIBCPP_ASSERT(__state_ != _Singular,
- "attempting to increment a singular iterator");
- _LIBCPP_ASSERT(__state_ != _AtEnd,
- "attempting to increment the end iterator");
- return __increment();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iterator operator++(int) {
- iterator __it(*this);
- this->operator++();
- return __it;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iterator& operator--() {
- _LIBCPP_ASSERT(__state_ != _Singular,
- "attempting to decrement a singular iterator");
- _LIBCPP_ASSERT(__entry_.data() != __path_ptr_->native().data(),
- "attempting to decrement the begin iterator");
- return __decrement();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iterator operator--(int) {
- iterator __it(*this);
- this->operator--();
- return __it;
- }
-
-private:
- friend class path;
-
- inline _LIBCPP_INLINE_VISIBILITY friend bool operator==(const iterator&,
- const iterator&);
-
- iterator& __increment();
- iterator& __decrement();
-
- path __stashed_elem_;
- const path* __path_ptr_;
- path::__string_view __entry_;
- _ParserState __state_;
-};
-
-inline _LIBCPP_INLINE_VISIBILITY bool operator==(const path::iterator& __lhs,
- const path::iterator& __rhs) {
- return __lhs.__path_ptr_ == __rhs.__path_ptr_ &&
- __lhs.__entry_.data() == __rhs.__entry_.data();
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool operator!=(const path::iterator& __lhs,
- const path::iterator& __rhs) {
- return !(__lhs == __rhs);
-}
-
-class _LIBCPP_EXCEPTION_ABI filesystem_error : public system_error {
-public:
- _LIBCPP_INLINE_VISIBILITY
- filesystem_error(const string& __what, error_code __ec)
- : system_error(__ec, __what),
- __storage_(make_shared<_Storage>(path(), path())) {
- __create_what(0);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- filesystem_error(const string& __what, const path& __p1, error_code __ec)
- : system_error(__ec, __what),
- __storage_(make_shared<_Storage>(__p1, path())) {
- __create_what(1);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- filesystem_error(const string& __what, const path& __p1, const path& __p2,
- error_code __ec)
- : system_error(__ec, __what),
- __storage_(make_shared<_Storage>(__p1, __p2)) {
- __create_what(2);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const path& path1() const noexcept { return __storage_->__p1_; }
-
- _LIBCPP_INLINE_VISIBILITY
- const path& path2() const noexcept { return __storage_->__p2_; }
-
- ~filesystem_error() override; // key function
-
- _LIBCPP_INLINE_VISIBILITY
- const char* what() const noexcept override {
- return __storage_->__what_.c_str();
- }
-
- _LIBCPP_FUNC_VIS
- void __create_what(int __num_paths);
-
-private:
- struct _Storage {
- _LIBCPP_INLINE_VISIBILITY
- _Storage(const path& __p1, const path& __p2) : __p1_(__p1), __p2_(__p2) {}
-
- path __p1_;
- path __p2_;
- string __what_;
- };
- shared_ptr<_Storage> __storage_;
-};
-
-template <class... _Args>
-_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
-#ifndef _LIBCPP_NO_EXCEPTIONS
- void
- __throw_filesystem_error(_Args&&... __args) {
- throw filesystem_error(std::forward<_Args>(__args)...);
-}
-#else
- void
- __throw_filesystem_error(_Args&&...) {
- _VSTD::abort();
-}
-#endif
-
-// operational functions
-
-_LIBCPP_FUNC_VIS
-path __absolute(const path&, error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-path __canonical(const path&, error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-void __copy(const path& __from, const path& __to, copy_options __opt,
- error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-bool __copy_file(const path& __from, const path& __to, copy_options __opt,
- error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-void __copy_symlink(const path& __existing_symlink, const path& __new_symlink,
- error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-bool __create_directories(const path& p, error_code* ec = nullptr);
-_LIBCPP_FUNC_VIS
-bool __create_directory(const path& p, error_code* ec = nullptr);
-_LIBCPP_FUNC_VIS
-bool __create_directory(const path& p, const path& attributes,
- error_code* ec = nullptr);
-_LIBCPP_FUNC_VIS
-void __create_directory_symlink(const path& __to, const path& __new_symlink,
- error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-void __create_hard_link(const path& __to, const path& __new_hard_link,
- error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-void __create_symlink(const path& __to, const path& __new_symlink,
- error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-path __current_path(error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-void __current_path(const path&, error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-bool __equivalent(const path&, const path&, error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-uintmax_t __file_size(const path&, error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-uintmax_t __hard_link_count(const path&, error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-bool __fs_is_empty(const path& p, error_code* ec = nullptr);
-_LIBCPP_FUNC_VIS
-file_time_type __last_write_time(const path& p, error_code* ec = nullptr);
-_LIBCPP_FUNC_VIS
-void __last_write_time(const path& p, file_time_type new_time,
- error_code* ec = nullptr);
-_LIBCPP_FUNC_VIS
-void __permissions(const path&, perms, perm_options, error_code* = nullptr);
-_LIBCPP_FUNC_VIS
-path __read_symlink(const path& p, error_code* ec = nullptr);
-_LIBCPP_FUNC_VIS
-bool __remove(const path& p, error_code* ec = nullptr);
-_LIBCPP_FUNC_VIS
-uintmax_t __remove_all(const path& p, error_code* ec = nullptr);
-_LIBCPP_FUNC_VIS
-void __rename(const path& from, const path& to, error_code* ec = nullptr);
-_LIBCPP_FUNC_VIS
-void __resize_file(const path& p, uintmax_t size, error_code* ec = nullptr);
-_LIBCPP_FUNC_VIS
-space_info __space(const path&, error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-file_status __status(const path&, error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-file_status __symlink_status(const path&, error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-path __system_complete(const path&, error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-path __temp_directory_path(error_code* __ec = nullptr);
-_LIBCPP_FUNC_VIS
-path __weakly_canonical(path const& __p, error_code* __ec = nullptr);
-
-inline _LIBCPP_INLINE_VISIBILITY path current_path() {
- return __current_path();
-}
-
-inline _LIBCPP_INLINE_VISIBILITY path current_path(error_code& __ec) {
- return __current_path(&__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void current_path(const path& __p) {
- __current_path(__p);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void current_path(const path& __p,
- error_code& __ec) noexcept {
- __current_path(__p, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY path absolute(const path& __p) {
- return __absolute(__p);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY path absolute(const path& __p,
- error_code& __ec) {
- return __absolute(__p, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY path canonical(const path& __p) {
- return __canonical(__p);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY path canonical(const path& __p,
- error_code& __ec) {
- return __canonical(__p, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void copy(const path& __from,
- const path& __to) {
- __copy(__from, __to, copy_options::none);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void copy(const path& __from, const path& __to,
- error_code& __ec) {
- __copy(__from, __to, copy_options::none, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void copy(const path& __from, const path& __to,
- copy_options __opt) {
- __copy(__from, __to, __opt);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void copy(const path& __from, const path& __to,
- copy_options __opt,
- error_code& __ec) {
- __copy(__from, __to, __opt, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool copy_file(const path& __from,
- const path& __to) {
- return __copy_file(__from, __to, copy_options::none);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool
-copy_file(const path& __from, const path& __to, error_code& __ec) {
- return __copy_file(__from, __to, copy_options::none, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool
-copy_file(const path& __from, const path& __to, copy_options __opt) {
- return __copy_file(__from, __to, __opt);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool copy_file(const path& __from,
- const path& __to,
- copy_options __opt,
- error_code& __ec) {
- return __copy_file(__from, __to, __opt, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void copy_symlink(const path& __existing,
- const path& __new) {
- __copy_symlink(__existing, __new);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void
-copy_symlink(const path& __ext, const path& __new, error_code& __ec) noexcept {
- __copy_symlink(__ext, __new, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool create_directories(const path& __p) {
- return __create_directories(__p);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool create_directories(const path& __p,
- error_code& __ec) {
- return __create_directories(__p, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool create_directory(const path& __p) {
- return __create_directory(__p);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool
-create_directory(const path& __p, error_code& __ec) noexcept {
- return __create_directory(__p, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool create_directory(const path& __p,
- const path& __attrs) {
- return __create_directory(__p, __attrs);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool
-create_directory(const path& __p, const path& __attrs,
- error_code& __ec) noexcept {
- return __create_directory(__p, __attrs, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void
-create_directory_symlink(const path& __to, const path& __new) {
- __create_directory_symlink(__to, __new);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void
-create_directory_symlink(const path& __to, const path& __new,
- error_code& __ec) noexcept {
- __create_directory_symlink(__to, __new, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void create_hard_link(const path& __to,
- const path& __new) {
- __create_hard_link(__to, __new);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void
-create_hard_link(const path& __to, const path& __new,
- error_code& __ec) noexcept {
- __create_hard_link(__to, __new, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void create_symlink(const path& __to,
- const path& __new) {
- __create_symlink(__to, __new);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void
-create_symlink(const path& __to, const path& __new, error_code& __ec) noexcept {
- return __create_symlink(__to, __new, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool status_known(file_status __s) noexcept {
- return __s.type() != file_type::none;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool exists(file_status __s) noexcept {
- return status_known(__s) && __s.type() != file_type::not_found;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool exists(const path& __p) {
- return exists(__status(__p));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool exists(const path& __p,
- error_code& __ec) noexcept {
- auto __s = __status(__p, &__ec);
- if (status_known(__s))
- __ec.clear();
- return exists(__s);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool equivalent(const path& __p1,
- const path& __p2) {
- return __equivalent(__p1, __p2);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool
-equivalent(const path& __p1, const path& __p2, error_code& __ec) noexcept {
- return __equivalent(__p1, __p2, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY uintmax_t file_size(const path& __p) {
- return __file_size(__p);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY uintmax_t
-file_size(const path& __p, error_code& __ec) noexcept {
- return __file_size(__p, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY uintmax_t hard_link_count(const path& __p) {
- return __hard_link_count(__p);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY uintmax_t
-hard_link_count(const path& __p, error_code& __ec) noexcept {
- return __hard_link_count(__p, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_block_file(file_status __s) noexcept {
- return __s.type() == file_type::block;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_block_file(const path& __p) {
- return is_block_file(__status(__p));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_block_file(const path& __p,
- error_code& __ec) noexcept {
- return is_block_file(__status(__p, &__ec));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool
-is_character_file(file_status __s) noexcept {
- return __s.type() == file_type::character;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_character_file(const path& __p) {
- return is_character_file(__status(__p));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool
-is_character_file(const path& __p, error_code& __ec) noexcept {
- return is_character_file(__status(__p, &__ec));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_directory(file_status __s) noexcept {
- return __s.type() == file_type::directory;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_directory(const path& __p) {
- return is_directory(__status(__p));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_directory(const path& __p,
- error_code& __ec) noexcept {
- return is_directory(__status(__p, &__ec));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_empty(const path& __p) {
- return __fs_is_empty(__p);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_empty(const path& __p,
- error_code& __ec) {
- return __fs_is_empty(__p, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_fifo(file_status __s) noexcept {
- return __s.type() == file_type::fifo;
-}
-inline _LIBCPP_INLINE_VISIBILITY bool is_fifo(const path& __p) {
- return is_fifo(__status(__p));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_fifo(const path& __p,
- error_code& __ec) noexcept {
- return is_fifo(__status(__p, &__ec));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool
-is_regular_file(file_status __s) noexcept {
- return __s.type() == file_type::regular;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_regular_file(const path& __p) {
- return is_regular_file(__status(__p));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool
-is_regular_file(const path& __p, error_code& __ec) noexcept {
- return is_regular_file(__status(__p, &__ec));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_socket(file_status __s) noexcept {
- return __s.type() == file_type::socket;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_socket(const path& __p) {
- return is_socket(__status(__p));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_socket(const path& __p,
- error_code& __ec) noexcept {
- return is_socket(__status(__p, &__ec));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_symlink(file_status __s) noexcept {
- return __s.type() == file_type::symlink;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_symlink(const path& __p) {
- return is_symlink(__symlink_status(__p));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_symlink(const path& __p,
- error_code& __ec) noexcept {
- return is_symlink(__symlink_status(__p, &__ec));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_other(file_status __s) noexcept {
- return exists(__s) && !is_regular_file(__s) && !is_directory(__s) &&
- !is_symlink(__s);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_other(const path& __p) {
- return is_other(__status(__p));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool is_other(const path& __p,
- error_code& __ec) noexcept {
- return is_other(__status(__p, &__ec));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY file_time_type
-last_write_time(const path& __p) {
- return __last_write_time(__p);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY file_time_type
-last_write_time(const path& __p, error_code& __ec) noexcept {
- return __last_write_time(__p, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void last_write_time(const path& __p,
- file_time_type __t) {
- __last_write_time(__p, __t);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void
-last_write_time(const path& __p, file_time_type __t,
- error_code& __ec) noexcept {
- __last_write_time(__p, __t, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void
-permissions(const path& __p, perms __prms,
- perm_options __opts = perm_options::replace) {
- __permissions(__p, __prms, __opts);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void permissions(const path& __p, perms __prms,
- error_code& __ec) noexcept {
- __permissions(__p, __prms, perm_options::replace, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void permissions(const path& __p, perms __prms,
- perm_options __opts,
- error_code& __ec) {
- __permissions(__p, __prms, __opts, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY path proximate(const path& __p,
- const path& __base,
- error_code& __ec) {
- path __tmp = __weakly_canonical(__p, &__ec);
- if (__ec)
- return {};
- path __tmp_base = __weakly_canonical(__base, &__ec);
- if (__ec)
- return {};
- return __tmp.lexically_proximate(__tmp_base);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY path proximate(const path& __p,
- error_code& __ec) {
- return proximate(__p, current_path(), __ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY path
-proximate(const path& __p, const path& __base = current_path()) {
- return __weakly_canonical(__p).lexically_proximate(
- __weakly_canonical(__base));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY path read_symlink(const path& __p) {
- return __read_symlink(__p);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY path read_symlink(const path& __p,
- error_code& __ec) {
- return __read_symlink(__p, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY path relative(const path& __p,
- const path& __base,
- error_code& __ec) {
- path __tmp = __weakly_canonical(__p, &__ec);
- if (__ec)
- return path();
- path __tmpbase = __weakly_canonical(__base, &__ec);
- if (__ec)
- return path();
- return __tmp.lexically_relative(__tmpbase);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY path relative(const path& __p,
- error_code& __ec) {
- return relative(__p, current_path(), __ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY path
-relative(const path& __p, const path& __base = current_path()) {
- return __weakly_canonical(__p).lexically_relative(__weakly_canonical(__base));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool remove(const path& __p) {
- return __remove(__p);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool remove(const path& __p,
- error_code& __ec) noexcept {
- return __remove(__p, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY uintmax_t remove_all(const path& __p) {
- return __remove_all(__p);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY uintmax_t remove_all(const path& __p,
- error_code& __ec) {
- return __remove_all(__p, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void rename(const path& __from,
- const path& __to) {
- return __rename(__from, __to);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void
-rename(const path& __from, const path& __to, error_code& __ec) noexcept {
- return __rename(__from, __to, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void resize_file(const path& __p,
- uintmax_t __ns) {
- return __resize_file(__p, __ns);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void
-resize_file(const path& __p, uintmax_t __ns, error_code& __ec) noexcept {
- return __resize_file(__p, __ns, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY space_info space(const path& __p) {
- return __space(__p);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY space_info space(const path& __p,
- error_code& __ec) noexcept {
- return __space(__p, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY file_status status(const path& __p) {
- return __status(__p);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY file_status status(const path& __p,
- error_code& __ec) noexcept {
- return __status(__p, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY file_status symlink_status(const path& __p) {
- return __symlink_status(__p);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY file_status
-symlink_status(const path& __p, error_code& __ec) noexcept {
- return __symlink_status(__p, &__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY path temp_directory_path() {
- return __temp_directory_path();
-}
-
-inline _LIBCPP_INLINE_VISIBILITY path temp_directory_path(error_code& __ec) {
- return __temp_directory_path(&__ec);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY path weakly_canonical(path const& __p) {
- return __weakly_canonical(__p);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY path weakly_canonical(path const& __p,
- error_code& __ec) {
- return __weakly_canonical(__p, &__ec);
-}
-
-class directory_iterator;
-class recursive_directory_iterator;
-class __dir_stream;
-
-class directory_entry {
- typedef _VSTD_FS::path _Path;
-
-public:
- // constructors and destructors
- directory_entry() noexcept = default;
- directory_entry(directory_entry const&) = default;
- directory_entry(directory_entry&&) noexcept = default;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit directory_entry(_Path const& __p) : __p_(__p) {
- error_code __ec;
- __refresh(&__ec);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- directory_entry(_Path const& __p, error_code& __ec) : __p_(__p) {
- __refresh(&__ec);
- }
-
- ~directory_entry() {}
-
- directory_entry& operator=(directory_entry const&) = default;
- directory_entry& operator=(directory_entry&&) noexcept = default;
-
- _LIBCPP_INLINE_VISIBILITY
- void assign(_Path const& __p) {
- __p_ = __p;
- error_code __ec;
- __refresh(&__ec);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void assign(_Path const& __p, error_code& __ec) {
- __p_ = __p;
- __refresh(&__ec);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void replace_filename(_Path const& __p) {
- __p_.replace_filename(__p);
- error_code __ec;
- __refresh(&__ec);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void replace_filename(_Path const& __p, error_code& __ec) {
- __p_ = __p_.parent_path() / __p;
- __refresh(&__ec);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void refresh() { __refresh(); }
-
- _LIBCPP_INLINE_VISIBILITY
- void refresh(error_code& __ec) noexcept { __refresh(&__ec); }
-
- _LIBCPP_INLINE_VISIBILITY
- _Path const& path() const noexcept { return __p_; }
-
- _LIBCPP_INLINE_VISIBILITY
- operator const _Path&() const noexcept { return __p_; }
-
- _LIBCPP_INLINE_VISIBILITY
- bool exists() const { return _VSTD_FS::exists(file_status{__get_ft()}); }
-
- _LIBCPP_INLINE_VISIBILITY
- bool exists(error_code& __ec) const noexcept {
- return _VSTD_FS::exists(file_status{__get_ft(&__ec)});
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_block_file() const { return __get_ft() == file_type::block; }
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_block_file(error_code& __ec) const noexcept {
- return __get_ft(&__ec) == file_type::block;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_character_file() const { return __get_ft() == file_type::character; }
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_character_file(error_code& __ec) const noexcept {
- return __get_ft(&__ec) == file_type::character;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_directory() const { return __get_ft() == file_type::directory; }
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_directory(error_code& __ec) const noexcept {
- return __get_ft(&__ec) == file_type::directory;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_fifo() const { return __get_ft() == file_type::fifo; }
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_fifo(error_code& __ec) const noexcept {
- return __get_ft(&__ec) == file_type::fifo;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_other() const { return _VSTD_FS::is_other(file_status{__get_ft()}); }
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_other(error_code& __ec) const noexcept {
- return _VSTD_FS::is_other(file_status{__get_ft(&__ec)});
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_regular_file() const { return __get_ft() == file_type::regular; }
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_regular_file(error_code& __ec) const noexcept {
- return __get_ft(&__ec) == file_type::regular;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_socket() const { return __get_ft() == file_type::socket; }
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_socket(error_code& __ec) const noexcept {
- return __get_ft(&__ec) == file_type::socket;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_symlink() const { return __get_sym_ft() == file_type::symlink; }
-
- _LIBCPP_INLINE_VISIBILITY
- bool is_symlink(error_code& __ec) const noexcept {
- return __get_sym_ft(&__ec) == file_type::symlink;
- }
- _LIBCPP_INLINE_VISIBILITY
- uintmax_t file_size() const { return __get_size(); }
-
- _LIBCPP_INLINE_VISIBILITY
- uintmax_t file_size(error_code& __ec) const noexcept {
- return __get_size(&__ec);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- uintmax_t hard_link_count() const { return __get_nlink(); }
-
- _LIBCPP_INLINE_VISIBILITY
- uintmax_t hard_link_count(error_code& __ec) const noexcept {
- return __get_nlink(&__ec);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- file_time_type last_write_time() const { return __get_write_time(); }
-
- _LIBCPP_INLINE_VISIBILITY
- file_time_type last_write_time(error_code& __ec) const noexcept {
- return __get_write_time(&__ec);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- file_status status() const { return __get_status(); }
-
- _LIBCPP_INLINE_VISIBILITY
- file_status status(error_code& __ec) const noexcept {
- return __get_status(&__ec);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- file_status symlink_status() const { return __get_symlink_status(); }
-
- _LIBCPP_INLINE_VISIBILITY
- file_status symlink_status(error_code& __ec) const noexcept {
- return __get_symlink_status(&__ec);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool operator<(directory_entry const& __rhs) const noexcept {
- return __p_ < __rhs.__p_;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool operator==(directory_entry const& __rhs) const noexcept {
- return __p_ == __rhs.__p_;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool operator!=(directory_entry const& __rhs) const noexcept {
- return __p_ != __rhs.__p_;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool operator<=(directory_entry const& __rhs) const noexcept {
- return __p_ <= __rhs.__p_;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool operator>(directory_entry const& __rhs) const noexcept {
- return __p_ > __rhs.__p_;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool operator>=(directory_entry const& __rhs) const noexcept {
- return __p_ >= __rhs.__p_;
- }
-
-private:
- friend class directory_iterator;
- friend class recursive_directory_iterator;
- friend class __dir_stream;
-
- enum _CacheType : unsigned char {
- _Empty,
- _IterSymlink,
- _IterNonSymlink,
- _RefreshSymlink,
- _RefreshSymlinkUnresolved,
- _RefreshNonSymlink
- };
-
- struct __cached_data {
- uintmax_t __size_;
- uintmax_t __nlink_;
- file_time_type __write_time_;
- perms __sym_perms_;
- perms __non_sym_perms_;
- file_type __type_;
- _CacheType __cache_type_;
-
- _LIBCPP_INLINE_VISIBILITY
- __cached_data() noexcept { __reset(); }
-
- _LIBCPP_INLINE_VISIBILITY
- void __reset() {
- __cache_type_ = _Empty;
- __type_ = file_type::none;
- __sym_perms_ = __non_sym_perms_ = perms::unknown;
- __size_ = __nlink_ = uintmax_t(-1);
- __write_time_ = file_time_type::min();
- }
- };
-
- _LIBCPP_INLINE_VISIBILITY
- static __cached_data __create_iter_result(file_type __ft) {
- __cached_data __data;
- __data.__type_ = __ft;
- __data.__cache_type_ = [&]() {
- switch (__ft) {
- case file_type::none:
- return _Empty;
- case file_type::symlink:
- return _IterSymlink;
- default:
- return _IterNonSymlink;
- }
- }();
- return __data;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __assign_iter_entry(_Path&& __p, __cached_data __dt) {
- __p_ = std::move(__p);
- __data_ = __dt;
- }
-
- _LIBCPP_FUNC_VIS
- error_code __do_refresh() noexcept;
-
- _LIBCPP_INLINE_VISIBILITY
- static bool __is_dne_error(error_code const& __ec) {
- if (!__ec)
- return true;
- switch (static_cast<errc>(__ec.value())) {
- case errc::no_such_file_or_directory:
- case errc::not_a_directory:
- return true;
- default:
- return false;
- }
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __handle_error(const char* __msg, error_code* __dest_ec,
- error_code const& __ec, bool __allow_dne = false) const {
- if (__dest_ec) {
- *__dest_ec = __ec;
- return;
- }
- if (__ec && (!__allow_dne || !__is_dne_error(__ec)))
- __throw_filesystem_error(__msg, __p_, __ec);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __refresh(error_code* __ec = nullptr) {
- __handle_error("in directory_entry::refresh", __ec, __do_refresh(),
- /*allow_dne*/ true);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- file_type __get_sym_ft(error_code* __ec = nullptr) const {
- switch (__data_.__cache_type_) {
- case _Empty:
- return __symlink_status(__p_, __ec).type();
- case _IterSymlink:
- case _RefreshSymlink:
- case _RefreshSymlinkUnresolved:
- if (__ec)
- __ec->clear();
- return file_type::symlink;
- case _IterNonSymlink:
- case _RefreshNonSymlink:
- file_status __st(__data_.__type_);
- if (__ec && !_VSTD_FS::exists(__st))
- *__ec = make_error_code(errc::no_such_file_or_directory);
- else if (__ec)
- __ec->clear();
- return __data_.__type_;
- }
- _LIBCPP_UNREACHABLE();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- file_type __get_ft(error_code* __ec = nullptr) const {
- switch (__data_.__cache_type_) {
- case _Empty:
- case _IterSymlink:
- case _RefreshSymlinkUnresolved:
- return __status(__p_, __ec).type();
- case _IterNonSymlink:
- case _RefreshNonSymlink:
- case _RefreshSymlink: {
- file_status __st(__data_.__type_);
- if (__ec && !_VSTD_FS::exists(__st))
- *__ec = make_error_code(errc::no_such_file_or_directory);
- else if (__ec)
- __ec->clear();
- return __data_.__type_;
- }
- }
- _LIBCPP_UNREACHABLE();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- file_status __get_status(error_code* __ec = nullptr) const {
- switch (__data_.__cache_type_) {
- case _Empty:
- case _IterNonSymlink:
- case _IterSymlink:
- case _RefreshSymlinkUnresolved:
- return __status(__p_, __ec);
- case _RefreshNonSymlink:
- case _RefreshSymlink:
- return file_status(__get_ft(__ec), __data_.__non_sym_perms_);
- }
- _LIBCPP_UNREACHABLE();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- file_status __get_symlink_status(error_code* __ec = nullptr) const {
- switch (__data_.__cache_type_) {
- case _Empty:
- case _IterNonSymlink:
- case _IterSymlink:
- return __symlink_status(__p_, __ec);
- case _RefreshNonSymlink:
- return file_status(__get_sym_ft(__ec), __data_.__non_sym_perms_);
- case _RefreshSymlink:
- case _RefreshSymlinkUnresolved:
- return file_status(__get_sym_ft(__ec), __data_.__sym_perms_);
- }
- _LIBCPP_UNREACHABLE();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- uintmax_t __get_size(error_code* __ec = nullptr) const {
- switch (__data_.__cache_type_) {
- case _Empty:
- case _IterNonSymlink:
- case _IterSymlink:
- case _RefreshSymlinkUnresolved:
- return _VSTD_FS::__file_size(__p_, __ec);
- case _RefreshSymlink:
- case _RefreshNonSymlink: {
- error_code __m_ec;
- file_status __st(__get_ft(&__m_ec));
- __handle_error("in directory_entry::file_size", __ec, __m_ec);
- if (_VSTD_FS::exists(__st) && !_VSTD_FS::is_regular_file(__st)) {
- errc __err_kind = _VSTD_FS::is_directory(__st) ? errc::is_a_directory
- : errc::not_supported;
- __handle_error("in directory_entry::file_size", __ec,
- make_error_code(__err_kind));
- }
- return __data_.__size_;
- }
- }
- _LIBCPP_UNREACHABLE();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- uintmax_t __get_nlink(error_code* __ec = nullptr) const {
- switch (__data_.__cache_type_) {
- case _Empty:
- case _IterNonSymlink:
- case _IterSymlink:
- case _RefreshSymlinkUnresolved:
- return _VSTD_FS::__hard_link_count(__p_, __ec);
- case _RefreshSymlink:
- case _RefreshNonSymlink: {
- error_code __m_ec;
- (void)__get_ft(&__m_ec);
- __handle_error("in directory_entry::hard_link_count", __ec, __m_ec);
- return __data_.__nlink_;
- }
- }
- _LIBCPP_UNREACHABLE();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- file_time_type __get_write_time(error_code* __ec = nullptr) const {
- switch (__data_.__cache_type_) {
- case _Empty:
- case _IterNonSymlink:
- case _IterSymlink:
- case _RefreshSymlinkUnresolved:
- return _VSTD_FS::__last_write_time(__p_, __ec);
- case _RefreshSymlink:
- case _RefreshNonSymlink: {
- error_code __m_ec;
- file_status __st(__get_ft(&__m_ec));
- __handle_error("in directory_entry::last_write_time", __ec, __m_ec);
- if (_VSTD_FS::exists(__st) &&
- __data_.__write_time_ == file_time_type::min())
- __handle_error("in directory_entry::last_write_time", __ec,
- make_error_code(errc::value_too_large));
- return __data_.__write_time_;
- }
- }
- _LIBCPP_UNREACHABLE();
- }
-
-private:
- _Path __p_;
- __cached_data __data_;
-};
-
-class __dir_element_proxy {
-public:
- inline _LIBCPP_INLINE_VISIBILITY directory_entry operator*() {
- return _VSTD::move(__elem_);
- }
-
-private:
- friend class directory_iterator;
- friend class recursive_directory_iterator;
- explicit __dir_element_proxy(directory_entry const& __e) : __elem_(__e) {}
- __dir_element_proxy(__dir_element_proxy&& __o)
- : __elem_(_VSTD::move(__o.__elem_)) {}
- directory_entry __elem_;
-};
-
-class directory_iterator {
-public:
- typedef directory_entry value_type;
- typedef ptrdiff_t difference_type;
- typedef value_type const* pointer;
- typedef value_type const& reference;
- typedef input_iterator_tag iterator_category;
-
-public:
- //ctor & dtor
- directory_iterator() noexcept {}
-
- explicit directory_iterator(const path& __p)
- : directory_iterator(__p, nullptr) {}
-
- directory_iterator(const path& __p, directory_options __opts)
- : directory_iterator(__p, nullptr, __opts) {}
-
- directory_iterator(const path& __p, error_code& __ec)
- : directory_iterator(__p, &__ec) {}
-
- directory_iterator(const path& __p, directory_options __opts,
- error_code& __ec)
- : directory_iterator(__p, &__ec, __opts) {}
-
- directory_iterator(const directory_iterator&) = default;
- directory_iterator(directory_iterator&&) = default;
- directory_iterator& operator=(const directory_iterator&) = default;
-
- directory_iterator& operator=(directory_iterator&& __o) noexcept {
- // non-default implementation provided to support self-move assign.
- if (this != &__o) {
- __imp_ = _VSTD::move(__o.__imp_);
- }
- return *this;
- }
-
- ~directory_iterator() = default;
-
- const directory_entry& operator*() const {
- _LIBCPP_ASSERT(__imp_, "The end iterator cannot be dereferenced");
- return __dereference();
- }
-
- const directory_entry* operator->() const { return &**this; }
-
- directory_iterator& operator++() { return __increment(); }
-
- __dir_element_proxy operator++(int) {
- __dir_element_proxy __p(**this);
- __increment();
- return __p;
- }
-
- directory_iterator& increment(error_code& __ec) { return __increment(&__ec); }
-
-private:
- inline _LIBCPP_INLINE_VISIBILITY friend bool
- operator==(const directory_iterator& __lhs,
- const directory_iterator& __rhs) noexcept;
-
- // construct the dir_stream
- _LIBCPP_FUNC_VIS
- directory_iterator(const path&, error_code*,
- directory_options = directory_options::none);
-
- _LIBCPP_FUNC_VIS
- directory_iterator& __increment(error_code* __ec = nullptr);
-
- _LIBCPP_FUNC_VIS
- const directory_entry& __dereference() const;
-
-private:
- shared_ptr<__dir_stream> __imp_;
-};
-
-inline _LIBCPP_INLINE_VISIBILITY bool
-operator==(const directory_iterator& __lhs,
- const directory_iterator& __rhs) noexcept {
- return __lhs.__imp_ == __rhs.__imp_;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY bool
-operator!=(const directory_iterator& __lhs,
- const directory_iterator& __rhs) noexcept {
- return !(__lhs == __rhs);
-}
-
-// enable directory_iterator range-based for statements
-inline _LIBCPP_INLINE_VISIBILITY directory_iterator
-begin(directory_iterator __iter) noexcept {
- return __iter;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY directory_iterator
-end(const directory_iterator&) noexcept {
- return directory_iterator();
-}
-
-class recursive_directory_iterator {
-public:
- using value_type = directory_entry;
- using difference_type = std::ptrdiff_t;
- using pointer = directory_entry const*;
- using reference = directory_entry const&;
- using iterator_category = std::input_iterator_tag;
-
-public:
- // constructors and destructor
- _LIBCPP_INLINE_VISIBILITY
- recursive_directory_iterator() noexcept : __rec_(false) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit recursive_directory_iterator(
- const path& __p, directory_options __xoptions = directory_options::none)
- : recursive_directory_iterator(__p, __xoptions, nullptr) {}
-
- _LIBCPP_INLINE_VISIBILITY
- recursive_directory_iterator(const path& __p, directory_options __xoptions,
- error_code& __ec)
- : recursive_directory_iterator(__p, __xoptions, &__ec) {}
-
- _LIBCPP_INLINE_VISIBILITY
- recursive_directory_iterator(const path& __p, error_code& __ec)
- : recursive_directory_iterator(__p, directory_options::none, &__ec) {}
-
- recursive_directory_iterator(const recursive_directory_iterator&) = default;
- recursive_directory_iterator(recursive_directory_iterator&&) = default;
-
- recursive_directory_iterator&
- operator=(const recursive_directory_iterator&) = default;
-
- _LIBCPP_INLINE_VISIBILITY
- recursive_directory_iterator&
- operator=(recursive_directory_iterator&& __o) noexcept {
- // non-default implementation provided to support self-move assign.
- if (this != &__o) {
- __imp_ = _VSTD::move(__o.__imp_);
- __rec_ = __o.__rec_;
- }
- return *this;
- }
-
- ~recursive_directory_iterator() = default;
-
- _LIBCPP_INLINE_VISIBILITY
- const directory_entry& operator*() const { return __dereference(); }
-
- _LIBCPP_INLINE_VISIBILITY
- const directory_entry* operator->() const { return &__dereference(); }
-
- recursive_directory_iterator& operator++() { return __increment(); }
-
- _LIBCPP_INLINE_VISIBILITY
- __dir_element_proxy operator++(int) {
- __dir_element_proxy __p(**this);
- __increment();
- return __p;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- recursive_directory_iterator& increment(error_code& __ec) {
- return __increment(&__ec);
- }
-
- _LIBCPP_FUNC_VIS directory_options options() const;
- _LIBCPP_FUNC_VIS int depth() const;
-
- _LIBCPP_INLINE_VISIBILITY
- void pop() { __pop(); }
-
- _LIBCPP_INLINE_VISIBILITY
- void pop(error_code& __ec) { __pop(&__ec); }
-
- _LIBCPP_INLINE_VISIBILITY
- bool recursion_pending() const { return __rec_; }
-
- _LIBCPP_INLINE_VISIBILITY
- void disable_recursion_pending() { __rec_ = false; }
-
-private:
- recursive_directory_iterator(const path& __p, directory_options __opt,
- error_code* __ec);
-
- _LIBCPP_FUNC_VIS
- const directory_entry& __dereference() const;
-
- _LIBCPP_FUNC_VIS
- bool __try_recursion(error_code* __ec);
-
- _LIBCPP_FUNC_VIS
- void __advance(error_code* __ec = nullptr);
-
- _LIBCPP_FUNC_VIS
- recursive_directory_iterator& __increment(error_code* __ec = nullptr);
-
- _LIBCPP_FUNC_VIS
- void __pop(error_code* __ec = nullptr);
-
- inline _LIBCPP_INLINE_VISIBILITY friend bool
- operator==(const recursive_directory_iterator&,
- const recursive_directory_iterator&) noexcept;
-
- struct __shared_imp;
- shared_ptr<__shared_imp> __imp_;
- bool __rec_;
-}; // class recursive_directory_iterator
-
-inline _LIBCPP_INLINE_VISIBILITY bool
-operator==(const recursive_directory_iterator& __lhs,
- const recursive_directory_iterator& __rhs) noexcept {
- return __lhs.__imp_ == __rhs.__imp_;
-}
-
-_LIBCPP_INLINE_VISIBILITY
-inline bool operator!=(const recursive_directory_iterator& __lhs,
- const recursive_directory_iterator& __rhs) noexcept {
- return !(__lhs == __rhs);
-}
-// enable recursive_directory_iterator range-based for statements
-inline _LIBCPP_INLINE_VISIBILITY recursive_directory_iterator
-begin(recursive_directory_iterator __iter) noexcept {
- return __iter;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY recursive_directory_iterator
-end(const recursive_directory_iterator&) noexcept {
- return recursive_directory_iterator();
-}
-
-_LIBCPP_END_NAMESPACE_FILESYSTEM
-
-#endif // !_LIBCPP_CXX03_LANG
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_FILESYSTEM
diff --git a/lib/libcxx/include/float.h b/lib/libcxx/include/float.h
deleted file mode 100644
index 759ac8e7954..00000000000
--- a/lib/libcxx/include/float.h
+++ /dev/null
@@ -1,94 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- float.h ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_FLOAT_H
-#define _LIBCPP_FLOAT_H
-
-/*
- float.h synopsis
-
-Macros:
-
- FLT_ROUNDS
- FLT_EVAL_METHOD // C99
- FLT_RADIX
-
- FLT_MANT_DIG
- DBL_MANT_DIG
- LDBL_MANT_DIG
-
- FLT_HAS_SUBNORM // C11
- DBL_HAS_SUBNORM // C11
- LDBL_HAS_SUBNORM // C11
-
- DECIMAL_DIG // C99
- FLT_DECIMAL_DIG // C11
- DBL_DECIMAL_DIG // C11
- LDBL_DECIMAL_DIG // C11
-
- FLT_DIG
- DBL_DIG
- LDBL_DIG
-
- FLT_MIN_EXP
- DBL_MIN_EXP
- LDBL_MIN_EXP
-
- FLT_MIN_10_EXP
- DBL_MIN_10_EXP
- LDBL_MIN_10_EXP
-
- FLT_MAX_EXP
- DBL_MAX_EXP
- LDBL_MAX_EXP
-
- FLT_MAX_10_EXP
- DBL_MAX_10_EXP
- LDBL_MAX_10_EXP
-
- FLT_MAX
- DBL_MAX
- LDBL_MAX
-
- FLT_EPSILON
- DBL_EPSILON
- LDBL_EPSILON
-
- FLT_MIN
- DBL_MIN
- LDBL_MIN
-
- FLT_TRUE_MIN // C11
- DBL_TRUE_MIN // C11
- LDBL_TRUE_MIN // C11
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#include_next <float.h>
-
-#ifdef __cplusplus
-
-#ifndef FLT_EVAL_METHOD
-#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
-#endif
-
-#ifndef DECIMAL_DIG
-#define DECIMAL_DIG __DECIMAL_DIG__
-#endif
-
-#endif // __cplusplus
-
-#endif // _LIBCPP_FLOAT_H
diff --git a/lib/libcxx/include/forward_list b/lib/libcxx/include/forward_list
deleted file mode 100644
index b506acd1ff2..00000000000
--- a/lib/libcxx/include/forward_list
+++ /dev/null
@@ -1,1768 +0,0 @@
-// -*- C++ -*-
-//===----------------------- forward_list ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_FORWARD_LIST
-#define _LIBCPP_FORWARD_LIST
-
-/*
- forward_list synopsis
-
-namespace std
-{
-
-template <class T, class Allocator = allocator<T>>
-class forward_list
-{
-public:
- typedef T value_type;
- typedef Allocator allocator_type;
-
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename allocator_traits<allocator_type>::pointer pointer;
- typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
- typedef typename allocator_traits<allocator_type>::size_type size_type;
- typedef typename allocator_traits<allocator_type>::difference_type difference_type;
-
- typedef <details> iterator;
- typedef <details> const_iterator;
-
- forward_list()
- noexcept(is_nothrow_default_constructible<allocator_type>::value);
- explicit forward_list(const allocator_type& a);
- explicit forward_list(size_type n);
- explicit forward_list(size_type n, const allocator_type& a); // C++14
- forward_list(size_type n, const value_type& v);
- forward_list(size_type n, const value_type& v, const allocator_type& a);
- template <class InputIterator>
- forward_list(InputIterator first, InputIterator last);
- template <class InputIterator>
- forward_list(InputIterator first, InputIterator last, const allocator_type& a);
- forward_list(const forward_list& x);
- forward_list(const forward_list& x, const allocator_type& a);
- forward_list(forward_list&& x)
- noexcept(is_nothrow_move_constructible<allocator_type>::value);
- forward_list(forward_list&& x, const allocator_type& a);
- forward_list(initializer_list<value_type> il);
- forward_list(initializer_list<value_type> il, const allocator_type& a);
-
- ~forward_list();
-
- forward_list& operator=(const forward_list& x);
- forward_list& operator=(forward_list&& x)
- noexcept(
- allocator_type::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value);
- forward_list& operator=(initializer_list<value_type> il);
-
- template <class InputIterator>
- void assign(InputIterator first, InputIterator last);
- void assign(size_type n, const value_type& v);
- void assign(initializer_list<value_type> il);
-
- allocator_type get_allocator() const noexcept;
-
- iterator begin() noexcept;
- const_iterator begin() const noexcept;
- iterator end() noexcept;
- const_iterator end() const noexcept;
-
- const_iterator cbegin() const noexcept;
- const_iterator cend() const noexcept;
-
- iterator before_begin() noexcept;
- const_iterator before_begin() const noexcept;
- const_iterator cbefore_begin() const noexcept;
-
- bool empty() const noexcept;
- size_type max_size() const noexcept;
-
- reference front();
- const_reference front() const;
-
- template <class... Args> reference emplace_front(Args&&... args); // reference in C++17
- void push_front(const value_type& v);
- void push_front(value_type&& v);
-
- void pop_front();
-
- template <class... Args>
- iterator emplace_after(const_iterator p, Args&&... args);
- iterator insert_after(const_iterator p, const value_type& v);
- iterator insert_after(const_iterator p, value_type&& v);
- iterator insert_after(const_iterator p, size_type n, const value_type& v);
- template <class InputIterator>
- iterator insert_after(const_iterator p,
- InputIterator first, InputIterator last);
- iterator insert_after(const_iterator p, initializer_list<value_type> il);
-
- iterator erase_after(const_iterator p);
- iterator erase_after(const_iterator first, const_iterator last);
-
- void swap(forward_list& x)
- noexcept(allocator_traits<allocator_type>::is_always_equal::value); // C++17
-
- void resize(size_type n);
- void resize(size_type n, const value_type& v);
- void clear() noexcept;
-
- void splice_after(const_iterator p, forward_list& x);
- void splice_after(const_iterator p, forward_list&& x);
- void splice_after(const_iterator p, forward_list& x, const_iterator i);
- void splice_after(const_iterator p, forward_list&& x, const_iterator i);
- void splice_after(const_iterator p, forward_list& x,
- const_iterator first, const_iterator last);
- void splice_after(const_iterator p, forward_list&& x,
- const_iterator first, const_iterator last);
- void remove(const value_type& v);
- template <class Predicate> void remove_if(Predicate pred);
- void unique();
- template <class BinaryPredicate> void unique(BinaryPredicate binary_pred);
- void merge(forward_list& x);
- void merge(forward_list&& x);
- template <class Compare> void merge(forward_list& x, Compare comp);
- template <class Compare> void merge(forward_list&& x, Compare comp);
- void sort();
- template <class Compare> void sort(Compare comp);
- void reverse() noexcept;
-};
-
-
-template <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
- forward_list(InputIterator, InputIterator, Allocator = Allocator())
- -> forward_list<typename iterator_traits<InputIterator>::value_type, Allocator>; // C++17
-
-template <class T, class Allocator>
- bool operator==(const forward_list<T, Allocator>& x,
- const forward_list<T, Allocator>& y);
-
-template <class T, class Allocator>
- bool operator< (const forward_list<T, Allocator>& x,
- const forward_list<T, Allocator>& y);
-
-template <class T, class Allocator>
- bool operator!=(const forward_list<T, Allocator>& x,
- const forward_list<T, Allocator>& y);
-
-template <class T, class Allocator>
- bool operator> (const forward_list<T, Allocator>& x,
- const forward_list<T, Allocator>& y);
-
-template <class T, class Allocator>
- bool operator>=(const forward_list<T, Allocator>& x,
- const forward_list<T, Allocator>& y);
-
-template <class T, class Allocator>
- bool operator<=(const forward_list<T, Allocator>& x,
- const forward_list<T, Allocator>& y);
-
-template <class T, class Allocator>
- void swap(forward_list<T, Allocator>& x, forward_list<T, Allocator>& y)
- noexcept(noexcept(x.swap(y)));
-
-template <class T, class Allocator, class U>
- void erase(forward_list<T, Allocator>& c, const U& value); // C++20
-template <class T, class Allocator, class Predicate>
- void erase_if(forward_list<T, Allocator>& c, Predicate pred); // C++20
-
-} // std
-
-*/
-
-#include <__config>
-#include <initializer_list>
-#include <memory>
-#include <limits>
-#include <iterator>
-#include <algorithm>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Tp, class _VoidPtr> struct __forward_list_node;
-template <class _NodePtr> struct __forward_begin_node;
-
-
-template <class>
-struct __forward_list_node_value_type;
-
-template <class _Tp, class _VoidPtr>
-struct __forward_list_node_value_type<__forward_list_node<_Tp, _VoidPtr> > {
- typedef _Tp type;
-};
-
-template <class _NodePtr>
-struct __forward_node_traits {
-
- typedef typename remove_cv<
- typename pointer_traits<_NodePtr>::element_type>::type __node;
- typedef typename __forward_list_node_value_type<__node>::type __node_value_type;
- typedef _NodePtr __node_pointer;
- typedef __forward_begin_node<_NodePtr> __begin_node;
- typedef typename __rebind_pointer<_NodePtr, __begin_node>::type
- __begin_node_pointer;
- typedef typename __rebind_pointer<_NodePtr, void>::type __void_pointer;
-
-#if defined(_LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB)
- typedef __begin_node_pointer __iter_node_pointer;
-#else
- typedef typename conditional<
- is_pointer<__void_pointer>::value,
- __begin_node_pointer,
- __node_pointer
- >::type __iter_node_pointer;
-#endif
-
- typedef typename conditional<
- is_same<__iter_node_pointer, __node_pointer>::value,
- __begin_node_pointer,
- __node_pointer
- >::type __non_iter_node_pointer;
-
- _LIBCPP_INLINE_VISIBILITY
- static __iter_node_pointer __as_iter_node(__iter_node_pointer __p) {
- return __p;
- }
- _LIBCPP_INLINE_VISIBILITY
- static __iter_node_pointer __as_iter_node(__non_iter_node_pointer __p) {
- return static_cast<__iter_node_pointer>(static_cast<__void_pointer>(__p));
- }
-};
-
-template <class _NodePtr>
-struct __forward_begin_node
-{
- typedef _NodePtr pointer;
- typedef typename __rebind_pointer<_NodePtr, __forward_begin_node>::type __begin_node_pointer;
-
- pointer __next_;
-
- _LIBCPP_INLINE_VISIBILITY __forward_begin_node() : __next_(nullptr) {}
-
- _LIBCPP_INLINE_VISIBILITY
- __begin_node_pointer __next_as_begin() const {
- return static_cast<__begin_node_pointer>(__next_);
- }
-};
-
-template <class _Tp, class _VoidPtr>
-struct _LIBCPP_HIDDEN __begin_node_of
-{
- typedef __forward_begin_node<
- typename __rebind_pointer<_VoidPtr, __forward_list_node<_Tp, _VoidPtr> >::type
- > type;
-};
-
-template <class _Tp, class _VoidPtr>
-struct __forward_list_node
- : public __begin_node_of<_Tp, _VoidPtr>::type
-{
- typedef _Tp value_type;
-
- value_type __value_;
-};
-
-
-template <class _Tp, class _Alloc = allocator<_Tp> > class _LIBCPP_TEMPLATE_VIS forward_list;
-template<class _NodeConstPtr> class _LIBCPP_TEMPLATE_VIS __forward_list_const_iterator;
-
-template <class _NodePtr>
-class _LIBCPP_TEMPLATE_VIS __forward_list_iterator
-{
- typedef __forward_node_traits<_NodePtr> __traits;
- typedef typename __traits::__node_pointer __node_pointer;
- typedef typename __traits::__begin_node_pointer __begin_node_pointer;
- typedef typename __traits::__iter_node_pointer __iter_node_pointer;
- typedef typename __traits::__void_pointer __void_pointer;
-
- __iter_node_pointer __ptr_;
-
- _LIBCPP_INLINE_VISIBILITY
- __begin_node_pointer __get_begin() const {
- return static_cast<__begin_node_pointer>(
- static_cast<__void_pointer>(__ptr_));
- }
- _LIBCPP_INLINE_VISIBILITY
- __node_pointer __get_unsafe_node_pointer() const {
- return static_cast<__node_pointer>(
- static_cast<__void_pointer>(__ptr_));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __forward_list_iterator(nullptr_t) _NOEXCEPT : __ptr_(nullptr) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __forward_list_iterator(__begin_node_pointer __p) _NOEXCEPT
- : __ptr_(__traits::__as_iter_node(__p)) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __forward_list_iterator(__node_pointer __p) _NOEXCEPT
- : __ptr_(__traits::__as_iter_node(__p)) {}
-
- template<class, class> friend class _LIBCPP_TEMPLATE_VIS forward_list;
- template<class> friend class _LIBCPP_TEMPLATE_VIS __forward_list_const_iterator;
-
-public:
- typedef forward_iterator_tag iterator_category;
- typedef typename __traits::__node_value_type value_type;
- typedef value_type& reference;
- typedef typename pointer_traits<__node_pointer>::difference_type
- difference_type;
- typedef typename __rebind_pointer<__node_pointer, value_type>::type pointer;
-
- _LIBCPP_INLINE_VISIBILITY
- __forward_list_iterator() _NOEXCEPT : __ptr_(nullptr) {}
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {return __get_unsafe_node_pointer()->__value_;}
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {
- return pointer_traits<pointer>::pointer_to(__get_unsafe_node_pointer()->__value_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __forward_list_iterator& operator++()
- {
- __ptr_ = __traits::__as_iter_node(__ptr_->__next_);
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY
- __forward_list_iterator operator++(int)
- {
- __forward_list_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __forward_list_iterator& __x,
- const __forward_list_iterator& __y)
- {return __x.__ptr_ == __y.__ptr_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __forward_list_iterator& __x,
- const __forward_list_iterator& __y)
- {return !(__x == __y);}
-};
-
-template <class _NodeConstPtr>
-class _LIBCPP_TEMPLATE_VIS __forward_list_const_iterator
-{
- static_assert((!is_const<typename pointer_traits<_NodeConstPtr>::element_type>::value), "");
- typedef _NodeConstPtr _NodePtr;
-
- typedef __forward_node_traits<_NodePtr> __traits;
- typedef typename __traits::__node __node;
- typedef typename __traits::__node_pointer __node_pointer;
- typedef typename __traits::__begin_node_pointer __begin_node_pointer;
- typedef typename __traits::__iter_node_pointer __iter_node_pointer;
- typedef typename __traits::__void_pointer __void_pointer;
-
- __iter_node_pointer __ptr_;
-
- __begin_node_pointer __get_begin() const {
- return static_cast<__begin_node_pointer>(
- static_cast<__void_pointer>(__ptr_));
- }
- __node_pointer __get_unsafe_node_pointer() const {
- return static_cast<__node_pointer>(
- static_cast<__void_pointer>(__ptr_));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __forward_list_const_iterator(nullptr_t) _NOEXCEPT
- : __ptr_(nullptr) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __forward_list_const_iterator(__begin_node_pointer __p) _NOEXCEPT
- : __ptr_(__traits::__as_iter_node(__p)) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __forward_list_const_iterator(__node_pointer __p) _NOEXCEPT
- : __ptr_(__traits::__as_iter_node(__p)) {}
-
-
- template<class, class> friend class forward_list;
-
-public:
- typedef forward_iterator_tag iterator_category;
- typedef typename __traits::__node_value_type value_type;
- typedef const value_type& reference;
- typedef typename pointer_traits<__node_pointer>::difference_type
- difference_type;
- typedef typename __rebind_pointer<__node_pointer, const value_type>::type
- pointer;
-
- _LIBCPP_INLINE_VISIBILITY
- __forward_list_const_iterator() _NOEXCEPT : __ptr_(nullptr) {}
- _LIBCPP_INLINE_VISIBILITY
- __forward_list_const_iterator(__forward_list_iterator<__node_pointer> __p) _NOEXCEPT
- : __ptr_(__p.__ptr_) {}
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {return __get_unsafe_node_pointer()->__value_;}
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return pointer_traits<pointer>::pointer_to(
- __get_unsafe_node_pointer()->__value_);}
-
- _LIBCPP_INLINE_VISIBILITY
- __forward_list_const_iterator& operator++()
- {
- __ptr_ = __traits::__as_iter_node(__ptr_->__next_);
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY
- __forward_list_const_iterator operator++(int)
- {
- __forward_list_const_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __forward_list_const_iterator& __x,
- const __forward_list_const_iterator& __y)
- {return __x.__ptr_ == __y.__ptr_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __forward_list_const_iterator& __x,
- const __forward_list_const_iterator& __y)
- {return !(__x == __y);}
-};
-
-template <class _Tp, class _Alloc>
-class __forward_list_base
-{
-protected:
- typedef _Tp value_type;
- typedef _Alloc allocator_type;
-
- typedef typename allocator_traits<allocator_type>::void_pointer void_pointer;
- typedef __forward_list_node<value_type, void_pointer> __node;
- typedef typename __begin_node_of<value_type, void_pointer>::type __begin_node;
- typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, __node>::type __node_allocator;
- typedef allocator_traits<__node_allocator> __node_traits;
- typedef typename __node_traits::pointer __node_pointer;
-
- typedef typename __rebind_alloc_helper<
- allocator_traits<allocator_type>, __begin_node
- >::type __begin_node_allocator;
- typedef typename allocator_traits<__begin_node_allocator>::pointer
- __begin_node_pointer;
-
- static_assert((!is_same<allocator_type, __node_allocator>::value),
- "internal allocator type must differ from user-specified "
- "type; otherwise overload resolution breaks");
-
- __compressed_pair<__begin_node, __node_allocator> __before_begin_;
-
- _LIBCPP_INLINE_VISIBILITY
- __begin_node_pointer __before_begin() _NOEXCEPT
- {return pointer_traits<__begin_node_pointer>::pointer_to(__before_begin_.first());}
- _LIBCPP_INLINE_VISIBILITY
- __begin_node_pointer __before_begin() const _NOEXCEPT
- {return pointer_traits<__begin_node_pointer>::pointer_to(const_cast<__begin_node&>(__before_begin_.first()));}
-
- _LIBCPP_INLINE_VISIBILITY
- __node_allocator& __alloc() _NOEXCEPT
- {return __before_begin_.second();}
- _LIBCPP_INLINE_VISIBILITY
- const __node_allocator& __alloc() const _NOEXCEPT
- {return __before_begin_.second();}
-
- typedef __forward_list_iterator<__node_pointer> iterator;
- typedef __forward_list_const_iterator<__node_pointer> const_iterator;
-
- _LIBCPP_INLINE_VISIBILITY
- __forward_list_base()
- _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value)
- : __before_begin_(__begin_node()) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit __forward_list_base(const allocator_type& __a)
- : __before_begin_(__begin_node(), __node_allocator(__a)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit __forward_list_base(const __node_allocator& __a)
- : __before_begin_(__begin_node(), __a) {}
-#ifndef _LIBCPP_CXX03_LANG
-public:
- _LIBCPP_INLINE_VISIBILITY
- __forward_list_base(__forward_list_base&& __x)
- _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value);
- _LIBCPP_INLINE_VISIBILITY
- __forward_list_base(__forward_list_base&& __x, const allocator_type& __a);
-#endif // _LIBCPP_CXX03_LANG
-
-private:
- __forward_list_base(const __forward_list_base&);
- __forward_list_base& operator=(const __forward_list_base&);
-
-public:
- ~__forward_list_base();
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __forward_list_base& __x)
- {__copy_assign_alloc(__x, integral_constant<bool,
- __node_traits::propagate_on_container_copy_assignment::value>());}
-
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__forward_list_base& __x)
- _NOEXCEPT_(!__node_traits::propagate_on_container_move_assignment::value ||
- is_nothrow_move_assignable<__node_allocator>::value)
- {__move_assign_alloc(__x, integral_constant<bool,
- __node_traits::propagate_on_container_move_assignment::value>());}
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- void swap(__forward_list_base& __x)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT;
-#else
- _NOEXCEPT_(!__node_traits::propagate_on_container_move_assignment::value ||
- __is_nothrow_swappable<__node_allocator>::value);
-#endif
-protected:
- void clear() _NOEXCEPT;
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __forward_list_base&, false_type) {}
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __forward_list_base& __x, true_type)
- {
- if (__alloc() != __x.__alloc())
- clear();
- __alloc() = __x.__alloc();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__forward_list_base&, false_type) _NOEXCEPT
- {}
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__forward_list_base& __x, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value)
- {__alloc() = _VSTD::move(__x.__alloc());}
-};
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Alloc>
-inline
-__forward_list_base<_Tp, _Alloc>::__forward_list_base(__forward_list_base&& __x)
- _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value)
- : __before_begin_(_VSTD::move(__x.__before_begin_))
-{
- __x.__before_begin()->__next_ = nullptr;
-}
-
-template <class _Tp, class _Alloc>
-inline
-__forward_list_base<_Tp, _Alloc>::__forward_list_base(__forward_list_base&& __x,
- const allocator_type& __a)
- : __before_begin_(__begin_node(), __node_allocator(__a))
-{
- if (__alloc() == __x.__alloc())
- {
- __before_begin()->__next_ = __x.__before_begin()->__next_;
- __x.__before_begin()->__next_ = nullptr;
- }
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Alloc>
-__forward_list_base<_Tp, _Alloc>::~__forward_list_base()
-{
- clear();
-}
-
-template <class _Tp, class _Alloc>
-inline
-void
-__forward_list_base<_Tp, _Alloc>::swap(__forward_list_base& __x)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT
-#else
- _NOEXCEPT_(!__node_traits::propagate_on_container_move_assignment::value ||
- __is_nothrow_swappable<__node_allocator>::value)
-#endif
-{
- __swap_allocator(__alloc(), __x.__alloc(),
- integral_constant<bool, __node_traits::propagate_on_container_swap::value>());
- using _VSTD::swap;
- swap(__before_begin()->__next_, __x.__before_begin()->__next_);
-}
-
-template <class _Tp, class _Alloc>
-void
-__forward_list_base<_Tp, _Alloc>::clear() _NOEXCEPT
-{
- __node_allocator& __a = __alloc();
- for (__node_pointer __p = __before_begin()->__next_; __p != nullptr;)
- {
- __node_pointer __next = __p->__next_;
- __node_traits::destroy(__a, _VSTD::addressof(__p->__value_));
- __node_traits::deallocate(__a, __p, 1);
- __p = __next;
- }
- __before_begin()->__next_ = nullptr;
-}
-
-template <class _Tp, class _Alloc /*= allocator<_Tp>*/>
-class _LIBCPP_TEMPLATE_VIS forward_list
- : private __forward_list_base<_Tp, _Alloc>
-{
- typedef __forward_list_base<_Tp, _Alloc> base;
- typedef typename base::__node_allocator __node_allocator;
- typedef typename base::__node __node;
- typedef typename base::__node_traits __node_traits;
- typedef typename base::__node_pointer __node_pointer;
- typedef typename base::__begin_node_pointer __begin_node_pointer;
-
-public:
- typedef _Tp value_type;
- typedef _Alloc allocator_type;
-
- static_assert((is_same<typename allocator_type::value_type, value_type>::value),
- "Allocator::value_type must be same type as value_type");
-
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename allocator_traits<allocator_type>::pointer pointer;
- typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
- typedef typename allocator_traits<allocator_type>::size_type size_type;
- typedef typename allocator_traits<allocator_type>::difference_type difference_type;
-
- typedef typename base::iterator iterator;
- typedef typename base::const_iterator const_iterator;
-
- _LIBCPP_INLINE_VISIBILITY
- forward_list()
- _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value)
- {} // = default;
- _LIBCPP_INLINE_VISIBILITY
- explicit forward_list(const allocator_type& __a);
- explicit forward_list(size_type __n);
-#if _LIBCPP_STD_VER > 11
- explicit forward_list(size_type __n, const allocator_type& __a);
-#endif
- forward_list(size_type __n, const value_type& __v);
- forward_list(size_type __n, const value_type& __v, const allocator_type& __a);
- template <class _InputIterator>
- forward_list(_InputIterator __f, _InputIterator __l,
- typename enable_if<
- __is_input_iterator<_InputIterator>::value
- >::type* = nullptr);
- template <class _InputIterator>
- forward_list(_InputIterator __f, _InputIterator __l,
- const allocator_type& __a,
- typename enable_if<
- __is_input_iterator<_InputIterator>::value
- >::type* = nullptr);
- forward_list(const forward_list& __x);
- forward_list(const forward_list& __x, const allocator_type& __a);
-
- forward_list& operator=(const forward_list& __x);
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- forward_list(forward_list&& __x)
- _NOEXCEPT_(is_nothrow_move_constructible<base>::value)
- : base(_VSTD::move(__x)) {}
- forward_list(forward_list&& __x, const allocator_type& __a);
-
- forward_list(initializer_list<value_type> __il);
- forward_list(initializer_list<value_type> __il, const allocator_type& __a);
-
- _LIBCPP_INLINE_VISIBILITY
- forward_list& operator=(forward_list&& __x)
- _NOEXCEPT_(
- __node_traits::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value);
-
- _LIBCPP_INLINE_VISIBILITY
- forward_list& operator=(initializer_list<value_type> __il);
-
- _LIBCPP_INLINE_VISIBILITY
- void assign(initializer_list<value_type> __il);
-#endif // _LIBCPP_CXX03_LANG
-
- // ~forward_list() = default;
-
- template <class _InputIterator>
- typename enable_if
- <
- __is_input_iterator<_InputIterator>::value,
- void
- >::type
- assign(_InputIterator __f, _InputIterator __l);
- void assign(size_type __n, const value_type& __v);
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const _NOEXCEPT
- {return allocator_type(base::__alloc());}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT
- {return iterator(base::__before_begin()->__next_);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT
- {return const_iterator(base::__before_begin()->__next_);}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT
- {return iterator(nullptr);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT
- {return const_iterator(nullptr);}
-
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const _NOEXCEPT
- {return const_iterator(base::__before_begin()->__next_);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const _NOEXCEPT
- {return const_iterator(nullptr);}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator before_begin() _NOEXCEPT
- {return iterator(base::__before_begin());}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator before_begin() const _NOEXCEPT
- {return const_iterator(base::__before_begin());}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbefore_begin() const _NOEXCEPT
- {return const_iterator(base::__before_begin());}
-
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const _NOEXCEPT
- {return base::__before_begin()->__next_ == nullptr;}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const _NOEXCEPT {
- return std::min<size_type>(
- __node_traits::max_size(base::__alloc()),
- numeric_limits<difference_type>::max());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- reference front() {return base::__before_begin()->__next_->__value_;}
- _LIBCPP_INLINE_VISIBILITY
- const_reference front() const {return base::__before_begin()->__next_->__value_;}
-
-#ifndef _LIBCPP_CXX03_LANG
-#if _LIBCPP_STD_VER > 14
- template <class... _Args> reference emplace_front(_Args&&... __args);
-#else
- template <class... _Args> void emplace_front(_Args&&... __args);
-#endif
- void push_front(value_type&& __v);
-#endif // _LIBCPP_CXX03_LANG
- void push_front(const value_type& __v);
-
- void pop_front();
-
-#ifndef _LIBCPP_CXX03_LANG
- template <class... _Args>
- iterator emplace_after(const_iterator __p, _Args&&... __args);
-
- iterator insert_after(const_iterator __p, value_type&& __v);
- iterator insert_after(const_iterator __p, initializer_list<value_type> __il)
- {return insert_after(__p, __il.begin(), __il.end());}
-#endif // _LIBCPP_CXX03_LANG
- iterator insert_after(const_iterator __p, const value_type& __v);
- iterator insert_after(const_iterator __p, size_type __n, const value_type& __v);
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __is_input_iterator<_InputIterator>::value,
- iterator
- >::type
- insert_after(const_iterator __p, _InputIterator __f, _InputIterator __l);
-
- iterator erase_after(const_iterator __p);
- iterator erase_after(const_iterator __f, const_iterator __l);
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(forward_list& __x)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT
-#else
- _NOEXCEPT_(!__node_traits::propagate_on_container_swap::value ||
- __is_nothrow_swappable<__node_allocator>::value)
-#endif
- {base::swap(__x);}
-
- void resize(size_type __n);
- void resize(size_type __n, const value_type& __v);
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT {base::clear();}
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- void splice_after(const_iterator __p, forward_list&& __x);
- _LIBCPP_INLINE_VISIBILITY
- void splice_after(const_iterator __p, forward_list&& __x, const_iterator __i);
- _LIBCPP_INLINE_VISIBILITY
- void splice_after(const_iterator __p, forward_list&& __x,
- const_iterator __f, const_iterator __l);
-#endif // _LIBCPP_CXX03_LANG
- void splice_after(const_iterator __p, forward_list& __x);
- void splice_after(const_iterator __p, forward_list& __x, const_iterator __i);
- void splice_after(const_iterator __p, forward_list& __x,
- const_iterator __f, const_iterator __l);
- void remove(const value_type& __v);
- template <class _Predicate> void remove_if(_Predicate __pred);
- _LIBCPP_INLINE_VISIBILITY
- void unique() {unique(__equal_to<value_type>());}
- template <class _BinaryPredicate> void unique(_BinaryPredicate __binary_pred);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- void merge(forward_list&& __x) {merge(__x, __less<value_type>());}
- template <class _Compare>
- _LIBCPP_INLINE_VISIBILITY
- void merge(forward_list&& __x, _Compare __comp)
- {merge(__x, _VSTD::move(__comp));}
-#endif // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- void merge(forward_list& __x) {merge(__x, __less<value_type>());}
- template <class _Compare> void merge(forward_list& __x, _Compare __comp);
- _LIBCPP_INLINE_VISIBILITY
- void sort() {sort(__less<value_type>());}
- template <class _Compare> _LIBCPP_INLINE_VISIBILITY void sort(_Compare __comp);
- void reverse() _NOEXCEPT;
-
-private:
-
-#ifndef _LIBCPP_CXX03_LANG
- void __move_assign(forward_list& __x, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
- void __move_assign(forward_list& __x, false_type);
-#endif // _LIBCPP_CXX03_LANG
-
- template <class _Compare>
- static
- __node_pointer
- __merge(__node_pointer __f1, __node_pointer __f2, _Compare& __comp);
-
- template <class _Compare>
- static
- __node_pointer
- __sort(__node_pointer __f, difference_type __sz, _Compare& __comp);
-};
-
-
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-template<class _InputIterator,
- class _Alloc = typename std::allocator<typename iterator_traits<_InputIterator>::value_type>,
- class = typename enable_if<__is_allocator<_Alloc>::value, void>::type
- >
-forward_list(_InputIterator, _InputIterator)
- -> forward_list<typename iterator_traits<_InputIterator>::value_type, _Alloc>;
-
-template<class _InputIterator,
- class _Alloc,
- class = typename enable_if<__is_allocator<_Alloc>::value, void>::type
- >
-forward_list(_InputIterator, _InputIterator, _Alloc)
- -> forward_list<typename iterator_traits<_InputIterator>::value_type, _Alloc>;
-#endif
-
-template <class _Tp, class _Alloc>
-inline
-forward_list<_Tp, _Alloc>::forward_list(const allocator_type& __a)
- : base(__a)
-{
-}
-
-template <class _Tp, class _Alloc>
-forward_list<_Tp, _Alloc>::forward_list(size_type __n)
-{
- if (__n > 0)
- {
- __node_allocator& __a = base::__alloc();
- typedef __allocator_destructor<__node_allocator> _Dp;
- unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1));
- for (__begin_node_pointer __p = base::__before_begin(); __n > 0; --__n,
- __p = __p->__next_as_begin())
- {
- __h.reset(__node_traits::allocate(__a, 1));
- __node_traits::construct(__a, _VSTD::addressof(__h->__value_));
- __h->__next_ = nullptr;
- __p->__next_ = __h.release();
- }
- }
-}
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp, class _Alloc>
-forward_list<_Tp, _Alloc>::forward_list(size_type __n,
- const allocator_type& __base_alloc)
- : base ( __base_alloc )
-{
- if (__n > 0)
- {
- __node_allocator& __a = base::__alloc();
- typedef __allocator_destructor<__node_allocator> _Dp;
- unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1));
- for (__begin_node_pointer __p = base::__before_begin(); __n > 0; --__n,
- __p = __p->__next_as_begin())
- {
- __h.reset(__node_traits::allocate(__a, 1));
- __node_traits::construct(__a, _VSTD::addressof(__h->__value_));
- __h->__next_ = nullptr;
- __p->__next_ = __h.release();
- }
- }
-}
-#endif
-
-template <class _Tp, class _Alloc>
-forward_list<_Tp, _Alloc>::forward_list(size_type __n, const value_type& __v)
-{
- insert_after(cbefore_begin(), __n, __v);
-}
-
-template <class _Tp, class _Alloc>
-forward_list<_Tp, _Alloc>::forward_list(size_type __n, const value_type& __v,
- const allocator_type& __a)
- : base(__a)
-{
- insert_after(cbefore_begin(), __n, __v);
-}
-
-template <class _Tp, class _Alloc>
-template <class _InputIterator>
-forward_list<_Tp, _Alloc>::forward_list(_InputIterator __f, _InputIterator __l,
- typename enable_if<
- __is_input_iterator<_InputIterator>::value
- >::type*)
-{
- insert_after(cbefore_begin(), __f, __l);
-}
-
-template <class _Tp, class _Alloc>
-template <class _InputIterator>
-forward_list<_Tp, _Alloc>::forward_list(_InputIterator __f, _InputIterator __l,
- const allocator_type& __a,
- typename enable_if<
- __is_input_iterator<_InputIterator>::value
- >::type*)
- : base(__a)
-{
- insert_after(cbefore_begin(), __f, __l);
-}
-
-template <class _Tp, class _Alloc>
-forward_list<_Tp, _Alloc>::forward_list(const forward_list& __x)
- : base(
- __node_traits::select_on_container_copy_construction(__x.__alloc())) {
- insert_after(cbefore_begin(), __x.begin(), __x.end());
-}
-
-template <class _Tp, class _Alloc>
-forward_list<_Tp, _Alloc>::forward_list(const forward_list& __x,
- const allocator_type& __a)
- : base(__a)
-{
- insert_after(cbefore_begin(), __x.begin(), __x.end());
-}
-
-template <class _Tp, class _Alloc>
-forward_list<_Tp, _Alloc>&
-forward_list<_Tp, _Alloc>::operator=(const forward_list& __x)
-{
- if (this != &__x)
- {
- base::__copy_assign_alloc(__x);
- assign(__x.begin(), __x.end());
- }
- return *this;
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Tp, class _Alloc>
-forward_list<_Tp, _Alloc>::forward_list(forward_list&& __x,
- const allocator_type& __a)
- : base(_VSTD::move(__x), __a)
-{
- if (base::__alloc() != __x.__alloc())
- {
- typedef move_iterator<iterator> _Ip;
- insert_after(cbefore_begin(), _Ip(__x.begin()), _Ip(__x.end()));
- }
-}
-
-template <class _Tp, class _Alloc>
-forward_list<_Tp, _Alloc>::forward_list(initializer_list<value_type> __il)
-{
- insert_after(cbefore_begin(), __il.begin(), __il.end());
-}
-
-template <class _Tp, class _Alloc>
-forward_list<_Tp, _Alloc>::forward_list(initializer_list<value_type> __il,
- const allocator_type& __a)
- : base(__a)
-{
- insert_after(cbefore_begin(), __il.begin(), __il.end());
-}
-
-template <class _Tp, class _Alloc>
-void
-forward_list<_Tp, _Alloc>::__move_assign(forward_list& __x, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
-{
- clear();
- base::__move_assign_alloc(__x);
- base::__before_begin()->__next_ = __x.__before_begin()->__next_;
- __x.__before_begin()->__next_ = nullptr;
-}
-
-template <class _Tp, class _Alloc>
-void
-forward_list<_Tp, _Alloc>::__move_assign(forward_list& __x, false_type)
-{
- if (base::__alloc() == __x.__alloc())
- __move_assign(__x, true_type());
- else
- {
- typedef move_iterator<iterator> _Ip;
- assign(_Ip(__x.begin()), _Ip(__x.end()));
- }
-}
-
-template <class _Tp, class _Alloc>
-inline
-forward_list<_Tp, _Alloc>&
-forward_list<_Tp, _Alloc>::operator=(forward_list&& __x)
- _NOEXCEPT_(
- __node_traits::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value)
-{
- __move_assign(__x, integral_constant<bool,
- __node_traits::propagate_on_container_move_assignment::value>());
- return *this;
-}
-
-template <class _Tp, class _Alloc>
-inline
-forward_list<_Tp, _Alloc>&
-forward_list<_Tp, _Alloc>::operator=(initializer_list<value_type> __il)
-{
- assign(__il.begin(), __il.end());
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Alloc>
-template <class _InputIterator>
-typename enable_if
-<
- __is_input_iterator<_InputIterator>::value,
- void
->::type
-forward_list<_Tp, _Alloc>::assign(_InputIterator __f, _InputIterator __l)
-{
- iterator __i = before_begin();
- iterator __j = _VSTD::next(__i);
- iterator __e = end();
- for (; __j != __e && __f != __l; ++__i, (void) ++__j, ++__f)
- *__j = *__f;
- if (__j == __e)
- insert_after(__i, __f, __l);
- else
- erase_after(__i, __e);
-}
-
-template <class _Tp, class _Alloc>
-void
-forward_list<_Tp, _Alloc>::assign(size_type __n, const value_type& __v)
-{
- iterator __i = before_begin();
- iterator __j = _VSTD::next(__i);
- iterator __e = end();
- for (; __j != __e && __n > 0; --__n, ++__i, ++__j)
- *__j = __v;
- if (__j == __e)
- insert_after(__i, __n, __v);
- else
- erase_after(__i, __e);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Alloc>
-inline
-void
-forward_list<_Tp, _Alloc>::assign(initializer_list<value_type> __il)
-{
- assign(__il.begin(), __il.end());
-}
-
-template <class _Tp, class _Alloc>
-template <class... _Args>
-#if _LIBCPP_STD_VER > 14
-typename forward_list<_Tp, _Alloc>::reference
-#else
-void
-#endif
-forward_list<_Tp, _Alloc>::emplace_front(_Args&&... __args)
-{
- __node_allocator& __a = base::__alloc();
- typedef __allocator_destructor<__node_allocator> _Dp;
- unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
- __node_traits::construct(__a, _VSTD::addressof(__h->__value_),
- _VSTD::forward<_Args>(__args)...);
- __h->__next_ = base::__before_begin()->__next_;
- base::__before_begin()->__next_ = __h.release();
-#if _LIBCPP_STD_VER > 14
- return base::__before_begin()->__next_->__value_;
-#endif
-}
-
-template <class _Tp, class _Alloc>
-void
-forward_list<_Tp, _Alloc>::push_front(value_type&& __v)
-{
- __node_allocator& __a = base::__alloc();
- typedef __allocator_destructor<__node_allocator> _Dp;
- unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
- __node_traits::construct(__a, _VSTD::addressof(__h->__value_), _VSTD::move(__v));
- __h->__next_ = base::__before_begin()->__next_;
- base::__before_begin()->__next_ = __h.release();
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Alloc>
-void
-forward_list<_Tp, _Alloc>::push_front(const value_type& __v)
-{
- __node_allocator& __a = base::__alloc();
- typedef __allocator_destructor<__node_allocator> _Dp;
- unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
- __node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v);
- __h->__next_ = base::__before_begin()->__next_;
- base::__before_begin()->__next_ = __h.release();
-}
-
-template <class _Tp, class _Alloc>
-void
-forward_list<_Tp, _Alloc>::pop_front()
-{
- __node_allocator& __a = base::__alloc();
- __node_pointer __p = base::__before_begin()->__next_;
- base::__before_begin()->__next_ = __p->__next_;
- __node_traits::destroy(__a, _VSTD::addressof(__p->__value_));
- __node_traits::deallocate(__a, __p, 1);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Alloc>
-template <class... _Args>
-typename forward_list<_Tp, _Alloc>::iterator
-forward_list<_Tp, _Alloc>::emplace_after(const_iterator __p, _Args&&... __args)
-{
- __begin_node_pointer const __r = __p.__get_begin();
- __node_allocator& __a = base::__alloc();
- typedef __allocator_destructor<__node_allocator> _Dp;
- unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
- __node_traits::construct(__a, _VSTD::addressof(__h->__value_),
- _VSTD::forward<_Args>(__args)...);
- __h->__next_ = __r->__next_;
- __r->__next_ = __h.release();
- return iterator(__r->__next_);
-}
-
-template <class _Tp, class _Alloc>
-typename forward_list<_Tp, _Alloc>::iterator
-forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, value_type&& __v)
-{
- __begin_node_pointer const __r = __p.__get_begin();
- __node_allocator& __a = base::__alloc();
- typedef __allocator_destructor<__node_allocator> _Dp;
- unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
- __node_traits::construct(__a, _VSTD::addressof(__h->__value_), _VSTD::move(__v));
- __h->__next_ = __r->__next_;
- __r->__next_ = __h.release();
- return iterator(__r->__next_);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Alloc>
-typename forward_list<_Tp, _Alloc>::iterator
-forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, const value_type& __v)
-{
- __begin_node_pointer const __r = __p.__get_begin();
- __node_allocator& __a = base::__alloc();
- typedef __allocator_destructor<__node_allocator> _Dp;
- unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
- __node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v);
- __h->__next_ = __r->__next_;
- __r->__next_ = __h.release();
- return iterator(__r->__next_);
-}
-
-template <class _Tp, class _Alloc>
-typename forward_list<_Tp, _Alloc>::iterator
-forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, size_type __n,
- const value_type& __v)
-{
- __begin_node_pointer __r = __p.__get_begin();
- if (__n > 0)
- {
- __node_allocator& __a = base::__alloc();
- typedef __allocator_destructor<__node_allocator> _Dp;
- unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
- __node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v);
- __node_pointer __first = __h.release();
- __node_pointer __last = __first;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (--__n; __n != 0; --__n, __last = __last->__next_)
- {
- __h.reset(__node_traits::allocate(__a, 1));
- __node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v);
- __last->__next_ = __h.release();
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- while (__first != nullptr)
- {
- __node_pointer __next = __first->__next_;
- __node_traits::destroy(__a, _VSTD::addressof(__first->__value_));
- __node_traits::deallocate(__a, __first, 1);
- __first = __next;
- }
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- __last->__next_ = __r->__next_;
- __r->__next_ = __first;
- __r = static_cast<__begin_node_pointer>(__last);
- }
- return iterator(__r);
-}
-
-template <class _Tp, class _Alloc>
-template <class _InputIterator>
-typename enable_if
-<
- __is_input_iterator<_InputIterator>::value,
- typename forward_list<_Tp, _Alloc>::iterator
->::type
-forward_list<_Tp, _Alloc>::insert_after(const_iterator __p,
- _InputIterator __f, _InputIterator __l)
-{
- __begin_node_pointer __r = __p.__get_begin();
- if (__f != __l)
- {
- __node_allocator& __a = base::__alloc();
- typedef __allocator_destructor<__node_allocator> _Dp;
- unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
- __node_traits::construct(__a, _VSTD::addressof(__h->__value_), *__f);
- __node_pointer __first = __h.release();
- __node_pointer __last = __first;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (++__f; __f != __l; ++__f, ((void)(__last = __last->__next_)))
- {
- __h.reset(__node_traits::allocate(__a, 1));
- __node_traits::construct(__a, _VSTD::addressof(__h->__value_), *__f);
- __last->__next_ = __h.release();
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- while (__first != nullptr)
- {
- __node_pointer __next = __first->__next_;
- __node_traits::destroy(__a, _VSTD::addressof(__first->__value_));
- __node_traits::deallocate(__a, __first, 1);
- __first = __next;
- }
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- __last->__next_ = __r->__next_;
- __r->__next_ = __first;
- __r = static_cast<__begin_node_pointer>(__last);
- }
- return iterator(__r);
-}
-
-template <class _Tp, class _Alloc>
-typename forward_list<_Tp, _Alloc>::iterator
-forward_list<_Tp, _Alloc>::erase_after(const_iterator __f)
-{
- __begin_node_pointer __p = __f.__get_begin();
- __node_pointer __n = __p->__next_;
- __p->__next_ = __n->__next_;
- __node_allocator& __a = base::__alloc();
- __node_traits::destroy(__a, _VSTD::addressof(__n->__value_));
- __node_traits::deallocate(__a, __n, 1);
- return iterator(__p->__next_);
-}
-
-template <class _Tp, class _Alloc>
-typename forward_list<_Tp, _Alloc>::iterator
-forward_list<_Tp, _Alloc>::erase_after(const_iterator __f, const_iterator __l)
-{
- __node_pointer __e = __l.__get_unsafe_node_pointer();
- if (__f != __l)
- {
- __begin_node_pointer __bp = __f.__get_begin();
-
- __node_pointer __n = __bp->__next_;
- if (__n != __e)
- {
- __bp->__next_ = __e;
- __node_allocator& __a = base::__alloc();
- do
- {
- __node_pointer __tmp = __n->__next_;
- __node_traits::destroy(__a, _VSTD::addressof(__n->__value_));
- __node_traits::deallocate(__a, __n, 1);
- __n = __tmp;
- } while (__n != __e);
- }
- }
- return iterator(__e);
-}
-
-template <class _Tp, class _Alloc>
-void
-forward_list<_Tp, _Alloc>::resize(size_type __n)
-{
- size_type __sz = 0;
- iterator __p = before_begin();
- iterator __i = begin();
- iterator __e = end();
- for (; __i != __e && __sz < __n; ++__p, ++__i, ++__sz)
- ;
- if (__i != __e)
- erase_after(__p, __e);
- else
- {
- __n -= __sz;
- if (__n > 0)
- {
- __node_allocator& __a = base::__alloc();
- typedef __allocator_destructor<__node_allocator> _Dp;
- unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1));
- for (__begin_node_pointer __ptr = __p.__get_begin(); __n > 0; --__n,
- __ptr = __ptr->__next_as_begin())
- {
- __h.reset(__node_traits::allocate(__a, 1));
- __node_traits::construct(__a, _VSTD::addressof(__h->__value_));
- __h->__next_ = nullptr;
- __ptr->__next_ = __h.release();
- }
- }
- }
-}
-
-template <class _Tp, class _Alloc>
-void
-forward_list<_Tp, _Alloc>::resize(size_type __n, const value_type& __v)
-{
- size_type __sz = 0;
- iterator __p = before_begin();
- iterator __i = begin();
- iterator __e = end();
- for (; __i != __e && __sz < __n; ++__p, ++__i, ++__sz)
- ;
- if (__i != __e)
- erase_after(__p, __e);
- else
- {
- __n -= __sz;
- if (__n > 0)
- {
- __node_allocator& __a = base::__alloc();
- typedef __allocator_destructor<__node_allocator> _Dp;
- unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1));
- for (__begin_node_pointer __ptr = __p.__get_begin(); __n > 0; --__n,
- __ptr = __ptr->__next_as_begin())
- {
- __h.reset(__node_traits::allocate(__a, 1));
- __node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v);
- __h->__next_ = nullptr;
- __ptr->__next_ = __h.release();
- }
- }
- }
-}
-
-template <class _Tp, class _Alloc>
-void
-forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
- forward_list& __x)
-{
- if (!__x.empty())
- {
- if (__p.__get_begin()->__next_ != nullptr)
- {
- const_iterator __lm1 = __x.before_begin();
- while (__lm1.__get_begin()->__next_ != nullptr)
- ++__lm1;
- __lm1.__get_begin()->__next_ = __p.__get_begin()->__next_;
- }
- __p.__get_begin()->__next_ = __x.__before_begin()->__next_;
- __x.__before_begin()->__next_ = nullptr;
- }
-}
-
-template <class _Tp, class _Alloc>
-void
-forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
- forward_list& /*__other*/,
- const_iterator __i)
-{
- const_iterator __lm1 = _VSTD::next(__i);
- if (__p != __i && __p != __lm1)
- {
- __i.__get_begin()->__next_ = __lm1.__get_begin()->__next_;
- __lm1.__get_begin()->__next_ = __p.__get_begin()->__next_;
- __p.__get_begin()->__next_ = __lm1.__get_unsafe_node_pointer();
- }
-}
-
-template <class _Tp, class _Alloc>
-void
-forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
- forward_list& /*__other*/,
- const_iterator __f, const_iterator __l)
-{
- if (__f != __l && __p != __f)
- {
- const_iterator __lm1 = __f;
- while (__lm1.__get_begin()->__next_ != __l.__get_begin())
- ++__lm1;
- if (__f != __lm1)
- {
- __lm1.__get_begin()->__next_ = __p.__get_begin()->__next_;
- __p.__get_begin()->__next_ = __f.__get_begin()->__next_;
- __f.__get_begin()->__next_ = __l.__get_unsafe_node_pointer();
- }
- }
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
- forward_list&& __x)
-{
- splice_after(__p, __x);
-}
-
-template <class _Tp, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
- forward_list&& __x,
- const_iterator __i)
-{
- splice_after(__p, __x, __i);
-}
-
-template <class _Tp, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
- forward_list&& __x,
- const_iterator __f, const_iterator __l)
-{
- splice_after(__p, __x, __f, __l);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Alloc>
-void
-forward_list<_Tp, _Alloc>::remove(const value_type& __v)
-{
- forward_list<_Tp, _Alloc> __deleted_nodes; // collect the nodes we're removing
- iterator __e = end();
- for (iterator __i = before_begin(); __i.__get_begin()->__next_ != nullptr;)
- {
- if (__i.__get_begin()->__next_->__value_ == __v)
- {
- iterator __j = _VSTD::next(__i, 2);
- for (; __j != __e && *__j == __v; ++__j)
- ;
- __deleted_nodes.splice_after(__deleted_nodes.before_begin(), *this, __i, __j);
- if (__j == __e)
- break;
- __i = __j;
- }
- else
- ++__i;
- }
-}
-
-template <class _Tp, class _Alloc>
-template <class _Predicate>
-void
-forward_list<_Tp, _Alloc>::remove_if(_Predicate __pred)
-{
- iterator __e = end();
- for (iterator __i = before_begin(); __i.__get_begin()->__next_ != nullptr;)
- {
- if (__pred(__i.__get_begin()->__next_->__value_))
- {
- iterator __j = _VSTD::next(__i, 2);
- for (; __j != __e && __pred(*__j); ++__j)
- ;
- erase_after(__i, __j);
- if (__j == __e)
- break;
- __i = __j;
- }
- else
- ++__i;
- }
-}
-
-template <class _Tp, class _Alloc>
-template <class _BinaryPredicate>
-void
-forward_list<_Tp, _Alloc>::unique(_BinaryPredicate __binary_pred)
-{
- for (iterator __i = begin(), __e = end(); __i != __e;)
- {
- iterator __j = _VSTD::next(__i);
- for (; __j != __e && __binary_pred(*__i, *__j); ++__j)
- ;
- if (__i.__get_begin()->__next_ != __j.__get_unsafe_node_pointer())
- erase_after(__i, __j);
- __i = __j;
- }
-}
-
-template <class _Tp, class _Alloc>
-template <class _Compare>
-void
-forward_list<_Tp, _Alloc>::merge(forward_list& __x, _Compare __comp)
-{
- if (this != &__x)
- {
- base::__before_begin()->__next_ = __merge(base::__before_begin()->__next_,
- __x.__before_begin()->__next_,
- __comp);
- __x.__before_begin()->__next_ = nullptr;
- }
-}
-
-template <class _Tp, class _Alloc>
-template <class _Compare>
-typename forward_list<_Tp, _Alloc>::__node_pointer
-forward_list<_Tp, _Alloc>::__merge(__node_pointer __f1, __node_pointer __f2,
- _Compare& __comp)
-{
- if (__f1 == nullptr)
- return __f2;
- if (__f2 == nullptr)
- return __f1;
- __node_pointer __r;
- if (__comp(__f2->__value_, __f1->__value_))
- {
- __node_pointer __t = __f2;
- while (__t->__next_ != nullptr &&
- __comp(__t->__next_->__value_, __f1->__value_))
- __t = __t->__next_;
- __r = __f2;
- __f2 = __t->__next_;
- __t->__next_ = __f1;
- }
- else
- __r = __f1;
- __node_pointer __p = __f1;
- __f1 = __f1->__next_;
- while (__f1 != nullptr && __f2 != nullptr)
- {
- if (__comp(__f2->__value_, __f1->__value_))
- {
- __node_pointer __t = __f2;
- while (__t->__next_ != nullptr &&
- __comp(__t->__next_->__value_, __f1->__value_))
- __t = __t->__next_;
- __p->__next_ = __f2;
- __f2 = __t->__next_;
- __t->__next_ = __f1;
- }
- __p = __f1;
- __f1 = __f1->__next_;
- }
- if (__f2 != nullptr)
- __p->__next_ = __f2;
- return __r;
-}
-
-template <class _Tp, class _Alloc>
-template <class _Compare>
-inline
-void
-forward_list<_Tp, _Alloc>::sort(_Compare __comp)
-{
- base::__before_begin()->__next_ = __sort(base::__before_begin()->__next_,
- _VSTD::distance(begin(), end()), __comp);
-}
-
-template <class _Tp, class _Alloc>
-template <class _Compare>
-typename forward_list<_Tp, _Alloc>::__node_pointer
-forward_list<_Tp, _Alloc>::__sort(__node_pointer __f1, difference_type __sz,
- _Compare& __comp)
-{
- switch (__sz)
- {
- case 0:
- case 1:
- return __f1;
- case 2:
- if (__comp(__f1->__next_->__value_, __f1->__value_))
- {
- __node_pointer __t = __f1->__next_;
- __t->__next_ = __f1;
- __f1->__next_ = nullptr;
- __f1 = __t;
- }
- return __f1;
- }
- difference_type __sz1 = __sz / 2;
- difference_type __sz2 = __sz - __sz1;
- __node_pointer __t = _VSTD::next(iterator(__f1), __sz1 - 1).__get_unsafe_node_pointer();
- __node_pointer __f2 = __t->__next_;
- __t->__next_ = nullptr;
- return __merge(__sort(__f1, __sz1, __comp),
- __sort(__f2, __sz2, __comp), __comp);
-}
-
-template <class _Tp, class _Alloc>
-void
-forward_list<_Tp, _Alloc>::reverse() _NOEXCEPT
-{
- __node_pointer __p = base::__before_begin()->__next_;
- if (__p != nullptr)
- {
- __node_pointer __f = __p->__next_;
- __p->__next_ = nullptr;
- while (__f != nullptr)
- {
- __node_pointer __t = __f->__next_;
- __f->__next_ = __p;
- __p = __f;
- __f = __t;
- }
- base::__before_begin()->__next_ = __p;
- }
-}
-
-template <class _Tp, class _Alloc>
-bool operator==(const forward_list<_Tp, _Alloc>& __x,
- const forward_list<_Tp, _Alloc>& __y)
-{
- typedef forward_list<_Tp, _Alloc> _Cp;
- typedef typename _Cp::const_iterator _Ip;
- _Ip __ix = __x.begin();
- _Ip __ex = __x.end();
- _Ip __iy = __y.begin();
- _Ip __ey = __y.end();
- for (; __ix != __ex && __iy != __ey; ++__ix, ++__iy)
- if (!(*__ix == *__iy))
- return false;
- return (__ix == __ex) == (__iy == __ey);
-}
-
-template <class _Tp, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator!=(const forward_list<_Tp, _Alloc>& __x,
- const forward_list<_Tp, _Alloc>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _Tp, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator< (const forward_list<_Tp, _Alloc>& __x,
- const forward_list<_Tp, _Alloc>& __y)
-{
- return _VSTD::lexicographical_compare(__x.begin(), __x.end(),
- __y.begin(), __y.end());
-}
-
-template <class _Tp, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator> (const forward_list<_Tp, _Alloc>& __x,
- const forward_list<_Tp, _Alloc>& __y)
-{
- return __y < __x;
-}
-
-template <class _Tp, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator>=(const forward_list<_Tp, _Alloc>& __x,
- const forward_list<_Tp, _Alloc>& __y)
-{
- return !(__x < __y);
-}
-
-template <class _Tp, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator<=(const forward_list<_Tp, _Alloc>& __x,
- const forward_list<_Tp, _Alloc>& __y)
-{
- return !(__y < __x);
-}
-
-template <class _Tp, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(forward_list<_Tp, _Alloc>& __x, forward_list<_Tp, _Alloc>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-#if _LIBCPP_STD_VER > 17
-template <class _Tp, class _Allocator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase_if(forward_list<_Tp, _Allocator>& __c, _Predicate __pred)
-{ __c.remove_if(__pred); }
-
-template <class _Tp, class _Allocator, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase(forward_list<_Tp, _Allocator>& __c, const _Up& __v)
-{ _VSTD::erase_if(__c, [&](auto& __elem) { return __elem == __v; }); }
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_FORWARD_LIST
diff --git a/lib/libcxx/include/fstream b/lib/libcxx/include/fstream
deleted file mode 100644
index 711e484e2dc..00000000000
--- a/lib/libcxx/include/fstream
+++ /dev/null
@@ -1,1765 +0,0 @@
-// -*- C++ -*-
-//===------------------------- fstream ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_FSTREAM
-#define _LIBCPP_FSTREAM
-
-/*
- fstream synopsis
-
-template <class charT, class traits = char_traits<charT> >
-class basic_filebuf
- : public basic_streambuf<charT, traits>
-{
-public:
- typedef charT char_type;
- typedef traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- // 27.9.1.2 Constructors/destructor:
- basic_filebuf();
- basic_filebuf(basic_filebuf&& rhs);
- virtual ~basic_filebuf();
-
- // 27.9.1.3 Assign/swap:
- basic_filebuf& operator=(basic_filebuf&& rhs);
- void swap(basic_filebuf& rhs);
-
- // 27.9.1.4 Members:
- bool is_open() const;
- basic_filebuf* open(const char* s, ios_base::openmode mode);
- basic_filebuf* open(const string& s, ios_base::openmode mode);
- basic_filebuf* open(const filesystem::path& p, ios_base::openmode mode); // C++17
- basic_filebuf* close();
-
-protected:
- // 27.9.1.5 Overridden virtual functions:
- virtual streamsize showmanyc();
- virtual int_type underflow();
- virtual int_type uflow();
- virtual int_type pbackfail(int_type c = traits_type::eof());
- virtual int_type overflow (int_type c = traits_type::eof());
- virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* s, streamsize n);
- virtual pos_type seekoff(off_type off, ios_base::seekdir way,
- ios_base::openmode which = ios_base::in | ios_base::out);
- virtual pos_type seekpos(pos_type sp,
- ios_base::openmode which = ios_base::in | ios_base::out);
- virtual int sync();
- virtual void imbue(const locale& loc);
-};
-
-template <class charT, class traits>
- void
- swap(basic_filebuf<charT, traits>& x, basic_filebuf<charT, traits>& y);
-
-typedef basic_filebuf<char> filebuf;
-typedef basic_filebuf<wchar_t> wfilebuf;
-
-template <class charT, class traits = char_traits<charT> >
-class basic_ifstream
- : public basic_istream<charT,traits>
-{
-public:
- typedef charT char_type;
- typedef traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- basic_ifstream();
- explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in);
- explicit basic_ifstream(const string& s, ios_base::openmode mode = ios_base::in);
- explicit basic_ifstream(const filesystem::path& p,
- ios_base::openmode mode = ios_base::in); // C++17
- basic_ifstream(basic_ifstream&& rhs);
-
- basic_ifstream& operator=(basic_ifstream&& rhs);
- void swap(basic_ifstream& rhs);
-
- basic_filebuf<char_type, traits_type>* rdbuf() const;
- bool is_open() const;
- void open(const char* s, ios_base::openmode mode = ios_base::in);
- void open(const string& s, ios_base::openmode mode = ios_base::in);
- void open(const filesystem::path& s, ios_base::openmode mode = ios_base::in); // C++17
-
- void close();
-};
-
-template <class charT, class traits>
- void
- swap(basic_ifstream<charT, traits>& x, basic_ifstream<charT, traits>& y);
-
-typedef basic_ifstream<char> ifstream;
-typedef basic_ifstream<wchar_t> wifstream;
-
-template <class charT, class traits = char_traits<charT> >
-class basic_ofstream
- : public basic_ostream<charT,traits>
-{
-public:
- typedef charT char_type;
- typedef traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- basic_ofstream();
- explicit basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out);
- explicit basic_ofstream(const string& s, ios_base::openmode mode = ios_base::out);
- explicit basic_ofstream(const filesystem::path& p,
- ios_base::openmode mode = ios_base::out); // C++17
- basic_ofstream(basic_ofstream&& rhs);
-
- basic_ofstream& operator=(basic_ofstream&& rhs);
- void swap(basic_ofstream& rhs);
-
- basic_filebuf<char_type, traits_type>* rdbuf() const;
- bool is_open() const;
- void open(const char* s, ios_base::openmode mode = ios_base::out);
- void open(const string& s, ios_base::openmode mode = ios_base::out);
- void open(const filesystem::path& p,
- ios_base::openmode mode = ios_base::out); // C++17
-
- void close();
-};
-
-template <class charT, class traits>
- void
- swap(basic_ofstream<charT, traits>& x, basic_ofstream<charT, traits>& y);
-
-typedef basic_ofstream<char> ofstream;
-typedef basic_ofstream<wchar_t> wofstream;
-
-template <class charT, class traits=char_traits<charT> >
-class basic_fstream
- : public basic_iostream<charT,traits>
-{
-public:
- typedef charT char_type;
- typedef traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- basic_fstream();
- explicit basic_fstream(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out);
- explicit basic_fstream(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out);
- explicit basic_fstream(const filesystem::path& p,
- ios_base::openmode mode = ios_base::in|ios_base::out); C++17
- basic_fstream(basic_fstream&& rhs);
-
- basic_fstream& operator=(basic_fstream&& rhs);
- void swap(basic_fstream& rhs);
-
- basic_filebuf<char_type, traits_type>* rdbuf() const;
- bool is_open() const;
- void open(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out);
- void open(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out);
- void open(const filesystem::path& s,
- ios_base::openmode mode = ios_base::in|ios_base::out); // C++17
-
- void close();
-};
-
-template <class charT, class traits>
- void swap(basic_fstream<charT, traits>& x, basic_fstream<charT, traits>& y);
-
-typedef basic_fstream<char> fstream;
-typedef basic_fstream<wchar_t> wfstream;
-
-} // std
-
-*/
-
-#include <__config>
-#include <ostream>
-#include <istream>
-#include <__locale>
-#include <cstdio>
-#include <cstdlib>
-#include <filesystem>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _CharT, class _Traits>
-class _LIBCPP_TEMPLATE_VIS basic_filebuf
- : public basic_streambuf<_CharT, _Traits>
-{
-public:
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
- typedef typename traits_type::state_type state_type;
-
- // 27.9.1.2 Constructors/destructor:
- basic_filebuf();
-#ifndef _LIBCPP_CXX03_LANG
- basic_filebuf(basic_filebuf&& __rhs);
-#endif
- virtual ~basic_filebuf();
-
- // 27.9.1.3 Assign/swap:
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- basic_filebuf& operator=(basic_filebuf&& __rhs);
-#endif
- void swap(basic_filebuf& __rhs);
-
- // 27.9.1.4 Members:
- _LIBCPP_INLINE_VISIBILITY
- bool is_open() const;
-#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
- basic_filebuf* open(const char* __s, ios_base::openmode __mode);
-#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
- basic_filebuf* open(const wchar_t* __s, ios_base::openmode __mode);
-#endif
- _LIBCPP_INLINE_VISIBILITY
- basic_filebuf* open(const string& __s, ios_base::openmode __mode);
-
-#if _LIBCPP_STD_VER >= 17
- _LIBCPP_INLINE_VISIBILITY
- basic_filebuf* open(const _VSTD_FS::path& __p, ios_base::openmode __mode) {
- return open(__p.c_str(), __mode);
- }
-#endif
- _LIBCPP_INLINE_VISIBILITY
- basic_filebuf* __open(int __fd, ios_base::openmode __mode);
-#endif
- basic_filebuf* close();
-
- _LIBCPP_INLINE_VISIBILITY
- inline static const char*
- __make_mdstring(ios_base::openmode __mode) _NOEXCEPT;
-
- protected:
- // 27.9.1.5 Overridden virtual functions:
- virtual int_type underflow();
- virtual int_type pbackfail(int_type __c = traits_type::eof());
- virtual int_type overflow (int_type __c = traits_type::eof());
- virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* __s, streamsize __n);
- virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
- ios_base::openmode __wch = ios_base::in | ios_base::out);
- virtual pos_type seekpos(pos_type __sp,
- ios_base::openmode __wch = ios_base::in | ios_base::out);
- virtual int sync();
- virtual void imbue(const locale& __loc);
-
-private:
- char* __extbuf_;
- const char* __extbufnext_;
- const char* __extbufend_;
- char __extbuf_min_[8];
- size_t __ebs_;
- char_type* __intbuf_;
- size_t __ibs_;
- FILE* __file_;
- const codecvt<char_type, char, state_type>* __cv_;
- state_type __st_;
- state_type __st_last_;
- ios_base::openmode __om_;
- ios_base::openmode __cm_;
- bool __owns_eb_;
- bool __owns_ib_;
- bool __always_noconv_;
-
- bool __read_mode();
- void __write_mode();
-};
-
-template <class _CharT, class _Traits>
-basic_filebuf<_CharT, _Traits>::basic_filebuf()
- : __extbuf_(0),
- __extbufnext_(0),
- __extbufend_(0),
- __ebs_(0),
- __intbuf_(0),
- __ibs_(0),
- __file_(0),
- __cv_(nullptr),
- __st_(),
- __st_last_(),
- __om_(0),
- __cm_(0),
- __owns_eb_(false),
- __owns_ib_(false),
- __always_noconv_(false)
-{
- if (has_facet<codecvt<char_type, char, state_type> >(this->getloc()))
- {
- __cv_ = &use_facet<codecvt<char_type, char, state_type> >(this->getloc());
- __always_noconv_ = __cv_->always_noconv();
- }
- setbuf(0, 4096);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits>
-basic_filebuf<_CharT, _Traits>::basic_filebuf(basic_filebuf&& __rhs)
- : basic_streambuf<_CharT, _Traits>(__rhs)
-{
- if (__rhs.__extbuf_ == __rhs.__extbuf_min_)
- {
- __extbuf_ = __extbuf_min_;
- __extbufnext_ = __extbuf_ + (__rhs.__extbufnext_ - __rhs.__extbuf_);
- __extbufend_ = __extbuf_ + (__rhs.__extbufend_ - __rhs.__extbuf_);
- }
- else
- {
- __extbuf_ = __rhs.__extbuf_;
- __extbufnext_ = __rhs.__extbufnext_;
- __extbufend_ = __rhs.__extbufend_;
- }
- __ebs_ = __rhs.__ebs_;
- __intbuf_ = __rhs.__intbuf_;
- __ibs_ = __rhs.__ibs_;
- __file_ = __rhs.__file_;
- __cv_ = __rhs.__cv_;
- __st_ = __rhs.__st_;
- __st_last_ = __rhs.__st_last_;
- __om_ = __rhs.__om_;
- __cm_ = __rhs.__cm_;
- __owns_eb_ = __rhs.__owns_eb_;
- __owns_ib_ = __rhs.__owns_ib_;
- __always_noconv_ = __rhs.__always_noconv_;
- if (__rhs.pbase())
- {
- if (__rhs.pbase() == __rhs.__intbuf_)
- this->setp(__intbuf_, __intbuf_ + (__rhs. epptr() - __rhs.pbase()));
- else
- this->setp((char_type*)__extbuf_,
- (char_type*)__extbuf_ + (__rhs. epptr() - __rhs.pbase()));
- this->__pbump(__rhs. pptr() - __rhs.pbase());
- }
- else if (__rhs.eback())
- {
- if (__rhs.eback() == __rhs.__intbuf_)
- this->setg(__intbuf_, __intbuf_ + (__rhs.gptr() - __rhs.eback()),
- __intbuf_ + (__rhs.egptr() - __rhs.eback()));
- else
- this->setg((char_type*)__extbuf_,
- (char_type*)__extbuf_ + (__rhs.gptr() - __rhs.eback()),
- (char_type*)__extbuf_ + (__rhs.egptr() - __rhs.eback()));
- }
- __rhs.__extbuf_ = 0;
- __rhs.__extbufnext_ = 0;
- __rhs.__extbufend_ = 0;
- __rhs.__ebs_ = 0;
- __rhs.__intbuf_ = 0;
- __rhs.__ibs_ = 0;
- __rhs.__file_ = 0;
- __rhs.__st_ = state_type();
- __rhs.__st_last_ = state_type();
- __rhs.__om_ = 0;
- __rhs.__cm_ = 0;
- __rhs.__owns_eb_ = false;
- __rhs.__owns_ib_ = false;
- __rhs.setg(0, 0, 0);
- __rhs.setp(0, 0);
-}
-
-template <class _CharT, class _Traits>
-inline
-basic_filebuf<_CharT, _Traits>&
-basic_filebuf<_CharT, _Traits>::operator=(basic_filebuf&& __rhs)
-{
- close();
- swap(__rhs);
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits>
-basic_filebuf<_CharT, _Traits>::~basic_filebuf()
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- close();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (__owns_eb_)
- delete [] __extbuf_;
- if (__owns_ib_)
- delete [] __intbuf_;
-}
-
-template <class _CharT, class _Traits>
-void
-basic_filebuf<_CharT, _Traits>::swap(basic_filebuf& __rhs)
-{
- basic_streambuf<char_type, traits_type>::swap(__rhs);
- if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_)
- {
- _VSTD::swap(__extbuf_, __rhs.__extbuf_);
- _VSTD::swap(__extbufnext_, __rhs.__extbufnext_);
- _VSTD::swap(__extbufend_, __rhs.__extbufend_);
- }
- else
- {
- ptrdiff_t __ln = __extbufnext_ - __extbuf_;
- ptrdiff_t __le = __extbufend_ - __extbuf_;
- ptrdiff_t __rn = __rhs.__extbufnext_ - __rhs.__extbuf_;
- ptrdiff_t __re = __rhs.__extbufend_ - __rhs.__extbuf_;
- if (__extbuf_ == __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_)
- {
- __extbuf_ = __rhs.__extbuf_;
- __rhs.__extbuf_ = __rhs.__extbuf_min_;
- }
- else if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ == __rhs.__extbuf_min_)
- {
- __rhs.__extbuf_ = __extbuf_;
- __extbuf_ = __extbuf_min_;
- }
- __extbufnext_ = __extbuf_ + __rn;
- __extbufend_ = __extbuf_ + __re;
- __rhs.__extbufnext_ = __rhs.__extbuf_ + __ln;
- __rhs.__extbufend_ = __rhs.__extbuf_ + __le;
- }
- _VSTD::swap(__ebs_, __rhs.__ebs_);
- _VSTD::swap(__intbuf_, __rhs.__intbuf_);
- _VSTD::swap(__ibs_, __rhs.__ibs_);
- _VSTD::swap(__file_, __rhs.__file_);
- _VSTD::swap(__cv_, __rhs.__cv_);
- _VSTD::swap(__st_, __rhs.__st_);
- _VSTD::swap(__st_last_, __rhs.__st_last_);
- _VSTD::swap(__om_, __rhs.__om_);
- _VSTD::swap(__cm_, __rhs.__cm_);
- _VSTD::swap(__owns_eb_, __rhs.__owns_eb_);
- _VSTD::swap(__owns_ib_, __rhs.__owns_ib_);
- _VSTD::swap(__always_noconv_, __rhs.__always_noconv_);
- if (this->eback() == (char_type*)__rhs.__extbuf_min_)
- {
- ptrdiff_t __n = this->gptr() - this->eback();
- ptrdiff_t __e = this->egptr() - this->eback();
- this->setg((char_type*)__extbuf_min_,
- (char_type*)__extbuf_min_ + __n,
- (char_type*)__extbuf_min_ + __e);
- }
- else if (this->pbase() == (char_type*)__rhs.__extbuf_min_)
- {
- ptrdiff_t __n = this->pptr() - this->pbase();
- ptrdiff_t __e = this->epptr() - this->pbase();
- this->setp((char_type*)__extbuf_min_,
- (char_type*)__extbuf_min_ + __e);
- this->__pbump(__n);
- }
- if (__rhs.eback() == (char_type*)__extbuf_min_)
- {
- ptrdiff_t __n = __rhs.gptr() - __rhs.eback();
- ptrdiff_t __e = __rhs.egptr() - __rhs.eback();
- __rhs.setg((char_type*)__rhs.__extbuf_min_,
- (char_type*)__rhs.__extbuf_min_ + __n,
- (char_type*)__rhs.__extbuf_min_ + __e);
- }
- else if (__rhs.pbase() == (char_type*)__extbuf_min_)
- {
- ptrdiff_t __n = __rhs.pptr() - __rhs.pbase();
- ptrdiff_t __e = __rhs.epptr() - __rhs.pbase();
- __rhs.setp((char_type*)__rhs.__extbuf_min_,
- (char_type*)__rhs.__extbuf_min_ + __e);
- __rhs.__pbump(__n);
- }
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(basic_filebuf<_CharT, _Traits>& __x, basic_filebuf<_CharT, _Traits>& __y)
-{
- __x.swap(__y);
-}
-
-template <class _CharT, class _Traits>
-inline
-bool
-basic_filebuf<_CharT, _Traits>::is_open() const
-{
- return __file_ != 0;
-}
-
-template <class _CharT, class _Traits>
-const char* basic_filebuf<_CharT, _Traits>::__make_mdstring(
- ios_base::openmode __mode) _NOEXCEPT {
- switch (__mode & ~ios_base::ate) {
- case ios_base::out:
- case ios_base::out | ios_base::trunc:
- return "w";
- case ios_base::out | ios_base::app:
- case ios_base::app:
- return "a";
- case ios_base::in:
- return "r";
- case ios_base::in | ios_base::out:
- return "r+";
- case ios_base::in | ios_base::out | ios_base::trunc:
- return "w+";
- case ios_base::in | ios_base::out | ios_base::app:
- case ios_base::in | ios_base::app:
- return "a+";
- case ios_base::out | ios_base::binary:
- case ios_base::out | ios_base::trunc | ios_base::binary:
- return "wb";
- case ios_base::out | ios_base::app | ios_base::binary:
- case ios_base::app | ios_base::binary:
- return "ab";
- case ios_base::in | ios_base::binary:
- return "rb";
- case ios_base::in | ios_base::out | ios_base::binary:
- return "r+b";
- case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary:
- return "w+b";
- case ios_base::in | ios_base::out | ios_base::app | ios_base::binary:
- case ios_base::in | ios_base::app | ios_base::binary:
- return "a+b";
- default:
- return nullptr;
- }
- _LIBCPP_UNREACHABLE();
-}
-
-#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
-template <class _CharT, class _Traits>
-basic_filebuf<_CharT, _Traits>*
-basic_filebuf<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
-{
- basic_filebuf<_CharT, _Traits>* __rt = 0;
- if (__file_ == 0)
- {
- if (const char* __mdstr = __make_mdstring(__mode)) {
- __rt = this;
- __file_ = fopen(__s, __mdstr);
- if (__file_) {
- __om_ = __mode;
- if (__mode & ios_base::ate) {
- if (fseek(__file_, 0, SEEK_END)) {
- fclose(__file_);
- __file_ = 0;
- __rt = 0;
- }
- }
- } else
- __rt = 0;
- }
- }
- return __rt;
-}
-
-template <class _CharT, class _Traits>
-_LIBCPP_INLINE_VISIBILITY basic_filebuf<_CharT, _Traits>*
-basic_filebuf<_CharT, _Traits>::__open(int __fd, ios_base::openmode __mode) {
- basic_filebuf<_CharT, _Traits>* __rt = 0;
- if (__file_ == 0) {
- if (const char* __mdstr = __make_mdstring(__mode)) {
- __rt = this;
- __file_ = fdopen(__fd, __mdstr);
- if (__file_) {
- __om_ = __mode;
- if (__mode & ios_base::ate) {
- if (fseek(__file_, 0, SEEK_END)) {
- fclose(__file_);
- __file_ = 0;
- __rt = 0;
- }
- }
- } else
- __rt = 0;
- }
- }
- return __rt;
-}
-
-#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
-// This is basically the same as the char* overload except that it uses _wfopen
-// and long mode strings.
-template <class _CharT, class _Traits>
-basic_filebuf<_CharT, _Traits>*
-basic_filebuf<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
-{
- basic_filebuf<_CharT, _Traits>* __rt = 0;
- if (__file_ == 0)
- {
- __rt = this;
- const wchar_t* __mdstr;
- switch (__mode & ~ios_base::ate)
- {
- case ios_base::out:
- case ios_base::out | ios_base::trunc:
- __mdstr = L"w";
- break;
- case ios_base::out | ios_base::app:
- case ios_base::app:
- __mdstr = L"a";
- break;
- case ios_base::in:
- __mdstr = L"r";
- break;
- case ios_base::in | ios_base::out:
- __mdstr = L"r+";
- break;
- case ios_base::in | ios_base::out | ios_base::trunc:
- __mdstr = L"w+";
- break;
- case ios_base::in | ios_base::out | ios_base::app:
- case ios_base::in | ios_base::app:
- __mdstr = L"a+";
- break;
- case ios_base::out | ios_base::binary:
- case ios_base::out | ios_base::trunc | ios_base::binary:
- __mdstr = L"wb";
- break;
- case ios_base::out | ios_base::app | ios_base::binary:
- case ios_base::app | ios_base::binary:
- __mdstr = L"ab";
- break;
- case ios_base::in | ios_base::binary:
- __mdstr = L"rb";
- break;
- case ios_base::in | ios_base::out | ios_base::binary:
- __mdstr = L"r+b";
- break;
- case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary:
- __mdstr = L"w+b";
- break;
- case ios_base::in | ios_base::out | ios_base::app | ios_base::binary:
- case ios_base::in | ios_base::app | ios_base::binary:
- __mdstr = L"a+b";
- break;
- default:
- __rt = 0;
- break;
- }
- if (__rt)
- {
- __file_ = _wfopen(__s, __mdstr);
- if (__file_)
- {
- __om_ = __mode;
- if (__mode & ios_base::ate)
- {
- if (fseek(__file_, 0, SEEK_END))
- {
- fclose(__file_);
- __file_ = 0;
- __rt = 0;
- }
- }
- }
- else
- __rt = 0;
- }
- }
- return __rt;
-}
-#endif
-
-template <class _CharT, class _Traits>
-inline
-basic_filebuf<_CharT, _Traits>*
-basic_filebuf<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
-{
- return open(__s.c_str(), __mode);
-}
-#endif
-
-template <class _CharT, class _Traits>
-basic_filebuf<_CharT, _Traits>*
-basic_filebuf<_CharT, _Traits>::close()
-{
- basic_filebuf<_CharT, _Traits>* __rt = 0;
- if (__file_)
- {
- __rt = this;
- unique_ptr<FILE, int(*)(FILE*)> __h(__file_, fclose);
- if (sync())
- __rt = 0;
- if (fclose(__h.release()) == 0)
- __file_ = 0;
- else
- __rt = 0;
- setbuf(0, 0);
- }
- return __rt;
-}
-
-template <class _CharT, class _Traits>
-typename basic_filebuf<_CharT, _Traits>::int_type
-basic_filebuf<_CharT, _Traits>::underflow()
-{
- if (__file_ == 0)
- return traits_type::eof();
- bool __initial = __read_mode();
- char_type __1buf;
- if (this->gptr() == 0)
- this->setg(&__1buf, &__1buf+1, &__1buf+1);
- const size_t __unget_sz = __initial ? 0 : min<size_t>((this->egptr() - this->eback()) / 2, 4);
- int_type __c = traits_type::eof();
- if (this->gptr() == this->egptr())
- {
- memmove(this->eback(), this->egptr() - __unget_sz, __unget_sz * sizeof(char_type));
- if (__always_noconv_)
- {
- size_t __nmemb = static_cast<size_t>(this->egptr() - this->eback() - __unget_sz);
- __nmemb = fread(this->eback() + __unget_sz, 1, __nmemb, __file_);
- if (__nmemb != 0)
- {
- this->setg(this->eback(),
- this->eback() + __unget_sz,
- this->eback() + __unget_sz + __nmemb);
- __c = traits_type::to_int_type(*this->gptr());
- }
- }
- else
- {
- _LIBCPP_ASSERT ( !(__extbufnext_ == NULL && (__extbufend_ != __extbufnext_)), "underflow moving from NULL" );
- if (__extbufend_ != __extbufnext_)
- memmove(__extbuf_, __extbufnext_, __extbufend_ - __extbufnext_);
- __extbufnext_ = __extbuf_ + (__extbufend_ - __extbufnext_);
- __extbufend_ = __extbuf_ + (__extbuf_ == __extbuf_min_ ? sizeof(__extbuf_min_) : __ebs_);
- size_t __nmemb = _VSTD::min(static_cast<size_t>(__ibs_ - __unget_sz),
- static_cast<size_t>(__extbufend_ - __extbufnext_));
- codecvt_base::result __r;
- __st_last_ = __st_;
- size_t __nr = fread((void*) const_cast<char *>(__extbufnext_), 1, __nmemb, __file_);
- if (__nr != 0)
- {
- if (!__cv_)
- __throw_bad_cast();
-
- __extbufend_ = __extbufnext_ + __nr;
- char_type* __inext;
- __r = __cv_->in(__st_, __extbuf_, __extbufend_, __extbufnext_,
- this->eback() + __unget_sz,
- this->eback() + __ibs_, __inext);
- if (__r == codecvt_base::noconv)
- {
- this->setg((char_type*)__extbuf_, (char_type*)__extbuf_,
- (char_type*)const_cast<char *>(__extbufend_));
- __c = traits_type::to_int_type(*this->gptr());
- }
- else if (__inext != this->eback() + __unget_sz)
- {
- this->setg(this->eback(), this->eback() + __unget_sz, __inext);
- __c = traits_type::to_int_type(*this->gptr());
- }
- }
- }
- }
- else
- __c = traits_type::to_int_type(*this->gptr());
- if (this->eback() == &__1buf)
- this->setg(0, 0, 0);
- return __c;
-}
-
-template <class _CharT, class _Traits>
-typename basic_filebuf<_CharT, _Traits>::int_type
-basic_filebuf<_CharT, _Traits>::pbackfail(int_type __c)
-{
- if (__file_ && this->eback() < this->gptr())
- {
- if (traits_type::eq_int_type(__c, traits_type::eof()))
- {
- this->gbump(-1);
- return traits_type::not_eof(__c);
- }
- if ((__om_ & ios_base::out) ||
- traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1]))
- {
- this->gbump(-1);
- *this->gptr() = traits_type::to_char_type(__c);
- return __c;
- }
- }
- return traits_type::eof();
-}
-
-template <class _CharT, class _Traits>
-typename basic_filebuf<_CharT, _Traits>::int_type
-basic_filebuf<_CharT, _Traits>::overflow(int_type __c)
-{
- if (__file_ == 0)
- return traits_type::eof();
- __write_mode();
- char_type __1buf;
- char_type* __pb_save = this->pbase();
- char_type* __epb_save = this->epptr();
- if (!traits_type::eq_int_type(__c, traits_type::eof()))
- {
- if (this->pptr() == 0)
- this->setp(&__1buf, &__1buf+1);
- *this->pptr() = traits_type::to_char_type(__c);
- this->pbump(1);
- }
- if (this->pptr() != this->pbase())
- {
- if (__always_noconv_)
- {
- size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase());
- if (fwrite(this->pbase(), sizeof(char_type), __nmemb, __file_) != __nmemb)
- return traits_type::eof();
- }
- else
- {
- char* __extbe = __extbuf_;
- codecvt_base::result __r;
- do
- {
- if (!__cv_)
- __throw_bad_cast();
-
- const char_type* __e;
- __r = __cv_->out(__st_, this->pbase(), this->pptr(), __e,
- __extbuf_, __extbuf_ + __ebs_, __extbe);
- if (__e == this->pbase())
- return traits_type::eof();
- if (__r == codecvt_base::noconv)
- {
- size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase());
- if (fwrite(this->pbase(), 1, __nmemb, __file_) != __nmemb)
- return traits_type::eof();
- }
- else if (__r == codecvt_base::ok || __r == codecvt_base::partial)
- {
- size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_);
- if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb)
- return traits_type::eof();
- if (__r == codecvt_base::partial)
- {
- this->setp(const_cast<char_type*>(__e), this->pptr());
- this->__pbump(this->epptr() - this->pbase());
- }
- }
- else
- return traits_type::eof();
- } while (__r == codecvt_base::partial);
- }
- this->setp(__pb_save, __epb_save);
- }
- return traits_type::not_eof(__c);
-}
-
-template <class _CharT, class _Traits>
-basic_streambuf<_CharT, _Traits>*
-basic_filebuf<_CharT, _Traits>::setbuf(char_type* __s, streamsize __n)
-{
- this->setg(0, 0, 0);
- this->setp(0, 0);
- if (__owns_eb_)
- delete [] __extbuf_;
- if (__owns_ib_)
- delete [] __intbuf_;
- __ebs_ = __n;
- if (__ebs_ > sizeof(__extbuf_min_))
- {
- if (__always_noconv_ && __s)
- {
- __extbuf_ = (char*)__s;
- __owns_eb_ = false;
- }
- else
- {
- __extbuf_ = new char[__ebs_];
- __owns_eb_ = true;
- }
- }
- else
- {
- __extbuf_ = __extbuf_min_;
- __ebs_ = sizeof(__extbuf_min_);
- __owns_eb_ = false;
- }
- if (!__always_noconv_)
- {
- __ibs_ = max<streamsize>(__n, sizeof(__extbuf_min_));
- if (__s && __ibs_ >= sizeof(__extbuf_min_))
- {
- __intbuf_ = __s;
- __owns_ib_ = false;
- }
- else
- {
- __intbuf_ = new char_type[__ibs_];
- __owns_ib_ = true;
- }
- }
- else
- {
- __ibs_ = 0;
- __intbuf_ = 0;
- __owns_ib_ = false;
- }
- return this;
-}
-
-template <class _CharT, class _Traits>
-typename basic_filebuf<_CharT, _Traits>::pos_type
-basic_filebuf<_CharT, _Traits>::seekoff(off_type __off, ios_base::seekdir __way,
- ios_base::openmode)
-{
- if (!__cv_)
- __throw_bad_cast();
-
- int __width = __cv_->encoding();
- if (__file_ == 0 || (__width <= 0 && __off != 0) || sync())
- return pos_type(off_type(-1));
- // __width > 0 || __off == 0
- int __whence;
- switch (__way)
- {
- case ios_base::beg:
- __whence = SEEK_SET;
- break;
- case ios_base::cur:
- __whence = SEEK_CUR;
- break;
- case ios_base::end:
- __whence = SEEK_END;
- break;
- default:
- return pos_type(off_type(-1));
- }
-#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
- if (fseek(__file_, __width > 0 ? __width * __off : 0, __whence))
- return pos_type(off_type(-1));
- pos_type __r = ftell(__file_);
-#else
- if (fseeko(__file_, __width > 0 ? __width * __off : 0, __whence))
- return pos_type(off_type(-1));
- pos_type __r = ftello(__file_);
-#endif
- __r.state(__st_);
- return __r;
-}
-
-template <class _CharT, class _Traits>
-typename basic_filebuf<_CharT, _Traits>::pos_type
-basic_filebuf<_CharT, _Traits>::seekpos(pos_type __sp, ios_base::openmode)
-{
- if (__file_ == 0 || sync())
- return pos_type(off_type(-1));
-#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
- if (fseek(__file_, __sp, SEEK_SET))
- return pos_type(off_type(-1));
-#else
- if (fseeko(__file_, __sp, SEEK_SET))
- return pos_type(off_type(-1));
-#endif
- __st_ = __sp.state();
- return __sp;
-}
-
-template <class _CharT, class _Traits>
-int
-basic_filebuf<_CharT, _Traits>::sync()
-{
- if (__file_ == 0)
- return 0;
- if (!__cv_)
- __throw_bad_cast();
-
- if (__cm_ & ios_base::out)
- {
- if (this->pptr() != this->pbase())
- if (overflow() == traits_type::eof())
- return -1;
- codecvt_base::result __r;
- do
- {
- char* __extbe;
- __r = __cv_->unshift(__st_, __extbuf_, __extbuf_ + __ebs_, __extbe);
- size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_);
- if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb)
- return -1;
- } while (__r == codecvt_base::partial);
- if (__r == codecvt_base::error)
- return -1;
- if (fflush(__file_))
- return -1;
- }
- else if (__cm_ & ios_base::in)
- {
- off_type __c;
- state_type __state = __st_last_;
- bool __update_st = false;
- if (__always_noconv_)
- __c = this->egptr() - this->gptr();
- else
- {
- int __width = __cv_->encoding();
- __c = __extbufend_ - __extbufnext_;
- if (__width > 0)
- __c += __width * (this->egptr() - this->gptr());
- else
- {
- if (this->gptr() != this->egptr())
- {
- const int __off = __cv_->length(__state, __extbuf_,
- __extbufnext_,
- this->gptr() - this->eback());
- __c += __extbufnext_ - __extbuf_ - __off;
- __update_st = true;
- }
- }
- }
-#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
- if (fseek(__file_, -__c, SEEK_CUR))
- return -1;
-#else
- if (fseeko(__file_, -__c, SEEK_CUR))
- return -1;
-#endif
- if (__update_st)
- __st_ = __state;
- __extbufnext_ = __extbufend_ = __extbuf_;
- this->setg(0, 0, 0);
- __cm_ = 0;
- }
- return 0;
-}
-
-template <class _CharT, class _Traits>
-void
-basic_filebuf<_CharT, _Traits>::imbue(const locale& __loc)
-{
- sync();
- __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc);
- bool __old_anc = __always_noconv_;
- __always_noconv_ = __cv_->always_noconv();
- if (__old_anc != __always_noconv_)
- {
- this->setg(0, 0, 0);
- this->setp(0, 0);
- // invariant, char_type is char, else we couldn't get here
- if (__always_noconv_) // need to dump __intbuf_
- {
- if (__owns_eb_)
- delete [] __extbuf_;
- __owns_eb_ = __owns_ib_;
- __ebs_ = __ibs_;
- __extbuf_ = (char*)__intbuf_;
- __ibs_ = 0;
- __intbuf_ = 0;
- __owns_ib_ = false;
- }
- else // need to obtain an __intbuf_.
- { // If __extbuf_ is user-supplied, use it, else new __intbuf_
- if (!__owns_eb_ && __extbuf_ != __extbuf_min_)
- {
- __ibs_ = __ebs_;
- __intbuf_ = (char_type*)__extbuf_;
- __owns_ib_ = false;
- __extbuf_ = new char[__ebs_];
- __owns_eb_ = true;
- }
- else
- {
- __ibs_ = __ebs_;
- __intbuf_ = new char_type[__ibs_];
- __owns_ib_ = true;
- }
- }
- }
-}
-
-template <class _CharT, class _Traits>
-bool
-basic_filebuf<_CharT, _Traits>::__read_mode()
-{
- if (!(__cm_ & ios_base::in))
- {
- this->setp(0, 0);
- if (__always_noconv_)
- this->setg((char_type*)__extbuf_,
- (char_type*)__extbuf_ + __ebs_,
- (char_type*)__extbuf_ + __ebs_);
- else
- this->setg(__intbuf_, __intbuf_ + __ibs_, __intbuf_ + __ibs_);
- __cm_ = ios_base::in;
- return true;
- }
- return false;
-}
-
-template <class _CharT, class _Traits>
-void
-basic_filebuf<_CharT, _Traits>::__write_mode()
-{
- if (!(__cm_ & ios_base::out))
- {
- this->setg(0, 0, 0);
- if (__ebs_ > sizeof(__extbuf_min_))
- {
- if (__always_noconv_)
- this->setp((char_type*)__extbuf_,
- (char_type*)__extbuf_ + (__ebs_ - 1));
- else
- this->setp(__intbuf_, __intbuf_ + (__ibs_ - 1));
- }
- else
- this->setp(0, 0);
- __cm_ = ios_base::out;
- }
-}
-
-// basic_ifstream
-
-template <class _CharT, class _Traits>
-class _LIBCPP_TEMPLATE_VIS basic_ifstream
- : public basic_istream<_CharT, _Traits>
-{
-public:
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- _LIBCPP_INLINE_VISIBILITY
- basic_ifstream();
-#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
- _LIBCPP_INLINE_VISIBILITY
- explicit basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in);
-#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
- _LIBCPP_INLINE_VISIBILITY
- explicit basic_ifstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::in);
-#endif
- _LIBCPP_INLINE_VISIBILITY
- explicit basic_ifstream(const string& __s, ios_base::openmode __mode = ios_base::in);
-#if _LIBCPP_STD_VER >= 17
- _LIBCPP_INLINE_VISIBILITY
- explicit basic_ifstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in)
- : basic_ifstream(__p.c_str(), __mode) {}
-#endif // _LIBCPP_STD_VER >= 17
-#endif
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- basic_ifstream(basic_ifstream&& __rhs);
-
- _LIBCPP_INLINE_VISIBILITY
- basic_ifstream& operator=(basic_ifstream&& __rhs);
-#endif
- _LIBCPP_INLINE_VISIBILITY
- void swap(basic_ifstream& __rhs);
-
- _LIBCPP_INLINE_VISIBILITY
- basic_filebuf<char_type, traits_type>* rdbuf() const;
- _LIBCPP_INLINE_VISIBILITY
- bool is_open() const;
-#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
- void open(const char* __s, ios_base::openmode __mode = ios_base::in);
-#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
- void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::in);
-#endif
- void open(const string& __s, ios_base::openmode __mode = ios_base::in);
-#if _LIBCPP_STD_VER >= 17
- _LIBCPP_INLINE_VISIBILITY
- void open(const filesystem::path& __p,
- ios_base::openmode __mode = ios_base::in) {
- return open(__p.c_str(), __mode);
- }
-#endif // _LIBCPP_STD_VER >= 17
-
- _LIBCPP_INLINE_VISIBILITY
- void __open(int __fd, ios_base::openmode __mode);
-#endif
- _LIBCPP_INLINE_VISIBILITY
- void close();
-
-private:
- basic_filebuf<char_type, traits_type> __sb_;
-};
-
-template <class _CharT, class _Traits>
-inline
-basic_ifstream<_CharT, _Traits>::basic_ifstream()
- : basic_istream<char_type, traits_type>(&__sb_)
-{
-}
-
-#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
-template <class _CharT, class _Traits>
-inline
-basic_ifstream<_CharT, _Traits>::basic_ifstream(const char* __s, ios_base::openmode __mode)
- : basic_istream<char_type, traits_type>(&__sb_)
-{
- if (__sb_.open(__s, __mode | ios_base::in) == 0)
- this->setstate(ios_base::failbit);
-}
-
-#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
-template <class _CharT, class _Traits>
-inline
-basic_ifstream<_CharT, _Traits>::basic_ifstream(const wchar_t* __s, ios_base::openmode __mode)
- : basic_istream<char_type, traits_type>(&__sb_)
-{
- if (__sb_.open(__s, __mode | ios_base::in) == 0)
- this->setstate(ios_base::failbit);
-}
-#endif
-
-template <class _CharT, class _Traits>
-inline
-basic_ifstream<_CharT, _Traits>::basic_ifstream(const string& __s, ios_base::openmode __mode)
- : basic_istream<char_type, traits_type>(&__sb_)
-{
- if (__sb_.open(__s, __mode | ios_base::in) == 0)
- this->setstate(ios_base::failbit);
-}
-#endif
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits>
-inline
-basic_ifstream<_CharT, _Traits>::basic_ifstream(basic_ifstream&& __rhs)
- : basic_istream<char_type, traits_type>(_VSTD::move(__rhs)),
- __sb_(_VSTD::move(__rhs.__sb_))
-{
- this->set_rdbuf(&__sb_);
-}
-
-template <class _CharT, class _Traits>
-inline
-basic_ifstream<_CharT, _Traits>&
-basic_ifstream<_CharT, _Traits>::operator=(basic_ifstream&& __rhs)
-{
- basic_istream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
- __sb_ = _VSTD::move(__rhs.__sb_);
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits>
-inline
-void
-basic_ifstream<_CharT, _Traits>::swap(basic_ifstream& __rhs)
-{
- basic_istream<char_type, traits_type>::swap(__rhs);
- __sb_.swap(__rhs.__sb_);
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(basic_ifstream<_CharT, _Traits>& __x, basic_ifstream<_CharT, _Traits>& __y)
-{
- __x.swap(__y);
-}
-
-template <class _CharT, class _Traits>
-inline
-basic_filebuf<_CharT, _Traits>*
-basic_ifstream<_CharT, _Traits>::rdbuf() const
-{
- return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
-}
-
-template <class _CharT, class _Traits>
-inline
-bool
-basic_ifstream<_CharT, _Traits>::is_open() const
-{
- return __sb_.is_open();
-}
-
-#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
-template <class _CharT, class _Traits>
-void
-basic_ifstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
-{
- if (__sb_.open(__s, __mode | ios_base::in))
- this->clear();
- else
- this->setstate(ios_base::failbit);
-}
-
-#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
-template <class _CharT, class _Traits>
-void
-basic_ifstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
-{
- if (__sb_.open(__s, __mode | ios_base::in))
- this->clear();
- else
- this->setstate(ios_base::failbit);
-}
-#endif
-
-template <class _CharT, class _Traits>
-void
-basic_ifstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
-{
- if (__sb_.open(__s, __mode | ios_base::in))
- this->clear();
- else
- this->setstate(ios_base::failbit);
-}
-
-template <class _CharT, class _Traits>
-void basic_ifstream<_CharT, _Traits>::__open(int __fd,
- ios_base::openmode __mode) {
- if (__sb_.__open(__fd, __mode | ios_base::in))
- this->clear();
- else
- this->setstate(ios_base::failbit);
-}
-#endif
-
-template <class _CharT, class _Traits>
-inline
-void
-basic_ifstream<_CharT, _Traits>::close()
-{
- if (__sb_.close() == 0)
- this->setstate(ios_base::failbit);
-}
-
-// basic_ofstream
-
-template <class _CharT, class _Traits>
-class _LIBCPP_TEMPLATE_VIS basic_ofstream
- : public basic_ostream<_CharT, _Traits>
-{
-public:
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- _LIBCPP_INLINE_VISIBILITY
- basic_ofstream();
- _LIBCPP_INLINE_VISIBILITY
- explicit basic_ofstream(const char* __s, ios_base::openmode __mode = ios_base::out);
-#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
- _LIBCPP_INLINE_VISIBILITY
- explicit basic_ofstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::out);
-#endif
- _LIBCPP_INLINE_VISIBILITY
- explicit basic_ofstream(const string& __s, ios_base::openmode __mode = ios_base::out);
-
-#if _LIBCPP_STD_VER >= 17
- _LIBCPP_INLINE_VISIBILITY
- explicit basic_ofstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::out)
- : basic_ofstream(__p.c_str(), __mode) {}
-#endif // _LIBCPP_STD_VER >= 17
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- basic_ofstream(basic_ofstream&& __rhs);
-
- _LIBCPP_INLINE_VISIBILITY
- basic_ofstream& operator=(basic_ofstream&& __rhs);
-#endif
- _LIBCPP_INLINE_VISIBILITY
- void swap(basic_ofstream& __rhs);
-
- _LIBCPP_INLINE_VISIBILITY
- basic_filebuf<char_type, traits_type>* rdbuf() const;
- _LIBCPP_INLINE_VISIBILITY
- bool is_open() const;
-#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
- void open(const char* __s, ios_base::openmode __mode = ios_base::out);
-#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
- void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::out);
-#endif
- void open(const string& __s, ios_base::openmode __mode = ios_base::out);
-
-#if _LIBCPP_STD_VER >= 17
- _LIBCPP_INLINE_VISIBILITY
- void open(const filesystem::path& __p, ios_base::openmode __mode = ios_base::out)
- { return open(__p.c_str(), __mode); }
-#endif // _LIBCPP_STD_VER >= 17
-
- _LIBCPP_INLINE_VISIBILITY
- void __open(int __fd, ios_base::openmode __mode);
-#endif
- _LIBCPP_INLINE_VISIBILITY
- void close();
-
-private:
- basic_filebuf<char_type, traits_type> __sb_;
-};
-
-template <class _CharT, class _Traits>
-inline
-basic_ofstream<_CharT, _Traits>::basic_ofstream()
- : basic_ostream<char_type, traits_type>(&__sb_)
-{
-}
-
-#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
-template <class _CharT, class _Traits>
-inline
-basic_ofstream<_CharT, _Traits>::basic_ofstream(const char* __s, ios_base::openmode __mode)
- : basic_ostream<char_type, traits_type>(&__sb_)
-{
- if (__sb_.open(__s, __mode | ios_base::out) == 0)
- this->setstate(ios_base::failbit);
-}
-
-#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
-template <class _CharT, class _Traits>
-inline
-basic_ofstream<_CharT, _Traits>::basic_ofstream(const wchar_t* __s, ios_base::openmode __mode)
- : basic_ostream<char_type, traits_type>(&__sb_)
-{
- if (__sb_.open(__s, __mode | ios_base::out) == 0)
- this->setstate(ios_base::failbit);
-}
-#endif
-
-template <class _CharT, class _Traits>
-inline
-basic_ofstream<_CharT, _Traits>::basic_ofstream(const string& __s, ios_base::openmode __mode)
- : basic_ostream<char_type, traits_type>(&__sb_)
-{
- if (__sb_.open(__s, __mode | ios_base::out) == 0)
- this->setstate(ios_base::failbit);
-}
-#endif
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits>
-inline
-basic_ofstream<_CharT, _Traits>::basic_ofstream(basic_ofstream&& __rhs)
- : basic_ostream<char_type, traits_type>(_VSTD::move(__rhs)),
- __sb_(_VSTD::move(__rhs.__sb_))
-{
- this->set_rdbuf(&__sb_);
-}
-
-template <class _CharT, class _Traits>
-inline
-basic_ofstream<_CharT, _Traits>&
-basic_ofstream<_CharT, _Traits>::operator=(basic_ofstream&& __rhs)
-{
- basic_ostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
- __sb_ = _VSTD::move(__rhs.__sb_);
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits>
-inline
-void
-basic_ofstream<_CharT, _Traits>::swap(basic_ofstream& __rhs)
-{
- basic_ostream<char_type, traits_type>::swap(__rhs);
- __sb_.swap(__rhs.__sb_);
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(basic_ofstream<_CharT, _Traits>& __x, basic_ofstream<_CharT, _Traits>& __y)
-{
- __x.swap(__y);
-}
-
-template <class _CharT, class _Traits>
-inline
-basic_filebuf<_CharT, _Traits>*
-basic_ofstream<_CharT, _Traits>::rdbuf() const
-{
- return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
-}
-
-template <class _CharT, class _Traits>
-inline
-bool
-basic_ofstream<_CharT, _Traits>::is_open() const
-{
- return __sb_.is_open();
-}
-
-#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
-template <class _CharT, class _Traits>
-void
-basic_ofstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
-{
- if (__sb_.open(__s, __mode | ios_base::out))
- this->clear();
- else
- this->setstate(ios_base::failbit);
-}
-
-#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
-template <class _CharT, class _Traits>
-void
-basic_ofstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
-{
- if (__sb_.open(__s, __mode | ios_base::out))
- this->clear();
- else
- this->setstate(ios_base::failbit);
-}
-#endif
-
-template <class _CharT, class _Traits>
-void
-basic_ofstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
-{
- if (__sb_.open(__s, __mode | ios_base::out))
- this->clear();
- else
- this->setstate(ios_base::failbit);
-}
-
-template <class _CharT, class _Traits>
-void basic_ofstream<_CharT, _Traits>::__open(int __fd,
- ios_base::openmode __mode) {
- if (__sb_.__open(__fd, __mode | ios_base::out))
- this->clear();
- else
- this->setstate(ios_base::failbit);
-}
-#endif
-
-template <class _CharT, class _Traits>
-inline
-void
-basic_ofstream<_CharT, _Traits>::close()
-{
- if (__sb_.close() == 0)
- this->setstate(ios_base::failbit);
-}
-
-// basic_fstream
-
-template <class _CharT, class _Traits>
-class _LIBCPP_TEMPLATE_VIS basic_fstream
- : public basic_iostream<_CharT, _Traits>
-{
-public:
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- _LIBCPP_INLINE_VISIBILITY
- basic_fstream();
-#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
- _LIBCPP_INLINE_VISIBILITY
- explicit basic_fstream(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
-#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
- _LIBCPP_INLINE_VISIBILITY
- explicit basic_fstream(const wchar_t* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
-#endif
- _LIBCPP_INLINE_VISIBILITY
- explicit basic_fstream(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
-
-#if _LIBCPP_STD_VER >= 17
- _LIBCPP_INLINE_VISIBILITY
- explicit basic_fstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in | ios_base::out)
- : basic_fstream(__p.c_str(), __mode) {}
-#endif // _LIBCPP_STD_VER >= 17
-
-#endif
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- basic_fstream(basic_fstream&& __rhs);
-
- _LIBCPP_INLINE_VISIBILITY
- basic_fstream& operator=(basic_fstream&& __rhs);
-#endif
- _LIBCPP_INLINE_VISIBILITY
- void swap(basic_fstream& __rhs);
-
- _LIBCPP_INLINE_VISIBILITY
- basic_filebuf<char_type, traits_type>* rdbuf() const;
- _LIBCPP_INLINE_VISIBILITY
- bool is_open() const;
-#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
- void open(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
-#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
- void open(const wchar_t* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
-#endif
- void open(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
-
-#if _LIBCPP_STD_VER >= 17
- _LIBCPP_INLINE_VISIBILITY
- void open(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in|ios_base::out)
- { return open(__p.c_str(), __mode); }
-#endif // _LIBCPP_STD_VER >= 17
-
-#endif
- _LIBCPP_INLINE_VISIBILITY
- void close();
-
-private:
- basic_filebuf<char_type, traits_type> __sb_;
-};
-
-template <class _CharT, class _Traits>
-inline
-basic_fstream<_CharT, _Traits>::basic_fstream()
- : basic_iostream<char_type, traits_type>(&__sb_)
-{
-}
-
-#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
-template <class _CharT, class _Traits>
-inline
-basic_fstream<_CharT, _Traits>::basic_fstream(const char* __s, ios_base::openmode __mode)
- : basic_iostream<char_type, traits_type>(&__sb_)
-{
- if (__sb_.open(__s, __mode) == 0)
- this->setstate(ios_base::failbit);
-}
-
-#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
-template <class _CharT, class _Traits>
-inline
-basic_fstream<_CharT, _Traits>::basic_fstream(const wchar_t* __s, ios_base::openmode __mode)
- : basic_iostream<char_type, traits_type>(&__sb_)
-{
- if (__sb_.open(__s, __mode) == 0)
- this->setstate(ios_base::failbit);
-}
-#endif
-
-template <class _CharT, class _Traits>
-inline
-basic_fstream<_CharT, _Traits>::basic_fstream(const string& __s, ios_base::openmode __mode)
- : basic_iostream<char_type, traits_type>(&__sb_)
-{
- if (__sb_.open(__s, __mode) == 0)
- this->setstate(ios_base::failbit);
-}
-#endif
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits>
-inline
-basic_fstream<_CharT, _Traits>::basic_fstream(basic_fstream&& __rhs)
- : basic_iostream<char_type, traits_type>(_VSTD::move(__rhs)),
- __sb_(_VSTD::move(__rhs.__sb_))
-{
- this->set_rdbuf(&__sb_);
-}
-
-template <class _CharT, class _Traits>
-inline
-basic_fstream<_CharT, _Traits>&
-basic_fstream<_CharT, _Traits>::operator=(basic_fstream&& __rhs)
-{
- basic_iostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
- __sb_ = _VSTD::move(__rhs.__sb_);
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits>
-inline
-void
-basic_fstream<_CharT, _Traits>::swap(basic_fstream& __rhs)
-{
- basic_iostream<char_type, traits_type>::swap(__rhs);
- __sb_.swap(__rhs.__sb_);
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(basic_fstream<_CharT, _Traits>& __x, basic_fstream<_CharT, _Traits>& __y)
-{
- __x.swap(__y);
-}
-
-template <class _CharT, class _Traits>
-inline
-basic_filebuf<_CharT, _Traits>*
-basic_fstream<_CharT, _Traits>::rdbuf() const
-{
- return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_);
-}
-
-template <class _CharT, class _Traits>
-inline
-bool
-basic_fstream<_CharT, _Traits>::is_open() const
-{
- return __sb_.is_open();
-}
-
-#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
-template <class _CharT, class _Traits>
-void
-basic_fstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
-{
- if (__sb_.open(__s, __mode))
- this->clear();
- else
- this->setstate(ios_base::failbit);
-}
-
-#ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
-template <class _CharT, class _Traits>
-void
-basic_fstream<_CharT, _Traits>::open(const wchar_t* __s, ios_base::openmode __mode)
-{
- if (__sb_.open(__s, __mode))
- this->clear();
- else
- this->setstate(ios_base::failbit);
-}
-#endif
-
-template <class _CharT, class _Traits>
-void
-basic_fstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
-{
- if (__sb_.open(__s, __mode))
- this->clear();
- else
- this->setstate(ios_base::failbit);
-}
-#endif
-
-template <class _CharT, class _Traits>
-inline
-void
-basic_fstream<_CharT, _Traits>::close()
-{
- if (__sb_.close() == 0)
- this->setstate(ios_base::failbit);
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_FSTREAM
diff --git a/lib/libcxx/include/functional b/lib/libcxx/include/functional
deleted file mode 100644
index 95491879b0c..00000000000
--- a/lib/libcxx/include/functional
+++ /dev/null
@@ -1,2970 +0,0 @@
-// -*- C++ -*-
-//===------------------------ functional ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_FUNCTIONAL
-#define _LIBCPP_FUNCTIONAL
-
-/*
- functional synopsis
-
-namespace std
-{
-
-template <class Arg, class Result>
-struct unary_function
-{
- typedef Arg argument_type;
- typedef Result result_type;
-};
-
-template <class Arg1, class Arg2, class Result>
-struct binary_function
-{
- typedef Arg1 first_argument_type;
- typedef Arg2 second_argument_type;
- typedef Result result_type;
-};
-
-template <class T>
-class reference_wrapper
- : public unary_function<T1, R> // if wrapping a unary functor
- : public binary_function<T1, T2, R> // if wraping a binary functor
-{
-public:
- // types
- typedef T type;
- typedef see below result_type; // Not always defined
-
- // construct/copy/destroy
- reference_wrapper(T&) noexcept;
- reference_wrapper(T&&) = delete; // do not bind to temps
- reference_wrapper(const reference_wrapper<T>& x) noexcept;
-
- // assignment
- reference_wrapper& operator=(const reference_wrapper<T>& x) noexcept;
-
- // access
- operator T& () const noexcept;
- T& get() const noexcept;
-
- // invoke
- template <class... ArgTypes>
- typename result_of<T&(ArgTypes&&...)>::type
- operator() (ArgTypes&&...) const;
-};
-
-template <class T> reference_wrapper<T> ref(T& t) noexcept;
-template <class T> void ref(const T&& t) = delete;
-template <class T> reference_wrapper<T> ref(reference_wrapper<T>t) noexcept;
-
-template <class T> reference_wrapper<const T> cref(const T& t) noexcept;
-template <class T> void cref(const T&& t) = delete;
-template <class T> reference_wrapper<const T> cref(reference_wrapper<T> t) noexcept;
-
-template <class T> struct unwrap_reference; // since C++20
-template <class T> struct unwrap_ref_decay : unwrap_reference<decay_t<T>> { }; // since C++20
-template <class T> using unwrap_reference_t = typename unwrap_reference<T>::type; // since C++20
-template <class T> using unwrap_ref_decay_t = typename unwrap_ref_decay<T>::type; // since C++20
-
-template <class T> // <class T=void> in C++14
-struct plus : binary_function<T, T, T>
-{
- T operator()(const T& x, const T& y) const;
-};
-
-template <class T> // <class T=void> in C++14
-struct minus : binary_function<T, T, T>
-{
- T operator()(const T& x, const T& y) const;
-};
-
-template <class T> // <class T=void> in C++14
-struct multiplies : binary_function<T, T, T>
-{
- T operator()(const T& x, const T& y) const;
-};
-
-template <class T> // <class T=void> in C++14
-struct divides : binary_function<T, T, T>
-{
- T operator()(const T& x, const T& y) const;
-};
-
-template <class T> // <class T=void> in C++14
-struct modulus : binary_function<T, T, T>
-{
- T operator()(const T& x, const T& y) const;
-};
-
-template <class T> // <class T=void> in C++14
-struct negate : unary_function<T, T>
-{
- T operator()(const T& x) const;
-};
-
-template <class T> // <class T=void> in C++14
-struct equal_to : binary_function<T, T, bool>
-{
- bool operator()(const T& x, const T& y) const;
-};
-
-template <class T> // <class T=void> in C++14
-struct not_equal_to : binary_function<T, T, bool>
-{
- bool operator()(const T& x, const T& y) const;
-};
-
-template <class T> // <class T=void> in C++14
-struct greater : binary_function<T, T, bool>
-{
- bool operator()(const T& x, const T& y) const;
-};
-
-template <class T> // <class T=void> in C++14
-struct less : binary_function<T, T, bool>
-{
- bool operator()(const T& x, const T& y) const;
-};
-
-template <class T> // <class T=void> in C++14
-struct greater_equal : binary_function<T, T, bool>
-{
- bool operator()(const T& x, const T& y) const;
-};
-
-template <class T> // <class T=void> in C++14
-struct less_equal : binary_function<T, T, bool>
-{
- bool operator()(const T& x, const T& y) const;
-};
-
-template <class T> // <class T=void> in C++14
-struct logical_and : binary_function<T, T, bool>
-{
- bool operator()(const T& x, const T& y) const;
-};
-
-template <class T> // <class T=void> in C++14
-struct logical_or : binary_function<T, T, bool>
-{
- bool operator()(const T& x, const T& y) const;
-};
-
-template <class T> // <class T=void> in C++14
-struct logical_not : unary_function<T, bool>
-{
- bool operator()(const T& x) const;
-};
-
-template <class T> // <class T=void> in C++14
-struct bit_and : unary_function<T, bool>
-{
- bool operator()(const T& x, const T& y) const;
-};
-
-template <class T> // <class T=void> in C++14
-struct bit_or : unary_function<T, bool>
-{
- bool operator()(const T& x, const T& y) const;
-};
-
-template <class T> // <class T=void> in C++14
-struct bit_xor : unary_function<T, bool>
-{
- bool operator()(const T& x, const T& y) const;
-};
-
-template <class T=void> // C++14
-struct bit_xor : unary_function<T, bool>
-{
- bool operator()(const T& x) const;
-};
-
-template <class Predicate>
-class unary_negate // deprecated in C++17
- : public unary_function<typename Predicate::argument_type, bool>
-{
-public:
- explicit unary_negate(const Predicate& pred);
- bool operator()(const typename Predicate::argument_type& x) const;
-};
-
-template <class Predicate> // deprecated in C++17
-unary_negate<Predicate> not1(const Predicate& pred);
-
-template <class Predicate>
-class binary_negate // deprecated in C++17
- : public binary_function<typename Predicate::first_argument_type,
- typename Predicate::second_argument_type,
- bool>
-{
-public:
- explicit binary_negate(const Predicate& pred);
- bool operator()(const typename Predicate::first_argument_type& x,
- const typename Predicate::second_argument_type& y) const;
-};
-
-template <class Predicate> // deprecated in C++17
-binary_negate<Predicate> not2(const Predicate& pred);
-
-template <class F> unspecified not_fn(F&& f); // C++17
-
-template<class T> struct is_bind_expression;
-template<class T> struct is_placeholder;
-
- // See C++14 20.9.9, Function object binders
-template <class T> inline constexpr bool is_bind_expression_v
- = is_bind_expression<T>::value; // C++17
-template <class T> inline constexpr int is_placeholder_v
- = is_placeholder<T>::value; // C++17
-
-
-template<class Fn, class... BoundArgs>
- unspecified bind(Fn&&, BoundArgs&&...);
-template<class R, class Fn, class... BoundArgs>
- unspecified bind(Fn&&, BoundArgs&&...);
-
-namespace placeholders {
- // M is the implementation-defined number of placeholders
- extern unspecified _1;
- extern unspecified _2;
- .
- .
- .
- extern unspecified _Mp;
-}
-
-template <class Operation>
-class binder1st // deprecated in C++11, removed in C++17
- : public unary_function<typename Operation::second_argument_type,
- typename Operation::result_type>
-{
-protected:
- Operation op;
- typename Operation::first_argument_type value;
-public:
- binder1st(const Operation& x, const typename Operation::first_argument_type y);
- typename Operation::result_type operator()( typename Operation::second_argument_type& x) const;
- typename Operation::result_type operator()(const typename Operation::second_argument_type& x) const;
-};
-
-template <class Operation, class T>
-binder1st<Operation> bind1st(const Operation& op, const T& x); // deprecated in C++11, removed in C++17
-
-template <class Operation>
-class binder2nd // deprecated in C++11, removed in C++17
- : public unary_function<typename Operation::first_argument_type,
- typename Operation::result_type>
-{
-protected:
- Operation op;
- typename Operation::second_argument_type value;
-public:
- binder2nd(const Operation& x, const typename Operation::second_argument_type y);
- typename Operation::result_type operator()( typename Operation::first_argument_type& x) const;
- typename Operation::result_type operator()(const typename Operation::first_argument_type& x) const;
-};
-
-template <class Operation, class T>
-binder2nd<Operation> bind2nd(const Operation& op, const T& x); // deprecated in C++11, removed in C++17
-
-template <class Arg, class Result> // deprecated in C++11, removed in C++17
-class pointer_to_unary_function : public unary_function<Arg, Result>
-{
-public:
- explicit pointer_to_unary_function(Result (*f)(Arg));
- Result operator()(Arg x) const;
-};
-
-template <class Arg, class Result>
-pointer_to_unary_function<Arg,Result> ptr_fun(Result (*f)(Arg)); // deprecated in C++11, removed in C++17
-
-template <class Arg1, class Arg2, class Result> // deprecated in C++11, removed in C++17
-class pointer_to_binary_function : public binary_function<Arg1, Arg2, Result>
-{
-public:
- explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2));
- Result operator()(Arg1 x, Arg2 y) const;
-};
-
-template <class Arg1, class Arg2, class Result>
-pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*f)(Arg1,Arg2)); // deprecated in C++11, removed in C++17
-
-template<class S, class T> // deprecated in C++11, removed in C++17
-class mem_fun_t : public unary_function<T*, S>
-{
-public:
- explicit mem_fun_t(S (T::*p)());
- S operator()(T* p) const;
-};
-
-template<class S, class T, class A>
-class mem_fun1_t : public binary_function<T*, A, S> // deprecated in C++11, removed in C++17
-{
-public:
- explicit mem_fun1_t(S (T::*p)(A));
- S operator()(T* p, A x) const;
-};
-
-template<class S, class T> mem_fun_t<S,T> mem_fun(S (T::*f)()); // deprecated in C++11, removed in C++17
-template<class S, class T, class A> mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A)); // deprecated in C++11, removed in C++17
-
-template<class S, class T>
-class mem_fun_ref_t : public unary_function<T, S> // deprecated in C++11, removed in C++17
-{
-public:
- explicit mem_fun_ref_t(S (T::*p)());
- S operator()(T& p) const;
-};
-
-template<class S, class T, class A>
-class mem_fun1_ref_t : public binary_function<T, A, S> // deprecated in C++11, removed in C++17
-{
-public:
- explicit mem_fun1_ref_t(S (T::*p)(A));
- S operator()(T& p, A x) const;
-};
-
-template<class S, class T> mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)()); // deprecated in C++11, removed in C++17
-template<class S, class T, class A> mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A)); // deprecated in C++11, removed in C++17
-
-template <class S, class T>
-class const_mem_fun_t : public unary_function<const T*, S> // deprecated in C++11, removed in C++17
-{
-public:
- explicit const_mem_fun_t(S (T::*p)() const);
- S operator()(const T* p) const;
-};
-
-template <class S, class T, class A>
-class const_mem_fun1_t : public binary_function<const T*, A, S> // deprecated in C++11, removed in C++17
-{
-public:
- explicit const_mem_fun1_t(S (T::*p)(A) const);
- S operator()(const T* p, A x) const;
-};
-
-template <class S, class T> const_mem_fun_t<S,T> mem_fun(S (T::*f)() const); // deprecated in C++11, removed in C++17
-template <class S, class T, class A> const_mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A) const); // deprecated in C++11, removed in C++17
-
-template <class S, class T>
-class const_mem_fun_ref_t : public unary_function<T, S> // deprecated in C++11, removed in C++17
-{
-public:
- explicit const_mem_fun_ref_t(S (T::*p)() const);
- S operator()(const T& p) const;
-};
-
-template <class S, class T, class A>
-class const_mem_fun1_ref_t : public binary_function<T, A, S> // deprecated in C++11, removed in C++17
-{
-public:
- explicit const_mem_fun1_ref_t(S (T::*p)(A) const);
- S operator()(const T& p, A x) const;
-};
-
-template <class S, class T> const_mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)() const); // deprecated in C++11, removed in C++17
-template <class S, class T, class A> const_mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A) const); // deprecated in C++11, removed in C++17
-
-template<class R, class T> unspecified mem_fn(R T::*);
-
-class bad_function_call
- : public exception
-{
-};
-
-template<class> class function; // undefined
-
-template<class R, class... ArgTypes>
-class function<R(ArgTypes...)>
- : public unary_function<T1, R> // iff sizeof...(ArgTypes) == 1 and
- // ArgTypes contains T1
- : public binary_function<T1, T2, R> // iff sizeof...(ArgTypes) == 2 and
- // ArgTypes contains T1 and T2
-{
-public:
- typedef R result_type;
-
- // construct/copy/destroy:
- function() noexcept;
- function(nullptr_t) noexcept;
- function(const function&);
- function(function&&) noexcept;
- template<class F>
- function(F);
- template<Allocator Alloc>
- function(allocator_arg_t, const Alloc&) noexcept; // removed in C++17
- template<Allocator Alloc>
- function(allocator_arg_t, const Alloc&, nullptr_t) noexcept; // removed in C++17
- template<Allocator Alloc>
- function(allocator_arg_t, const Alloc&, const function&); // removed in C++17
- template<Allocator Alloc>
- function(allocator_arg_t, const Alloc&, function&&); // removed in C++17
- template<class F, Allocator Alloc>
- function(allocator_arg_t, const Alloc&, F); // removed in C++17
-
- function& operator=(const function&);
- function& operator=(function&&) noexcept;
- function& operator=(nullptr_t) noexcept;
- template<class F>
- function& operator=(F&&);
- template<class F>
- function& operator=(reference_wrapper<F>) noexcept;
-
- ~function();
-
- // function modifiers:
- void swap(function&) noexcept;
- template<class F, class Alloc>
- void assign(F&&, const Alloc&); // Removed in C++17
-
- // function capacity:
- explicit operator bool() const noexcept;
-
- // function invocation:
- R operator()(ArgTypes...) const;
-
- // function target access:
- const std::type_info& target_type() const noexcept;
- template <typename T> T* target() noexcept;
- template <typename T> const T* target() const noexcept;
-};
-
-// Null pointer comparisons:
-template <class R, class ... ArgTypes>
- bool operator==(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
-
-template <class R, class ... ArgTypes>
- bool operator==(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
-
-template <class R, class ... ArgTypes>
- bool operator!=(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
-
-template <class R, class ... ArgTypes>
- bool operator!=(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
-
-// specialized algorithms:
-template <class R, class ... ArgTypes>
- void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&) noexcept;
-
-template <class T> struct hash;
-
-template <> struct hash<bool>;
-template <> struct hash<char>;
-template <> struct hash<signed char>;
-template <> struct hash<unsigned char>;
-template <> struct hash<char16_t>;
-template <> struct hash<char32_t>;
-template <> struct hash<wchar_t>;
-template <> struct hash<short>;
-template <> struct hash<unsigned short>;
-template <> struct hash<int>;
-template <> struct hash<unsigned int>;
-template <> struct hash<long>;
-template <> struct hash<long long>;
-template <> struct hash<unsigned long>;
-template <> struct hash<unsigned long long>;
-
-template <> struct hash<float>;
-template <> struct hash<double>;
-template <> struct hash<long double>;
-
-template<class T> struct hash<T*>;
-template <> struct hash<nullptr_t>; // C++17
-
-} // std
-
-POLICY: For non-variadic implementations, the number of arguments is limited
- to 3. It is hoped that the need for non-variadic implementations
- will be minimal.
-
-*/
-
-#include <__config>
-#include <type_traits>
-#include <typeinfo>
-#include <exception>
-#include <memory>
-#include <tuple>
-#include <utility>
-#include <version>
-
-#include <__functional_base>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS plus : binary_function<_Tp, _Tp, _Tp>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x + __y;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS plus<void>
-{
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
-};
-#endif
-
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS minus : binary_function<_Tp, _Tp, _Tp>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x - __y;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS minus<void>
-{
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
-};
-#endif
-
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS multiplies : binary_function<_Tp, _Tp, _Tp>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x * __y;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS multiplies<void>
-{
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
-};
-#endif
-
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS divides : binary_function<_Tp, _Tp, _Tp>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x / __y;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS divides<void>
-{
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
-};
-#endif
-
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS modulus : binary_function<_Tp, _Tp, _Tp>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x % __y;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS modulus<void>
-{
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
-};
-#endif
-
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS negate : unary_function<_Tp, _Tp>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return -__x;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS negate<void>
-{
- template <class _Tp>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_Tp&& __x) const
- _NOEXCEPT_(noexcept(- _VSTD::forward<_Tp>(__x)))
- -> decltype (- _VSTD::forward<_Tp>(__x))
- { return - _VSTD::forward<_Tp>(__x); }
- typedef void is_transparent;
-};
-#endif
-
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS equal_to : binary_function<_Tp, _Tp, bool>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return __x == __y;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS equal_to<void>
-{
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
-};
-#endif
-
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS not_equal_to : binary_function<_Tp, _Tp, bool>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return __x != __y;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS not_equal_to<void>
-{
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
-};
-#endif
-
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS greater : binary_function<_Tp, _Tp, bool>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return __x > __y;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS greater<void>
-{
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
-};
-#endif
-
-
-// less in <__functional_base>
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS greater_equal : binary_function<_Tp, _Tp, bool>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return __x >= __y;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS greater_equal<void>
-{
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
-};
-#endif
-
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS less_equal : binary_function<_Tp, _Tp, bool>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return __x <= __y;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS less_equal<void>
-{
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
-};
-#endif
-
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS logical_and : binary_function<_Tp, _Tp, bool>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return __x && __y;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS logical_and<void>
-{
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
-};
-#endif
-
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS logical_or : binary_function<_Tp, _Tp, bool>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return __x || __y;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS logical_or<void>
-{
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
-};
-#endif
-
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS logical_not : unary_function<_Tp, bool>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x) const
- {return !__x;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS logical_not<void>
-{
- template <class _Tp>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_Tp&& __x) const
- _NOEXCEPT_(noexcept(!_VSTD::forward<_Tp>(__x)))
- -> decltype (!_VSTD::forward<_Tp>(__x))
- { return !_VSTD::forward<_Tp>(__x); }
- typedef void is_transparent;
-};
-#endif
-
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS bit_and : binary_function<_Tp, _Tp, _Tp>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x & __y;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS bit_and<void>
-{
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
-};
-#endif
-
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS bit_or : binary_function<_Tp, _Tp, _Tp>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x | __y;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS bit_or<void>
-{
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
-};
-#endif
-
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS bit_xor : binary_function<_Tp, _Tp, _Tp>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x ^ __y;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS bit_xor<void>
-{
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
-};
-#endif
-
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-struct _LIBCPP_TEMPLATE_VIS bit_not : unary_function<_Tp, _Tp>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return ~__x;}
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS bit_not<void>
-{
- template <class _Tp>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_Tp&& __x) const
- _NOEXCEPT_(noexcept(~_VSTD::forward<_Tp>(__x)))
- -> decltype (~_VSTD::forward<_Tp>(__x))
- { return ~_VSTD::forward<_Tp>(__x); }
- typedef void is_transparent;
-};
-#endif
-
-template <class _Predicate>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 unary_negate
- : public unary_function<typename _Predicate::argument_type, bool>
-{
- _Predicate __pred_;
-public:
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- explicit unary_negate(const _Predicate& __pred)
- : __pred_(__pred) {}
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const typename _Predicate::argument_type& __x) const
- {return !__pred_(__x);}
-};
-
-template <class _Predicate>
-_LIBCPP_DEPRECATED_IN_CXX17 inline _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-unary_negate<_Predicate>
-not1(const _Predicate& __pred) {return unary_negate<_Predicate>(__pred);}
-
-template <class _Predicate>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 binary_negate
- : public binary_function<typename _Predicate::first_argument_type,
- typename _Predicate::second_argument_type,
- bool>
-{
- _Predicate __pred_;
-public:
- _LIBCPP_INLINE_VISIBILITY explicit _LIBCPP_CONSTEXPR_AFTER_CXX11
- binary_negate(const _Predicate& __pred) : __pred_(__pred) {}
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const typename _Predicate::first_argument_type& __x,
- const typename _Predicate::second_argument_type& __y) const
- {return !__pred_(__x, __y);}
-};
-
-template <class _Predicate>
-_LIBCPP_DEPRECATED_IN_CXX17 inline _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-binary_negate<_Predicate>
-not2(const _Predicate& __pred) {return binary_negate<_Predicate>(__pred);}
-
-#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS)
-template <class __Operation>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 binder1st
- : public unary_function<typename __Operation::second_argument_type,
- typename __Operation::result_type>
-{
-protected:
- __Operation op;
- typename __Operation::first_argument_type value;
-public:
- _LIBCPP_INLINE_VISIBILITY binder1st(const __Operation& __x,
- const typename __Operation::first_argument_type __y)
- : op(__x), value(__y) {}
- _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
- (typename __Operation::second_argument_type& __x) const
- {return op(value, __x);}
- _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
- (const typename __Operation::second_argument_type& __x) const
- {return op(value, __x);}
-};
-
-template <class __Operation, class _Tp>
-_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
-binder1st<__Operation>
-bind1st(const __Operation& __op, const _Tp& __x)
- {return binder1st<__Operation>(__op, __x);}
-
-template <class __Operation>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 binder2nd
- : public unary_function<typename __Operation::first_argument_type,
- typename __Operation::result_type>
-{
-protected:
- __Operation op;
- typename __Operation::second_argument_type value;
-public:
- _LIBCPP_INLINE_VISIBILITY
- binder2nd(const __Operation& __x, const typename __Operation::second_argument_type __y)
- : op(__x), value(__y) {}
- _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
- ( typename __Operation::first_argument_type& __x) const
- {return op(__x, value);}
- _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator()
- (const typename __Operation::first_argument_type& __x) const
- {return op(__x, value);}
-};
-
-template <class __Operation, class _Tp>
-_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
-binder2nd<__Operation>
-bind2nd(const __Operation& __op, const _Tp& __x)
- {return binder2nd<__Operation>(__op, __x);}
-
-template <class _Arg, class _Result>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 pointer_to_unary_function
- : public unary_function<_Arg, _Result>
-{
- _Result (*__f_)(_Arg);
-public:
- _LIBCPP_INLINE_VISIBILITY explicit pointer_to_unary_function(_Result (*__f)(_Arg))
- : __f_(__f) {}
- _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg __x) const
- {return __f_(__x);}
-};
-
-template <class _Arg, class _Result>
-_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
-pointer_to_unary_function<_Arg,_Result>
-ptr_fun(_Result (*__f)(_Arg))
- {return pointer_to_unary_function<_Arg,_Result>(__f);}
-
-template <class _Arg1, class _Arg2, class _Result>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 pointer_to_binary_function
- : public binary_function<_Arg1, _Arg2, _Result>
-{
- _Result (*__f_)(_Arg1, _Arg2);
-public:
- _LIBCPP_INLINE_VISIBILITY explicit pointer_to_binary_function(_Result (*__f)(_Arg1, _Arg2))
- : __f_(__f) {}
- _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg1 __x, _Arg2 __y) const
- {return __f_(__x, __y);}
-};
-
-template <class _Arg1, class _Arg2, class _Result>
-_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
-pointer_to_binary_function<_Arg1,_Arg2,_Result>
-ptr_fun(_Result (*__f)(_Arg1,_Arg2))
- {return pointer_to_binary_function<_Arg1,_Arg2,_Result>(__f);}
-
-template<class _Sp, class _Tp>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun_t
- : public unary_function<_Tp*, _Sp>
-{
- _Sp (_Tp::*__p_)();
-public:
- _LIBCPP_INLINE_VISIBILITY explicit mem_fun_t(_Sp (_Tp::*__p)())
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p) const
- {return (__p->*__p_)();}
-};
-
-template<class _Sp, class _Tp, class _Ap>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun1_t
- : public binary_function<_Tp*, _Ap, _Sp>
-{
- _Sp (_Tp::*__p_)(_Ap);
-public:
- _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_t(_Sp (_Tp::*__p)(_Ap))
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p, _Ap __x) const
- {return (__p->*__p_)(__x);}
-};
-
-template<class _Sp, class _Tp>
-_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
-mem_fun_t<_Sp,_Tp>
-mem_fun(_Sp (_Tp::*__f)())
- {return mem_fun_t<_Sp,_Tp>(__f);}
-
-template<class _Sp, class _Tp, class _Ap>
-_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
-mem_fun1_t<_Sp,_Tp,_Ap>
-mem_fun(_Sp (_Tp::*__f)(_Ap))
- {return mem_fun1_t<_Sp,_Tp,_Ap>(__f);}
-
-template<class _Sp, class _Tp>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun_ref_t
- : public unary_function<_Tp, _Sp>
-{
- _Sp (_Tp::*__p_)();
-public:
- _LIBCPP_INLINE_VISIBILITY explicit mem_fun_ref_t(_Sp (_Tp::*__p)())
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p) const
- {return (__p.*__p_)();}
-};
-
-template<class _Sp, class _Tp, class _Ap>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun1_ref_t
- : public binary_function<_Tp, _Ap, _Sp>
-{
- _Sp (_Tp::*__p_)(_Ap);
-public:
- _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap))
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p, _Ap __x) const
- {return (__p.*__p_)(__x);}
-};
-
-template<class _Sp, class _Tp>
-_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
-mem_fun_ref_t<_Sp,_Tp>
-mem_fun_ref(_Sp (_Tp::*__f)())
- {return mem_fun_ref_t<_Sp,_Tp>(__f);}
-
-template<class _Sp, class _Tp, class _Ap>
-_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
-mem_fun1_ref_t<_Sp,_Tp,_Ap>
-mem_fun_ref(_Sp (_Tp::*__f)(_Ap))
- {return mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);}
-
-template <class _Sp, class _Tp>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun_t
- : public unary_function<const _Tp*, _Sp>
-{
- _Sp (_Tp::*__p_)() const;
-public:
- _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_t(_Sp (_Tp::*__p)() const)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p) const
- {return (__p->*__p_)();}
-};
-
-template <class _Sp, class _Tp, class _Ap>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun1_t
- : public binary_function<const _Tp*, _Ap, _Sp>
-{
- _Sp (_Tp::*__p_)(_Ap) const;
-public:
- _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_t(_Sp (_Tp::*__p)(_Ap) const)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p, _Ap __x) const
- {return (__p->*__p_)(__x);}
-};
-
-template <class _Sp, class _Tp>
-_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
-const_mem_fun_t<_Sp,_Tp>
-mem_fun(_Sp (_Tp::*__f)() const)
- {return const_mem_fun_t<_Sp,_Tp>(__f);}
-
-template <class _Sp, class _Tp, class _Ap>
-_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
-const_mem_fun1_t<_Sp,_Tp,_Ap>
-mem_fun(_Sp (_Tp::*__f)(_Ap) const)
- {return const_mem_fun1_t<_Sp,_Tp,_Ap>(__f);}
-
-template <class _Sp, class _Tp>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun_ref_t
- : public unary_function<_Tp, _Sp>
-{
- _Sp (_Tp::*__p_)() const;
-public:
- _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_ref_t(_Sp (_Tp::*__p)() const)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p) const
- {return (__p.*__p_)();}
-};
-
-template <class _Sp, class _Tp, class _Ap>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun1_ref_t
- : public binary_function<_Tp, _Ap, _Sp>
-{
- _Sp (_Tp::*__p_)(_Ap) const;
-public:
- _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap) const)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p, _Ap __x) const
- {return (__p.*__p_)(__x);}
-};
-
-template <class _Sp, class _Tp>
-_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
-const_mem_fun_ref_t<_Sp,_Tp>
-mem_fun_ref(_Sp (_Tp::*__f)() const)
- {return const_mem_fun_ref_t<_Sp,_Tp>(__f);}
-
-template <class _Sp, class _Tp, class _Ap>
-_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY
-const_mem_fun1_ref_t<_Sp,_Tp,_Ap>
-mem_fun_ref(_Sp (_Tp::*__f)(_Ap) const)
- {return const_mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);}
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-// MEMFUN
-//==============================================================================
-
-template <class _Tp>
-class __mem_fn
- : public __weak_result_type<_Tp>
-{
-public:
- // types
- typedef _Tp type;
-private:
- type __f_;
-
-public:
- _LIBCPP_INLINE_VISIBILITY __mem_fn(type __f) _NOEXCEPT : __f_(__f) {}
-
-#ifndef _LIBCPP_CXX03_LANG
- // invoke
- template <class... _ArgTypes>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return<type, _ArgTypes...>::type
- operator() (_ArgTypes&&... __args) const {
- return __invoke(__f_, _VSTD::forward<_ArgTypes>(__args)...);
- }
-#else
-
- template <class _A0>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return0<type, _A0>::type
- operator() (_A0& __a0) const {
- return __invoke(__f_, __a0);
- }
-
- template <class _A0>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return0<type, _A0 const>::type
- operator() (_A0 const& __a0) const {
- return __invoke(__f_, __a0);
- }
-
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return1<type, _A0, _A1>::type
- operator() (_A0& __a0, _A1& __a1) const {
- return __invoke(__f_, __a0, __a1);
- }
-
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return1<type, _A0 const, _A1>::type
- operator() (_A0 const& __a0, _A1& __a1) const {
- return __invoke(__f_, __a0, __a1);
- }
-
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return1<type, _A0, _A1 const>::type
- operator() (_A0& __a0, _A1 const& __a1) const {
- return __invoke(__f_, __a0, __a1);
- }
-
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return1<type, _A0 const, _A1 const>::type
- operator() (_A0 const& __a0, _A1 const& __a1) const {
- return __invoke(__f_, __a0, __a1);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0, _A1, _A2>::type
- operator() (_A0& __a0, _A1& __a1, _A2& __a2) const {
- return __invoke(__f_, __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0 const, _A1, _A2>::type
- operator() (_A0 const& __a0, _A1& __a1, _A2& __a2) const {
- return __invoke(__f_, __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0, _A1 const, _A2>::type
- operator() (_A0& __a0, _A1 const& __a1, _A2& __a2) const {
- return __invoke(__f_, __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0, _A1, _A2 const>::type
- operator() (_A0& __a0, _A1& __a1, _A2 const& __a2) const {
- return __invoke(__f_, __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0 const, _A1 const, _A2>::type
- operator() (_A0 const& __a0, _A1 const& __a1, _A2& __a2) const {
- return __invoke(__f_, __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0 const, _A1, _A2 const>::type
- operator() (_A0 const& __a0, _A1& __a1, _A2 const& __a2) const {
- return __invoke(__f_, __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0, _A1 const, _A2 const>::type
- operator() (_A0& __a0, _A1 const& __a1, _A2 const& __a2) const {
- return __invoke(__f_, __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0 const, _A1 const, _A2 const>::type
- operator() (_A0 const& __a0, _A1 const& __a1, _A2 const& __a2) const {
- return __invoke(__f_, __a0, __a1, __a2);
- }
-#endif
-};
-
-template<class _Rp, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-__mem_fn<_Rp _Tp::*>
-mem_fn(_Rp _Tp::* __pm) _NOEXCEPT
-{
- return __mem_fn<_Rp _Tp::*>(__pm);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// FUNCTION
-//==============================================================================
-
-// bad_function_call
-
-class _LIBCPP_EXCEPTION_ABI bad_function_call
- : public exception
-{
-#ifdef _LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION
-public:
- virtual ~bad_function_call() _NOEXCEPT;
-
- virtual const char* what() const _NOEXCEPT;
-#endif
-};
-
-_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
-void __throw_bad_function_call()
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- throw bad_function_call();
-#else
- _VSTD::abort();
-#endif
-}
-
-template<class _Fp> class _LIBCPP_TEMPLATE_VIS function; // undefined
-
-namespace __function
-{
-
-template<class _Rp>
-struct __maybe_derive_from_unary_function
-{
-};
-
-template<class _Rp, class _A1>
-struct __maybe_derive_from_unary_function<_Rp(_A1)>
- : public unary_function<_A1, _Rp>
-{
-};
-
-template<class _Rp>
-struct __maybe_derive_from_binary_function
-{
-};
-
-template<class _Rp, class _A1, class _A2>
-struct __maybe_derive_from_binary_function<_Rp(_A1, _A2)>
- : public binary_function<_A1, _A2, _Rp>
-{
-};
-
-template <class _Fp>
-_LIBCPP_INLINE_VISIBILITY
-bool __not_null(_Fp const&) { return true; }
-
-template <class _Fp>
-_LIBCPP_INLINE_VISIBILITY
-bool __not_null(_Fp* __ptr) { return __ptr; }
-
-template <class _Ret, class _Class>
-_LIBCPP_INLINE_VISIBILITY
-bool __not_null(_Ret _Class::*__ptr) { return __ptr; }
-
-template <class _Fp>
-_LIBCPP_INLINE_VISIBILITY
-bool __not_null(function<_Fp> const& __f) { return !!__f; }
-
-} // namespace __function
-
-#ifndef _LIBCPP_CXX03_LANG
-
-namespace __function {
-
-// __alloc_func holds a functor and an allocator.
-
-template <class _Fp, class _Ap, class _FB> class __alloc_func;
-
-template <class _Fp, class _Ap, class _Rp, class... _ArgTypes>
-class __alloc_func<_Fp, _Ap, _Rp(_ArgTypes...)>
-{
- __compressed_pair<_Fp, _Ap> __f_;
-
- public:
- typedef _Fp _Target;
- typedef _Ap _Alloc;
-
- _LIBCPP_INLINE_VISIBILITY
- const _Target& __target() const { return __f_.first(); }
-
- _LIBCPP_INLINE_VISIBILITY
- const _Alloc& __allocator() const { return __f_.second(); }
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __alloc_func(_Target&& __f)
- : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)),
- _VSTD::forward_as_tuple())
- {
- }
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __alloc_func(const _Target& __f, const _Alloc& __a)
- : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f),
- _VSTD::forward_as_tuple(__a))
- {
- }
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __alloc_func(const _Target& __f, _Alloc&& __a)
- : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f),
- _VSTD::forward_as_tuple(_VSTD::move(__a)))
- {
- }
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __alloc_func(_Target&& __f, _Alloc&& __a)
- : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)),
- _VSTD::forward_as_tuple(_VSTD::move(__a)))
- {
- }
-
- _LIBCPP_INLINE_VISIBILITY
- _Rp operator()(_ArgTypes&&... __arg)
- {
- typedef __invoke_void_return_wrapper<_Rp> _Invoker;
- return _Invoker::__call(__f_.first(),
- _VSTD::forward<_ArgTypes>(__arg)...);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __alloc_func* __clone() const
- {
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef
- typename __rebind_alloc_helper<__alloc_traits, __alloc_func>::type
- _AA;
- _AA __a(__f_.second());
- typedef __allocator_destructor<_AA> _Dp;
- unique_ptr<__alloc_func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new ((void*)__hold.get()) __alloc_func(__f_.first(), _Alloc(__a));
- return __hold.release();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void destroy() _NOEXCEPT { __f_.~__compressed_pair<_Target, _Alloc>(); }
-};
-
-// __base provides an abstract interface for copyable functors.
-
-template<class _Fp> class __base;
-
-template<class _Rp, class ..._ArgTypes>
-class __base<_Rp(_ArgTypes...)>
-{
- __base(const __base&);
- __base& operator=(const __base&);
-public:
- _LIBCPP_INLINE_VISIBILITY __base() {}
- _LIBCPP_INLINE_VISIBILITY virtual ~__base() {}
- virtual __base* __clone() const = 0;
- virtual void __clone(__base*) const = 0;
- virtual void destroy() _NOEXCEPT = 0;
- virtual void destroy_deallocate() _NOEXCEPT = 0;
- virtual _Rp operator()(_ArgTypes&& ...) = 0;
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const _NOEXCEPT = 0;
- virtual const std::type_info& target_type() const _NOEXCEPT = 0;
-#endif // _LIBCPP_NO_RTTI
-};
-
-// __func implements __base for a given functor type.
-
-template<class _FD, class _Alloc, class _FB> class __func;
-
-template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
-class __func<_Fp, _Alloc, _Rp(_ArgTypes...)>
- : public __base<_Rp(_ArgTypes...)>
-{
- __alloc_func<_Fp, _Alloc, _Rp(_ArgTypes...)> __f_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __func(_Fp&& __f)
- : __f_(_VSTD::move(__f)) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __func(const _Fp& __f, const _Alloc& __a)
- : __f_(__f, __a) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __func(const _Fp& __f, _Alloc&& __a)
- : __f_(__f, _VSTD::move(__a)) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __func(_Fp&& __f, _Alloc&& __a)
- : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
-
- virtual __base<_Rp(_ArgTypes...)>* __clone() const;
- virtual void __clone(__base<_Rp(_ArgTypes...)>*) const;
- virtual void destroy() _NOEXCEPT;
- virtual void destroy_deallocate() _NOEXCEPT;
- virtual _Rp operator()(_ArgTypes&&... __arg);
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const _NOEXCEPT;
- virtual const std::type_info& target_type() const _NOEXCEPT;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
-__base<_Rp(_ArgTypes...)>*
-__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone() const
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.__allocator());
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new ((void*)__hold.get()) __func(__f_.__target(), _Alloc(__a));
- return __hold.release();
-}
-
-template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
-void
-__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone(__base<_Rp(_ArgTypes...)>* __p) const
-{
- ::new (__p) __func(__f_.__target(), __f_.__allocator());
-}
-
-template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
-void
-__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy() _NOEXCEPT
-{
- __f_.destroy();
-}
-
-template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
-void
-__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate() _NOEXCEPT
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.__allocator());
- __f_.destroy();
- __a.deallocate(this, 1);
-}
-
-template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
-_Rp
-__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg)
-{
- return __f_(_VSTD::forward<_ArgTypes>(__arg)...);
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
-const void*
-__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target(const type_info& __ti) const _NOEXCEPT
-{
- if (__ti == typeid(_Fp))
- return &__f_.__target();
- return (const void*)0;
-}
-
-template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
-const std::type_info&
-__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target_type() const _NOEXCEPT
-{
- return typeid(_Fp);
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-// __value_func creates a value-type from a __func.
-
-template <class _Fp> class __value_func;
-
-template <class _Rp, class... _ArgTypes> class __value_func<_Rp(_ArgTypes...)>
-{
- typename aligned_storage<3 * sizeof(void*)>::type __buf_;
-
- typedef __base<_Rp(_ArgTypes...)> __func;
- __func* __f_;
-
- _LIBCPP_NO_CFI static __func* __as_base(void* p)
- {
- return reinterpret_cast<__func*>(p);
- }
-
- public:
- _LIBCPP_INLINE_VISIBILITY
- __value_func() _NOEXCEPT : __f_(0) {}
-
- template <class _Fp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY __value_func(_Fp&& __f, const _Alloc __a)
- : __f_(0)
- {
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef __function::__func<_Fp, _Alloc, _Rp(_ArgTypes...)> _Fun;
- typedef typename __rebind_alloc_helper<__alloc_traits, _Fun>::type
- _FunAlloc;
-
- if (__function::__not_null(__f))
- {
- _FunAlloc __af(__a);
- if (sizeof(_Fun) <= sizeof(__buf_) &&
- is_nothrow_copy_constructible<_Fp>::value &&
- is_nothrow_copy_constructible<_FunAlloc>::value)
- {
- __f_ =
- ::new ((void*)&__buf_) _Fun(_VSTD::move(__f), _Alloc(__af));
- }
- else
- {
- typedef __allocator_destructor<_FunAlloc> _Dp;
- unique_ptr<__func, _Dp> __hold(__af.allocate(1), _Dp(__af, 1));
- ::new ((void*)__hold.get()) _Fun(_VSTD::move(__f), _Alloc(__a));
- __f_ = __hold.release();
- }
- }
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __value_func(const __value_func& __f)
- {
- if (__f.__f_ == 0)
- __f_ = 0;
- else if ((void*)__f.__f_ == &__f.__buf_)
- {
- __f_ = __as_base(&__buf_);
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __value_func(__value_func&& __f) _NOEXCEPT
- {
- if (__f.__f_ == 0)
- __f_ = 0;
- else if ((void*)__f.__f_ == &__f.__buf_)
- {
- __f_ = __as_base(&__buf_);
- __f.__f_->__clone(__f_);
- }
- else
- {
- __f_ = __f.__f_;
- __f.__f_ = 0;
- }
- }
-
- _LIBCPP_INLINE_VISIBILITY
- ~__value_func()
- {
- if ((void*)__f_ == &__buf_)
- __f_->destroy();
- else if (__f_)
- __f_->destroy_deallocate();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __value_func& operator=(__value_func&& __f)
- {
- *this = nullptr;
- if (__f.__f_ == 0)
- __f_ = 0;
- else if ((void*)__f.__f_ == &__f.__buf_)
- {
- __f_ = __as_base(&__buf_);
- __f.__f_->__clone(__f_);
- }
- else
- {
- __f_ = __f.__f_;
- __f.__f_ = 0;
- }
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __value_func& operator=(nullptr_t)
- {
- __func* __f = __f_;
- __f_ = 0;
- if ((void*)__f == &__buf_)
- __f->destroy();
- else if (__f)
- __f->destroy_deallocate();
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- _Rp operator()(_ArgTypes&&... __args) const
- {
- if (__f_ == 0)
- __throw_bad_function_call();
- return (*__f_)(_VSTD::forward<_ArgTypes>(__args)...);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(__value_func& __f) _NOEXCEPT
- {
- if (&__f == this)
- return;
- if ((void*)__f_ == &__buf_ && (void*)__f.__f_ == &__f.__buf_)
- {
- typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
- __func* __t = __as_base(&__tempbuf);
- __f_->__clone(__t);
- __f_->destroy();
- __f_ = 0;
- __f.__f_->__clone(__as_base(&__buf_));
- __f.__f_->destroy();
- __f.__f_ = 0;
- __f_ = __as_base(&__buf_);
- __t->__clone(__as_base(&__f.__buf_));
- __t->destroy();
- __f.__f_ = __as_base(&__f.__buf_);
- }
- else if ((void*)__f_ == &__buf_)
- {
- __f_->__clone(__as_base(&__f.__buf_));
- __f_->destroy();
- __f_ = __f.__f_;
- __f.__f_ = __as_base(&__f.__buf_);
- }
- else if ((void*)__f.__f_ == &__f.__buf_)
- {
- __f.__f_->__clone(__as_base(&__buf_));
- __f.__f_->destroy();
- __f.__f_ = __f_;
- __f_ = __as_base(&__buf_);
- }
- else
- _VSTD::swap(__f_, __f.__f_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT { return __f_ != 0; }
-
-#ifndef _LIBCPP_NO_RTTI
- _LIBCPP_INLINE_VISIBILITY
- const std::type_info& target_type() const _NOEXCEPT
- {
- if (__f_ == 0)
- return typeid(void);
- return __f_->target_type();
- }
-
- template <typename _Tp>
- _LIBCPP_INLINE_VISIBILITY const _Tp* target() const _NOEXCEPT
- {
- if (__f_ == 0)
- return 0;
- return (const _Tp*)__f_->target(typeid(_Tp));
- }
-#endif // _LIBCPP_NO_RTTI
-};
-
-// Storage for a functor object, to be used with __policy to manage copy and
-// destruction.
-union __policy_storage
-{
- mutable char __small[sizeof(void*) * 2];
- void* __large;
-};
-
-// True if _Fun can safely be held in __policy_storage.__small.
-template <typename _Fun>
-struct __use_small_storage
- : public _VSTD::integral_constant<
- bool, sizeof(_Fun) <= sizeof(__policy_storage) &&
- _LIBCPP_ALIGNOF(_Fun) <= _LIBCPP_ALIGNOF(__policy_storage) &&
- _VSTD::is_trivially_copy_constructible<_Fun>::value &&
- _VSTD::is_trivially_destructible<_Fun>::value> {};
-
-// Policy contains information about how to copy, destroy, and move the
-// underlying functor. You can think of it as a vtable of sorts.
-struct __policy
-{
- // Used to copy or destroy __large values. null for trivial objects.
- void* (*const __clone)(const void*);
- void (*const __destroy)(void*);
-
- // True if this is the null policy (no value).
- const bool __is_null;
-
- // The target type. May be null if RTTI is disabled.
- const std::type_info* const __type_info;
-
- // Returns a pointer to a static policy object suitable for the functor
- // type.
- template <typename _Fun>
- _LIBCPP_INLINE_VISIBILITY static const __policy* __create()
- {
- return __choose_policy<_Fun>(__use_small_storage<_Fun>());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- static const __policy* __create_empty()
- {
- static const _LIBCPP_CONSTEXPR __policy __policy_ = {nullptr, nullptr,
- true,
-#ifndef _LIBCPP_NO_RTTI
- &typeid(void)
-#else
- nullptr
-#endif
- };
- return &__policy_;
- }
-
- private:
- template <typename _Fun> static void* __large_clone(const void* __s)
- {
- const _Fun* __f = static_cast<const _Fun*>(__s);
- return __f->__clone();
- }
-
- template <typename _Fun> static void __large_destroy(void* __s)
- {
- typedef allocator_traits<typename _Fun::_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, _Fun>::type
- _FunAlloc;
- _Fun* __f = static_cast<_Fun*>(__s);
- _FunAlloc __a(__f->__allocator());
- __f->destroy();
- __a.deallocate(__f, 1);
- }
-
- template <typename _Fun>
- _LIBCPP_INLINE_VISIBILITY static const __policy*
- __choose_policy(/* is_small = */ false_type)
- {
- static const _LIBCPP_CONSTEXPR __policy __policy_ = {
- &__large_clone<_Fun>, &__large_destroy<_Fun>, false,
-#ifndef _LIBCPP_NO_RTTI
- &typeid(typename _Fun::_Target)
-#else
- nullptr
-#endif
- };
- return &__policy_;
- }
-
- template <typename _Fun>
- _LIBCPP_INLINE_VISIBILITY static const __policy*
- __choose_policy(/* is_small = */ true_type)
- {
- static const _LIBCPP_CONSTEXPR __policy __policy_ = {
- nullptr, nullptr, false,
-#ifndef _LIBCPP_NO_RTTI
- &typeid(typename _Fun::_Target)
-#else
- nullptr
-#endif
- };
- return &__policy_;
- }
-};
-
-// Used to choose between perfect forwarding or pass-by-value. Pass-by-value is
-// faster for types that can be passed in registers.
-template <typename _Tp>
-using __fast_forward =
- typename _VSTD::conditional<_VSTD::is_scalar<_Tp>::value, _Tp, _Tp&&>::type;
-
-// __policy_invoker calls an instance of __alloc_func held in __policy_storage.
-
-template <class _Fp> struct __policy_invoker;
-
-template <class _Rp, class... _ArgTypes>
-struct __policy_invoker<_Rp(_ArgTypes...)>
-{
- typedef _Rp (*__Call)(const __policy_storage*,
- __fast_forward<_ArgTypes>...);
-
- __Call __call_;
-
- // Creates an invoker that throws bad_function_call.
- _LIBCPP_INLINE_VISIBILITY
- __policy_invoker() : __call_(&__call_empty) {}
-
- // Creates an invoker that calls the given instance of __func.
- template <typename _Fun>
- _LIBCPP_INLINE_VISIBILITY static __policy_invoker __create()
- {
- return __policy_invoker(&__call_impl<_Fun>);
- }
-
- private:
- _LIBCPP_INLINE_VISIBILITY
- explicit __policy_invoker(__Call __c) : __call_(__c) {}
-
- static _Rp __call_empty(const __policy_storage*,
- __fast_forward<_ArgTypes>...)
- {
- __throw_bad_function_call();
- }
-
- template <typename _Fun>
- static _Rp __call_impl(const __policy_storage* __buf,
- __fast_forward<_ArgTypes>... __args)
- {
- _Fun* __f = reinterpret_cast<_Fun*>(__use_small_storage<_Fun>::value
- ? &__buf->__small
- : __buf->__large);
- return (*__f)(_VSTD::forward<_ArgTypes>(__args)...);
- }
-};
-
-// __policy_func uses a __policy and __policy_invoker to create a type-erased,
-// copyable functor.
-
-template <class _Fp> class __policy_func;
-
-template <class _Rp, class... _ArgTypes> class __policy_func<_Rp(_ArgTypes...)>
-{
- // Inline storage for small objects.
- __policy_storage __buf_;
-
- // Calls the value stored in __buf_. This could technically be part of
- // policy, but storing it here eliminates a level of indirection inside
- // operator().
- typedef __function::__policy_invoker<_Rp(_ArgTypes...)> __invoker;
- __invoker __invoker_;
-
- // The policy that describes how to move / copy / destroy __buf_. Never
- // null, even if the function is empty.
- const __policy* __policy_;
-
- public:
- _LIBCPP_INLINE_VISIBILITY
- __policy_func() : __policy_(__policy::__create_empty()) {}
-
- template <class _Fp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY __policy_func(_Fp&& __f, const _Alloc& __a)
- : __policy_(__policy::__create_empty())
- {
- typedef __alloc_func<_Fp, _Alloc, _Rp(_ArgTypes...)> _Fun;
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, _Fun>::type
- _FunAlloc;
-
- if (__function::__not_null(__f))
- {
- __invoker_ = __invoker::template __create<_Fun>();
- __policy_ = __policy::__create<_Fun>();
-
- _FunAlloc __af(__a);
- if (__use_small_storage<_Fun>())
- {
- ::new ((void*)&__buf_.__small)
- _Fun(_VSTD::move(__f), _Alloc(__af));
- }
- else
- {
- typedef __allocator_destructor<_FunAlloc> _Dp;
- unique_ptr<_Fun, _Dp> __hold(__af.allocate(1), _Dp(__af, 1));
- ::new ((void*)__hold.get())
- _Fun(_VSTD::move(__f), _Alloc(__af));
- __buf_.__large = __hold.release();
- }
- }
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __policy_func(const __policy_func& __f)
- : __buf_(__f.__buf_), __invoker_(__f.__invoker_),
- __policy_(__f.__policy_)
- {
- if (__policy_->__clone)
- __buf_.__large = __policy_->__clone(__f.__buf_.__large);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __policy_func(__policy_func&& __f)
- : __buf_(__f.__buf_), __invoker_(__f.__invoker_),
- __policy_(__f.__policy_)
- {
- if (__policy_->__destroy)
- {
- __f.__policy_ = __policy::__create_empty();
- __f.__invoker_ = __invoker();
- }
- }
-
- _LIBCPP_INLINE_VISIBILITY
- ~__policy_func()
- {
- if (__policy_->__destroy)
- __policy_->__destroy(__buf_.__large);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __policy_func& operator=(__policy_func&& __f)
- {
- *this = nullptr;
- __buf_ = __f.__buf_;
- __invoker_ = __f.__invoker_;
- __policy_ = __f.__policy_;
- __f.__policy_ = __policy::__create_empty();
- __f.__invoker_ = __invoker();
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __policy_func& operator=(nullptr_t)
- {
- const __policy* __p = __policy_;
- __policy_ = __policy::__create_empty();
- __invoker_ = __invoker();
- if (__p->__destroy)
- __p->__destroy(__buf_.__large);
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- _Rp operator()(_ArgTypes&&... __args) const
- {
- return __invoker_.__call_(_VSTD::addressof(__buf_),
- _VSTD::forward<_ArgTypes>(__args)...);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(__policy_func& __f)
- {
- _VSTD::swap(__invoker_, __f.__invoker_);
- _VSTD::swap(__policy_, __f.__policy_);
- _VSTD::swap(__buf_, __f.__buf_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- explicit operator bool() const _NOEXCEPT
- {
- return !__policy_->__is_null;
- }
-
-#ifndef _LIBCPP_NO_RTTI
- _LIBCPP_INLINE_VISIBILITY
- const std::type_info& target_type() const _NOEXCEPT
- {
- return *__policy_->__type_info;
- }
-
- template <typename _Tp>
- _LIBCPP_INLINE_VISIBILITY const _Tp* target() const _NOEXCEPT
- {
- if (__policy_->__is_null || typeid(_Tp) != *__policy_->__type_info)
- return nullptr;
- if (__policy_->__clone) // Out of line storage.
- return reinterpret_cast<const _Tp*>(__buf_.__large);
- else
- return reinterpret_cast<const _Tp*>(&__buf_.__small);
- }
-#endif // _LIBCPP_NO_RTTI
-};
-
-} // __function
-
-template<class _Rp, class ..._ArgTypes>
-class _LIBCPP_TEMPLATE_VIS function<_Rp(_ArgTypes...)>
- : public __function::__maybe_derive_from_unary_function<_Rp(_ArgTypes...)>,
- public __function::__maybe_derive_from_binary_function<_Rp(_ArgTypes...)>
-{
-#ifndef _LIBCPP_ABI_OPTIMIZED_FUNCTION
- typedef __function::__value_func<_Rp(_ArgTypes...)> __func;
-#else
- typedef __function::__policy_func<_Rp(_ArgTypes...)> __func;
-#endif
-
- __func __f_;
-
- template <class _Fp, bool = __lazy_and<
- integral_constant<bool, !is_same<__uncvref_t<_Fp>, function>::value>,
- __invokable<_Fp&, _ArgTypes...>
- >::value>
- struct __callable;
- template <class _Fp>
- struct __callable<_Fp, true>
- {
- static const bool value = is_same<void, _Rp>::value ||
- is_convertible<typename __invoke_of<_Fp&, _ArgTypes...>::type,
- _Rp>::value;
- };
- template <class _Fp>
- struct __callable<_Fp, false>
- {
- static const bool value = false;
- };
-
- template <class _Fp>
- using _EnableIfCallable = typename enable_if<__callable<_Fp>::value>::type;
-public:
- typedef _Rp result_type;
-
- // construct/copy/destroy:
- _LIBCPP_INLINE_VISIBILITY
- function() _NOEXCEPT { }
- _LIBCPP_INLINE_VISIBILITY
- function(nullptr_t) _NOEXCEPT {}
- function(const function&);
- function(function&&) _NOEXCEPT;
- template<class _Fp, class = _EnableIfCallable<_Fp>>
- function(_Fp);
-
-#if _LIBCPP_STD_VER <= 14
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&) _NOEXCEPT {}
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&, nullptr_t) _NOEXCEPT {}
- template<class _Alloc>
- function(allocator_arg_t, const _Alloc&, const function&);
- template<class _Alloc>
- function(allocator_arg_t, const _Alloc&, function&&);
- template<class _Fp, class _Alloc, class = _EnableIfCallable<_Fp>>
- function(allocator_arg_t, const _Alloc& __a, _Fp __f);
-#endif
-
- function& operator=(const function&);
- function& operator=(function&&) _NOEXCEPT;
- function& operator=(nullptr_t) _NOEXCEPT;
- template<class _Fp, class = _EnableIfCallable<_Fp>>
- function& operator=(_Fp&&);
-
- ~function();
-
- // function modifiers:
- void swap(function&) _NOEXCEPT;
-
-#if _LIBCPP_STD_VER <= 14
- template<class _Fp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- void assign(_Fp&& __f, const _Alloc& __a)
- {function(allocator_arg, __a, _VSTD::forward<_Fp>(__f)).swap(*this);}
-#endif
-
- // function capacity:
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {
- return static_cast<bool>(__f_);
- }
-
- // deleted overloads close possible hole in the type system
- template<class _R2, class... _ArgTypes2>
- bool operator==(const function<_R2(_ArgTypes2...)>&) const = delete;
- template<class _R2, class... _ArgTypes2>
- bool operator!=(const function<_R2(_ArgTypes2...)>&) const = delete;
-public:
- // function invocation:
- _Rp operator()(_ArgTypes...) const;
-
-#ifndef _LIBCPP_NO_RTTI
- // function target access:
- const std::type_info& target_type() const _NOEXCEPT;
- template <typename _Tp> _Tp* target() _NOEXCEPT;
- template <typename _Tp> const _Tp* target() const _NOEXCEPT;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Rp, class ..._ArgTypes>
-function<_Rp(_ArgTypes...)>::function(const function& __f) : __f_(__f.__f_) {}
-
-#if _LIBCPP_STD_VER <= 14
-template<class _Rp, class ..._ArgTypes>
-template <class _Alloc>
-function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
- const function& __f) : __f_(__f.__f_) {}
-#endif
-
-template <class _Rp, class... _ArgTypes>
-function<_Rp(_ArgTypes...)>::function(function&& __f) _NOEXCEPT
- : __f_(_VSTD::move(__f.__f_)) {}
-
-#if _LIBCPP_STD_VER <= 14
-template<class _Rp, class ..._ArgTypes>
-template <class _Alloc>
-function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
- function&& __f)
- : __f_(_VSTD::move(__f.__f_)) {}
-#endif
-
-template <class _Rp, class... _ArgTypes>
-template <class _Fp, class>
-function<_Rp(_ArgTypes...)>::function(_Fp __f)
- : __f_(_VSTD::move(__f), allocator<_Fp>()) {}
-
-#if _LIBCPP_STD_VER <= 14
-template <class _Rp, class... _ArgTypes>
-template <class _Fp, class _Alloc, class>
-function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc& __a,
- _Fp __f)
- : __f_(_VSTD::move(__f), __a) {}
-#endif
-
-template<class _Rp, class ..._ArgTypes>
-function<_Rp(_ArgTypes...)>&
-function<_Rp(_ArgTypes...)>::operator=(const function& __f)
-{
- function(__f).swap(*this);
- return *this;
-}
-
-template<class _Rp, class ..._ArgTypes>
-function<_Rp(_ArgTypes...)>&
-function<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT
-{
- __f_ = std::move(__f.__f_);
- return *this;
-}
-
-template<class _Rp, class ..._ArgTypes>
-function<_Rp(_ArgTypes...)>&
-function<_Rp(_ArgTypes...)>::operator=(nullptr_t) _NOEXCEPT
-{
- __f_ = nullptr;
- return *this;
-}
-
-template<class _Rp, class ..._ArgTypes>
-template <class _Fp, class>
-function<_Rp(_ArgTypes...)>&
-function<_Rp(_ArgTypes...)>::operator=(_Fp&& __f)
-{
- function(_VSTD::forward<_Fp>(__f)).swap(*this);
- return *this;
-}
-
-template<class _Rp, class ..._ArgTypes>
-function<_Rp(_ArgTypes...)>::~function() {}
-
-template<class _Rp, class ..._ArgTypes>
-void
-function<_Rp(_ArgTypes...)>::swap(function& __f) _NOEXCEPT
-{
- __f_.swap(__f.__f_);
-}
-
-template<class _Rp, class ..._ArgTypes>
-_Rp
-function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const
-{
- return __f_(_VSTD::forward<_ArgTypes>(__arg)...);
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Rp, class ..._ArgTypes>
-const std::type_info&
-function<_Rp(_ArgTypes...)>::target_type() const _NOEXCEPT
-{
- return __f_.target_type();
-}
-
-template<class _Rp, class ..._ArgTypes>
-template <typename _Tp>
-_Tp*
-function<_Rp(_ArgTypes...)>::target() _NOEXCEPT
-{
- return (_Tp*)(__f_.template target<_Tp>());
-}
-
-template<class _Rp, class ..._ArgTypes>
-template <typename _Tp>
-const _Tp*
-function<_Rp(_ArgTypes...)>::target() const _NOEXCEPT
-{
- return __f_.template target<_Tp>();
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-template <class _Rp, class... _ArgTypes>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return !__f;}
-
-template <class _Rp, class... _ArgTypes>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return !__f;}
-
-template <class _Rp, class... _ArgTypes>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return (bool)__f;}
-
-template <class _Rp, class... _ArgTypes>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return (bool)__f;}
-
-template <class _Rp, class... _ArgTypes>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(function<_Rp(_ArgTypes...)>& __x, function<_Rp(_ArgTypes...)>& __y) _NOEXCEPT
-{return __x.swap(__y);}
-
-#else // _LIBCPP_CXX03_LANG
-
-#include <__functional_03>
-
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-// BIND
-//==============================================================================
-
-template<class _Tp> struct __is_bind_expression : public false_type {};
-template<class _Tp> struct _LIBCPP_TEMPLATE_VIS is_bind_expression
- : public __is_bind_expression<typename remove_cv<_Tp>::type> {};
-
-#if _LIBCPP_STD_VER > 14
-template <class _Tp>
-_LIBCPP_INLINE_VAR constexpr size_t is_bind_expression_v = is_bind_expression<_Tp>::value;
-#endif
-
-template<class _Tp> struct __is_placeholder : public integral_constant<int, 0> {};
-template<class _Tp> struct _LIBCPP_TEMPLATE_VIS is_placeholder
- : public __is_placeholder<typename remove_cv<_Tp>::type> {};
-
-#if _LIBCPP_STD_VER > 14
-template <class _Tp>
-_LIBCPP_INLINE_VAR constexpr size_t is_placeholder_v = is_placeholder<_Tp>::value;
-#endif
-
-namespace placeholders
-{
-
-template <int _Np> struct __ph {};
-
-#if defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY)
-_LIBCPP_FUNC_VIS extern const __ph<1> _1;
-_LIBCPP_FUNC_VIS extern const __ph<2> _2;
-_LIBCPP_FUNC_VIS extern const __ph<3> _3;
-_LIBCPP_FUNC_VIS extern const __ph<4> _4;
-_LIBCPP_FUNC_VIS extern const __ph<5> _5;
-_LIBCPP_FUNC_VIS extern const __ph<6> _6;
-_LIBCPP_FUNC_VIS extern const __ph<7> _7;
-_LIBCPP_FUNC_VIS extern const __ph<8> _8;
-_LIBCPP_FUNC_VIS extern const __ph<9> _9;
-_LIBCPP_FUNC_VIS extern const __ph<10> _10;
-#else
-/* _LIBCPP_INLINE_VAR */ constexpr __ph<1> _1{};
-/* _LIBCPP_INLINE_VAR */ constexpr __ph<2> _2{};
-/* _LIBCPP_INLINE_VAR */ constexpr __ph<3> _3{};
-/* _LIBCPP_INLINE_VAR */ constexpr __ph<4> _4{};
-/* _LIBCPP_INLINE_VAR */ constexpr __ph<5> _5{};
-/* _LIBCPP_INLINE_VAR */ constexpr __ph<6> _6{};
-/* _LIBCPP_INLINE_VAR */ constexpr __ph<7> _7{};
-/* _LIBCPP_INLINE_VAR */ constexpr __ph<8> _8{};
-/* _LIBCPP_INLINE_VAR */ constexpr __ph<9> _9{};
-/* _LIBCPP_INLINE_VAR */ constexpr __ph<10> _10{};
-#endif // defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY)
-
-} // placeholders
-
-template<int _Np>
-struct __is_placeholder<placeholders::__ph<_Np> >
- : public integral_constant<int, _Np> {};
-
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Uj>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp&
-__mu(reference_wrapper<_Tp> __t, _Uj&)
-{
- return __t.get();
-}
-
-template <class _Ti, class ..._Uj, size_t ..._Indx>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __invoke_of<_Ti&, _Uj...>::type
-__mu_expand(_Ti& __ti, tuple<_Uj...>& __uj, __tuple_indices<_Indx...>)
-{
- return __ti(_VSTD::forward<_Uj>(_VSTD::get<_Indx>(__uj))...);
-}
-
-template <class _Ti, class ..._Uj>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __lazy_enable_if
-<
- is_bind_expression<_Ti>::value,
- __invoke_of<_Ti&, _Uj...>
->::type
-__mu(_Ti& __ti, tuple<_Uj...>& __uj)
-{
- typedef typename __make_tuple_indices<sizeof...(_Uj)>::type __indices;
- return __mu_expand(__ti, __uj, __indices());
-}
-
-template <bool IsPh, class _Ti, class _Uj>
-struct __mu_return2 {};
-
-template <class _Ti, class _Uj>
-struct __mu_return2<true, _Ti, _Uj>
-{
- typedef typename tuple_element<is_placeholder<_Ti>::value - 1, _Uj>::type type;
-};
-
-template <class _Ti, class _Uj>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- 0 < is_placeholder<_Ti>::value,
- typename __mu_return2<0 < is_placeholder<_Ti>::value, _Ti, _Uj>::type
->::type
-__mu(_Ti&, _Uj& __uj)
-{
- const size_t _Indx = is_placeholder<_Ti>::value - 1;
- return _VSTD::forward<typename tuple_element<_Indx, _Uj>::type>(_VSTD::get<_Indx>(__uj));
-}
-
-template <class _Ti, class _Uj>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- !is_bind_expression<_Ti>::value &&
- is_placeholder<_Ti>::value == 0 &&
- !__is_reference_wrapper<_Ti>::value,
- _Ti&
->::type
-__mu(_Ti& __ti, _Uj&)
-{
- return __ti;
-}
-
-template <class _Ti, bool IsReferenceWrapper, bool IsBindEx, bool IsPh,
- class _TupleUj>
-struct __mu_return_impl;
-
-template <bool _Invokable, class _Ti, class ..._Uj>
-struct __mu_return_invokable // false
-{
- typedef __nat type;
-};
-
-template <class _Ti, class ..._Uj>
-struct __mu_return_invokable<true, _Ti, _Uj...>
-{
- typedef typename __invoke_of<_Ti&, _Uj...>::type type;
-};
-
-template <class _Ti, class ..._Uj>
-struct __mu_return_impl<_Ti, false, true, false, tuple<_Uj...> >
- : public __mu_return_invokable<__invokable<_Ti&, _Uj...>::value, _Ti, _Uj...>
-{
-};
-
-template <class _Ti, class _TupleUj>
-struct __mu_return_impl<_Ti, false, false, true, _TupleUj>
-{
- typedef typename tuple_element<is_placeholder<_Ti>::value - 1,
- _TupleUj>::type&& type;
-};
-
-template <class _Ti, class _TupleUj>
-struct __mu_return_impl<_Ti, true, false, false, _TupleUj>
-{
- typedef typename _Ti::type& type;
-};
-
-template <class _Ti, class _TupleUj>
-struct __mu_return_impl<_Ti, false, false, false, _TupleUj>
-{
- typedef _Ti& type;
-};
-
-template <class _Ti, class _TupleUj>
-struct __mu_return
- : public __mu_return_impl<_Ti,
- __is_reference_wrapper<_Ti>::value,
- is_bind_expression<_Ti>::value,
- 0 < is_placeholder<_Ti>::value &&
- is_placeholder<_Ti>::value <= tuple_size<_TupleUj>::value,
- _TupleUj>
-{
-};
-
-template <class _Fp, class _BoundArgs, class _TupleUj>
-struct __is_valid_bind_return
-{
- static const bool value = false;
-};
-
-template <class _Fp, class ..._BoundArgs, class _TupleUj>
-struct __is_valid_bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj>
-{
- static const bool value = __invokable<_Fp,
- typename __mu_return<_BoundArgs, _TupleUj>::type...>::value;
-};
-
-template <class _Fp, class ..._BoundArgs, class _TupleUj>
-struct __is_valid_bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj>
-{
- static const bool value = __invokable<_Fp,
- typename __mu_return<const _BoundArgs, _TupleUj>::type...>::value;
-};
-
-template <class _Fp, class _BoundArgs, class _TupleUj,
- bool = __is_valid_bind_return<_Fp, _BoundArgs, _TupleUj>::value>
-struct __bind_return;
-
-template <class _Fp, class ..._BoundArgs, class _TupleUj>
-struct __bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj, true>
-{
- typedef typename __invoke_of
- <
- _Fp&,
- typename __mu_return
- <
- _BoundArgs,
- _TupleUj
- >::type...
- >::type type;
-};
-
-template <class _Fp, class ..._BoundArgs, class _TupleUj>
-struct __bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj, true>
-{
- typedef typename __invoke_of
- <
- _Fp&,
- typename __mu_return
- <
- const _BoundArgs,
- _TupleUj
- >::type...
- >::type type;
-};
-
-template <class _Fp, class _BoundArgs, size_t ..._Indx, class _Args>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __bind_return<_Fp, _BoundArgs, _Args>::type
-__apply_functor(_Fp& __f, _BoundArgs& __bound_args, __tuple_indices<_Indx...>,
- _Args&& __args)
-{
- return _VSTD::__invoke(__f, _VSTD::__mu(_VSTD::get<_Indx>(__bound_args), __args)...);
-}
-
-template<class _Fp, class ..._BoundArgs>
-class __bind
- : public __weak_result_type<typename decay<_Fp>::type>
-{
-protected:
- typedef typename decay<_Fp>::type _Fd;
- typedef tuple<typename decay<_BoundArgs>::type...> _Td;
-private:
- _Fd __f_;
- _Td __bound_args_;
-
- typedef typename __make_tuple_indices<sizeof...(_BoundArgs)>::type __indices;
-public:
- template <class _Gp, class ..._BA,
- class = typename enable_if
- <
- is_constructible<_Fd, _Gp>::value &&
- !is_same<typename remove_reference<_Gp>::type,
- __bind>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- explicit __bind(_Gp&& __f, _BA&& ...__bound_args)
- : __f_(_VSTD::forward<_Gp>(__f)),
- __bound_args_(_VSTD::forward<_BA>(__bound_args)...) {}
-
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type
- operator()(_Args&& ...__args)
- {
- return _VSTD::__apply_functor(__f_, __bound_args_, __indices(),
- tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...));
- }
-
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type
- operator()(_Args&& ...__args) const
- {
- return _VSTD::__apply_functor(__f_, __bound_args_, __indices(),
- tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...));
- }
-};
-
-template<class _Fp, class ..._BoundArgs>
-struct __is_bind_expression<__bind<_Fp, _BoundArgs...> > : public true_type {};
-
-template<class _Rp, class _Fp, class ..._BoundArgs>
-class __bind_r
- : public __bind<_Fp, _BoundArgs...>
-{
- typedef __bind<_Fp, _BoundArgs...> base;
- typedef typename base::_Fd _Fd;
- typedef typename base::_Td _Td;
-public:
- typedef _Rp result_type;
-
-
- template <class _Gp, class ..._BA,
- class = typename enable_if
- <
- is_constructible<_Fd, _Gp>::value &&
- !is_same<typename remove_reference<_Gp>::type,
- __bind_r>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- explicit __bind_r(_Gp&& __f, _BA&& ...__bound_args)
- : base(_VSTD::forward<_Gp>(__f),
- _VSTD::forward<_BA>(__bound_args)...) {}
-
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- is_convertible<typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type,
- result_type>::value || is_void<_Rp>::value,
- result_type
- >::type
- operator()(_Args&& ...__args)
- {
- typedef __invoke_void_return_wrapper<_Rp> _Invoker;
- return _Invoker::__call(static_cast<base&>(*this), _VSTD::forward<_Args>(__args)...);
- }
-
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- is_convertible<typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type,
- result_type>::value || is_void<_Rp>::value,
- result_type
- >::type
- operator()(_Args&& ...__args) const
- {
- typedef __invoke_void_return_wrapper<_Rp> _Invoker;
- return _Invoker::__call(static_cast<base const&>(*this), _VSTD::forward<_Args>(__args)...);
- }
-};
-
-template<class _Rp, class _Fp, class ..._BoundArgs>
-struct __is_bind_expression<__bind_r<_Rp, _Fp, _BoundArgs...> > : public true_type {};
-
-template<class _Fp, class ..._BoundArgs>
-inline _LIBCPP_INLINE_VISIBILITY
-__bind<_Fp, _BoundArgs...>
-bind(_Fp&& __f, _BoundArgs&&... __bound_args)
-{
- typedef __bind<_Fp, _BoundArgs...> type;
- return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...);
-}
-
-template<class _Rp, class _Fp, class ..._BoundArgs>
-inline _LIBCPP_INLINE_VISIBILITY
-__bind_r<_Rp, _Fp, _BoundArgs...>
-bind(_Fp&& __f, _BoundArgs&&... __bound_args)
-{
- typedef __bind_r<_Rp, _Fp, _BoundArgs...> type;
- return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-#if _LIBCPP_STD_VER > 14
-
-template <class _Fn, class ..._Args>
-result_of_t<_Fn&&(_Args&&...)>
-invoke(_Fn&& __f, _Args&&... __args)
- noexcept(noexcept(_VSTD::__invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)...)))
-{
- return _VSTD::__invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)...);
-}
-
-template <class _DecayFunc>
-class _LIBCPP_TEMPLATE_VIS __not_fn_imp {
- _DecayFunc __fd;
-
-public:
- __not_fn_imp() = delete;
-
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- auto operator()(_Args&& ...__args) &
- noexcept(noexcept(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...)))
- -> decltype( !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))
- { return !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); }
-
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- auto operator()(_Args&& ...__args) &&
- noexcept(noexcept(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...)))
- -> decltype( !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))
- { return !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...); }
-
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- auto operator()(_Args&& ...__args) const&
- noexcept(noexcept(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...)))
- -> decltype( !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))
- { return !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); }
-
-
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- auto operator()(_Args&& ...__args) const&&
- noexcept(noexcept(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...)))
- -> decltype( !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))
- { return !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...); }
-
-private:
- template <class _RawFunc,
- class = enable_if_t<!is_same<decay_t<_RawFunc>, __not_fn_imp>::value>>
- _LIBCPP_INLINE_VISIBILITY
- explicit __not_fn_imp(_RawFunc&& __rf)
- : __fd(_VSTD::forward<_RawFunc>(__rf)) {}
-
- template <class _RawFunc>
- friend inline _LIBCPP_INLINE_VISIBILITY
- __not_fn_imp<decay_t<_RawFunc>> not_fn(_RawFunc&&);
-};
-
-template <class _RawFunc>
-inline _LIBCPP_INLINE_VISIBILITY
-__not_fn_imp<decay_t<_RawFunc>> not_fn(_RawFunc&& __fn) {
- return __not_fn_imp<decay_t<_RawFunc>>(_VSTD::forward<_RawFunc>(__fn));
-}
-
-#endif
-
-// struct hash<T*> in <memory>
-
-template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
-pair<_ForwardIterator1, _ForwardIterator1> _LIBCPP_CONSTEXPR_AFTER_CXX11
-__search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
- _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
- forward_iterator_tag, forward_iterator_tag)
-{
- if (__first2 == __last2)
- return make_pair(__first1, __first1); // Everything matches an empty sequence
- while (true)
- {
- // Find first element in sequence 1 that matchs *__first2, with a mininum of loop checks
- while (true)
- {
- if (__first1 == __last1) // return __last1 if no element matches *__first2
- return make_pair(__last1, __last1);
- if (__pred(*__first1, *__first2))
- break;
- ++__first1;
- }
- // *__first1 matches *__first2, now match elements after here
- _ForwardIterator1 __m1 = __first1;
- _ForwardIterator2 __m2 = __first2;
- while (true)
- {
- if (++__m2 == __last2) // If pattern exhausted, __first1 is the answer (works for 1 element pattern)
- return make_pair(__first1, __m1);
- if (++__m1 == __last1) // Otherwise if source exhaused, pattern not found
- return make_pair(__last1, __last1);
- if (!__pred(*__m1, *__m2)) // if there is a mismatch, restart with a new __first1
- {
- ++__first1;
- break;
- } // else there is a match, check next elements
- }
- }
-}
-
-template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
-_LIBCPP_CONSTEXPR_AFTER_CXX11
-pair<_RandomAccessIterator1, _RandomAccessIterator1>
-__search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
- _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
- random_access_iterator_tag, random_access_iterator_tag)
-{
- typedef typename iterator_traits<_RandomAccessIterator1>::difference_type _D1;
- typedef typename iterator_traits<_RandomAccessIterator2>::difference_type _D2;
- // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
- const _D2 __len2 = __last2 - __first2;
- if (__len2 == 0)
- return make_pair(__first1, __first1);
- const _D1 __len1 = __last1 - __first1;
- if (__len1 < __len2)
- return make_pair(__last1, __last1);
- const _RandomAccessIterator1 __s = __last1 - (__len2 - 1); // Start of pattern match can't go beyond here
-
- while (true)
- {
- while (true)
- {
- if (__first1 == __s)
- return make_pair(__last1, __last1);
- if (__pred(*__first1, *__first2))
- break;
- ++__first1;
- }
-
- _RandomAccessIterator1 __m1 = __first1;
- _RandomAccessIterator2 __m2 = __first2;
- while (true)
- {
- if (++__m2 == __last2)
- return make_pair(__first1, __first1 + __len2);
- ++__m1; // no need to check range on __m1 because __s guarantees we have enough source
- if (!__pred(*__m1, *__m2))
- {
- ++__first1;
- break;
- }
- }
- }
-}
-
-#if _LIBCPP_STD_VER > 14
-
-// default searcher
-template<class _ForwardIterator, class _BinaryPredicate = equal_to<>>
-class _LIBCPP_TYPE_VIS default_searcher {
-public:
- _LIBCPP_INLINE_VISIBILITY
- default_searcher(_ForwardIterator __f, _ForwardIterator __l,
- _BinaryPredicate __p = _BinaryPredicate())
- : __first_(__f), __last_(__l), __pred_(__p) {}
-
- template <typename _ForwardIterator2>
- _LIBCPP_INLINE_VISIBILITY
- pair<_ForwardIterator2, _ForwardIterator2>
- operator () (_ForwardIterator2 __f, _ForwardIterator2 __l) const
- {
- return _VSTD::__search(__f, __l, __first_, __last_, __pred_,
- typename _VSTD::iterator_traits<_ForwardIterator>::iterator_category(),
- typename _VSTD::iterator_traits<_ForwardIterator2>::iterator_category());
- }
-
-private:
- _ForwardIterator __first_;
- _ForwardIterator __last_;
- _BinaryPredicate __pred_;
- };
-
-#endif // _LIBCPP_STD_VER > 14
-
-#if _LIBCPP_STD_VER > 17
-template <class _Tp>
-using unwrap_reference_t = typename unwrap_reference<_Tp>::type;
-
-template <class _Tp>
-using unwrap_ref_decay_t = typename unwrap_ref_decay<_Tp>::type;
-#endif // > C++17
-
-template <class _Container, class _Predicate>
-inline void __libcpp_erase_if_container( _Container& __c, _Predicate __pred)
-{
- for (typename _Container::iterator __iter = __c.begin(), __last = __c.end(); __iter != __last;)
- {
- if (__pred(*__iter))
- __iter = __c.erase(__iter);
- else
- ++__iter;
- }
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_FUNCTIONAL
diff --git a/lib/libcxx/include/future b/lib/libcxx/include/future
deleted file mode 100644
index b3ffc7e3517..00000000000
--- a/lib/libcxx/include/future
+++ /dev/null
@@ -1,2613 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- future -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_FUTURE
-#define _LIBCPP_FUTURE
-
-/*
- future synopsis
-
-namespace std
-{
-
-enum class future_errc
-{
- future_already_retrieved = 1,
- promise_already_satisfied,
- no_state,
- broken_promise
-};
-
-enum class launch
-{
- async = 1,
- deferred = 2,
- any = async | deferred
-};
-
-enum class future_status
-{
- ready,
- timeout,
- deferred
-};
-
-template <> struct is_error_code_enum<future_errc> : public true_type { };
-error_code make_error_code(future_errc e) noexcept;
-error_condition make_error_condition(future_errc e) noexcept;
-
-const error_category& future_category() noexcept;
-
-class future_error
- : public logic_error
-{
-public:
- future_error(error_code ec); // exposition only
- explicit future_error(future_errc); // C++17
- const error_code& code() const noexcept;
- const char* what() const noexcept;
-};
-
-template <class R>
-class promise
-{
-public:
- promise();
- template <class Allocator>
- promise(allocator_arg_t, const Allocator& a);
- promise(promise&& rhs) noexcept;
- promise(const promise& rhs) = delete;
- ~promise();
-
- // assignment
- promise& operator=(promise&& rhs) noexcept;
- promise& operator=(const promise& rhs) = delete;
- void swap(promise& other) noexcept;
-
- // retrieving the result
- future<R> get_future();
-
- // setting the result
- void set_value(const R& r);
- void set_value(R&& r);
- void set_exception(exception_ptr p);
-
- // setting the result with deferred notification
- void set_value_at_thread_exit(const R& r);
- void set_value_at_thread_exit(R&& r);
- void set_exception_at_thread_exit(exception_ptr p);
-};
-
-template <class R>
-class promise<R&>
-{
-public:
- promise();
- template <class Allocator>
- promise(allocator_arg_t, const Allocator& a);
- promise(promise&& rhs) noexcept;
- promise(const promise& rhs) = delete;
- ~promise();
-
- // assignment
- promise& operator=(promise&& rhs) noexcept;
- promise& operator=(const promise& rhs) = delete;
- void swap(promise& other) noexcept;
-
- // retrieving the result
- future<R&> get_future();
-
- // setting the result
- void set_value(R& r);
- void set_exception(exception_ptr p);
-
- // setting the result with deferred notification
- void set_value_at_thread_exit(R&);
- void set_exception_at_thread_exit(exception_ptr p);
-};
-
-template <>
-class promise<void>
-{
-public:
- promise();
- template <class Allocator>
- promise(allocator_arg_t, const Allocator& a);
- promise(promise&& rhs) noexcept;
- promise(const promise& rhs) = delete;
- ~promise();
-
- // assignment
- promise& operator=(promise&& rhs) noexcept;
- promise& operator=(const promise& rhs) = delete;
- void swap(promise& other) noexcept;
-
- // retrieving the result
- future<void> get_future();
-
- // setting the result
- void set_value();
- void set_exception(exception_ptr p);
-
- // setting the result with deferred notification
- void set_value_at_thread_exit();
- void set_exception_at_thread_exit(exception_ptr p);
-};
-
-template <class R> void swap(promise<R>& x, promise<R>& y) noexcept;
-
-template <class R, class Alloc>
- struct uses_allocator<promise<R>, Alloc> : public true_type {};
-
-template <class R>
-class future
-{
-public:
- future() noexcept;
- future(future&&) noexcept;
- future(const future& rhs) = delete;
- ~future();
- future& operator=(const future& rhs) = delete;
- future& operator=(future&&) noexcept;
- shared_future<R> share() noexcept;
-
- // retrieving the value
- R get();
-
- // functions to check state
- bool valid() const noexcept;
-
- void wait() const;
- template <class Rep, class Period>
- future_status
- wait_for(const chrono::duration<Rep, Period>& rel_time) const;
- template <class Clock, class Duration>
- future_status
- wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
-};
-
-template <class R>
-class future<R&>
-{
-public:
- future() noexcept;
- future(future&&) noexcept;
- future(const future& rhs) = delete;
- ~future();
- future& operator=(const future& rhs) = delete;
- future& operator=(future&&) noexcept;
- shared_future<R&> share() noexcept;
-
- // retrieving the value
- R& get();
-
- // functions to check state
- bool valid() const noexcept;
-
- void wait() const;
- template <class Rep, class Period>
- future_status
- wait_for(const chrono::duration<Rep, Period>& rel_time) const;
- template <class Clock, class Duration>
- future_status
- wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
-};
-
-template <>
-class future<void>
-{
-public:
- future() noexcept;
- future(future&&) noexcept;
- future(const future& rhs) = delete;
- ~future();
- future& operator=(const future& rhs) = delete;
- future& operator=(future&&) noexcept;
- shared_future<void> share() noexcept;
-
- // retrieving the value
- void get();
-
- // functions to check state
- bool valid() const noexcept;
-
- void wait() const;
- template <class Rep, class Period>
- future_status
- wait_for(const chrono::duration<Rep, Period>& rel_time) const;
- template <class Clock, class Duration>
- future_status
- wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
-};
-
-template <class R>
-class shared_future
-{
-public:
- shared_future() noexcept;
- shared_future(const shared_future& rhs);
- shared_future(future<R>&&) noexcept;
- shared_future(shared_future&& rhs) noexcept;
- ~shared_future();
- shared_future& operator=(const shared_future& rhs);
- shared_future& operator=(shared_future&& rhs) noexcept;
-
- // retrieving the value
- const R& get() const;
-
- // functions to check state
- bool valid() const noexcept;
-
- void wait() const;
- template <class Rep, class Period>
- future_status
- wait_for(const chrono::duration<Rep, Period>& rel_time) const;
- template <class Clock, class Duration>
- future_status
- wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
-};
-
-template <class R>
-class shared_future<R&>
-{
-public:
- shared_future() noexcept;
- shared_future(const shared_future& rhs);
- shared_future(future<R&>&&) noexcept;
- shared_future(shared_future&& rhs) noexcept;
- ~shared_future();
- shared_future& operator=(const shared_future& rhs);
- shared_future& operator=(shared_future&& rhs) noexcept;
-
- // retrieving the value
- R& get() const;
-
- // functions to check state
- bool valid() const noexcept;
-
- void wait() const;
- template <class Rep, class Period>
- future_status
- wait_for(const chrono::duration<Rep, Period>& rel_time) const;
- template <class Clock, class Duration>
- future_status
- wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
-};
-
-template <>
-class shared_future<void>
-{
-public:
- shared_future() noexcept;
- shared_future(const shared_future& rhs);
- shared_future(future<void>&&) noexcept;
- shared_future(shared_future&& rhs) noexcept;
- ~shared_future();
- shared_future& operator=(const shared_future& rhs);
- shared_future& operator=(shared_future&& rhs) noexcept;
-
- // retrieving the value
- void get() const;
-
- // functions to check state
- bool valid() const noexcept;
-
- void wait() const;
- template <class Rep, class Period>
- future_status
- wait_for(const chrono::duration<Rep, Period>& rel_time) const;
- template <class Clock, class Duration>
- future_status
- wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
-};
-
-template <class F, class... Args>
- future<typename result_of<typename decay<F>::type(typename decay<Args>::type...)>::type>
- async(F&& f, Args&&... args);
-
-template <class F, class... Args>
- future<typename result_of<typename decay<F>::type(typename decay<Args>::type...)>::type>
- async(launch policy, F&& f, Args&&... args);
-
-template <class> class packaged_task; // undefined
-
-template <class R, class... ArgTypes>
-class packaged_task<R(ArgTypes...)>
-{
-public:
- typedef R result_type; // extension
-
- // construction and destruction
- packaged_task() noexcept;
- template <class F>
- explicit packaged_task(F&& f);
- template <class F, class Allocator>
- packaged_task(allocator_arg_t, const Allocator& a, F&& f);
- ~packaged_task();
-
- // no copy
- packaged_task(const packaged_task&) = delete;
- packaged_task& operator=(const packaged_task&) = delete;
-
- // move support
- packaged_task(packaged_task&& other) noexcept;
- packaged_task& operator=(packaged_task&& other) noexcept;
- void swap(packaged_task& other) noexcept;
-
- bool valid() const noexcept;
-
- // result retrieval
- future<R> get_future();
-
- // execution
- void operator()(ArgTypes... );
- void make_ready_at_thread_exit(ArgTypes...);
-
- void reset();
-};
-
-template <class R>
- void swap(packaged_task<R(ArgTypes...)&, packaged_task<R(ArgTypes...)>&) noexcept;
-
-template <class R, class Alloc> struct uses_allocator<packaged_task<R>, Alloc>;
-
-} // std
-
-*/
-
-#include <__config>
-#include <system_error>
-#include <memory>
-#include <chrono>
-#include <exception>
-#include <mutex>
-#include <thread>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#ifdef _LIBCPP_HAS_NO_THREADS
-#error <future> is not supported on this single threaded system
-#else // !_LIBCPP_HAS_NO_THREADS
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-//enum class future_errc
-_LIBCPP_DECLARE_STRONG_ENUM(future_errc)
-{
- future_already_retrieved = 1,
- promise_already_satisfied,
- no_state,
- broken_promise
-};
-_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_errc)
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS is_error_code_enum<future_errc> : public true_type {};
-
-#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
-template <>
-struct _LIBCPP_TEMPLATE_VIS is_error_code_enum<future_errc::__lx> : public true_type { };
-#endif
-
-//enum class launch
-_LIBCPP_DECLARE_STRONG_ENUM(launch)
-{
- async = 1,
- deferred = 2,
- any = async | deferred
-};
-_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(launch)
-
-#ifndef _LIBCPP_HAS_NO_STRONG_ENUMS
-
-#ifdef _LIBCPP_UNDERLYING_TYPE
-typedef underlying_type<launch>::type __launch_underlying_type;
-#else
-typedef int __launch_underlying_type;
-#endif
-
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-launch
-operator&(launch __x, launch __y)
-{
- return static_cast<launch>(static_cast<__launch_underlying_type>(__x) &
- static_cast<__launch_underlying_type>(__y));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-launch
-operator|(launch __x, launch __y)
-{
- return static_cast<launch>(static_cast<__launch_underlying_type>(__x) |
- static_cast<__launch_underlying_type>(__y));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-launch
-operator^(launch __x, launch __y)
-{
- return static_cast<launch>(static_cast<__launch_underlying_type>(__x) ^
- static_cast<__launch_underlying_type>(__y));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-launch
-operator~(launch __x)
-{
- return static_cast<launch>(~static_cast<__launch_underlying_type>(__x) & 3);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-launch&
-operator&=(launch& __x, launch __y)
-{
- __x = __x & __y; return __x;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-launch&
-operator|=(launch& __x, launch __y)
-{
- __x = __x | __y; return __x;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-launch&
-operator^=(launch& __x, launch __y)
-{
- __x = __x ^ __y; return __x;
-}
-
-#endif // !_LIBCPP_HAS_NO_STRONG_ENUMS
-
-//enum class future_status
-_LIBCPP_DECLARE_STRONG_ENUM(future_status)
-{
- ready,
- timeout,
- deferred
-};
-_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_status)
-
-_LIBCPP_FUNC_VIS
-const error_category& future_category() _NOEXCEPT;
-
-inline _LIBCPP_INLINE_VISIBILITY
-error_code
-make_error_code(future_errc __e) _NOEXCEPT
-{
- return error_code(static_cast<int>(__e), future_category());
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-error_condition
-make_error_condition(future_errc __e) _NOEXCEPT
-{
- return error_condition(static_cast<int>(__e), future_category());
-}
-
-class _LIBCPP_EXCEPTION_ABI _LIBCPP_AVAILABILITY_FUTURE_ERROR future_error
- : public logic_error
-{
- error_code __ec_;
-public:
- future_error(error_code __ec);
-#if _LIBCPP_STD_VERS > 14
- explicit future_error(future_errc _Ev) : logic_error(), __ec_(make_error_code(_Ev)) {}
-#endif
- _LIBCPP_INLINE_VISIBILITY
- const error_code& code() const _NOEXCEPT {return __ec_;}
-
- virtual ~future_error() _NOEXCEPT;
-};
-
-_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
-#ifndef _LIBCPP_NO_EXCEPTIONS
-_LIBCPP_AVAILABILITY_FUTURE_ERROR
-#endif
-void __throw_future_error(future_errc _Ev)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- throw future_error(make_error_code(_Ev));
-#else
- ((void)_Ev);
- _VSTD::abort();
-#endif
-}
-
-class _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_FUTURE __assoc_sub_state
- : public __shared_count
-{
-protected:
- exception_ptr __exception_;
- mutable mutex __mut_;
- mutable condition_variable __cv_;
- unsigned __state_;
-
- virtual void __on_zero_shared() _NOEXCEPT;
- void __sub_wait(unique_lock<mutex>& __lk);
-public:
- enum
- {
- __constructed = 1,
- __future_attached = 2,
- ready = 4,
- deferred = 8
- };
-
- _LIBCPP_INLINE_VISIBILITY
- __assoc_sub_state() : __state_(0) {}
-
- _LIBCPP_INLINE_VISIBILITY
- bool __has_value() const
- {return (__state_ & __constructed) || (__exception_ != nullptr);}
-
- _LIBCPP_INLINE_VISIBILITY
- void __attach_future() {
- lock_guard<mutex> __lk(__mut_);
- bool __has_future_attached = (__state_ & __future_attached) != 0;
- if (__has_future_attached)
- __throw_future_error(future_errc::future_already_retrieved);
- this->__add_shared();
- __state_ |= __future_attached;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __set_deferred() {__state_ |= deferred;}
-
- void __make_ready();
- _LIBCPP_INLINE_VISIBILITY
- bool __is_ready() const {return (__state_ & ready) != 0;}
-
- void set_value();
- void set_value_at_thread_exit();
-
- void set_exception(exception_ptr __p);
- void set_exception_at_thread_exit(exception_ptr __p);
-
- void copy();
-
- void wait();
- template <class _Rep, class _Period>
- future_status
- _LIBCPP_INLINE_VISIBILITY
- wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const;
- template <class _Clock, class _Duration>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- future_status
- wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const;
-
- virtual void __execute();
-};
-
-template <class _Clock, class _Duration>
-future_status
-__assoc_sub_state::wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
-{
- unique_lock<mutex> __lk(__mut_);
- if (__state_ & deferred)
- return future_status::deferred;
- while (!(__state_ & ready) && _Clock::now() < __abs_time)
- __cv_.wait_until(__lk, __abs_time);
- if (__state_ & ready)
- return future_status::ready;
- return future_status::timeout;
-}
-
-template <class _Rep, class _Period>
-inline
-future_status
-__assoc_sub_state::wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
-{
- return wait_until(chrono::steady_clock::now() + __rel_time);
-}
-
-template <class _Rp>
-class _LIBCPP_AVAILABILITY_FUTURE __assoc_state
- : public __assoc_sub_state
-{
- typedef __assoc_sub_state base;
- typedef typename aligned_storage<sizeof(_Rp), alignment_of<_Rp>::value>::type _Up;
-protected:
- _Up __value_;
-
- virtual void __on_zero_shared() _NOEXCEPT;
-public:
-
- template <class _Arg>
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- void set_value(_Arg&& __arg);
-#else
- void set_value(_Arg& __arg);
-#endif
-
- template <class _Arg>
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- void set_value_at_thread_exit(_Arg&& __arg);
-#else
- void set_value_at_thread_exit(_Arg& __arg);
-#endif
-
- _Rp move();
- typename add_lvalue_reference<_Rp>::type copy();
-};
-
-template <class _Rp>
-void
-__assoc_state<_Rp>::__on_zero_shared() _NOEXCEPT
-{
- if (this->__state_ & base::__constructed)
- reinterpret_cast<_Rp*>(&__value_)->~_Rp();
- delete this;
-}
-
-template <class _Rp>
-template <class _Arg>
-_LIBCPP_AVAILABILITY_FUTURE
-void
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-__assoc_state<_Rp>::set_value(_Arg&& __arg)
-#else
-__assoc_state<_Rp>::set_value(_Arg& __arg)
-#endif
-{
- unique_lock<mutex> __lk(this->__mut_);
- if (this->__has_value())
- __throw_future_error(future_errc::promise_already_satisfied);
- ::new(&__value_) _Rp(_VSTD::forward<_Arg>(__arg));
- this->__state_ |= base::__constructed | base::ready;
- __cv_.notify_all();
-}
-
-template <class _Rp>
-template <class _Arg>
-void
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-__assoc_state<_Rp>::set_value_at_thread_exit(_Arg&& __arg)
-#else
-__assoc_state<_Rp>::set_value_at_thread_exit(_Arg& __arg)
-#endif
-{
- unique_lock<mutex> __lk(this->__mut_);
- if (this->__has_value())
- __throw_future_error(future_errc::promise_already_satisfied);
- ::new(&__value_) _Rp(_VSTD::forward<_Arg>(__arg));
- this->__state_ |= base::__constructed;
- __thread_local_data()->__make_ready_at_thread_exit(this);
-}
-
-template <class _Rp>
-_Rp
-__assoc_state<_Rp>::move()
-{
- unique_lock<mutex> __lk(this->__mut_);
- this->__sub_wait(__lk);
- if (this->__exception_ != nullptr)
- rethrow_exception(this->__exception_);
- return _VSTD::move(*reinterpret_cast<_Rp*>(&__value_));
-}
-
-template <class _Rp>
-typename add_lvalue_reference<_Rp>::type
-__assoc_state<_Rp>::copy()
-{
- unique_lock<mutex> __lk(this->__mut_);
- this->__sub_wait(__lk);
- if (this->__exception_ != nullptr)
- rethrow_exception(this->__exception_);
- return *reinterpret_cast<_Rp*>(&__value_);
-}
-
-template <class _Rp>
-class _LIBCPP_AVAILABILITY_FUTURE __assoc_state<_Rp&>
- : public __assoc_sub_state
-{
- typedef __assoc_sub_state base;
- typedef _Rp* _Up;
-protected:
- _Up __value_;
-
- virtual void __on_zero_shared() _NOEXCEPT;
-public:
-
- void set_value(_Rp& __arg);
- void set_value_at_thread_exit(_Rp& __arg);
-
- _Rp& copy();
-};
-
-template <class _Rp>
-void
-__assoc_state<_Rp&>::__on_zero_shared() _NOEXCEPT
-{
- delete this;
-}
-
-template <class _Rp>
-void
-__assoc_state<_Rp&>::set_value(_Rp& __arg)
-{
- unique_lock<mutex> __lk(this->__mut_);
- if (this->__has_value())
- __throw_future_error(future_errc::promise_already_satisfied);
- __value_ = _VSTD::addressof(__arg);
- this->__state_ |= base::__constructed | base::ready;
- __cv_.notify_all();
-}
-
-template <class _Rp>
-void
-__assoc_state<_Rp&>::set_value_at_thread_exit(_Rp& __arg)
-{
- unique_lock<mutex> __lk(this->__mut_);
- if (this->__has_value())
- __throw_future_error(future_errc::promise_already_satisfied);
- __value_ = _VSTD::addressof(__arg);
- this->__state_ |= base::__constructed;
- __thread_local_data()->__make_ready_at_thread_exit(this);
-}
-
-template <class _Rp>
-_Rp&
-__assoc_state<_Rp&>::copy()
-{
- unique_lock<mutex> __lk(this->__mut_);
- this->__sub_wait(__lk);
- if (this->__exception_ != nullptr)
- rethrow_exception(this->__exception_);
- return *__value_;
-}
-
-template <class _Rp, class _Alloc>
-class _LIBCPP_AVAILABILITY_FUTURE __assoc_state_alloc
- : public __assoc_state<_Rp>
-{
- typedef __assoc_state<_Rp> base;
- _Alloc __alloc_;
-
- virtual void __on_zero_shared() _NOEXCEPT;
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __assoc_state_alloc(const _Alloc& __a)
- : __alloc_(__a) {}
-};
-
-template <class _Rp, class _Alloc>
-void
-__assoc_state_alloc<_Rp, _Alloc>::__on_zero_shared() _NOEXCEPT
-{
- if (this->__state_ & base::__constructed)
- reinterpret_cast<_Rp*>(_VSTD::addressof(this->__value_))->~_Rp();
- typedef typename __allocator_traits_rebind<_Alloc, __assoc_state_alloc>::type _Al;
- typedef allocator_traits<_Al> _ATraits;
- typedef pointer_traits<typename _ATraits::pointer> _PTraits;
- _Al __a(__alloc_);
- this->~__assoc_state_alloc();
- __a.deallocate(_PTraits::pointer_to(*this), 1);
-}
-
-template <class _Rp, class _Alloc>
-class _LIBCPP_AVAILABILITY_FUTURE __assoc_state_alloc<_Rp&, _Alloc>
- : public __assoc_state<_Rp&>
-{
- typedef __assoc_state<_Rp&> base;
- _Alloc __alloc_;
-
- virtual void __on_zero_shared() _NOEXCEPT;
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __assoc_state_alloc(const _Alloc& __a)
- : __alloc_(__a) {}
-};
-
-template <class _Rp, class _Alloc>
-void
-__assoc_state_alloc<_Rp&, _Alloc>::__on_zero_shared() _NOEXCEPT
-{
- typedef typename __allocator_traits_rebind<_Alloc, __assoc_state_alloc>::type _Al;
- typedef allocator_traits<_Al> _ATraits;
- typedef pointer_traits<typename _ATraits::pointer> _PTraits;
- _Al __a(__alloc_);
- this->~__assoc_state_alloc();
- __a.deallocate(_PTraits::pointer_to(*this), 1);
-}
-
-template <class _Alloc>
-class _LIBCPP_AVAILABILITY_FUTURE __assoc_sub_state_alloc
- : public __assoc_sub_state
-{
- typedef __assoc_sub_state base;
- _Alloc __alloc_;
-
- virtual void __on_zero_shared() _NOEXCEPT;
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __assoc_sub_state_alloc(const _Alloc& __a)
- : __alloc_(__a) {}
-};
-
-template <class _Alloc>
-void
-__assoc_sub_state_alloc<_Alloc>::__on_zero_shared() _NOEXCEPT
-{
- typedef typename __allocator_traits_rebind<_Alloc, __assoc_sub_state_alloc>::type _Al;
- typedef allocator_traits<_Al> _ATraits;
- typedef pointer_traits<typename _ATraits::pointer> _PTraits;
- _Al __a(__alloc_);
- this->~__assoc_sub_state_alloc();
- __a.deallocate(_PTraits::pointer_to(*this), 1);
-}
-
-template <class _Rp, class _Fp>
-class _LIBCPP_AVAILABILITY_FUTURE __deferred_assoc_state
- : public __assoc_state<_Rp>
-{
- typedef __assoc_state<_Rp> base;
-
- _Fp __func_;
-
-public:
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- explicit __deferred_assoc_state(_Fp&& __f);
-#endif
-
- virtual void __execute();
-};
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Rp, class _Fp>
-inline
-__deferred_assoc_state<_Rp, _Fp>::__deferred_assoc_state(_Fp&& __f)
- : __func_(_VSTD::forward<_Fp>(__f))
-{
- this->__set_deferred();
-}
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Rp, class _Fp>
-void
-__deferred_assoc_state<_Rp, _Fp>::__execute()
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- this->set_value(__func_());
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->set_exception(current_exception());
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
-}
-
-template <class _Fp>
-class _LIBCPP_AVAILABILITY_FUTURE __deferred_assoc_state<void, _Fp>
- : public __assoc_sub_state
-{
- typedef __assoc_sub_state base;
-
- _Fp __func_;
-
-public:
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- explicit __deferred_assoc_state(_Fp&& __f);
-#endif
-
- virtual void __execute();
-};
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Fp>
-inline
-__deferred_assoc_state<void, _Fp>::__deferred_assoc_state(_Fp&& __f)
- : __func_(_VSTD::forward<_Fp>(__f))
-{
- this->__set_deferred();
-}
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Fp>
-void
-__deferred_assoc_state<void, _Fp>::__execute()
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- __func_();
- this->set_value();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->set_exception(current_exception());
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
-}
-
-template <class _Rp, class _Fp>
-class _LIBCPP_AVAILABILITY_FUTURE __async_assoc_state
- : public __assoc_state<_Rp>
-{
- typedef __assoc_state<_Rp> base;
-
- _Fp __func_;
-
- virtual void __on_zero_shared() _NOEXCEPT;
-public:
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- explicit __async_assoc_state(_Fp&& __f);
-#endif
-
- virtual void __execute();
-};
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Rp, class _Fp>
-inline
-__async_assoc_state<_Rp, _Fp>::__async_assoc_state(_Fp&& __f)
- : __func_(_VSTD::forward<_Fp>(__f))
-{
-}
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Rp, class _Fp>
-void
-__async_assoc_state<_Rp, _Fp>::__execute()
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- this->set_value(__func_());
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->set_exception(current_exception());
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
-}
-
-template <class _Rp, class _Fp>
-void
-__async_assoc_state<_Rp, _Fp>::__on_zero_shared() _NOEXCEPT
-{
- this->wait();
- base::__on_zero_shared();
-}
-
-template <class _Fp>
-class _LIBCPP_AVAILABILITY_FUTURE __async_assoc_state<void, _Fp>
- : public __assoc_sub_state
-{
- typedef __assoc_sub_state base;
-
- _Fp __func_;
-
- virtual void __on_zero_shared() _NOEXCEPT;
-public:
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- explicit __async_assoc_state(_Fp&& __f);
-#endif
-
- virtual void __execute();
-};
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Fp>
-inline
-__async_assoc_state<void, _Fp>::__async_assoc_state(_Fp&& __f)
- : __func_(_VSTD::forward<_Fp>(__f))
-{
-}
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Fp>
-void
-__async_assoc_state<void, _Fp>::__execute()
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- __func_();
- this->set_value();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->set_exception(current_exception());
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
-}
-
-template <class _Fp>
-void
-__async_assoc_state<void, _Fp>::__on_zero_shared() _NOEXCEPT
-{
- this->wait();
- base::__on_zero_shared();
-}
-
-template <class _Rp> class _LIBCPP_TEMPLATE_VIS promise;
-template <class _Rp> class _LIBCPP_TEMPLATE_VIS shared_future;
-
-// future
-
-template <class _Rp> class _LIBCPP_TEMPLATE_VIS future;
-
-template <class _Rp, class _Fp>
-future<_Rp>
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-__make_deferred_assoc_state(_Fp&& __f);
-#else
-__make_deferred_assoc_state(_Fp __f);
-#endif
-
-template <class _Rp, class _Fp>
-future<_Rp>
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-__make_async_assoc_state(_Fp&& __f);
-#else
-__make_async_assoc_state(_Fp __f);
-#endif
-
-template <class _Rp>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE future
-{
- __assoc_state<_Rp>* __state_;
-
- explicit future(__assoc_state<_Rp>* __state);
-
- template <class> friend class promise;
- template <class> friend class shared_future;
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- template <class _R1, class _Fp>
- friend future<_R1> __make_deferred_assoc_state(_Fp&& __f);
- template <class _R1, class _Fp>
- friend future<_R1> __make_async_assoc_state(_Fp&& __f);
-#else
- template <class _R1, class _Fp>
- friend future<_R1> __make_deferred_assoc_state(_Fp __f);
- template <class _R1, class _Fp>
- friend future<_R1> __make_async_assoc_state(_Fp __f);
-#endif
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- future() _NOEXCEPT : __state_(nullptr) {}
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- future(future&& __rhs) _NOEXCEPT
- : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
- future(const future&) = delete;
- future& operator=(const future&) = delete;
- _LIBCPP_INLINE_VISIBILITY
- future& operator=(future&& __rhs) _NOEXCEPT
- {
- future(std::move(__rhs)).swap(*this);
- return *this;
- }
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-private:
- future(const future&);
- future& operator=(const future&);
-public:
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- ~future();
- _LIBCPP_INLINE_VISIBILITY
- shared_future<_Rp> share() _NOEXCEPT;
-
- // retrieving the value
- _Rp get();
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
-
- // functions to check state
- _LIBCPP_INLINE_VISIBILITY
- bool valid() const _NOEXCEPT {return __state_ != nullptr;}
-
- _LIBCPP_INLINE_VISIBILITY
- void wait() const {__state_->wait();}
- template <class _Rep, class _Period>
- _LIBCPP_INLINE_VISIBILITY
- future_status
- wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
- {return __state_->wait_for(__rel_time);}
- template <class _Clock, class _Duration>
- _LIBCPP_INLINE_VISIBILITY
- future_status
- wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
- {return __state_->wait_until(__abs_time);}
-};
-
-template <class _Rp>
-future<_Rp>::future(__assoc_state<_Rp>* __state)
- : __state_(__state)
-{
- __state_->__attach_future();
-}
-
-struct __release_shared_count
-{
- void operator()(__shared_count* p) {p->__release_shared();}
-};
-
-template <class _Rp>
-future<_Rp>::~future()
-{
- if (__state_)
- __state_->__release_shared();
-}
-
-template <class _Rp>
-_Rp
-future<_Rp>::get()
-{
- unique_ptr<__shared_count, __release_shared_count> __(__state_);
- __assoc_state<_Rp>* __s = __state_;
- __state_ = nullptr;
- return __s->move();
-}
-
-template <class _Rp>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE future<_Rp&>
-{
- __assoc_state<_Rp&>* __state_;
-
- explicit future(__assoc_state<_Rp&>* __state);
-
- template <class> friend class promise;
- template <class> friend class shared_future;
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- template <class _R1, class _Fp>
- friend future<_R1> __make_deferred_assoc_state(_Fp&& __f);
- template <class _R1, class _Fp>
- friend future<_R1> __make_async_assoc_state(_Fp&& __f);
-#else
- template <class _R1, class _Fp>
- friend future<_R1> __make_deferred_assoc_state(_Fp __f);
- template <class _R1, class _Fp>
- friend future<_R1> __make_async_assoc_state(_Fp __f);
-#endif
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- future() _NOEXCEPT : __state_(nullptr) {}
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- future(future&& __rhs) _NOEXCEPT
- : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
- future(const future&) = delete;
- future& operator=(const future&) = delete;
- _LIBCPP_INLINE_VISIBILITY
- future& operator=(future&& __rhs) _NOEXCEPT
- {
- future(std::move(__rhs)).swap(*this);
- return *this;
- }
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-private:
- future(const future&);
- future& operator=(const future&);
-public:
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- ~future();
- _LIBCPP_INLINE_VISIBILITY
- shared_future<_Rp&> share() _NOEXCEPT;
-
- // retrieving the value
- _Rp& get();
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
-
- // functions to check state
- _LIBCPP_INLINE_VISIBILITY
- bool valid() const _NOEXCEPT {return __state_ != nullptr;}
-
- _LIBCPP_INLINE_VISIBILITY
- void wait() const {__state_->wait();}
- template <class _Rep, class _Period>
- _LIBCPP_INLINE_VISIBILITY
- future_status
- wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
- {return __state_->wait_for(__rel_time);}
- template <class _Clock, class _Duration>
- _LIBCPP_INLINE_VISIBILITY
- future_status
- wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
- {return __state_->wait_until(__abs_time);}
-};
-
-template <class _Rp>
-future<_Rp&>::future(__assoc_state<_Rp&>* __state)
- : __state_(__state)
-{
- __state_->__attach_future();
-}
-
-template <class _Rp>
-future<_Rp&>::~future()
-{
- if (__state_)
- __state_->__release_shared();
-}
-
-template <class _Rp>
-_Rp&
-future<_Rp&>::get()
-{
- unique_ptr<__shared_count, __release_shared_count> __(__state_);
- __assoc_state<_Rp&>* __s = __state_;
- __state_ = nullptr;
- return __s->copy();
-}
-
-template <>
-class _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_FUTURE future<void>
-{
- __assoc_sub_state* __state_;
-
- explicit future(__assoc_sub_state* __state);
-
- template <class> friend class promise;
- template <class> friend class shared_future;
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- template <class _R1, class _Fp>
- friend future<_R1> __make_deferred_assoc_state(_Fp&& __f);
- template <class _R1, class _Fp>
- friend future<_R1> __make_async_assoc_state(_Fp&& __f);
-#else
- template <class _R1, class _Fp>
- friend future<_R1> __make_deferred_assoc_state(_Fp __f);
- template <class _R1, class _Fp>
- friend future<_R1> __make_async_assoc_state(_Fp __f);
-#endif
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- future() _NOEXCEPT : __state_(nullptr) {}
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- future(future&& __rhs) _NOEXCEPT
- : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
- future(const future&) = delete;
- future& operator=(const future&) = delete;
- _LIBCPP_INLINE_VISIBILITY
- future& operator=(future&& __rhs) _NOEXCEPT
- {
- future(std::move(__rhs)).swap(*this);
- return *this;
- }
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-private:
- future(const future&);
- future& operator=(const future&);
-public:
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- ~future();
- _LIBCPP_INLINE_VISIBILITY
- shared_future<void> share() _NOEXCEPT;
-
- // retrieving the value
- void get();
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
-
- // functions to check state
- _LIBCPP_INLINE_VISIBILITY
- bool valid() const _NOEXCEPT {return __state_ != nullptr;}
-
- _LIBCPP_INLINE_VISIBILITY
- void wait() const {__state_->wait();}
- template <class _Rep, class _Period>
- _LIBCPP_INLINE_VISIBILITY
- future_status
- wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
- {return __state_->wait_for(__rel_time);}
- template <class _Clock, class _Duration>
- _LIBCPP_INLINE_VISIBILITY
- future_status
- wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
- {return __state_->wait_until(__abs_time);}
-};
-
-template <class _Rp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(future<_Rp>& __x, future<_Rp>& __y) _NOEXCEPT
-{
- __x.swap(__y);
-}
-
-// promise<R>
-
-template <class _Callable> class packaged_task;
-
-template <class _Rp>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE promise
-{
- __assoc_state<_Rp>* __state_;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {}
-
- template <class> friend class packaged_task;
-public:
- promise();
- template <class _Alloc>
- promise(allocator_arg_t, const _Alloc& __a);
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- promise(promise&& __rhs) _NOEXCEPT
- : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
- promise(const promise& __rhs) = delete;
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-private:
- promise(const promise& __rhs);
-public:
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- ~promise();
-
- // assignment
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- promise& operator=(promise&& __rhs) _NOEXCEPT
- {
- promise(std::move(__rhs)).swap(*this);
- return *this;
- }
- promise& operator=(const promise& __rhs) = delete;
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-private:
- promise& operator=(const promise& __rhs);
-public:
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
-
- // retrieving the result
- future<_Rp> get_future();
-
- // setting the result
- void set_value(const _Rp& __r);
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- void set_value(_Rp&& __r);
-#endif
- void set_exception(exception_ptr __p);
-
- // setting the result with deferred notification
- void set_value_at_thread_exit(const _Rp& __r);
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- void set_value_at_thread_exit(_Rp&& __r);
-#endif
- void set_exception_at_thread_exit(exception_ptr __p);
-};
-
-template <class _Rp>
-promise<_Rp>::promise()
- : __state_(new __assoc_state<_Rp>)
-{
-}
-
-template <class _Rp>
-template <class _Alloc>
-promise<_Rp>::promise(allocator_arg_t, const _Alloc& __a0)
-{
- typedef __assoc_state_alloc<_Rp, _Alloc> _State;
- typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2;
- typedef __allocator_destructor<_A2> _D2;
- _A2 __a(__a0);
- unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1));
- ::new(static_cast<void*>(_VSTD::addressof(*__hold.get()))) _State(__a0);
- __state_ = _VSTD::addressof(*__hold.release());
-}
-
-template <class _Rp>
-promise<_Rp>::~promise()
-{
- if (__state_)
- {
- if (!__state_->__has_value() && __state_->use_count() > 1)
- __state_->set_exception(make_exception_ptr(
- future_error(make_error_code(future_errc::broken_promise))
- ));
- __state_->__release_shared();
- }
-}
-
-template <class _Rp>
-future<_Rp>
-promise<_Rp>::get_future()
-{
- if (__state_ == nullptr)
- __throw_future_error(future_errc::no_state);
- return future<_Rp>(__state_);
-}
-
-template <class _Rp>
-void
-promise<_Rp>::set_value(const _Rp& __r)
-{
- if (__state_ == nullptr)
- __throw_future_error(future_errc::no_state);
- __state_->set_value(__r);
-}
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Rp>
-void
-promise<_Rp>::set_value(_Rp&& __r)
-{
- if (__state_ == nullptr)
- __throw_future_error(future_errc::no_state);
- __state_->set_value(_VSTD::move(__r));
-}
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Rp>
-void
-promise<_Rp>::set_exception(exception_ptr __p)
-{
- _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception: received nullptr" );
- if (__state_ == nullptr)
- __throw_future_error(future_errc::no_state);
- __state_->set_exception(__p);
-}
-
-template <class _Rp>
-void
-promise<_Rp>::set_value_at_thread_exit(const _Rp& __r)
-{
- if (__state_ == nullptr)
- __throw_future_error(future_errc::no_state);
- __state_->set_value_at_thread_exit(__r);
-}
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Rp>
-void
-promise<_Rp>::set_value_at_thread_exit(_Rp&& __r)
-{
- if (__state_ == nullptr)
- __throw_future_error(future_errc::no_state);
- __state_->set_value_at_thread_exit(_VSTD::move(__r));
-}
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Rp>
-void
-promise<_Rp>::set_exception_at_thread_exit(exception_ptr __p)
-{
- _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception_at_thread_exit: received nullptr" );
- if (__state_ == nullptr)
- __throw_future_error(future_errc::no_state);
- __state_->set_exception_at_thread_exit(__p);
-}
-
-// promise<R&>
-
-template <class _Rp>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE promise<_Rp&>
-{
- __assoc_state<_Rp&>* __state_;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {}
-
- template <class> friend class packaged_task;
-
-public:
- promise();
- template <class _Allocator>
- promise(allocator_arg_t, const _Allocator& __a);
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- promise(promise&& __rhs) _NOEXCEPT
- : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
- promise(const promise& __rhs) = delete;
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-private:
- promise(const promise& __rhs);
-public:
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- ~promise();
-
- // assignment
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- promise& operator=(promise&& __rhs) _NOEXCEPT
- {
- promise(std::move(__rhs)).swap(*this);
- return *this;
- }
- promise& operator=(const promise& __rhs) = delete;
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-private:
- promise& operator=(const promise& __rhs);
-public:
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
-
- // retrieving the result
- future<_Rp&> get_future();
-
- // setting the result
- void set_value(_Rp& __r);
- void set_exception(exception_ptr __p);
-
- // setting the result with deferred notification
- void set_value_at_thread_exit(_Rp&);
- void set_exception_at_thread_exit(exception_ptr __p);
-};
-
-template <class _Rp>
-promise<_Rp&>::promise()
- : __state_(new __assoc_state<_Rp&>)
-{
-}
-
-template <class _Rp>
-template <class _Alloc>
-promise<_Rp&>::promise(allocator_arg_t, const _Alloc& __a0)
-{
- typedef __assoc_state_alloc<_Rp&, _Alloc> _State;
- typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2;
- typedef __allocator_destructor<_A2> _D2;
- _A2 __a(__a0);
- unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1));
- ::new(static_cast<void*>(_VSTD::addressof(*__hold.get()))) _State(__a0);
- __state_ = _VSTD::addressof(*__hold.release());
-}
-
-template <class _Rp>
-promise<_Rp&>::~promise()
-{
- if (__state_)
- {
- if (!__state_->__has_value() && __state_->use_count() > 1)
- __state_->set_exception(make_exception_ptr(
- future_error(make_error_code(future_errc::broken_promise))
- ));
- __state_->__release_shared();
- }
-}
-
-template <class _Rp>
-future<_Rp&>
-promise<_Rp&>::get_future()
-{
- if (__state_ == nullptr)
- __throw_future_error(future_errc::no_state);
- return future<_Rp&>(__state_);
-}
-
-template <class _Rp>
-void
-promise<_Rp&>::set_value(_Rp& __r)
-{
- if (__state_ == nullptr)
- __throw_future_error(future_errc::no_state);
- __state_->set_value(__r);
-}
-
-template <class _Rp>
-void
-promise<_Rp&>::set_exception(exception_ptr __p)
-{
- _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception: received nullptr" );
- if (__state_ == nullptr)
- __throw_future_error(future_errc::no_state);
- __state_->set_exception(__p);
-}
-
-template <class _Rp>
-void
-promise<_Rp&>::set_value_at_thread_exit(_Rp& __r)
-{
- if (__state_ == nullptr)
- __throw_future_error(future_errc::no_state);
- __state_->set_value_at_thread_exit(__r);
-}
-
-template <class _Rp>
-void
-promise<_Rp&>::set_exception_at_thread_exit(exception_ptr __p)
-{
- _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception_at_thread_exit: received nullptr" );
- if (__state_ == nullptr)
- __throw_future_error(future_errc::no_state);
- __state_->set_exception_at_thread_exit(__p);
-}
-
-// promise<void>
-
-template <>
-class _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_FUTURE promise<void>
-{
- __assoc_sub_state* __state_;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {}
-
- template <class> friend class packaged_task;
-
-public:
- promise();
- template <class _Allocator>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- promise(allocator_arg_t, const _Allocator& __a);
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- promise(promise&& __rhs) _NOEXCEPT
- : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
- promise(const promise& __rhs) = delete;
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-private:
- promise(const promise& __rhs);
-public:
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- ~promise();
-
- // assignment
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- promise& operator=(promise&& __rhs) _NOEXCEPT
- {
- promise(std::move(__rhs)).swap(*this);
- return *this;
- }
- promise& operator=(const promise& __rhs) = delete;
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-private:
- promise& operator=(const promise& __rhs);
-public:
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
-
- // retrieving the result
- future<void> get_future();
-
- // setting the result
- void set_value();
- void set_exception(exception_ptr __p);
-
- // setting the result with deferred notification
- void set_value_at_thread_exit();
- void set_exception_at_thread_exit(exception_ptr __p);
-};
-
-template <class _Alloc>
-promise<void>::promise(allocator_arg_t, const _Alloc& __a0)
-{
- typedef __assoc_sub_state_alloc<_Alloc> _State;
- typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2;
- typedef __allocator_destructor<_A2> _D2;
- _A2 __a(__a0);
- unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1));
- ::new(static_cast<void*>(_VSTD::addressof(*__hold.get()))) _State(__a0);
- __state_ = _VSTD::addressof(*__hold.release());
-}
-
-template <class _Rp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(promise<_Rp>& __x, promise<_Rp>& __y) _NOEXCEPT
-{
- __x.swap(__y);
-}
-
-template <class _Rp, class _Alloc>
- struct _LIBCPP_TEMPLATE_VIS uses_allocator<promise<_Rp>, _Alloc>
- : public true_type {};
-
-#ifndef _LIBCPP_HAS_NO_VARIADICS
-
-// packaged_task
-
-template<class _Fp> class __packaged_task_base;
-
-template<class _Rp, class ..._ArgTypes>
-class _LIBCPP_AVAILABILITY_FUTURE __packaged_task_base<_Rp(_ArgTypes...)>
-{
- __packaged_task_base(const __packaged_task_base&);
- __packaged_task_base& operator=(const __packaged_task_base&);
-public:
- _LIBCPP_INLINE_VISIBILITY
- __packaged_task_base() {}
- _LIBCPP_INLINE_VISIBILITY
- virtual ~__packaged_task_base() {}
- virtual void __move_to(__packaged_task_base*) _NOEXCEPT = 0;
- virtual void destroy() = 0;
- virtual void destroy_deallocate() = 0;
- virtual _Rp operator()(_ArgTypes&& ...) = 0;
-};
-
-template<class _FD, class _Alloc, class _FB> class __packaged_task_func;
-
-template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
-class _LIBCPP_AVAILABILITY_FUTURE __packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>
- : public __packaged_task_base<_Rp(_ArgTypes...)>
-{
- __compressed_pair<_Fp, _Alloc> __f_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __packaged_task_func(const _Fp& __f) : __f_(__f) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit __packaged_task_func(_Fp&& __f) : __f_(_VSTD::move(__f)) {}
- _LIBCPP_INLINE_VISIBILITY
- __packaged_task_func(const _Fp& __f, const _Alloc& __a)
- : __f_(__f, __a) {}
- _LIBCPP_INLINE_VISIBILITY
- __packaged_task_func(_Fp&& __f, const _Alloc& __a)
- : __f_(_VSTD::move(__f), __a) {}
- virtual void __move_to(__packaged_task_base<_Rp(_ArgTypes...)>*) _NOEXCEPT;
- virtual void destroy();
- virtual void destroy_deallocate();
- virtual _Rp operator()(_ArgTypes&& ... __args);
-};
-
-template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
-void
-__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__move_to(
- __packaged_task_base<_Rp(_ArgTypes...)>* __p) _NOEXCEPT
-{
- ::new (__p) __packaged_task_func(_VSTD::move(__f_.first()), _VSTD::move(__f_.second()));
-}
-
-template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
-void
-__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy()
-{
- __f_.~__compressed_pair<_Fp, _Alloc>();
-}
-
-template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
-void
-__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate()
-{
- typedef typename __allocator_traits_rebind<_Alloc, __packaged_task_func>::type _Ap;
- typedef allocator_traits<_Ap> _ATraits;
- typedef pointer_traits<typename _ATraits::pointer> _PTraits;
- _Ap __a(__f_.second());
- __f_.~__compressed_pair<_Fp, _Alloc>();
- __a.deallocate(_PTraits::pointer_to(*this), 1);
-}
-
-template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
-_Rp
-__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg)
-{
- return __invoke(__f_.first(), _VSTD::forward<_ArgTypes>(__arg)...);
-}
-
-template <class _Callable> class __packaged_task_function;
-
-template<class _Rp, class ..._ArgTypes>
-class _LIBCPP_AVAILABILITY_FUTURE __packaged_task_function<_Rp(_ArgTypes...)>
-{
- typedef __packaged_task_base<_Rp(_ArgTypes...)> __base;
- typename aligned_storage<3*sizeof(void*)>::type __buf_;
- __base* __f_;
-
-public:
- typedef _Rp result_type;
-
- // construct/copy/destroy:
- _LIBCPP_INLINE_VISIBILITY
- __packaged_task_function() _NOEXCEPT : __f_(nullptr) {}
- template<class _Fp>
- __packaged_task_function(_Fp&& __f);
- template<class _Fp, class _Alloc>
- __packaged_task_function(allocator_arg_t, const _Alloc& __a, _Fp&& __f);
-
- __packaged_task_function(__packaged_task_function&&) _NOEXCEPT;
- __packaged_task_function& operator=(__packaged_task_function&&) _NOEXCEPT;
-
- __packaged_task_function(const __packaged_task_function&) = delete;
- __packaged_task_function& operator=(const __packaged_task_function&) = delete;
-
- ~__packaged_task_function();
-
- void swap(__packaged_task_function&) _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- _Rp operator()(_ArgTypes...) const;
-};
-
-template<class _Rp, class ..._ArgTypes>
-__packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(__packaged_task_function&& __f) _NOEXCEPT
-{
- if (__f.__f_ == nullptr)
- __f_ = nullptr;
- else if (__f.__f_ == (__base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__move_to(__f_);
- }
- else
- {
- __f_ = __f.__f_;
- __f.__f_ = nullptr;
- }
-}
-
-template<class _Rp, class ..._ArgTypes>
-template <class _Fp>
-__packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(_Fp&& __f)
- : __f_(nullptr)
-{
- typedef typename remove_reference<typename decay<_Fp>::type>::type _FR;
- typedef __packaged_task_func<_FR, allocator<_FR>, _Rp(_ArgTypes...)> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new (__f_) _FF(_VSTD::forward<_Fp>(__f));
- }
- else
- {
- typedef allocator<_FF> _Ap;
- _Ap __a;
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (__hold.get()) _FF(_VSTD::forward<_Fp>(__f), allocator<_FR>(__a));
- __f_ = __hold.release();
- }
-}
-
-template<class _Rp, class ..._ArgTypes>
-template <class _Fp, class _Alloc>
-__packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(
- allocator_arg_t, const _Alloc& __a0, _Fp&& __f)
- : __f_(nullptr)
-{
- typedef typename remove_reference<typename decay<_Fp>::type>::type _FR;
- typedef __packaged_task_func<_FR, _Alloc, _Rp(_ArgTypes...)> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new (__f_) _FF(_VSTD::forward<_Fp>(__f));
- }
- else
- {
- typedef typename __allocator_traits_rebind<_Alloc, _FF>::type _Ap;
- _Ap __a(__a0);
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new (static_cast<void*>(_VSTD::addressof(*__hold.get())))
- _FF(_VSTD::forward<_Fp>(__f), _Alloc(__a));
- __f_ = _VSTD::addressof(*__hold.release());
- }
-}
-
-template<class _Rp, class ..._ArgTypes>
-__packaged_task_function<_Rp(_ArgTypes...)>&
-__packaged_task_function<_Rp(_ArgTypes...)>::operator=(__packaged_task_function&& __f) _NOEXCEPT
-{
- if (__f_ == (__base*)&__buf_)
- __f_->destroy();
- else if (__f_)
- __f_->destroy_deallocate();
- __f_ = nullptr;
- if (__f.__f_ == nullptr)
- __f_ = nullptr;
- else if (__f.__f_ == (__base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__move_to(__f_);
- }
- else
- {
- __f_ = __f.__f_;
- __f.__f_ = nullptr;
- }
- return *this;
-}
-
-template<class _Rp, class ..._ArgTypes>
-__packaged_task_function<_Rp(_ArgTypes...)>::~__packaged_task_function()
-{
- if (__f_ == (__base*)&__buf_)
- __f_->destroy();
- else if (__f_)
- __f_->destroy_deallocate();
-}
-
-template<class _Rp, class ..._ArgTypes>
-void
-__packaged_task_function<_Rp(_ArgTypes...)>::swap(__packaged_task_function& __f) _NOEXCEPT
-{
- if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
- {
- typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
- __base* __t = (__base*)&__tempbuf;
- __f_->__move_to(__t);
- __f_->destroy();
- __f_ = nullptr;
- __f.__f_->__move_to((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = nullptr;
- __f_ = (__base*)&__buf_;
- __t->__move_to((__base*)&__f.__buf_);
- __t->destroy();
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f_ == (__base*)&__buf_)
- {
- __f_->__move_to((__base*)&__f.__buf_);
- __f_->destroy();
- __f_ = __f.__f_;
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f.__f_ == (__base*)&__f.__buf_)
- {
- __f.__f_->__move_to((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = __f_;
- __f_ = (__base*)&__buf_;
- }
- else
- _VSTD::swap(__f_, __f.__f_);
-}
-
-template<class _Rp, class ..._ArgTypes>
-inline
-_Rp
-__packaged_task_function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const
-{
- return (*__f_)(_VSTD::forward<_ArgTypes>(__arg)...);
-}
-
-template<class _Rp, class ..._ArgTypes>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE packaged_task<_Rp(_ArgTypes...)>
-{
-public:
- typedef _Rp result_type; // extension
-
-private:
- __packaged_task_function<result_type(_ArgTypes...)> __f_;
- promise<result_type> __p_;
-
-public:
- // construction and destruction
- _LIBCPP_INLINE_VISIBILITY
- packaged_task() _NOEXCEPT : __p_(nullptr) {}
- template <class _Fp,
- class = typename enable_if
- <
- !is_same<
- typename __uncvref<_Fp>::type,
- packaged_task
- >::value
- >::type
- >
- _LIBCPP_INLINE_VISIBILITY
- explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {}
- template <class _Fp, class _Allocator,
- class = typename enable_if
- <
- !is_same<
- typename __uncvref<_Fp>::type,
- packaged_task
- >::value
- >::type
- >
- _LIBCPP_INLINE_VISIBILITY
- packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f)
- : __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)),
- __p_(allocator_arg, __a) {}
- // ~packaged_task() = default;
-
- // no copy
- packaged_task(const packaged_task&) = delete;
- packaged_task& operator=(const packaged_task&) = delete;
-
- // move support
- _LIBCPP_INLINE_VISIBILITY
- packaged_task(packaged_task&& __other) _NOEXCEPT
- : __f_(_VSTD::move(__other.__f_)), __p_(_VSTD::move(__other.__p_)) {}
- _LIBCPP_INLINE_VISIBILITY
- packaged_task& operator=(packaged_task&& __other) _NOEXCEPT
- {
- __f_ = _VSTD::move(__other.__f_);
- __p_ = _VSTD::move(__other.__p_);
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY
- void swap(packaged_task& __other) _NOEXCEPT
- {
- __f_.swap(__other.__f_);
- __p_.swap(__other.__p_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool valid() const _NOEXCEPT {return __p_.__state_ != nullptr;}
-
- // result retrieval
- _LIBCPP_INLINE_VISIBILITY
- future<result_type> get_future() {return __p_.get_future();}
-
- // execution
- void operator()(_ArgTypes... __args);
- void make_ready_at_thread_exit(_ArgTypes... __args);
-
- void reset();
-};
-
-template<class _Rp, class ..._ArgTypes>
-void
-packaged_task<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __args)
-{
- if (__p_.__state_ == nullptr)
- __throw_future_error(future_errc::no_state);
- if (__p_.__state_->__has_value())
- __throw_future_error(future_errc::promise_already_satisfied);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- __p_.set_value(__f_(_VSTD::forward<_ArgTypes>(__args)...));
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __p_.set_exception(current_exception());
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
-}
-
-template<class _Rp, class ..._ArgTypes>
-void
-packaged_task<_Rp(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args)
-{
- if (__p_.__state_ == nullptr)
- __throw_future_error(future_errc::no_state);
- if (__p_.__state_->__has_value())
- __throw_future_error(future_errc::promise_already_satisfied);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- __p_.set_value_at_thread_exit(__f_(_VSTD::forward<_ArgTypes>(__args)...));
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __p_.set_exception_at_thread_exit(current_exception());
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
-}
-
-template<class _Rp, class ..._ArgTypes>
-void
-packaged_task<_Rp(_ArgTypes...)>::reset()
-{
- if (!valid())
- __throw_future_error(future_errc::no_state);
- __p_ = promise<result_type>();
-}
-
-template<class ..._ArgTypes>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE packaged_task<void(_ArgTypes...)>
-{
-public:
- typedef void result_type; // extension
-
-private:
- __packaged_task_function<result_type(_ArgTypes...)> __f_;
- promise<result_type> __p_;
-
-public:
- // construction and destruction
- _LIBCPP_INLINE_VISIBILITY
- packaged_task() _NOEXCEPT : __p_(nullptr) {}
- template <class _Fp,
- class = typename enable_if
- <
- !is_same<
- typename __uncvref<_Fp>::type,
- packaged_task
- >::value
- >::type
- >
- _LIBCPP_INLINE_VISIBILITY
- explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {}
- template <class _Fp, class _Allocator,
- class = typename enable_if
- <
- !is_same<
- typename __uncvref<_Fp>::type,
- packaged_task
- >::value
- >::type
- >
- _LIBCPP_INLINE_VISIBILITY
- packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f)
- : __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)),
- __p_(allocator_arg, __a) {}
- // ~packaged_task() = default;
-
- // no copy
- packaged_task(const packaged_task&) = delete;
- packaged_task& operator=(const packaged_task&) = delete;
-
- // move support
- _LIBCPP_INLINE_VISIBILITY
- packaged_task(packaged_task&& __other) _NOEXCEPT
- : __f_(_VSTD::move(__other.__f_)), __p_(_VSTD::move(__other.__p_)) {}
- _LIBCPP_INLINE_VISIBILITY
- packaged_task& operator=(packaged_task&& __other) _NOEXCEPT
- {
- __f_ = _VSTD::move(__other.__f_);
- __p_ = _VSTD::move(__other.__p_);
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY
- void swap(packaged_task& __other) _NOEXCEPT
- {
- __f_.swap(__other.__f_);
- __p_.swap(__other.__p_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool valid() const _NOEXCEPT {return __p_.__state_ != nullptr;}
-
- // result retrieval
- _LIBCPP_INLINE_VISIBILITY
- future<result_type> get_future() {return __p_.get_future();}
-
- // execution
- void operator()(_ArgTypes... __args);
- void make_ready_at_thread_exit(_ArgTypes... __args);
-
- void reset();
-};
-
-template<class ..._ArgTypes>
-void
-packaged_task<void(_ArgTypes...)>::operator()(_ArgTypes... __args)
-{
- if (__p_.__state_ == nullptr)
- __throw_future_error(future_errc::no_state);
- if (__p_.__state_->__has_value())
- __throw_future_error(future_errc::promise_already_satisfied);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- __f_(_VSTD::forward<_ArgTypes>(__args)...);
- __p_.set_value();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __p_.set_exception(current_exception());
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
-}
-
-template<class ..._ArgTypes>
-void
-packaged_task<void(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args)
-{
- if (__p_.__state_ == nullptr)
- __throw_future_error(future_errc::no_state);
- if (__p_.__state_->__has_value())
- __throw_future_error(future_errc::promise_already_satisfied);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- __f_(_VSTD::forward<_ArgTypes>(__args)...);
- __p_.set_value_at_thread_exit();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __p_.set_exception_at_thread_exit(current_exception());
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
-}
-
-template<class ..._ArgTypes>
-void
-packaged_task<void(_ArgTypes...)>::reset()
-{
- if (!valid())
- __throw_future_error(future_errc::no_state);
- __p_ = promise<result_type>();
-}
-
-template <class _Callable>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(packaged_task<_Callable>& __x, packaged_task<_Callable>& __y) _NOEXCEPT
-{
- __x.swap(__y);
-}
-
-template <class _Callable, class _Alloc>
-struct _LIBCPP_TEMPLATE_VIS uses_allocator<packaged_task<_Callable>, _Alloc>
- : public true_type {};
-
-template <class _Rp, class _Fp>
-future<_Rp>
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-__make_deferred_assoc_state(_Fp&& __f)
-#else
-__make_deferred_assoc_state(_Fp __f)
-#endif
-{
- unique_ptr<__deferred_assoc_state<_Rp, _Fp>, __release_shared_count>
- __h(new __deferred_assoc_state<_Rp, _Fp>(_VSTD::forward<_Fp>(__f)));
- return future<_Rp>(__h.get());
-}
-
-template <class _Rp, class _Fp>
-future<_Rp>
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-__make_async_assoc_state(_Fp&& __f)
-#else
-__make_async_assoc_state(_Fp __f)
-#endif
-{
- unique_ptr<__async_assoc_state<_Rp, _Fp>, __release_shared_count>
- __h(new __async_assoc_state<_Rp, _Fp>(_VSTD::forward<_Fp>(__f)));
- _VSTD::thread(&__async_assoc_state<_Rp, _Fp>::__execute, __h.get()).detach();
- return future<_Rp>(__h.get());
-}
-
-template <class _Fp, class... _Args>
-class __async_func
-{
- tuple<_Fp, _Args...> __f_;
-
-public:
- typedef typename __invoke_of<_Fp, _Args...>::type _Rp;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __async_func(_Fp&& __f, _Args&&... __args)
- : __f_(_VSTD::move(__f), _VSTD::move(__args)...) {}
-
- _LIBCPP_INLINE_VISIBILITY
- __async_func(__async_func&& __f) : __f_(_VSTD::move(__f.__f_)) {}
-
- _Rp operator()()
- {
- typedef typename __make_tuple_indices<1+sizeof...(_Args), 1>::type _Index;
- return __execute(_Index());
- }
-private:
- template <size_t ..._Indices>
- _Rp
- __execute(__tuple_indices<_Indices...>)
- {
- return __invoke(_VSTD::move(_VSTD::get<0>(__f_)), _VSTD::move(_VSTD::get<_Indices>(__f_))...);
- }
-};
-
-inline _LIBCPP_INLINE_VISIBILITY bool __does_policy_contain(launch __policy, launch __value )
-{ return (int(__policy) & int(__value)) != 0; }
-
-template <class _Fp, class... _Args>
-_LIBCPP_NODISCARD_AFTER_CXX17
-future<typename __invoke_of<typename decay<_Fp>::type, typename decay<_Args>::type...>::type>
-async(launch __policy, _Fp&& __f, _Args&&... __args)
-{
- typedef __async_func<typename decay<_Fp>::type, typename decay<_Args>::type...> _BF;
- typedef typename _BF::_Rp _Rp;
-
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif
- if (__does_policy_contain(__policy, launch::async))
- return _VSTD::__make_async_assoc_state<_Rp>(_BF(__decay_copy(_VSTD::forward<_Fp>(__f)),
- __decay_copy(_VSTD::forward<_Args>(__args))...));
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch ( ... ) { if (__policy == launch::async) throw ; }
-#endif
-
- if (__does_policy_contain(__policy, launch::deferred))
- return _VSTD::__make_deferred_assoc_state<_Rp>(_BF(__decay_copy(_VSTD::forward<_Fp>(__f)),
- __decay_copy(_VSTD::forward<_Args>(__args))...));
- return future<_Rp>{};
-}
-
-template <class _Fp, class... _Args>
-_LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY
-future<typename __invoke_of<typename decay<_Fp>::type, typename decay<_Args>::type...>::type>
-async(_Fp&& __f, _Args&&... __args)
-{
- return _VSTD::async(launch::any, _VSTD::forward<_Fp>(__f),
- _VSTD::forward<_Args>(__args)...);
-}
-
-#endif // _LIBCPP_HAS_NO_VARIADICS
-
-// shared_future
-
-template <class _Rp>
-class _LIBCPP_TEMPLATE_VIS shared_future
-{
- __assoc_state<_Rp>* __state_;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- shared_future() _NOEXCEPT : __state_(nullptr) {}
- _LIBCPP_INLINE_VISIBILITY
- shared_future(const shared_future& __rhs) _NOEXCEPT : __state_(__rhs.__state_)
- {if (__state_) __state_->__add_shared();}
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- shared_future(future<_Rp>&& __f) _NOEXCEPT : __state_(__f.__state_)
- {__f.__state_ = nullptr;}
- _LIBCPP_INLINE_VISIBILITY
- shared_future(shared_future&& __rhs) _NOEXCEPT : __state_(__rhs.__state_)
- {__rhs.__state_ = nullptr;}
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- ~shared_future();
- shared_future& operator=(const shared_future& __rhs) _NOEXCEPT;
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- shared_future& operator=(shared_future&& __rhs) _NOEXCEPT
- {
- shared_future(std::move(__rhs)).swap(*this);
- return *this;
- }
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
- // retrieving the value
- _LIBCPP_INLINE_VISIBILITY
- const _Rp& get() const {return __state_->copy();}
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(shared_future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
-
- // functions to check state
- _LIBCPP_INLINE_VISIBILITY
- bool valid() const _NOEXCEPT {return __state_ != nullptr;}
-
- _LIBCPP_INLINE_VISIBILITY
- void wait() const {__state_->wait();}
- template <class _Rep, class _Period>
- _LIBCPP_INLINE_VISIBILITY
- future_status
- wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
- {return __state_->wait_for(__rel_time);}
- template <class _Clock, class _Duration>
- _LIBCPP_INLINE_VISIBILITY
- future_status
- wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
- {return __state_->wait_until(__abs_time);}
-};
-
-template <class _Rp>
-shared_future<_Rp>::~shared_future()
-{
- if (__state_)
- __state_->__release_shared();
-}
-
-template <class _Rp>
-shared_future<_Rp>&
-shared_future<_Rp>::operator=(const shared_future& __rhs) _NOEXCEPT
-{
- if (__rhs.__state_)
- __rhs.__state_->__add_shared();
- if (__state_)
- __state_->__release_shared();
- __state_ = __rhs.__state_;
- return *this;
-}
-
-template <class _Rp>
-class _LIBCPP_TEMPLATE_VIS shared_future<_Rp&>
-{
- __assoc_state<_Rp&>* __state_;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- shared_future() _NOEXCEPT : __state_(nullptr) {}
- _LIBCPP_INLINE_VISIBILITY
- shared_future(const shared_future& __rhs) : __state_(__rhs.__state_)
- {if (__state_) __state_->__add_shared();}
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- shared_future(future<_Rp&>&& __f) _NOEXCEPT : __state_(__f.__state_)
- {__f.__state_ = nullptr;}
- _LIBCPP_INLINE_VISIBILITY
- shared_future(shared_future&& __rhs) _NOEXCEPT : __state_(__rhs.__state_)
- {__rhs.__state_ = nullptr;}
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- ~shared_future();
- shared_future& operator=(const shared_future& __rhs);
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- shared_future& operator=(shared_future&& __rhs) _NOEXCEPT
- {
- shared_future(std::move(__rhs)).swap(*this);
- return *this;
- }
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
- // retrieving the value
- _LIBCPP_INLINE_VISIBILITY
- _Rp& get() const {return __state_->copy();}
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(shared_future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
-
- // functions to check state
- _LIBCPP_INLINE_VISIBILITY
- bool valid() const _NOEXCEPT {return __state_ != nullptr;}
-
- _LIBCPP_INLINE_VISIBILITY
- void wait() const {__state_->wait();}
- template <class _Rep, class _Period>
- _LIBCPP_INLINE_VISIBILITY
- future_status
- wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
- {return __state_->wait_for(__rel_time);}
- template <class _Clock, class _Duration>
- _LIBCPP_INLINE_VISIBILITY
- future_status
- wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
- {return __state_->wait_until(__abs_time);}
-};
-
-template <class _Rp>
-shared_future<_Rp&>::~shared_future()
-{
- if (__state_)
- __state_->__release_shared();
-}
-
-template <class _Rp>
-shared_future<_Rp&>&
-shared_future<_Rp&>::operator=(const shared_future& __rhs)
-{
- if (__rhs.__state_)
- __rhs.__state_->__add_shared();
- if (__state_)
- __state_->__release_shared();
- __state_ = __rhs.__state_;
- return *this;
-}
-
-template <>
-class _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_FUTURE shared_future<void>
-{
- __assoc_sub_state* __state_;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- shared_future() _NOEXCEPT : __state_(nullptr) {}
- _LIBCPP_INLINE_VISIBILITY
- shared_future(const shared_future& __rhs) : __state_(__rhs.__state_)
- {if (__state_) __state_->__add_shared();}
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- shared_future(future<void>&& __f) _NOEXCEPT : __state_(__f.__state_)
- {__f.__state_ = nullptr;}
- _LIBCPP_INLINE_VISIBILITY
- shared_future(shared_future&& __rhs) _NOEXCEPT : __state_(__rhs.__state_)
- {__rhs.__state_ = nullptr;}
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- ~shared_future();
- shared_future& operator=(const shared_future& __rhs);
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- shared_future& operator=(shared_future&& __rhs) _NOEXCEPT
- {
- shared_future(std::move(__rhs)).swap(*this);
- return *this;
- }
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
- // retrieving the value
- _LIBCPP_INLINE_VISIBILITY
- void get() const {__state_->copy();}
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(shared_future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
-
- // functions to check state
- _LIBCPP_INLINE_VISIBILITY
- bool valid() const _NOEXCEPT {return __state_ != nullptr;}
-
- _LIBCPP_INLINE_VISIBILITY
- void wait() const {__state_->wait();}
- template <class _Rep, class _Period>
- _LIBCPP_INLINE_VISIBILITY
- future_status
- wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
- {return __state_->wait_for(__rel_time);}
- template <class _Clock, class _Duration>
- _LIBCPP_INLINE_VISIBILITY
- future_status
- wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
- {return __state_->wait_until(__abs_time);}
-};
-
-template <class _Rp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(shared_future<_Rp>& __x, shared_future<_Rp>& __y) _NOEXCEPT
-{
- __x.swap(__y);
-}
-
-template <class _Rp>
-inline
-shared_future<_Rp>
-future<_Rp>::share() _NOEXCEPT
-{
- return shared_future<_Rp>(_VSTD::move(*this));
-}
-
-template <class _Rp>
-inline
-shared_future<_Rp&>
-future<_Rp&>::share() _NOEXCEPT
-{
- return shared_future<_Rp&>(_VSTD::move(*this));
-}
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-inline
-shared_future<void>
-future<void>::share() _NOEXCEPT
-{
- return shared_future<void>(_VSTD::move(*this));
-}
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // !_LIBCPP_HAS_NO_THREADS
-
-#endif // _LIBCPP_FUTURE
diff --git a/lib/libcxx/include/initializer_list b/lib/libcxx/include/initializer_list
deleted file mode 100644
index b934637b83d..00000000000
--- a/lib/libcxx/include/initializer_list
+++ /dev/null
@@ -1,118 +0,0 @@
-// -*- C++ -*-
-//===----------------------- initializer_list -----------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_INITIALIZER_LIST
-#define _LIBCPP_INITIALIZER_LIST
-
-/*
- initializer_list synopsis
-
-namespace std
-{
-
-template<class E>
-class initializer_list
-{
-public:
- typedef E value_type;
- typedef const E& reference;
- typedef const E& const_reference;
- typedef size_t size_type;
-
- typedef const E* iterator;
- typedef const E* const_iterator;
-
- initializer_list() noexcept; // constexpr in C++14
-
- size_t size() const noexcept; // constexpr in C++14
- const E* begin() const noexcept; // constexpr in C++14
- const E* end() const noexcept; // constexpr in C++14
-};
-
-template<class E> const E* begin(initializer_list<E> il) noexcept; // constexpr in C++14
-template<class E> const E* end(initializer_list<E> il) noexcept; // constexpr in C++14
-
-} // std
-
-*/
-
-#include <__config>
-#include <cstddef>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-namespace std // purposefully not versioned
-{
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template<class _Ep>
-class _LIBCPP_TEMPLATE_VIS initializer_list
-{
- const _Ep* __begin_;
- size_t __size_;
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR_AFTER_CXX11
- initializer_list(const _Ep* __b, size_t __s) _NOEXCEPT
- : __begin_(__b),
- __size_(__s)
- {}
-public:
- typedef _Ep value_type;
- typedef const _Ep& reference;
- typedef const _Ep& const_reference;
- typedef size_t size_type;
-
- typedef const _Ep* iterator;
- typedef const _Ep* const_iterator;
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR_AFTER_CXX11
- initializer_list() _NOEXCEPT : __begin_(nullptr), __size_(0) {}
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR_AFTER_CXX11
- size_t size() const _NOEXCEPT {return __size_;}
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR_AFTER_CXX11
- const _Ep* begin() const _NOEXCEPT {return __begin_;}
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR_AFTER_CXX11
- const _Ep* end() const _NOEXCEPT {return __begin_ + __size_;}
-};
-
-template<class _Ep>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR_AFTER_CXX11
-const _Ep*
-begin(initializer_list<_Ep> __il) _NOEXCEPT
-{
- return __il.begin();
-}
-
-template<class _Ep>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR_AFTER_CXX11
-const _Ep*
-end(initializer_list<_Ep> __il) _NOEXCEPT
-{
- return __il.end();
-}
-
-#endif // !defined(_LIBCPP_CXX03_LANG)
-
-} // std
-
-#endif // _LIBCPP_INITIALIZER_LIST
diff --git a/lib/libcxx/include/inttypes.h b/lib/libcxx/include/inttypes.h
deleted file mode 100644
index 058f54b5161..00000000000
--- a/lib/libcxx/include/inttypes.h
+++ /dev/null
@@ -1,258 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- inttypes.h -------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_INTTYPES_H
-#define _LIBCPP_INTTYPES_H
-
-/*
- inttypes.h synopsis
-
-This entire header is C99 / C++0X
-
-#include <stdint.h> // <cinttypes> includes <cstdint>
-
-Macros:
-
- PRId8
- PRId16
- PRId32
- PRId64
-
- PRIdLEAST8
- PRIdLEAST16
- PRIdLEAST32
- PRIdLEAST64
-
- PRIdFAST8
- PRIdFAST16
- PRIdFAST32
- PRIdFAST64
-
- PRIdMAX
- PRIdPTR
-
- PRIi8
- PRIi16
- PRIi32
- PRIi64
-
- PRIiLEAST8
- PRIiLEAST16
- PRIiLEAST32
- PRIiLEAST64
-
- PRIiFAST8
- PRIiFAST16
- PRIiFAST32
- PRIiFAST64
-
- PRIiMAX
- PRIiPTR
-
- PRIo8
- PRIo16
- PRIo32
- PRIo64
-
- PRIoLEAST8
- PRIoLEAST16
- PRIoLEAST32
- PRIoLEAST64
-
- PRIoFAST8
- PRIoFAST16
- PRIoFAST32
- PRIoFAST64
-
- PRIoMAX
- PRIoPTR
-
- PRIu8
- PRIu16
- PRIu32
- PRIu64
-
- PRIuLEAST8
- PRIuLEAST16
- PRIuLEAST32
- PRIuLEAST64
-
- PRIuFAST8
- PRIuFAST16
- PRIuFAST32
- PRIuFAST64
-
- PRIuMAX
- PRIuPTR
-
- PRIx8
- PRIx16
- PRIx32
- PRIx64
-
- PRIxLEAST8
- PRIxLEAST16
- PRIxLEAST32
- PRIxLEAST64
-
- PRIxFAST8
- PRIxFAST16
- PRIxFAST32
- PRIxFAST64
-
- PRIxMAX
- PRIxPTR
-
- PRIX8
- PRIX16
- PRIX32
- PRIX64
-
- PRIXLEAST8
- PRIXLEAST16
- PRIXLEAST32
- PRIXLEAST64
-
- PRIXFAST8
- PRIXFAST16
- PRIXFAST32
- PRIXFAST64
-
- PRIXMAX
- PRIXPTR
-
- SCNd8
- SCNd16
- SCNd32
- SCNd64
-
- SCNdLEAST8
- SCNdLEAST16
- SCNdLEAST32
- SCNdLEAST64
-
- SCNdFAST8
- SCNdFAST16
- SCNdFAST32
- SCNdFAST64
-
- SCNdMAX
- SCNdPTR
-
- SCNi8
- SCNi16
- SCNi32
- SCNi64
-
- SCNiLEAST8
- SCNiLEAST16
- SCNiLEAST32
- SCNiLEAST64
-
- SCNiFAST8
- SCNiFAST16
- SCNiFAST32
- SCNiFAST64
-
- SCNiMAX
- SCNiPTR
-
- SCNo8
- SCNo16
- SCNo32
- SCNo64
-
- SCNoLEAST8
- SCNoLEAST16
- SCNoLEAST32
- SCNoLEAST64
-
- SCNoFAST8
- SCNoFAST16
- SCNoFAST32
- SCNoFAST64
-
- SCNoMAX
- SCNoPTR
-
- SCNu8
- SCNu16
- SCNu32
- SCNu64
-
- SCNuLEAST8
- SCNuLEAST16
- SCNuLEAST32
- SCNuLEAST64
-
- SCNuFAST8
- SCNuFAST16
- SCNuFAST32
- SCNuFAST64
-
- SCNuMAX
- SCNuPTR
-
- SCNx8
- SCNx16
- SCNx32
- SCNx64
-
- SCNxLEAST8
- SCNxLEAST16
- SCNxLEAST32
- SCNxLEAST64
-
- SCNxFAST8
- SCNxFAST16
- SCNxFAST32
- SCNxFAST64
-
- SCNxMAX
- SCNxPTR
-
-Types:
-
- imaxdiv_t
-
-intmax_t imaxabs(intmax_t j);
-imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom);
-intmax_t strtoimax(const char* restrict nptr, char** restrict endptr, int base);
-uintmax_t strtoumax(const char* restrict nptr, char** restrict endptr, int base);
-intmax_t wcstoimax(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base);
-uintmax_t wcstoumax(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base);
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-/* C99 stdlib (e.g. glibc < 2.18) does not provide format macros needed
- for C++11 unless __STDC_FORMAT_MACROS is defined
-*/
-#if defined(__cplusplus) && !defined(__STDC_FORMAT_MACROS)
-# define __STDC_FORMAT_MACROS
-#endif
-
-#include_next <inttypes.h>
-
-#ifdef __cplusplus
-
-#include <stdint.h>
-
-#undef imaxabs
-#undef imaxdiv
-
-#endif // __cplusplus
-
-#endif // _LIBCPP_INTTYPES_H
diff --git a/lib/libcxx/include/iomanip b/lib/libcxx/include/iomanip
deleted file mode 100644
index 36c11167a44..00000000000
--- a/lib/libcxx/include/iomanip
+++ /dev/null
@@ -1,671 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- iomanip ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_IOMANIP
-#define _LIBCPP_IOMANIP
-
-/*
- iomanip synopsis
-
-namespace std {
-
-// types T1, T2, ... are unspecified implementation types
-T1 resetiosflags(ios_base::fmtflags mask);
-T2 setiosflags (ios_base::fmtflags mask);
-T3 setbase(int base);
-template<charT> T4 setfill(charT c);
-T5 setprecision(int n);
-T6 setw(int n);
-template <class moneyT> T7 get_money(moneyT& mon, bool intl = false);
-template <class charT, class moneyT> T8 put_money(const moneyT& mon, bool intl = false);
-template <class charT> T9 get_time(struct tm* tmb, const charT* fmt);
-template <class charT> T10 put_time(const struct tm* tmb, const charT* fmt);
-
-template <class charT>
- T11 quoted(const charT* s, charT delim=charT('"'), charT escape=charT('\\')); // C++14
-
-template <class charT, class traits, class Allocator>
- T12 quoted(const basic_string<charT, traits, Allocator>& s,
- charT delim=charT('"'), charT escape=charT('\\')); // C++14
-
-template <class charT, class traits, class Allocator>
- T13 quoted(basic_string<charT, traits, Allocator>& s,
- charT delim=charT('"'), charT escape=charT('\\')); // C++14
-
-} // std
-
-*/
-
-#include <__config>
-#include <__string>
-#include <istream>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-// resetiosflags
-
-class __iom_t1
-{
- ios_base::fmtflags __mask_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __iom_t1(ios_base::fmtflags __m) : __mask_(__m) {}
-
- template <class _CharT, class _Traits>
- friend
- _LIBCPP_INLINE_VISIBILITY
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t1& __x)
- {
- __is.unsetf(__x.__mask_);
- return __is;
- }
-
- template <class _CharT, class _Traits>
- friend
- _LIBCPP_INLINE_VISIBILITY
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t1& __x)
- {
- __os.unsetf(__x.__mask_);
- return __os;
- }
-};
-
-inline _LIBCPP_INLINE_VISIBILITY
-__iom_t1
-resetiosflags(ios_base::fmtflags __mask)
-{
- return __iom_t1(__mask);
-}
-
-// setiosflags
-
-class __iom_t2
-{
- ios_base::fmtflags __mask_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __iom_t2(ios_base::fmtflags __m) : __mask_(__m) {}
-
- template <class _CharT, class _Traits>
- friend
- _LIBCPP_INLINE_VISIBILITY
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t2& __x)
- {
- __is.setf(__x.__mask_);
- return __is;
- }
-
- template <class _CharT, class _Traits>
- friend
- _LIBCPP_INLINE_VISIBILITY
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t2& __x)
- {
- __os.setf(__x.__mask_);
- return __os;
- }
-};
-
-inline _LIBCPP_INLINE_VISIBILITY
-__iom_t2
-setiosflags(ios_base::fmtflags __mask)
-{
- return __iom_t2(__mask);
-}
-
-// setbase
-
-class __iom_t3
-{
- int __base_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __iom_t3(int __b) : __base_(__b) {}
-
- template <class _CharT, class _Traits>
- friend
- _LIBCPP_INLINE_VISIBILITY
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t3& __x)
- {
- __is.setf(__x.__base_ == 8 ? ios_base::oct :
- __x.__base_ == 10 ? ios_base::dec :
- __x.__base_ == 16 ? ios_base::hex :
- ios_base::fmtflags(0), ios_base::basefield);
- return __is;
- }
-
- template <class _CharT, class _Traits>
- friend
- _LIBCPP_INLINE_VISIBILITY
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t3& __x)
- {
- __os.setf(__x.__base_ == 8 ? ios_base::oct :
- __x.__base_ == 10 ? ios_base::dec :
- __x.__base_ == 16 ? ios_base::hex :
- ios_base::fmtflags(0), ios_base::basefield);
- return __os;
- }
-};
-
-inline _LIBCPP_INLINE_VISIBILITY
-__iom_t3
-setbase(int __base)
-{
- return __iom_t3(__base);
-}
-
-// setfill
-
-template<class _CharT>
-class __iom_t4
-{
- _CharT __fill_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __iom_t4(_CharT __c) : __fill_(__c) {}
-
- template <class _Traits>
- friend
- _LIBCPP_INLINE_VISIBILITY
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t4& __x)
- {
- __os.fill(__x.__fill_);
- return __os;
- }
-};
-
-template<class _CharT>
-inline _LIBCPP_INLINE_VISIBILITY
-__iom_t4<_CharT>
-setfill(_CharT __c)
-{
- return __iom_t4<_CharT>(__c);
-}
-
-// setprecision
-
-class __iom_t5
-{
- int __n_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __iom_t5(int __n) : __n_(__n) {}
-
- template <class _CharT, class _Traits>
- friend
- _LIBCPP_INLINE_VISIBILITY
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t5& __x)
- {
- __is.precision(__x.__n_);
- return __is;
- }
-
- template <class _CharT, class _Traits>
- friend
- _LIBCPP_INLINE_VISIBILITY
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t5& __x)
- {
- __os.precision(__x.__n_);
- return __os;
- }
-};
-
-inline _LIBCPP_INLINE_VISIBILITY
-__iom_t5
-setprecision(int __n)
-{
- return __iom_t5(__n);
-}
-
-// setw
-
-class __iom_t6
-{
- int __n_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __iom_t6(int __n) : __n_(__n) {}
-
- template <class _CharT, class _Traits>
- friend
- _LIBCPP_INLINE_VISIBILITY
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t6& __x)
- {
- __is.width(__x.__n_);
- return __is;
- }
-
- template <class _CharT, class _Traits>
- friend
- _LIBCPP_INLINE_VISIBILITY
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t6& __x)
- {
- __os.width(__x.__n_);
- return __os;
- }
-};
-
-inline _LIBCPP_INLINE_VISIBILITY
-__iom_t6
-setw(int __n)
-{
- return __iom_t6(__n);
-}
-
-// get_money
-
-template <class _MoneyT> class __iom_t7;
-
-template <class _CharT, class _Traits, class _MoneyT>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x);
-
-template <class _MoneyT>
-class __iom_t7
-{
- _MoneyT& __mon_;
- bool __intl_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- __iom_t7(_MoneyT& __mon, bool __intl)
- : __mon_(__mon), __intl_(__intl) {}
-
- template <class _CharT, class _Traits, class _Mp>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_Mp>& __x);
-};
-
-template <class _CharT, class _Traits, class _MoneyT>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typename basic_istream<_CharT, _Traits>::sentry __s(__is);
- if (__s)
- {
- typedef istreambuf_iterator<_CharT, _Traits> _Ip;
- typedef money_get<_CharT, _Ip> _Fp;
- ios_base::iostate __err = ios_base::goodbit;
- const _Fp& __mf = use_facet<_Fp>(__is.getloc());
- __mf.get(_Ip(__is), _Ip(), __x.__intl_, __is, __err, __x.__mon_);
- __is.setstate(__err);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __is.__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __is;
-}
-
-template <class _MoneyT>
-inline _LIBCPP_INLINE_VISIBILITY
-__iom_t7<_MoneyT>
-get_money(_MoneyT& __mon, bool __intl = false)
-{
- return __iom_t7<_MoneyT>(__mon, __intl);
-}
-
-// put_money
-
-template <class _MoneyT> class __iom_t8;
-
-template <class _CharT, class _Traits, class _MoneyT>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x);
-
-template <class _MoneyT>
-class __iom_t8
-{
- const _MoneyT& __mon_;
- bool __intl_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- __iom_t8(const _MoneyT& __mon, bool __intl)
- : __mon_(__mon), __intl_(__intl) {}
-
- template <class _CharT, class _Traits, class _Mp>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_Mp>& __x);
-};
-
-template <class _CharT, class _Traits, class _MoneyT>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
- if (__s)
- {
- typedef ostreambuf_iterator<_CharT, _Traits> _Op;
- typedef money_put<_CharT, _Op> _Fp;
- const _Fp& __mf = use_facet<_Fp>(__os.getloc());
- if (__mf.put(_Op(__os), __x.__intl_, __os, __os.fill(), __x.__mon_).failed())
- __os.setstate(ios_base::badbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __os.__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __os;
-}
-
-template <class _MoneyT>
-inline _LIBCPP_INLINE_VISIBILITY
-__iom_t8<_MoneyT>
-put_money(const _MoneyT& __mon, bool __intl = false)
-{
- return __iom_t8<_MoneyT>(__mon, __intl);
-}
-
-// get_time
-
-template <class _CharT> class __iom_t9;
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x);
-
-template <class _CharT>
-class __iom_t9
-{
- tm* __tm_;
- const _CharT* __fmt_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- __iom_t9(tm* __tm, const _CharT* __fmt)
- : __tm_(__tm), __fmt_(__fmt) {}
-
- template <class _Cp, class _Traits>
- friend
- basic_istream<_Cp, _Traits>&
- operator>>(basic_istream<_Cp, _Traits>& __is, const __iom_t9<_Cp>& __x);
-};
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typename basic_istream<_CharT, _Traits>::sentry __s(__is);
- if (__s)
- {
- typedef istreambuf_iterator<_CharT, _Traits> _Ip;
- typedef time_get<_CharT, _Ip> _Fp;
- ios_base::iostate __err = ios_base::goodbit;
- const _Fp& __tf = use_facet<_Fp>(__is.getloc());
- __tf.get(_Ip(__is), _Ip(), __is, __err, __x.__tm_,
- __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_));
- __is.setstate(__err);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __is.__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __is;
-}
-
-template <class _CharT>
-inline _LIBCPP_INLINE_VISIBILITY
-__iom_t9<_CharT>
-get_time(tm* __tm, const _CharT* __fmt)
-{
- return __iom_t9<_CharT>(__tm, __fmt);
-}
-
-// put_time
-
-template <class _CharT> class __iom_t10;
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x);
-
-template <class _CharT>
-class __iom_t10
-{
- const tm* __tm_;
- const _CharT* __fmt_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- __iom_t10(const tm* __tm, const _CharT* __fmt)
- : __tm_(__tm), __fmt_(__fmt) {}
-
- template <class _Cp, class _Traits>
- friend
- basic_ostream<_Cp, _Traits>&
- operator<<(basic_ostream<_Cp, _Traits>& __os, const __iom_t10<_Cp>& __x);
-};
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
- if (__s)
- {
- typedef ostreambuf_iterator<_CharT, _Traits> _Op;
- typedef time_put<_CharT, _Op> _Fp;
- const _Fp& __tf = use_facet<_Fp>(__os.getloc());
- if (__tf.put(_Op(__os), __os, __os.fill(), __x.__tm_,
- __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_)).failed())
- __os.setstate(ios_base::badbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __os.__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __os;
-}
-
-template <class _CharT>
-inline _LIBCPP_INLINE_VISIBILITY
-__iom_t10<_CharT>
-put_time(const tm* __tm, const _CharT* __fmt)
-{
- return __iom_t10<_CharT>(__tm, __fmt);
-}
-
-template <class _CharT, class _Traits, class _ForwardIterator>
-std::basic_ostream<_CharT, _Traits> &
-__quoted_output ( basic_ostream<_CharT, _Traits> &__os,
- _ForwardIterator __first, _ForwardIterator __last, _CharT __delim, _CharT __escape )
-{
- _VSTD::basic_string<_CharT, _Traits> __str;
- __str.push_back(__delim);
- for ( ; __first != __last; ++ __first )
- {
- if (_Traits::eq (*__first, __escape) || _Traits::eq (*__first, __delim))
- __str.push_back(__escape);
- __str.push_back(*__first);
- }
- __str.push_back(__delim);
- return __put_character_sequence(__os, __str.data(), __str.size());
-}
-
-template <class _CharT, class _Traits, class _String>
-basic_istream<_CharT, _Traits> &
-__quoted_input ( basic_istream<_CharT, _Traits> &__is, _String & __string, _CharT __delim, _CharT __escape )
-{
- __string.clear ();
- _CharT __c;
- __is >> __c;
- if ( __is.fail ())
- return __is;
-
- if (!_Traits::eq (__c, __delim)) // no delimiter, read the whole string
- {
- __is.unget ();
- __is >> __string;
- return __is;
- }
-
- __save_flags<_CharT, _Traits> sf(__is);
- noskipws (__is);
- while (true)
- {
- __is >> __c;
- if ( __is.fail ())
- break;
- if (_Traits::eq (__c, __escape))
- {
- __is >> __c;
- if ( __is.fail ())
- break;
- }
- else if (_Traits::eq (__c, __delim))
- break;
- __string.push_back ( __c );
- }
- return __is;
-}
-
-
-template <class _CharT, class _Traits, class _Iter>
-basic_ostream<_CharT, _Traits>& operator<<(
- basic_ostream<_CharT, _Traits>& __os,
- const __quoted_output_proxy<_CharT, _Iter, _Traits> & __proxy)
-{
- return __quoted_output (__os, __proxy.__first, __proxy.__last, __proxy.__delim, __proxy.__escape);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-struct __quoted_proxy
-{
- basic_string<_CharT, _Traits, _Allocator> &__string;
- _CharT __delim;
- _CharT __escape;
-
- __quoted_proxy(basic_string<_CharT, _Traits, _Allocator> &__s, _CharT __d, _CharT __e)
- : __string(__s), __delim(__d), __escape(__e) {}
-};
-
-template <class _CharT, class _Traits, class _Allocator>
-_LIBCPP_INLINE_VISIBILITY
-basic_ostream<_CharT, _Traits>& operator<<(
- basic_ostream<_CharT, _Traits>& __os,
- const __quoted_proxy<_CharT, _Traits, _Allocator> & __proxy)
-{
- return __quoted_output (__os, __proxy.__string.cbegin (), __proxy.__string.cend (), __proxy.__delim, __proxy.__escape);
-}
-
-// extractor for non-const basic_string& proxies
-template <class _CharT, class _Traits, class _Allocator>
-_LIBCPP_INLINE_VISIBILITY
-basic_istream<_CharT, _Traits>& operator>>(
- basic_istream<_CharT, _Traits>& __is,
- const __quoted_proxy<_CharT, _Traits, _Allocator> & __proxy)
-{
- return __quoted_input ( __is, __proxy.__string, __proxy.__delim, __proxy.__escape );
-}
-
-
-template <class _CharT>
-_LIBCPP_INLINE_VISIBILITY
-__quoted_output_proxy<_CharT, const _CharT *>
-quoted ( const _CharT *__s, _CharT __delim = _CharT('"'), _CharT __escape =_CharT('\\'))
-{
- const _CharT *__end = __s;
- while ( *__end ) ++__end;
- return __quoted_output_proxy<_CharT, const _CharT *> ( __s, __end, __delim, __escape );
-}
-
-
-template <class _CharT, class _Traits, class _Allocator>
-_LIBCPP_INLINE_VISIBILITY
-__quoted_output_proxy<_CharT, typename basic_string <_CharT, _Traits, _Allocator>::const_iterator>
-__quoted ( const basic_string <_CharT, _Traits, _Allocator> &__s, _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\'))
-{
- return __quoted_output_proxy<_CharT,
- typename basic_string <_CharT, _Traits, _Allocator>::const_iterator>
- ( __s.cbegin(), __s.cend (), __delim, __escape );
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-_LIBCPP_INLINE_VISIBILITY
-__quoted_proxy<_CharT, _Traits, _Allocator>
-__quoted ( basic_string <_CharT, _Traits, _Allocator> &__s, _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\'))
-{
- return __quoted_proxy<_CharT, _Traits, _Allocator>( __s, __delim, __escape );
-}
-
-
-#if _LIBCPP_STD_VER > 11
-
-template <class _CharT, class _Traits, class _Allocator>
-_LIBCPP_INLINE_VISIBILITY
-__quoted_output_proxy<_CharT, typename basic_string <_CharT, _Traits, _Allocator>::const_iterator>
-quoted ( const basic_string <_CharT, _Traits, _Allocator> &__s, _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\'))
-{
- return __quoted(__s, __delim, __escape);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-_LIBCPP_INLINE_VISIBILITY
-__quoted_proxy<_CharT, _Traits, _Allocator>
-quoted ( basic_string <_CharT, _Traits, _Allocator> &__s, _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\'))
-{
- return __quoted(__s, __delim, __escape);
-}
-
-template <class _CharT, class _Traits>
-__quoted_output_proxy<_CharT, const _CharT *, _Traits>
-quoted (basic_string_view <_CharT, _Traits> __sv,
- _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\'))
-{
- return __quoted_output_proxy<_CharT, const _CharT *, _Traits>
- ( __sv.data(), __sv.data() + __sv.size(), __delim, __escape );
-}
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_IOMANIP
diff --git a/lib/libcxx/include/ios b/lib/libcxx/include/ios
deleted file mode 100644
index 040b2d4e04f..00000000000
--- a/lib/libcxx/include/ios
+++ /dev/null
@@ -1,1048 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- ios -------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_IOS
-#define _LIBCPP_IOS
-
-/*
- ios synopsis
-
-#include <iosfwd>
-
-namespace std
-{
-
-typedef OFF_T streamoff;
-typedef SZ_T streamsize;
-template <class stateT> class fpos;
-
-class ios_base
-{
-public:
- class failure;
-
- typedef T1 fmtflags;
- static constexpr fmtflags boolalpha;
- static constexpr fmtflags dec;
- static constexpr fmtflags fixed;
- static constexpr fmtflags hex;
- static constexpr fmtflags internal;
- static constexpr fmtflags left;
- static constexpr fmtflags oct;
- static constexpr fmtflags right;
- static constexpr fmtflags scientific;
- static constexpr fmtflags showbase;
- static constexpr fmtflags showpoint;
- static constexpr fmtflags showpos;
- static constexpr fmtflags skipws;
- static constexpr fmtflags unitbuf;
- static constexpr fmtflags uppercase;
- static constexpr fmtflags adjustfield;
- static constexpr fmtflags basefield;
- static constexpr fmtflags floatfield;
-
- typedef T2 iostate;
- static constexpr iostate badbit;
- static constexpr iostate eofbit;
- static constexpr iostate failbit;
- static constexpr iostate goodbit;
-
- typedef T3 openmode;
- static constexpr openmode app;
- static constexpr openmode ate;
- static constexpr openmode binary;
- static constexpr openmode in;
- static constexpr openmode out;
- static constexpr openmode trunc;
-
- typedef T4 seekdir;
- static constexpr seekdir beg;
- static constexpr seekdir cur;
- static constexpr seekdir end;
-
- class Init;
-
- // 27.5.2.2 fmtflags state:
- fmtflags flags() const;
- fmtflags flags(fmtflags fmtfl);
- fmtflags setf(fmtflags fmtfl);
- fmtflags setf(fmtflags fmtfl, fmtflags mask);
- void unsetf(fmtflags mask);
-
- streamsize precision() const;
- streamsize precision(streamsize prec);
- streamsize width() const;
- streamsize width(streamsize wide);
-
- // 27.5.2.3 locales:
- locale imbue(const locale& loc);
- locale getloc() const;
-
- // 27.5.2.5 storage:
- static int xalloc();
- long& iword(int index);
- void*& pword(int index);
-
- // destructor
- virtual ~ios_base();
-
- // 27.5.2.6 callbacks;
- enum event { erase_event, imbue_event, copyfmt_event };
- typedef void (*event_callback)(event, ios_base&, int index);
- void register_callback(event_callback fn, int index);
-
- ios_base(const ios_base&) = delete;
- ios_base& operator=(const ios_base&) = delete;
-
- static bool sync_with_stdio(bool sync = true);
-
-protected:
- ios_base();
-};
-
-template <class charT, class traits = char_traits<charT> >
-class basic_ios
- : public ios_base
-{
-public:
- // types:
- typedef charT char_type;
- typedef typename traits::int_type int_type; // removed in C++17
- typedef typename traits::pos_type pos_type; // removed in C++17
- typedef typename traits::off_type off_type; // removed in C++17
- typedef traits traits_type;
-
- operator unspecified-bool-type() const;
- bool operator!() const;
- iostate rdstate() const;
- void clear(iostate state = goodbit);
- void setstate(iostate state);
- bool good() const;
- bool eof() const;
- bool fail() const;
- bool bad() const;
-
- iostate exceptions() const;
- void exceptions(iostate except);
-
- // 27.5.4.1 Constructor/destructor:
- explicit basic_ios(basic_streambuf<charT,traits>* sb);
- virtual ~basic_ios();
-
- // 27.5.4.2 Members:
- basic_ostream<charT,traits>* tie() const;
- basic_ostream<charT,traits>* tie(basic_ostream<charT,traits>* tiestr);
-
- basic_streambuf<charT,traits>* rdbuf() const;
- basic_streambuf<charT,traits>* rdbuf(basic_streambuf<charT,traits>* sb);
-
- basic_ios& copyfmt(const basic_ios& rhs);
-
- char_type fill() const;
- char_type fill(char_type ch);
-
- locale imbue(const locale& loc);
-
- char narrow(char_type c, char dfault) const;
- char_type widen(char c) const;
-
- basic_ios(const basic_ios& ) = delete;
- basic_ios& operator=(const basic_ios&) = delete;
-
-protected:
- basic_ios();
- void init(basic_streambuf<charT,traits>* sb);
- void move(basic_ios& rhs);
- void swap(basic_ios& rhs) noexcept;
- void set_rdbuf(basic_streambuf<charT, traits>* sb);
-};
-
-// 27.5.5, manipulators:
-ios_base& boolalpha (ios_base& str);
-ios_base& noboolalpha(ios_base& str);
-ios_base& showbase (ios_base& str);
-ios_base& noshowbase (ios_base& str);
-ios_base& showpoint (ios_base& str);
-ios_base& noshowpoint(ios_base& str);
-ios_base& showpos (ios_base& str);
-ios_base& noshowpos (ios_base& str);
-ios_base& skipws (ios_base& str);
-ios_base& noskipws (ios_base& str);
-ios_base& uppercase (ios_base& str);
-ios_base& nouppercase(ios_base& str);
-ios_base& unitbuf (ios_base& str);
-ios_base& nounitbuf (ios_base& str);
-
-// 27.5.5.2 adjustfield:
-ios_base& internal (ios_base& str);
-ios_base& left (ios_base& str);
-ios_base& right (ios_base& str);
-
-// 27.5.5.3 basefield:
-ios_base& dec (ios_base& str);
-ios_base& hex (ios_base& str);
-ios_base& oct (ios_base& str);
-
-// 27.5.5.4 floatfield:
-ios_base& fixed (ios_base& str);
-ios_base& scientific (ios_base& str);
-ios_base& hexfloat (ios_base& str);
-ios_base& defaultfloat(ios_base& str);
-
-// 27.5.5.5 error reporting:
-enum class io_errc
-{
- stream = 1
-};
-
-concept_map ErrorCodeEnum<io_errc> { };
-error_code make_error_code(io_errc e) noexcept;
-error_condition make_error_condition(io_errc e) noexcept;
-storage-class-specifier const error_category& iostream_category() noexcept;
-
-} // std
-
-*/
-
-#include <__config>
-#include <iosfwd>
-#include <__locale>
-#include <system_error>
-
-#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
-#include <atomic> // for __xindex_
-#endif
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-typedef ptrdiff_t streamsize;
-
-class _LIBCPP_TYPE_VIS ios_base
-{
-public:
- class _LIBCPP_EXCEPTION_ABI failure;
-
- typedef unsigned int fmtflags;
- static const fmtflags boolalpha = 0x0001;
- static const fmtflags dec = 0x0002;
- static const fmtflags fixed = 0x0004;
- static const fmtflags hex = 0x0008;
- static const fmtflags internal = 0x0010;
- static const fmtflags left = 0x0020;
- static const fmtflags oct = 0x0040;
- static const fmtflags right = 0x0080;
- static const fmtflags scientific = 0x0100;
- static const fmtflags showbase = 0x0200;
- static const fmtflags showpoint = 0x0400;
- static const fmtflags showpos = 0x0800;
- static const fmtflags skipws = 0x1000;
- static const fmtflags unitbuf = 0x2000;
- static const fmtflags uppercase = 0x4000;
- static const fmtflags adjustfield = left | right | internal;
- static const fmtflags basefield = dec | oct | hex;
- static const fmtflags floatfield = scientific | fixed;
-
- typedef unsigned int iostate;
- static const iostate badbit = 0x1;
- static const iostate eofbit = 0x2;
- static const iostate failbit = 0x4;
- static const iostate goodbit = 0x0;
-
- typedef unsigned int openmode;
- static const openmode app = 0x01;
- static const openmode ate = 0x02;
- static const openmode binary = 0x04;
- static const openmode in = 0x08;
- static const openmode out = 0x10;
- static const openmode trunc = 0x20;
-
- enum seekdir {beg, cur, end};
-
-#if _LIBCPP_STD_VER <= 14
- typedef iostate io_state;
- typedef openmode open_mode;
- typedef seekdir seek_dir;
-
- typedef _VSTD::streamoff streamoff;
- typedef _VSTD::streampos streampos;
-#endif
-
- class _LIBCPP_TYPE_VIS Init;
-
- // 27.5.2.2 fmtflags state:
- _LIBCPP_INLINE_VISIBILITY fmtflags flags() const;
- _LIBCPP_INLINE_VISIBILITY fmtflags flags(fmtflags __fmtfl);
- _LIBCPP_INLINE_VISIBILITY fmtflags setf(fmtflags __fmtfl);
- _LIBCPP_INLINE_VISIBILITY fmtflags setf(fmtflags __fmtfl, fmtflags __mask);
- _LIBCPP_INLINE_VISIBILITY void unsetf(fmtflags __mask);
-
- _LIBCPP_INLINE_VISIBILITY streamsize precision() const;
- _LIBCPP_INLINE_VISIBILITY streamsize precision(streamsize __prec);
- _LIBCPP_INLINE_VISIBILITY streamsize width() const;
- _LIBCPP_INLINE_VISIBILITY streamsize width(streamsize __wide);
-
- // 27.5.2.3 locales:
- locale imbue(const locale& __loc);
- locale getloc() const;
-
- // 27.5.2.5 storage:
- static int xalloc();
- long& iword(int __index);
- void*& pword(int __index);
-
- // destructor
- virtual ~ios_base();
-
- // 27.5.2.6 callbacks;
- enum event { erase_event, imbue_event, copyfmt_event };
- typedef void (*event_callback)(event, ios_base&, int __index);
- void register_callback(event_callback __fn, int __index);
-
-private:
- ios_base(const ios_base&); // = delete;
- ios_base& operator=(const ios_base&); // = delete;
-
-public:
- static bool sync_with_stdio(bool __sync = true);
-
- _LIBCPP_INLINE_VISIBILITY iostate rdstate() const;
- void clear(iostate __state = goodbit);
- _LIBCPP_INLINE_VISIBILITY void setstate(iostate __state);
-
- _LIBCPP_INLINE_VISIBILITY bool good() const;
- _LIBCPP_INLINE_VISIBILITY bool eof() const;
- _LIBCPP_INLINE_VISIBILITY bool fail() const;
- _LIBCPP_INLINE_VISIBILITY bool bad() const;
-
- _LIBCPP_INLINE_VISIBILITY iostate exceptions() const;
- _LIBCPP_INLINE_VISIBILITY void exceptions(iostate __iostate);
-
- void __set_badbit_and_consider_rethrow();
- void __set_failbit_and_consider_rethrow();
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- ios_base() {// purposefully does no initialization
- }
-
- void init(void* __sb);
- _LIBCPP_INLINE_VISIBILITY void* rdbuf() const {return __rdbuf_;}
-
- _LIBCPP_INLINE_VISIBILITY
- void rdbuf(void* __sb)
- {
- __rdbuf_ = __sb;
- clear();
- }
-
- void __call_callbacks(event);
- void copyfmt(const ios_base&);
- void move(ios_base&);
- void swap(ios_base&) _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- void set_rdbuf(void* __sb)
- {
- __rdbuf_ = __sb;
- }
-
-private:
- // All data members must be scalars
- fmtflags __fmtflags_;
- streamsize __precision_;
- streamsize __width_;
- iostate __rdstate_;
- iostate __exceptions_;
- void* __rdbuf_;
- void* __loc_;
- event_callback* __fn_;
- int* __index_;
- size_t __event_size_;
- size_t __event_cap_;
-// TODO(EricWF): Enable this for both Clang and GCC. Currently it is only
-// enabled with clang.
-#if defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_NO_THREADS)
- static atomic<int> __xindex_;
-#else
- static int __xindex_;
-#endif
- long* __iarray_;
- size_t __iarray_size_;
- size_t __iarray_cap_;
- void** __parray_;
- size_t __parray_size_;
- size_t __parray_cap_;
-};
-
-//enum class io_errc
-_LIBCPP_DECLARE_STRONG_ENUM(io_errc)
-{
- stream = 1
-};
-_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(io_errc)
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS is_error_code_enum<io_errc> : public true_type { };
-
-#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
-template <>
-struct _LIBCPP_TEMPLATE_VIS is_error_code_enum<io_errc::__lx> : public true_type { };
-#endif
-
-_LIBCPP_FUNC_VIS
-const error_category& iostream_category() _NOEXCEPT;
-
-inline _LIBCPP_INLINE_VISIBILITY
-error_code
-make_error_code(io_errc __e) _NOEXCEPT
-{
- return error_code(static_cast<int>(__e), iostream_category());
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-error_condition
-make_error_condition(io_errc __e) _NOEXCEPT
-{
- return error_condition(static_cast<int>(__e), iostream_category());
-}
-
-class _LIBCPP_EXCEPTION_ABI ios_base::failure
- : public system_error
-{
-public:
- explicit failure(const string& __msg, const error_code& __ec = io_errc::stream);
- explicit failure(const char* __msg, const error_code& __ec = io_errc::stream);
- virtual ~failure() throw();
-};
-
-class _LIBCPP_TYPE_VIS ios_base::Init
-{
-public:
- Init();
- ~Init();
-};
-
-// fmtflags
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base::fmtflags
-ios_base::flags() const
-{
- return __fmtflags_;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base::fmtflags
-ios_base::flags(fmtflags __fmtfl)
-{
- fmtflags __r = __fmtflags_;
- __fmtflags_ = __fmtfl;
- return __r;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base::fmtflags
-ios_base::setf(fmtflags __fmtfl)
-{
- fmtflags __r = __fmtflags_;
- __fmtflags_ |= __fmtfl;
- return __r;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-void
-ios_base::unsetf(fmtflags __mask)
-{
- __fmtflags_ &= ~__mask;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base::fmtflags
-ios_base::setf(fmtflags __fmtfl, fmtflags __mask)
-{
- fmtflags __r = __fmtflags_;
- unsetf(__mask);
- __fmtflags_ |= __fmtfl & __mask;
- return __r;
-}
-
-// precision
-
-inline _LIBCPP_INLINE_VISIBILITY
-streamsize
-ios_base::precision() const
-{
- return __precision_;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-streamsize
-ios_base::precision(streamsize __prec)
-{
- streamsize __r = __precision_;
- __precision_ = __prec;
- return __r;
-}
-
-// width
-
-inline _LIBCPP_INLINE_VISIBILITY
-streamsize
-ios_base::width() const
-{
- return __width_;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-streamsize
-ios_base::width(streamsize __wide)
-{
- streamsize __r = __width_;
- __width_ = __wide;
- return __r;
-}
-
-// iostate
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base::iostate
-ios_base::rdstate() const
-{
- return __rdstate_;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-void
-ios_base::setstate(iostate __state)
-{
- clear(__rdstate_ | __state);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-ios_base::good() const
-{
- return __rdstate_ == 0;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-ios_base::eof() const
-{
- return (__rdstate_ & eofbit) != 0;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-ios_base::fail() const
-{
- return (__rdstate_ & (failbit | badbit)) != 0;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-ios_base::bad() const
-{
- return (__rdstate_ & badbit) != 0;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base::iostate
-ios_base::exceptions() const
-{
- return __exceptions_;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-void
-ios_base::exceptions(iostate __iostate)
-{
- __exceptions_ = __iostate;
- clear(__rdstate_);
-}
-
-#if defined(_LIBCPP_CXX03_LANG)
-struct _LIBCPP_TYPE_VIS __cxx03_bool {
- typedef void (__cxx03_bool::*__bool_type)();
- void __true_value() {}
-};
-#endif
-
-template <class _CharT, class _Traits>
-class _LIBCPP_TEMPLATE_VIS basic_ios
- : public ios_base
-{
-public:
- // types:
- typedef _CharT char_type;
- typedef _Traits traits_type;
-
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- static_assert((is_same<_CharT, typename traits_type::char_type>::value),
- "traits_type::char_type must be the same type as CharT");
-
- // __true_value will generate undefined references when linking unless
- // we give it internal linkage.
-
-#if defined(_LIBCPP_CXX03_LANG)
- _LIBCPP_INLINE_VISIBILITY
- operator __cxx03_bool::__bool_type() const {
- return !fail() ? &__cxx03_bool::__true_value : nullptr;
- }
-#else
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_EXPLICIT operator bool() const {return !fail();}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY bool operator!() const {return fail();}
- _LIBCPP_INLINE_VISIBILITY iostate rdstate() const {return ios_base::rdstate();}
- _LIBCPP_INLINE_VISIBILITY void clear(iostate __state = goodbit) {ios_base::clear(__state);}
- _LIBCPP_INLINE_VISIBILITY void setstate(iostate __state) {ios_base::setstate(__state);}
- _LIBCPP_INLINE_VISIBILITY bool good() const {return ios_base::good();}
- _LIBCPP_INLINE_VISIBILITY bool eof() const {return ios_base::eof();}
- _LIBCPP_INLINE_VISIBILITY bool fail() const {return ios_base::fail();}
- _LIBCPP_INLINE_VISIBILITY bool bad() const {return ios_base::bad();}
-
- _LIBCPP_INLINE_VISIBILITY iostate exceptions() const {return ios_base::exceptions();}
- _LIBCPP_INLINE_VISIBILITY void exceptions(iostate __iostate) {ios_base::exceptions(__iostate);}
-
- // 27.5.4.1 Constructor/destructor:
- _LIBCPP_INLINE_VISIBILITY
- explicit basic_ios(basic_streambuf<char_type,traits_type>* __sb);
- virtual ~basic_ios();
-
- // 27.5.4.2 Members:
- _LIBCPP_INLINE_VISIBILITY
- basic_ostream<char_type, traits_type>* tie() const;
- _LIBCPP_INLINE_VISIBILITY
- basic_ostream<char_type, traits_type>* tie(basic_ostream<char_type, traits_type>* __tiestr);
-
- _LIBCPP_INLINE_VISIBILITY
- basic_streambuf<char_type, traits_type>* rdbuf() const;
- _LIBCPP_INLINE_VISIBILITY
- basic_streambuf<char_type, traits_type>* rdbuf(basic_streambuf<char_type, traits_type>* __sb);
-
- basic_ios& copyfmt(const basic_ios& __rhs);
-
- _LIBCPP_INLINE_VISIBILITY
- char_type fill() const;
- _LIBCPP_INLINE_VISIBILITY
- char_type fill(char_type __ch);
-
- _LIBCPP_INLINE_VISIBILITY
- locale imbue(const locale& __loc);
-
- _LIBCPP_INLINE_VISIBILITY
- char narrow(char_type __c, char __dfault) const;
- _LIBCPP_INLINE_VISIBILITY
- char_type widen(char __c) const;
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- basic_ios() {// purposefully does no initialization
- }
- _LIBCPP_INLINE_VISIBILITY
- void init(basic_streambuf<char_type, traits_type>* __sb);
-
- _LIBCPP_INLINE_VISIBILITY
- void move(basic_ios& __rhs);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- void move(basic_ios&& __rhs) {move(__rhs);}
-#endif
- _LIBCPP_INLINE_VISIBILITY
- void swap(basic_ios& __rhs) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- void set_rdbuf(basic_streambuf<char_type, traits_type>* __sb);
-private:
- basic_ostream<char_type, traits_type>* __tie_;
- mutable int_type __fill_;
-};
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_ios<_CharT, _Traits>::basic_ios(basic_streambuf<char_type,traits_type>* __sb)
-{
- init(__sb);
-}
-
-template <class _CharT, class _Traits>
-basic_ios<_CharT, _Traits>::~basic_ios()
-{
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-basic_ios<_CharT, _Traits>::init(basic_streambuf<char_type, traits_type>* __sb)
-{
- ios_base::init(__sb);
- __tie_ = 0;
- __fill_ = traits_type::eof();
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_ostream<_CharT, _Traits>*
-basic_ios<_CharT, _Traits>::tie() const
-{
- return __tie_;
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_ostream<_CharT, _Traits>*
-basic_ios<_CharT, _Traits>::tie(basic_ostream<char_type, traits_type>* __tiestr)
-{
- basic_ostream<char_type, traits_type>* __r = __tie_;
- __tie_ = __tiestr;
- return __r;
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_streambuf<_CharT, _Traits>*
-basic_ios<_CharT, _Traits>::rdbuf() const
-{
- return static_cast<basic_streambuf<char_type, traits_type>*>(ios_base::rdbuf());
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_streambuf<_CharT, _Traits>*
-basic_ios<_CharT, _Traits>::rdbuf(basic_streambuf<char_type, traits_type>* __sb)
-{
- basic_streambuf<char_type, traits_type>* __r = rdbuf();
- ios_base::rdbuf(__sb);
- return __r;
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-locale
-basic_ios<_CharT, _Traits>::imbue(const locale& __loc)
-{
- locale __r = getloc();
- ios_base::imbue(__loc);
- if (rdbuf())
- rdbuf()->pubimbue(__loc);
- return __r;
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-char
-basic_ios<_CharT, _Traits>::narrow(char_type __c, char __dfault) const
-{
- return use_facet<ctype<char_type> >(getloc()).narrow(__c, __dfault);
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-_CharT
-basic_ios<_CharT, _Traits>::widen(char __c) const
-{
- return use_facet<ctype<char_type> >(getloc()).widen(__c);
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-_CharT
-basic_ios<_CharT, _Traits>::fill() const
-{
- if (traits_type::eq_int_type(traits_type::eof(), __fill_))
- __fill_ = widen(' ');
- return __fill_;
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-_CharT
-basic_ios<_CharT, _Traits>::fill(char_type __ch)
-{
- char_type __r = __fill_;
- __fill_ = __ch;
- return __r;
-}
-
-template <class _CharT, class _Traits>
-basic_ios<_CharT, _Traits>&
-basic_ios<_CharT, _Traits>::copyfmt(const basic_ios& __rhs)
-{
- if (this != &__rhs)
- {
- __call_callbacks(erase_event);
- ios_base::copyfmt(__rhs);
- __tie_ = __rhs.__tie_;
- __fill_ = __rhs.__fill_;
- __call_callbacks(copyfmt_event);
- exceptions(__rhs.exceptions());
- }
- return *this;
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-basic_ios<_CharT, _Traits>::move(basic_ios& __rhs)
-{
- ios_base::move(__rhs);
- __tie_ = __rhs.__tie_;
- __rhs.__tie_ = 0;
- __fill_ = __rhs.__fill_;
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-basic_ios<_CharT, _Traits>::swap(basic_ios& __rhs) _NOEXCEPT
-{
- ios_base::swap(__rhs);
- _VSTD::swap(__tie_, __rhs.__tie_);
- _VSTD::swap(__fill_, __rhs.__fill_);
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-basic_ios<_CharT, _Traits>::set_rdbuf(basic_streambuf<char_type, traits_type>* __sb)
-{
- ios_base::set_rdbuf(__sb);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-boolalpha(ios_base& __str)
-{
- __str.setf(ios_base::boolalpha);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-noboolalpha(ios_base& __str)
-{
- __str.unsetf(ios_base::boolalpha);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-showbase(ios_base& __str)
-{
- __str.setf(ios_base::showbase);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-noshowbase(ios_base& __str)
-{
- __str.unsetf(ios_base::showbase);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-showpoint(ios_base& __str)
-{
- __str.setf(ios_base::showpoint);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-noshowpoint(ios_base& __str)
-{
- __str.unsetf(ios_base::showpoint);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-showpos(ios_base& __str)
-{
- __str.setf(ios_base::showpos);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-noshowpos(ios_base& __str)
-{
- __str.unsetf(ios_base::showpos);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-skipws(ios_base& __str)
-{
- __str.setf(ios_base::skipws);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-noskipws(ios_base& __str)
-{
- __str.unsetf(ios_base::skipws);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-uppercase(ios_base& __str)
-{
- __str.setf(ios_base::uppercase);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-nouppercase(ios_base& __str)
-{
- __str.unsetf(ios_base::uppercase);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-unitbuf(ios_base& __str)
-{
- __str.setf(ios_base::unitbuf);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-nounitbuf(ios_base& __str)
-{
- __str.unsetf(ios_base::unitbuf);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-internal(ios_base& __str)
-{
- __str.setf(ios_base::internal, ios_base::adjustfield);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-left(ios_base& __str)
-{
- __str.setf(ios_base::left, ios_base::adjustfield);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-right(ios_base& __str)
-{
- __str.setf(ios_base::right, ios_base::adjustfield);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-dec(ios_base& __str)
-{
- __str.setf(ios_base::dec, ios_base::basefield);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-hex(ios_base& __str)
-{
- __str.setf(ios_base::hex, ios_base::basefield);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-oct(ios_base& __str)
-{
- __str.setf(ios_base::oct, ios_base::basefield);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-fixed(ios_base& __str)
-{
- __str.setf(ios_base::fixed, ios_base::floatfield);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-scientific(ios_base& __str)
-{
- __str.setf(ios_base::scientific, ios_base::floatfield);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-hexfloat(ios_base& __str)
-{
- __str.setf(ios_base::fixed | ios_base::scientific, ios_base::floatfield);
- return __str;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-ios_base&
-defaultfloat(ios_base& __str)
-{
- __str.unsetf(ios_base::floatfield);
- return __str;
-}
-
-template <class _CharT, class _Traits>
-class __save_flags
-{
- typedef basic_ios<_CharT, _Traits> __stream_type;
- typedef typename __stream_type::fmtflags fmtflags;
-
- __stream_type& __stream_;
- fmtflags __fmtflags_;
- _CharT __fill_;
-
- __save_flags(const __save_flags&);
- __save_flags& operator=(const __save_flags&);
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __save_flags(__stream_type& __stream)
- : __stream_(__stream),
- __fmtflags_(__stream.flags()),
- __fill_(__stream.fill())
- {}
- _LIBCPP_INLINE_VISIBILITY
- ~__save_flags()
- {
- __stream_.flags(__fmtflags_);
- __stream_.fill(__fill_);
- }
-};
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_IOS
diff --git a/lib/libcxx/include/iosfwd b/lib/libcxx/include/iosfwd
deleted file mode 100644
index 31f1902e5f5..00000000000
--- a/lib/libcxx/include/iosfwd
+++ /dev/null
@@ -1,221 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- iosfwd -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_IOSFWD
-#define _LIBCPP_IOSFWD
-
-/*
- iosfwd synopsis
-
-namespace std
-{
-
-template<class charT> struct char_traits;
-template<> struct char_traits<char>;
-template<> struct char_traits<char8_t>; // C++20
-template<> struct char_traits<char16_t>;
-template<> struct char_traits<char32_t>;
-template<> struct char_traits<wchar_t>;
-
-template<class T> class allocator;
-
-class ios_base;
-template <class charT, class traits = char_traits<charT> > class basic_ios;
-
-template <class charT, class traits = char_traits<charT> > class basic_streambuf;
-template <class charT, class traits = char_traits<charT> > class basic_istream;
-template <class charT, class traits = char_traits<charT> > class basic_ostream;
-template <class charT, class traits = char_traits<charT> > class basic_iostream;
-
-template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
- class basic_stringbuf;
-template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
- class basic_istringstream;
-template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
- class basic_ostringstream;
-template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
- class basic_stringstream;
-
-template <class charT, class traits = char_traits<charT> > class basic_filebuf;
-template <class charT, class traits = char_traits<charT> > class basic_ifstream;
-template <class charT, class traits = char_traits<charT> > class basic_ofstream;
-template <class charT, class traits = char_traits<charT> > class basic_fstream;
-
-template <class charT, class traits = char_traits<charT> > class istreambuf_iterator;
-template <class charT, class traits = char_traits<charT> > class ostreambuf_iterator;
-
-typedef basic_ios<char> ios;
-typedef basic_ios<wchar_t> wios;
-
-typedef basic_streambuf<char> streambuf;
-typedef basic_istream<char> istream;
-typedef basic_ostream<char> ostream;
-typedef basic_iostream<char> iostream;
-
-typedef basic_stringbuf<char> stringbuf;
-typedef basic_istringstream<char> istringstream;
-typedef basic_ostringstream<char> ostringstream;
-typedef basic_stringstream<char> stringstream;
-
-typedef basic_filebuf<char> filebuf;
-typedef basic_ifstream<char> ifstream;
-typedef basic_ofstream<char> ofstream;
-typedef basic_fstream<char> fstream;
-
-typedef basic_streambuf<wchar_t> wstreambuf;
-typedef basic_istream<wchar_t> wistream;
-typedef basic_ostream<wchar_t> wostream;
-typedef basic_iostream<wchar_t> wiostream;
-
-typedef basic_stringbuf<wchar_t> wstringbuf;
-typedef basic_istringstream<wchar_t> wistringstream;
-typedef basic_ostringstream<wchar_t> wostringstream;
-typedef basic_stringstream<wchar_t> wstringstream;
-
-typedef basic_filebuf<wchar_t> wfilebuf;
-typedef basic_ifstream<wchar_t> wifstream;
-typedef basic_ofstream<wchar_t> wofstream;
-typedef basic_fstream<wchar_t> wfstream;
-
-template <class state> class fpos;
-typedef fpos<char_traits<char>::state_type> streampos;
-typedef fpos<char_traits<wchar_t>::state_type> wstreampos;
-
-} // std
-
-*/
-
-#include <__config>
-#include <wchar.h> // for mbstate_t
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-class _LIBCPP_TYPE_VIS ios_base;
-
-template<class _CharT> struct _LIBCPP_TEMPLATE_VIS char_traits;
-template<> struct char_traits<char>;
-#ifndef _LIBCPP_NO_HAS_CHAR8_T
-template<> struct char_traits<char8_t>;
-#endif
-template<> struct char_traits<char16_t>;
-template<> struct char_traits<char32_t>;
-template<> struct char_traits<wchar_t>;
-
-template<class _Tp> class _LIBCPP_TEMPLATE_VIS allocator;
-
-template <class _CharT, class _Traits = char_traits<_CharT> >
- class _LIBCPP_TEMPLATE_VIS basic_ios;
-
-template <class _CharT, class _Traits = char_traits<_CharT> >
- class _LIBCPP_TEMPLATE_VIS basic_streambuf;
-template <class _CharT, class _Traits = char_traits<_CharT> >
- class _LIBCPP_TEMPLATE_VIS basic_istream;
-template <class _CharT, class _Traits = char_traits<_CharT> >
- class _LIBCPP_TEMPLATE_VIS basic_ostream;
-template <class _CharT, class _Traits = char_traits<_CharT> >
- class _LIBCPP_TEMPLATE_VIS basic_iostream;
-
-template <class _CharT, class _Traits = char_traits<_CharT>,
- class _Allocator = allocator<_CharT> >
- class _LIBCPP_TEMPLATE_VIS basic_stringbuf;
-template <class _CharT, class _Traits = char_traits<_CharT>,
- class _Allocator = allocator<_CharT> >
- class _LIBCPP_TEMPLATE_VIS basic_istringstream;
-template <class _CharT, class _Traits = char_traits<_CharT>,
- class _Allocator = allocator<_CharT> >
- class _LIBCPP_TEMPLATE_VIS basic_ostringstream;
-template <class _CharT, class _Traits = char_traits<_CharT>,
- class _Allocator = allocator<_CharT> >
- class _LIBCPP_TEMPLATE_VIS basic_stringstream;
-
-template <class _CharT, class _Traits = char_traits<_CharT> >
- class _LIBCPP_TEMPLATE_VIS basic_filebuf;
-template <class _CharT, class _Traits = char_traits<_CharT> >
- class _LIBCPP_TEMPLATE_VIS basic_ifstream;
-template <class _CharT, class _Traits = char_traits<_CharT> >
- class _LIBCPP_TEMPLATE_VIS basic_ofstream;
-template <class _CharT, class _Traits = char_traits<_CharT> >
- class _LIBCPP_TEMPLATE_VIS basic_fstream;
-
-template <class _CharT, class _Traits = char_traits<_CharT> >
- class _LIBCPP_TEMPLATE_VIS istreambuf_iterator;
-template <class _CharT, class _Traits = char_traits<_CharT> >
- class _LIBCPP_TEMPLATE_VIS ostreambuf_iterator;
-
-typedef basic_ios<char> ios;
-typedef basic_ios<wchar_t> wios;
-
-typedef basic_streambuf<char> streambuf;
-typedef basic_istream<char> istream;
-typedef basic_ostream<char> ostream;
-typedef basic_iostream<char> iostream;
-
-typedef basic_stringbuf<char> stringbuf;
-typedef basic_istringstream<char> istringstream;
-typedef basic_ostringstream<char> ostringstream;
-typedef basic_stringstream<char> stringstream;
-
-typedef basic_filebuf<char> filebuf;
-typedef basic_ifstream<char> ifstream;
-typedef basic_ofstream<char> ofstream;
-typedef basic_fstream<char> fstream;
-
-typedef basic_streambuf<wchar_t> wstreambuf;
-typedef basic_istream<wchar_t> wistream;
-typedef basic_ostream<wchar_t> wostream;
-typedef basic_iostream<wchar_t> wiostream;
-
-typedef basic_stringbuf<wchar_t> wstringbuf;
-typedef basic_istringstream<wchar_t> wistringstream;
-typedef basic_ostringstream<wchar_t> wostringstream;
-typedef basic_stringstream<wchar_t> wstringstream;
-
-typedef basic_filebuf<wchar_t> wfilebuf;
-typedef basic_ifstream<wchar_t> wifstream;
-typedef basic_ofstream<wchar_t> wofstream;
-typedef basic_fstream<wchar_t> wfstream;
-
-template <class _State> class _LIBCPP_TEMPLATE_VIS fpos;
-typedef fpos<mbstate_t> streampos;
-typedef fpos<mbstate_t> wstreampos;
-#ifndef _LIBCPP_NO_HAS_CHAR8_T
-typedef fpos<mbstate_t> u8streampos;
-#endif
-#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
-typedef fpos<mbstate_t> u16streampos;
-typedef fpos<mbstate_t> u32streampos;
-#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
-
-#if defined(_NEWLIB_VERSION)
-// On newlib, off_t is 'long int'
-typedef long int streamoff; // for char_traits in <string>
-#else
-typedef long long streamoff; // for char_traits in <string>
-#endif
-
-template <class _CharT, // for <stdexcept>
- class _Traits = char_traits<_CharT>,
- class _Allocator = allocator<_CharT> >
- class _LIBCPP_TEMPLATE_VIS basic_string;
-typedef basic_string<char, char_traits<char>, allocator<char> > string;
-typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring;
-
-
-// Include other forward declarations here
-template <class _Tp, class _Alloc = allocator<_Tp> >
-class _LIBCPP_TEMPLATE_VIS vector;
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_IOSFWD
diff --git a/lib/libcxx/include/iostream b/lib/libcxx/include/iostream
deleted file mode 100644
index 136a849777f..00000000000
--- a/lib/libcxx/include/iostream
+++ /dev/null
@@ -1,64 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- iostream ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_IOSTREAM
-#define _LIBCPP_IOSTREAM
-
-/*
- iostream synopsis
-
-#include <ios>
-#include <streambuf>
-#include <istream>
-#include <ostream>
-
-namespace std {
-
-extern istream cin;
-extern ostream cout;
-extern ostream cerr;
-extern ostream clog;
-extern wistream wcin;
-extern wostream wcout;
-extern wostream wcerr;
-extern wostream wclog;
-
-} // std
-
-*/
-
-#include <__config>
-#include <ios>
-#include <streambuf>
-#include <istream>
-#include <ostream>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-#ifndef _LIBCPP_HAS_NO_STDIN
-extern _LIBCPP_FUNC_VIS istream cin;
-extern _LIBCPP_FUNC_VIS wistream wcin;
-#endif
-#ifndef _LIBCPP_HAS_NO_STDOUT
-extern _LIBCPP_FUNC_VIS ostream cout;
-extern _LIBCPP_FUNC_VIS wostream wcout;
-#endif
-extern _LIBCPP_FUNC_VIS ostream cerr;
-extern _LIBCPP_FUNC_VIS wostream wcerr;
-extern _LIBCPP_FUNC_VIS ostream clog;
-extern _LIBCPP_FUNC_VIS wostream wclog;
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_IOSTREAM
diff --git a/lib/libcxx/include/istream b/lib/libcxx/include/istream
deleted file mode 100644
index 30ee4f4b871..00000000000
--- a/lib/libcxx/include/istream
+++ /dev/null
@@ -1,1518 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- istream ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_ISTREAM
-#define _LIBCPP_ISTREAM
-
-/*
- istream synopsis
-
-template <class charT, class traits = char_traits<charT> >
-class basic_istream
- : virtual public basic_ios<charT,traits>
-{
-public:
- // types (inherited from basic_ios (27.5.4)):
- typedef charT char_type;
- typedef traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- // 27.7.1.1.1 Constructor/destructor:
- explicit basic_istream(basic_streambuf<char_type, traits_type>* sb);
- basic_istream(basic_istream&& rhs);
- virtual ~basic_istream();
-
- // 27.7.1.1.2 Assign/swap:
- basic_istream& operator=(basic_istream&& rhs);
- void swap(basic_istream& rhs);
-
- // 27.7.1.1.3 Prefix/suffix:
- class sentry;
-
- // 27.7.1.2 Formatted input:
- basic_istream& operator>>(basic_istream& (*pf)(basic_istream&));
- basic_istream& operator>>(basic_ios<char_type, traits_type>&
- (*pf)(basic_ios<char_type, traits_type>&));
- basic_istream& operator>>(ios_base& (*pf)(ios_base&));
- basic_istream& operator>>(basic_streambuf<char_type, traits_type>* sb);
- basic_istream& operator>>(bool& n);
- basic_istream& operator>>(short& n);
- basic_istream& operator>>(unsigned short& n);
- basic_istream& operator>>(int& n);
- basic_istream& operator>>(unsigned int& n);
- basic_istream& operator>>(long& n);
- basic_istream& operator>>(unsigned long& n);
- basic_istream& operator>>(long long& n);
- basic_istream& operator>>(unsigned long long& n);
- basic_istream& operator>>(float& f);
- basic_istream& operator>>(double& f);
- basic_istream& operator>>(long double& f);
- basic_istream& operator>>(void*& p);
-
- // 27.7.1.3 Unformatted input:
- streamsize gcount() const;
- int_type get();
- basic_istream& get(char_type& c);
- basic_istream& get(char_type* s, streamsize n);
- basic_istream& get(char_type* s, streamsize n, char_type delim);
- basic_istream& get(basic_streambuf<char_type,traits_type>& sb);
- basic_istream& get(basic_streambuf<char_type,traits_type>& sb, char_type delim);
-
- basic_istream& getline(char_type* s, streamsize n);
- basic_istream& getline(char_type* s, streamsize n, char_type delim);
-
- basic_istream& ignore(streamsize n = 1, int_type delim = traits_type::eof());
- int_type peek();
- basic_istream& read (char_type* s, streamsize n);
- streamsize readsome(char_type* s, streamsize n);
-
- basic_istream& putback(char_type c);
- basic_istream& unget();
- int sync();
-
- pos_type tellg();
- basic_istream& seekg(pos_type);
- basic_istream& seekg(off_type, ios_base::seekdir);
-protected:
- basic_istream(const basic_istream& rhs) = delete;
- basic_istream(basic_istream&& rhs);
- // 27.7.2.1.2 Assign/swap:
- basic_istream& operator=(const basic_istream& rhs) = delete;
- basic_istream& operator=(basic_istream&& rhs);
- void swap(basic_istream& rhs);
-};
-
-// 27.7.1.2.3 character extraction templates:
-template<class charT, class traits>
- basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&);
-
-template<class traits>
- basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char&);
-
-template<class traits>
- basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char&);
-
-template<class charT, class traits>
- basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT*);
-
-template<class traits>
- basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char*);
-
-template<class traits>
- basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char*);
-
-template <class charT, class traits>
- void
- swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y);
-
-typedef basic_istream<char> istream;
-typedef basic_istream<wchar_t> wistream;
-
-template <class charT, class traits = char_traits<charT> >
-class basic_iostream :
- public basic_istream<charT,traits>,
- public basic_ostream<charT,traits>
-{
-public:
- // types:
- typedef charT char_type;
- typedef traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- // constructor/destructor
- explicit basic_iostream(basic_streambuf<char_type, traits_type>* sb);
- basic_iostream(basic_iostream&& rhs);
- virtual ~basic_iostream();
-
- // assign/swap
- basic_iostream& operator=(basic_iostream&& rhs);
- void swap(basic_iostream& rhs);
-};
-
-template <class charT, class traits>
- void
- swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y);
-
-typedef basic_iostream<char> iostream;
-typedef basic_iostream<wchar_t> wiostream;
-
-template <class charT, class traits>
- basic_istream<charT,traits>&
- ws(basic_istream<charT,traits>& is);
-
-template <class charT, class traits, class T>
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>&& is, T& x);
-
-} // std
-
-*/
-
-#include <__config>
-#include <version>
-#include <ostream>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _CharT, class _Traits>
-class _LIBCPP_TEMPLATE_VIS basic_istream
- : virtual public basic_ios<_CharT, _Traits>
-{
- streamsize __gc_;
-public:
- // types (inherited from basic_ios (27.5.4)):
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- // 27.7.1.1.1 Constructor/destructor:
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb) : __gc_(0)
- { this->init(__sb); }
- virtual ~basic_istream();
-protected:
-#ifndef _LIBCPP_CXX03_LANG
- inline _LIBCPP_INLINE_VISIBILITY
- basic_istream(basic_istream&& __rhs);
-
- // 27.7.1.1.2 Assign/swap:
- inline _LIBCPP_INLINE_VISIBILITY
- basic_istream& operator=(basic_istream&& __rhs);
-#endif
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- void swap(basic_istream& __rhs) {
- _VSTD::swap(__gc_, __rhs.__gc_);
- basic_ios<char_type, traits_type>::swap(__rhs);
- }
-
-#ifndef _LIBCPP_CXX03_LANG
- basic_istream (const basic_istream& __rhs) = delete;
- basic_istream& operator=(const basic_istream& __rhs) = delete;
-#endif
-public:
-
- // 27.7.1.1.3 Prefix/suffix:
- class _LIBCPP_TEMPLATE_VIS sentry;
-
- // 27.7.1.2 Formatted input:
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&))
- { return __pf(*this); }
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- basic_istream& operator>>(basic_ios<char_type, traits_type>&
- (*__pf)(basic_ios<char_type, traits_type>&))
- { __pf(*this); return *this; }
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- basic_istream& operator>>(ios_base& (*__pf)(ios_base&))
- { __pf(*this); return *this; }
-
- basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
- basic_istream& operator>>(bool& __n);
- basic_istream& operator>>(short& __n);
- basic_istream& operator>>(unsigned short& __n);
- basic_istream& operator>>(int& __n);
- basic_istream& operator>>(unsigned int& __n);
- basic_istream& operator>>(long& __n);
- basic_istream& operator>>(unsigned long& __n);
- basic_istream& operator>>(long long& __n);
- basic_istream& operator>>(unsigned long long& __n);
- basic_istream& operator>>(float& __f);
- basic_istream& operator>>(double& __f);
- basic_istream& operator>>(long double& __f);
- basic_istream& operator>>(void*& __p);
-
- // 27.7.1.3 Unformatted input:
- _LIBCPP_INLINE_VISIBILITY
- streamsize gcount() const {return __gc_;}
- int_type get();
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- basic_istream& get(char_type& __c) {
- int_type __ch = get();
- if (__ch != traits_type::eof())
- __c = traits_type::to_char_type(__ch);
- return *this;
- }
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- basic_istream& get(char_type* __s, streamsize __n)
- { return get(__s, __n, this->widen('\n')); }
-
- basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- basic_istream& get(basic_streambuf<char_type, traits_type>& __sb)
- { return get(__sb, this->widen('\n')); }
-
- basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- basic_istream& getline(char_type* __s, streamsize __n)
- { return getline(__s, __n, this->widen('\n')); }
-
- basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
-
- basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
- int_type peek();
- basic_istream& read (char_type* __s, streamsize __n);
- streamsize readsome(char_type* __s, streamsize __n);
-
- basic_istream& putback(char_type __c);
- basic_istream& unget();
- int sync();
-
- pos_type tellg();
- basic_istream& seekg(pos_type __pos);
- basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
-};
-
-template <class _CharT, class _Traits>
-class _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry
-{
- bool __ok_;
-
- sentry(const sentry&); // = delete;
- sentry& operator=(const sentry&); // = delete;
-
-public:
- explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
-// ~sentry() = default;
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_EXPLICIT
- operator bool() const {return __ok_;}
-};
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
- bool __noskipws)
- : __ok_(false)
-{
- if (__is.good())
- {
- if (__is.tie())
- __is.tie()->flush();
- if (!__noskipws && (__is.flags() & ios_base::skipws))
- {
- typedef istreambuf_iterator<_CharT, _Traits> _Ip;
- const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
- _Ip __i(__is);
- _Ip __eof;
- for (; __i != __eof; ++__i)
- if (!__ct.is(__ct.space, *__i))
- break;
- if (__i == __eof)
- __is.setstate(ios_base::failbit | ios_base::eofbit);
- }
- __ok_ = __is.good();
- }
- else
- __is.setstate(ios_base::failbit);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
- : __gc_(__rhs.__gc_)
-{
- __rhs.__gc_ = 0;
- this->move(__rhs);
-}
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
-{
- swap(__rhs);
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>::~basic_istream()
-{
-}
-
-template <class _Tp, class _CharT, class _Traits>
-_LIBCPP_INLINE_VISIBILITY
-basic_istream<_CharT, _Traits>&
-__input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typename basic_istream<_CharT, _Traits>::sentry __s(__is);
- if (__s)
- {
- typedef istreambuf_iterator<_CharT, _Traits> _Ip;
- typedef num_get<_CharT, _Ip> _Fp;
- ios_base::iostate __err = ios_base::goodbit;
- use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __err, __n);
- __is.setstate(__err);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __is.__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __is;
-}
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
-{
- return _VSTD::__input_arithmetic<unsigned short>(*this, __n);
-}
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n)
-{
- return _VSTD::__input_arithmetic<unsigned int>(*this, __n);
-}
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::operator>>(long& __n)
-{
- return _VSTD::__input_arithmetic<long>(*this, __n);
-}
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n)
-{
- return _VSTD::__input_arithmetic<unsigned long>(*this, __n);
-}
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::operator>>(long long& __n)
-{
- return _VSTD::__input_arithmetic<long long>(*this, __n);
-}
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n)
-{
- return _VSTD::__input_arithmetic<unsigned long long>(*this, __n);
-}
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::operator>>(float& __n)
-{
- return _VSTD::__input_arithmetic<float>(*this, __n);
-}
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::operator>>(double& __n)
-{
- return _VSTD::__input_arithmetic<double>(*this, __n);
-}
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::operator>>(long double& __n)
-{
- return _VSTD::__input_arithmetic<long double>(*this, __n);
-}
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::operator>>(bool& __n)
-{
- return _VSTD::__input_arithmetic<bool>(*this, __n);
-}
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::operator>>(void*& __n)
-{
- return _VSTD::__input_arithmetic<void*>(*this, __n);
-}
-
-template <class _Tp, class _CharT, class _Traits>
-_LIBCPP_INLINE_VISIBILITY
-basic_istream<_CharT, _Traits>&
-__input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) {
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typename basic_istream<_CharT, _Traits>::sentry __s(__is);
- if (__s)
- {
- typedef istreambuf_iterator<_CharT, _Traits> _Ip;
- typedef num_get<_CharT, _Ip> _Fp;
- ios_base::iostate __err = ios_base::goodbit;
- long __temp;
- use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __err, __temp);
- if (__temp < numeric_limits<_Tp>::min())
- {
- __err |= ios_base::failbit;
- __n = numeric_limits<_Tp>::min();
- }
- else if (__temp > numeric_limits<_Tp>::max())
- {
- __err |= ios_base::failbit;
- __n = numeric_limits<_Tp>::max();
- }
- else
- __n = static_cast<_Tp>(__temp);
- __is.setstate(__err);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __is.__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __is;
-}
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::operator>>(short& __n)
-{
- return _VSTD::__input_arithmetic_with_numeric_limits<short>(*this, __n);
-}
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::operator>>(int& __n)
-{
- return _VSTD::__input_arithmetic_with_numeric_limits<int>(*this, __n);
-}
-
-template<class _CharT, class _Traits>
-_LIBCPP_INLINE_VISIBILITY
-basic_istream<_CharT, _Traits>&
-__input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
- if (__sen)
- {
- auto __s = __p;
- const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
- ios_base::iostate __err = ios_base::goodbit;
- while (__s != __p + (__n-1))
- {
- typename _Traits::int_type __i = __is.rdbuf()->sgetc();
- if (_Traits::eq_int_type(__i, _Traits::eof()))
- {
- __err |= ios_base::eofbit;
- break;
- }
- _CharT __ch = _Traits::to_char_type(__i);
- if (__ct.is(__ct.space, __ch))
- break;
- *__s++ = __ch;
- __is.rdbuf()->sbumpc();
- }
- *__s = _CharT();
- __is.width(0);
- if (__s == __p)
- __err |= ios_base::failbit;
- __is.setstate(__err);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __is.__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __is;
-}
-
-#if _LIBCPP_STD_VER > 17
-
-template<class _CharT, class _Traits, size_t _Np>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np])
-{
- auto __n = _Np;
- if (__is.width() > 0)
- __n = _VSTD::min(size_t(__is.width()), _Np);
- return _VSTD::__input_c_string(__is, __buf, __n);
-}
-
-template<class _Traits, size_t _Np>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_istream<char, _Traits>&
-operator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np])
-{
- return __is >> (char(&)[_Np])__buf;
-}
-
-template<class _Traits, size_t _Np>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_istream<char, _Traits>&
-operator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np])
-{
- return __is >> (char(&)[_Np])__buf;
-}
-
-#else
-
-template<class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
-{
- streamsize __n = __is.width();
- if (__n <= 0)
- __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
- return _VSTD::__input_c_string(__is, __s, size_t(__n));
-}
-
-template<class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_istream<char, _Traits>&
-operator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
-{
- return __is >> (char*)__s;
-}
-
-template<class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_istream<char, _Traits>&
-operator>>(basic_istream<char, _Traits>& __is, signed char* __s)
-{
- return __is >> (char*)__s;
-}
-
-#endif // _LIBCPP_STD_VER > 17
-
-template<class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
- if (__sen)
- {
- typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
- if (_Traits::eq_int_type(__i, _Traits::eof()))
- __is.setstate(ios_base::eofbit | ios_base::failbit);
- else
- __c = _Traits::to_char_type(__i);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __is.__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __is;
-}
-
-template<class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_istream<char, _Traits>&
-operator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
-{
- return __is >> (char&)__c;
-}
-
-template<class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_istream<char, _Traits>&
-operator>>(basic_istream<char, _Traits>& __is, signed char& __c)
-{
- return __is >> (char&)__c;
-}
-
-template<class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
-{
- __gc_ = 0;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __s(*this, true);
- if (__s)
- {
- if (__sb)
- {
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- ios_base::iostate __err = ios_base::goodbit;
- while (true)
- {
- typename traits_type::int_type __i = this->rdbuf()->sgetc();
- if (traits_type::eq_int_type(__i, _Traits::eof()))
- {
- __err |= ios_base::eofbit;
- break;
- }
- if (traits_type::eq_int_type(
- __sb->sputc(traits_type::to_char_type(__i)),
- traits_type::eof()))
- break;
- ++__gc_;
- this->rdbuf()->sbumpc();
- }
- if (__gc_ == 0)
- __err |= ios_base::failbit;
- this->setstate(__err);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- if (__gc_ == 0)
- this->__set_failbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
- else
- this->setstate(ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template<class _CharT, class _Traits>
-typename basic_istream<_CharT, _Traits>::int_type
-basic_istream<_CharT, _Traits>::get()
-{
- __gc_ = 0;
- int_type __r = traits_type::eof();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __s(*this, true);
- if (__s)
- {
- __r = this->rdbuf()->sbumpc();
- if (traits_type::eq_int_type(__r, traits_type::eof()))
- this->setstate(ios_base::failbit | ios_base::eofbit);
- else
- __gc_ = 1;
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __r;
-}
-
-template<class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
-{
- __gc_ = 0;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __sen(*this, true);
- if (__sen)
- {
- if (__n > 0)
- {
- ios_base::iostate __err = ios_base::goodbit;
- while (__gc_ < __n-1)
- {
- int_type __i = this->rdbuf()->sgetc();
- if (traits_type::eq_int_type(__i, traits_type::eof()))
- {
- __err |= ios_base::eofbit;
- break;
- }
- char_type __ch = traits_type::to_char_type(__i);
- if (traits_type::eq(__ch, __dlm))
- break;
- *__s++ = __ch;
- ++__gc_;
- this->rdbuf()->sbumpc();
- }
- if (__gc_ == 0)
- __err |= ios_base::failbit;
- this->setstate(__err);
- }
- else
- this->setstate(ios_base::failbit);
- }
- if (__n > 0)
- *__s = char_type();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- if (__n > 0)
- *__s = char_type();
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template<class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
- char_type __dlm)
-{
- __gc_ = 0;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __sen(*this, true);
- if (__sen)
- {
- ios_base::iostate __err = ios_base::goodbit;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- while (true)
- {
- typename traits_type::int_type __i = this->rdbuf()->sgetc();
- if (traits_type::eq_int_type(__i, traits_type::eof()))
- {
- __err |= ios_base::eofbit;
- break;
- }
- char_type __ch = traits_type::to_char_type(__i);
- if (traits_type::eq(__ch, __dlm))
- break;
- if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
- break;
- ++__gc_;
- this->rdbuf()->sbumpc();
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (__gc_ == 0)
- __err |= ios_base::failbit;
- this->setstate(__err);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template<class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
-{
- __gc_ = 0;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __sen(*this, true);
- if (__sen)
- {
- ios_base::iostate __err = ios_base::goodbit;
- while (true)
- {
- typename traits_type::int_type __i = this->rdbuf()->sgetc();
- if (traits_type::eq_int_type(__i, traits_type::eof()))
- {
- __err |= ios_base::eofbit;
- break;
- }
- char_type __ch = traits_type::to_char_type(__i);
- if (traits_type::eq(__ch, __dlm))
- {
- this->rdbuf()->sbumpc();
- ++__gc_;
- break;
- }
- if (__gc_ >= __n-1)
- {
- __err |= ios_base::failbit;
- break;
- }
- *__s++ = __ch;
- this->rdbuf()->sbumpc();
- ++__gc_;
- }
- if (__gc_ == 0)
- __err |= ios_base::failbit;
- this->setstate(__err);
- }
- if (__n > 0)
- *__s = char_type();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- if (__n > 0)
- *__s = char_type();
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template<class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
-{
- __gc_ = 0;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __sen(*this, true);
- if (__sen)
- {
- ios_base::iostate __err = ios_base::goodbit;
- if (__n == numeric_limits<streamsize>::max())
- {
- while (true)
- {
- typename traits_type::int_type __i = this->rdbuf()->sbumpc();
- if (traits_type::eq_int_type(__i, traits_type::eof()))
- {
- __err |= ios_base::eofbit;
- break;
- }
- ++__gc_;
- if (traits_type::eq_int_type(__i, __dlm))
- break;
- }
- }
- else
- {
- while (__gc_ < __n)
- {
- typename traits_type::int_type __i = this->rdbuf()->sbumpc();
- if (traits_type::eq_int_type(__i, traits_type::eof()))
- {
- __err |= ios_base::eofbit;
- break;
- }
- ++__gc_;
- if (traits_type::eq_int_type(__i, __dlm))
- break;
- }
- }
- this->setstate(__err);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template<class _CharT, class _Traits>
-typename basic_istream<_CharT, _Traits>::int_type
-basic_istream<_CharT, _Traits>::peek()
-{
- __gc_ = 0;
- int_type __r = traits_type::eof();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __sen(*this, true);
- if (__sen)
- {
- __r = this->rdbuf()->sgetc();
- if (traits_type::eq_int_type(__r, traits_type::eof()))
- this->setstate(ios_base::eofbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __r;
-}
-
-template<class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
-{
- __gc_ = 0;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __sen(*this, true);
- if (__sen)
- {
- __gc_ = this->rdbuf()->sgetn(__s, __n);
- if (__gc_ != __n)
- this->setstate(ios_base::failbit | ios_base::eofbit);
- }
- else
- this->setstate(ios_base::failbit);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template<class _CharT, class _Traits>
-streamsize
-basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
-{
- __gc_ = 0;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __sen(*this, true);
- if (__sen)
- {
- streamsize __c = this->rdbuf()->in_avail();
- switch (__c)
- {
- case -1:
- this->setstate(ios_base::eofbit);
- break;
- case 0:
- break;
- default:
- read(__s, _VSTD::min(__c, __n));
- break;
- }
- }
- else
- this->setstate(ios_base::failbit);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __gc_;
-}
-
-template<class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::putback(char_type __c)
-{
- __gc_ = 0;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- this->clear(this->rdstate() & ~ios_base::eofbit);
- sentry __sen(*this, true);
- if (__sen)
- {
- if (this->rdbuf() == 0 || this->rdbuf()->sputbackc(__c) == traits_type::eof())
- this->setstate(ios_base::badbit);
- }
- else
- this->setstate(ios_base::failbit);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template<class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::unget()
-{
- __gc_ = 0;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- this->clear(this->rdstate() & ~ios_base::eofbit);
- sentry __sen(*this, true);
- if (__sen)
- {
- if (this->rdbuf() == 0 || this->rdbuf()->sungetc() == traits_type::eof())
- this->setstate(ios_base::badbit);
- }
- else
- this->setstate(ios_base::failbit);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template<class _CharT, class _Traits>
-int
-basic_istream<_CharT, _Traits>::sync()
-{
- int __r = 0;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __sen(*this, true);
- if (__sen)
- {
- if (this->rdbuf() == 0)
- return -1;
- if (this->rdbuf()->pubsync() == -1)
- {
- this->setstate(ios_base::badbit);
- return -1;
- }
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __r;
-}
-
-template<class _CharT, class _Traits>
-typename basic_istream<_CharT, _Traits>::pos_type
-basic_istream<_CharT, _Traits>::tellg()
-{
- pos_type __r(-1);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __sen(*this, true);
- if (__sen)
- __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __r;
-}
-
-template<class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::seekg(pos_type __pos)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- this->clear(this->rdstate() & ~ios_base::eofbit);
- sentry __sen(*this, true);
- if (__sen)
- {
- if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
- this->setstate(ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template<class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- this->clear(this->rdstate() & ~ios_base::eofbit);
- sentry __sen(*this, true);
- if (__sen)
- {
- if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
- this->setstate(ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-ws(basic_istream<_CharT, _Traits>& __is)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
- if (__sen)
- {
- const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
- while (true)
- {
- typename _Traits::int_type __i = __is.rdbuf()->sgetc();
- if (_Traits::eq_int_type(__i, _Traits::eof()))
- {
- __is.setstate(ios_base::eofbit);
- break;
- }
- if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
- break;
- __is.rdbuf()->sbumpc();
- }
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __is.__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __is;
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp&& __x)
-{
- __is >> _VSTD::forward<_Tp>(__x);
- return __is;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits>
-class _LIBCPP_TEMPLATE_VIS basic_iostream
- : public basic_istream<_CharT, _Traits>,
- public basic_ostream<_CharT, _Traits>
-{
-public:
- // types:
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- // constructor/destructor
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
- : basic_istream<_CharT, _Traits>(__sb)
- {}
-
- virtual ~basic_iostream();
-protected:
-#ifndef _LIBCPP_CXX03_LANG
- inline _LIBCPP_INLINE_VISIBILITY
- basic_iostream(basic_iostream&& __rhs);
-
- // assign/swap
- inline _LIBCPP_INLINE_VISIBILITY
- basic_iostream& operator=(basic_iostream&& __rhs);
-#endif
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- void swap(basic_iostream& __rhs)
- { basic_istream<char_type, traits_type>::swap(__rhs); }
-public:
-};
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits>
-basic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
- : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
-{
-}
-
-template <class _CharT, class _Traits>
-basic_iostream<_CharT, _Traits>&
-basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
-{
- swap(__rhs);
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits>
-basic_iostream<_CharT, _Traits>::~basic_iostream()
-{
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- basic_string<_CharT, _Traits, _Allocator>& __str)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
- if (__sen)
- {
- __str.clear();
- streamsize __n = __is.width();
- if (__n <= 0)
- __n = __str.max_size();
- if (__n <= 0)
- __n = numeric_limits<streamsize>::max();
- streamsize __c = 0;
- const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
- ios_base::iostate __err = ios_base::goodbit;
- while (__c < __n)
- {
- typename _Traits::int_type __i = __is.rdbuf()->sgetc();
- if (_Traits::eq_int_type(__i, _Traits::eof()))
- {
- __err |= ios_base::eofbit;
- break;
- }
- _CharT __ch = _Traits::to_char_type(__i);
- if (__ct.is(__ct.space, __ch))
- break;
- __str.push_back(__ch);
- ++__c;
- __is.rdbuf()->sbumpc();
- }
- __is.width(0);
- if (__c == 0)
- __err |= ios_base::failbit;
- __is.setstate(__err);
- }
- else
- __is.setstate(ios_base::failbit);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __is.__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __is;
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-basic_istream<_CharT, _Traits>&
-getline(basic_istream<_CharT, _Traits>& __is,
- basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
- if (__sen)
- {
- __str.clear();
- ios_base::iostate __err = ios_base::goodbit;
- streamsize __extr = 0;
- while (true)
- {
- typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
- if (_Traits::eq_int_type(__i, _Traits::eof()))
- {
- __err |= ios_base::eofbit;
- break;
- }
- ++__extr;
- _CharT __ch = _Traits::to_char_type(__i);
- if (_Traits::eq(__ch, __dlm))
- break;
- __str.push_back(__ch);
- if (__str.size() == __str.max_size())
- {
- __err |= ios_base::failbit;
- break;
- }
- }
- if (__extr == 0)
- __err |= ios_base::failbit;
- __is.setstate(__err);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __is.__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __is;
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_istream<_CharT, _Traits>&
-getline(basic_istream<_CharT, _Traits>& __is,
- basic_string<_CharT, _Traits, _Allocator>& __str)
-{
- return getline(__is, __str, __is.widen('\n'));
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_istream<_CharT, _Traits>&
-getline(basic_istream<_CharT, _Traits>&& __is,
- basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
-{
- return getline(__is, __str, __dlm);
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_istream<_CharT, _Traits>&
-getline(basic_istream<_CharT, _Traits>&& __is,
- basic_string<_CharT, _Traits, _Allocator>& __str)
-{
- return getline(__is, __str, __is.widen('\n'));
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits, size_t _Size>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
- if (__sen)
- {
- basic_string<_CharT, _Traits> __str;
- const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
- size_t __c = 0;
- ios_base::iostate __err = ios_base::goodbit;
- _CharT __zero = __ct.widen('0');
- _CharT __one = __ct.widen('1');
- while (__c < _Size)
- {
- typename _Traits::int_type __i = __is.rdbuf()->sgetc();
- if (_Traits::eq_int_type(__i, _Traits::eof()))
- {
- __err |= ios_base::eofbit;
- break;
- }
- _CharT __ch = _Traits::to_char_type(__i);
- if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
- break;
- __str.push_back(__ch);
- ++__c;
- __is.rdbuf()->sbumpc();
- }
- __x = bitset<_Size>(__str);
- if (__c == 0)
- __err |= ios_base::failbit;
- __is.setstate(__err);
- }
- else
- __is.setstate(ios_base::failbit);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __is.__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __is;
-}
-
-#ifndef _LIBCPP_DO_NOT_ASSUME_STREAMS_EXPLICIT_INSTANTIATION_IN_DYLIB
-_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>)
-_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>)
-_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>)
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_ISTREAM
diff --git a/lib/libcxx/include/iterator b/lib/libcxx/include/iterator
deleted file mode 100644
index bda177e11e6..00000000000
--- a/lib/libcxx/include/iterator
+++ /dev/null
@@ -1,1903 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- iterator ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_ITERATOR
-#define _LIBCPP_ITERATOR
-
-/*
- iterator synopsis
-
-namespace std
-{
-
-template<class Iterator>
-struct iterator_traits
-{
- typedef typename Iterator::difference_type difference_type;
- typedef typename Iterator::value_type value_type;
- typedef typename Iterator::pointer pointer;
- typedef typename Iterator::reference reference;
- typedef typename Iterator::iterator_category iterator_category;
-};
-
-template<class T>
-struct iterator_traits<T*>
-{
- typedef ptrdiff_t difference_type;
- typedef T value_type;
- typedef T* pointer;
- typedef T& reference;
- typedef random_access_iterator_tag iterator_category;
-};
-
-template<class Category, class T, class Distance = ptrdiff_t,
- class Pointer = T*, class Reference = T&>
-struct iterator
-{
- typedef T value_type;
- typedef Distance difference_type;
- typedef Pointer pointer;
- typedef Reference reference;
- typedef Category iterator_category;
-};
-
-struct input_iterator_tag {};
-struct output_iterator_tag {};
-struct forward_iterator_tag : public input_iterator_tag {};
-struct bidirectional_iterator_tag : public forward_iterator_tag {};
-struct random_access_iterator_tag : public bidirectional_iterator_tag {};
-
-// 27.4.3, iterator operations
-// extension: second argument not conforming to C++03
-template <class InputIterator> // constexpr in C++17
- constexpr void advance(InputIterator& i,
- typename iterator_traits<InputIterator>::difference_type n);
-
-template <class InputIterator> // constexpr in C++17
- constexpr typename iterator_traits<InputIterator>::difference_type
- distance(InputIterator first, InputIterator last);
-
-template <class InputIterator> // constexpr in C++17
- constexpr InputIterator next(InputIterator x,
-typename iterator_traits<InputIterator>::difference_type n = 1);
-
-template <class BidirectionalIterator> // constexpr in C++17
- constexpr BidirectionalIterator prev(BidirectionalIterator x,
- typename iterator_traits<BidirectionalIterator>::difference_type n = 1);
-
-template <class Iterator>
-class reverse_iterator
- : public iterator<typename iterator_traits<Iterator>::iterator_category,
- typename iterator_traits<Iterator>::value_type,
- typename iterator_traits<Iterator>::difference_type,
- typename iterator_traits<Iterator>::pointer,
- typename iterator_traits<Iterator>::reference>
-{
-protected:
- Iterator current;
-public:
- typedef Iterator iterator_type;
- typedef typename iterator_traits<Iterator>::difference_type difference_type;
- typedef typename iterator_traits<Iterator>::reference reference;
- typedef typename iterator_traits<Iterator>::pointer pointer;
-
- constexpr reverse_iterator();
- constexpr explicit reverse_iterator(Iterator x);
- template <class U> constexpr reverse_iterator(const reverse_iterator<U>& u);
- template <class U> constexpr reverse_iterator& operator=(const reverse_iterator<U>& u);
- constexpr Iterator base() const;
- constexpr reference operator*() const;
- constexpr pointer operator->() const;
- constexpr reverse_iterator& operator++();
- constexpr reverse_iterator operator++(int);
- constexpr reverse_iterator& operator--();
- constexpr reverse_iterator operator--(int);
- constexpr reverse_iterator operator+ (difference_type n) const;
- constexpr reverse_iterator& operator+=(difference_type n);
- constexpr reverse_iterator operator- (difference_type n) const;
- constexpr reverse_iterator& operator-=(difference_type n);
- constexpr reference operator[](difference_type n) const;
-};
-
-template <class Iterator1, class Iterator2>
-constexpr bool // constexpr in C++17
-operator==(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
-
-template <class Iterator1, class Iterator2>
-constexpr bool // constexpr in C++17
-operator<(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
-
-template <class Iterator1, class Iterator2>
-constexpr bool // constexpr in C++17
-operator!=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
-
-template <class Iterator1, class Iterator2>
-constexpr bool // constexpr in C++17
-operator>(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
-
-template <class Iterator1, class Iterator2>
-constexpr bool // constexpr in C++17
-operator>=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
-
-template <class Iterator1, class Iterator2>
-constexpr bool // constexpr in C++17
-operator<=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
-
-template <class Iterator1, class Iterator2>
-constexpr auto
-operator-(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y)
--> decltype(__y.base() - __x.base()); // constexpr in C++17
-
-template <class Iterator>
-constexpr reverse_iterator<Iterator>
-operator+(typename reverse_iterator<Iterator>::difference_type n,
- const reverse_iterator<Iterator>& x); // constexpr in C++17
-
-template <class Iterator>
-constexpr reverse_iterator<Iterator> make_reverse_iterator(Iterator i); // C++14, constexpr in C++17
-
-template <class Container>
-class back_insert_iterator
-{
-protected:
- Container* container;
-public:
- typedef Container container_type;
- typedef void value_type;
- typedef void difference_type;
- typedef void reference;
- typedef void pointer;
-
- explicit back_insert_iterator(Container& x);
- back_insert_iterator& operator=(const typename Container::value_type& value);
- back_insert_iterator& operator*();
- back_insert_iterator& operator++();
- back_insert_iterator operator++(int);
-};
-
-template <class Container> back_insert_iterator<Container> back_inserter(Container& x);
-
-template <class Container>
-class front_insert_iterator
-{
-protected:
- Container* container;
-public:
- typedef Container container_type;
- typedef void value_type;
- typedef void difference_type;
- typedef void reference;
- typedef void pointer;
-
- explicit front_insert_iterator(Container& x);
- front_insert_iterator& operator=(const typename Container::value_type& value);
- front_insert_iterator& operator*();
- front_insert_iterator& operator++();
- front_insert_iterator operator++(int);
-};
-
-template <class Container> front_insert_iterator<Container> front_inserter(Container& x);
-
-template <class Container>
-class insert_iterator
-{
-protected:
- Container* container;
- typename Container::iterator iter;
-public:
- typedef Container container_type;
- typedef void value_type;
- typedef void difference_type;
- typedef void reference;
- typedef void pointer;
-
- insert_iterator(Container& x, typename Container::iterator i);
- insert_iterator& operator=(const typename Container::value_type& value);
- insert_iterator& operator*();
- insert_iterator& operator++();
- insert_iterator& operator++(int);
-};
-
-template <class Container, class Iterator>
-insert_iterator<Container> inserter(Container& x, Iterator i);
-
-template <class Iterator>
-class move_iterator {
-public:
- typedef Iterator iterator_type;
- typedef typename iterator_traits<Iterator>::difference_type difference_type;
- typedef Iterator pointer;
- typedef typename iterator_traits<Iterator>::value_type value_type;
- typedef typename iterator_traits<Iterator>::iterator_category iterator_category;
- typedef value_type&& reference;
-
- constexpr move_iterator(); // all the constexprs are in C++17
- constexpr explicit move_iterator(Iterator i);
- template <class U>
- constexpr move_iterator(const move_iterator<U>& u);
- template <class U>
- constexpr move_iterator& operator=(const move_iterator<U>& u);
- constexpr iterator_type base() const;
- constexpr reference operator*() const;
- constexpr pointer operator->() const;
- constexpr move_iterator& operator++();
- constexpr move_iterator operator++(int);
- constexpr move_iterator& operator--();
- constexpr move_iterator operator--(int);
- constexpr move_iterator operator+(difference_type n) const;
- constexpr move_iterator& operator+=(difference_type n);
- constexpr move_iterator operator-(difference_type n) const;
- constexpr move_iterator& operator-=(difference_type n);
- constexpr unspecified operator[](difference_type n) const;
-private:
- Iterator current; // exposition only
-};
-
-template <class Iterator1, class Iterator2>
-constexpr bool // constexpr in C++17
-operator==(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
-
-template <class Iterator1, class Iterator2>
-constexpr bool // constexpr in C++17
-operator!=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
-
-template <class Iterator1, class Iterator2>
-constexpr bool // constexpr in C++17
-operator<(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
-
-template <class Iterator1, class Iterator2>
-constexpr bool // constexpr in C++17
-operator<=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
-
-template <class Iterator1, class Iterator2>
-constexpr bool // constexpr in C++17
-operator>(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
-
-template <class Iterator1, class Iterator2>
-constexpr bool // constexpr in C++17
-operator>=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
-
-template <class Iterator1, class Iterator2>
-constexpr auto // constexpr in C++17
-operator-(const move_iterator<Iterator1>& x,
- const move_iterator<Iterator2>& y) -> decltype(x.base() - y.base());
-
-template <class Iterator>
-constexpr move_iterator<Iterator> operator+( // constexpr in C++17
- typename move_iterator<Iterator>::difference_type n,
- const move_iterator<Iterator>& x);
-
-template <class Iterator> // constexpr in C++17
-constexpr move_iterator<Iterator> make_move_iterator(const Iterator& i);
-
-
-template <class T, class charT = char, class traits = char_traits<charT>, class Distance = ptrdiff_t>
-class istream_iterator
- : public iterator<input_iterator_tag, T, Distance, const T*, const T&>
-{
-public:
- typedef charT char_type;
- typedef traits traits_type;
- typedef basic_istream<charT,traits> istream_type;
-
- constexpr istream_iterator();
- istream_iterator(istream_type& s);
- istream_iterator(const istream_iterator& x);
- ~istream_iterator();
-
- const T& operator*() const;
- const T* operator->() const;
- istream_iterator& operator++();
- istream_iterator operator++(int);
-};
-
-template <class T, class charT, class traits, class Distance>
-bool operator==(const istream_iterator<T,charT,traits,Distance>& x,
- const istream_iterator<T,charT,traits,Distance>& y);
-template <class T, class charT, class traits, class Distance>
-bool operator!=(const istream_iterator<T,charT,traits,Distance>& x,
- const istream_iterator<T,charT,traits,Distance>& y);
-
-template <class T, class charT = char, class traits = char_traits<charT> >
-class ostream_iterator
- : public iterator<output_iterator_tag, void, void, void ,void>
-{
-public:
- typedef charT char_type;
- typedef traits traits_type;
- typedef basic_ostream<charT,traits> ostream_type;
-
- ostream_iterator(ostream_type& s);
- ostream_iterator(ostream_type& s, const charT* delimiter);
- ostream_iterator(const ostream_iterator& x);
- ~ostream_iterator();
- ostream_iterator& operator=(const T& value);
-
- ostream_iterator& operator*();
- ostream_iterator& operator++();
- ostream_iterator& operator++(int);
-};
-
-template<class charT, class traits = char_traits<charT> >
-class istreambuf_iterator
- : public iterator<input_iterator_tag, charT,
- typename traits::off_type, unspecified,
- charT>
-{
-public:
- typedef charT char_type;
- typedef traits traits_type;
- typedef typename traits::int_type int_type;
- typedef basic_streambuf<charT,traits> streambuf_type;
- typedef basic_istream<charT,traits> istream_type;
-
- istreambuf_iterator() noexcept;
- istreambuf_iterator(istream_type& s) noexcept;
- istreambuf_iterator(streambuf_type* s) noexcept;
- istreambuf_iterator(a-private-type) noexcept;
-
- charT operator*() const;
- pointer operator->() const;
- istreambuf_iterator& operator++();
- a-private-type operator++(int);
-
- bool equal(const istreambuf_iterator& b) const;
-};
-
-template <class charT, class traits>
-bool operator==(const istreambuf_iterator<charT,traits>& a,
- const istreambuf_iterator<charT,traits>& b);
-template <class charT, class traits>
-bool operator!=(const istreambuf_iterator<charT,traits>& a,
- const istreambuf_iterator<charT,traits>& b);
-
-template <class charT, class traits = char_traits<charT> >
-class ostreambuf_iterator
- : public iterator<output_iterator_tag, void, void, void, void>
-{
-public:
- typedef charT char_type;
- typedef traits traits_type;
- typedef basic_streambuf<charT,traits> streambuf_type;
- typedef basic_ostream<charT,traits> ostream_type;
-
- ostreambuf_iterator(ostream_type& s) noexcept;
- ostreambuf_iterator(streambuf_type* s) noexcept;
- ostreambuf_iterator& operator=(charT c);
- ostreambuf_iterator& operator*();
- ostreambuf_iterator& operator++();
- ostreambuf_iterator& operator++(int);
- bool failed() const noexcept;
-};
-
-template <class C> constexpr auto begin(C& c) -> decltype(c.begin());
-template <class C> constexpr auto begin(const C& c) -> decltype(c.begin());
-template <class C> constexpr auto end(C& c) -> decltype(c.end());
-template <class C> constexpr auto end(const C& c) -> decltype(c.end());
-template <class T, size_t N> constexpr T* begin(T (&array)[N]);
-template <class T, size_t N> constexpr T* end(T (&array)[N]);
-
-template <class C> auto constexpr cbegin(const C& c) -> decltype(std::begin(c)); // C++14
-template <class C> auto constexpr cend(const C& c) -> decltype(std::end(c)); // C++14
-template <class C> auto constexpr rbegin(C& c) -> decltype(c.rbegin()); // C++14
-template <class C> auto constexpr rbegin(const C& c) -> decltype(c.rbegin()); // C++14
-template <class C> auto constexpr rend(C& c) -> decltype(c.rend()); // C++14
-template <class C> constexpr auto rend(const C& c) -> decltype(c.rend()); // C++14
-template <class E> reverse_iterator<const E*> constexpr rbegin(initializer_list<E> il); // C++14
-template <class E> reverse_iterator<const E*> constexpr rend(initializer_list<E> il); // C++14
-template <class T, size_t N> reverse_iterator<T*> constexpr rbegin(T (&array)[N]); // C++14
-template <class T, size_t N> reverse_iterator<T*> constexpr rend(T (&array)[N]); // C++14
-template <class C> constexpr auto crbegin(const C& c) -> decltype(std::rbegin(c)); // C++14
-template <class C> constexpr auto crend(const C& c) -> decltype(std::rend(c)); // C++14
-
-// 24.8, container access:
-template <class C> constexpr auto size(const C& c) -> decltype(c.size()); // C++17
-template <class T, size_t N> constexpr size_t size(const T (&array)[N]) noexcept; // C++17
-template <class C> constexpr auto empty(const C& c) -> decltype(c.empty()); // C++17
-template <class T, size_t N> constexpr bool empty(const T (&array)[N]) noexcept; // C++17
-template <class E> constexpr bool empty(initializer_list<E> il) noexcept; // C++17
-template <class C> constexpr auto data(C& c) -> decltype(c.data()); // C++17
-template <class C> constexpr auto data(const C& c) -> decltype(c.data()); // C++17
-template <class T, size_t N> constexpr T* data(T (&array)[N]) noexcept; // C++17
-template <class E> constexpr const E* data(initializer_list<E> il) noexcept; // C++17
-
-} // std
-
-*/
-
-#include <__config>
-#include <iosfwd> // for forward declarations of vector and string.
-#include <__functional_base>
-#include <type_traits>
-#include <cstddef>
-#include <initializer_list>
-#include <version>
-#ifdef __APPLE__
-#include <Availability.h>
-#endif
-
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-struct _LIBCPP_TEMPLATE_VIS input_iterator_tag {};
-struct _LIBCPP_TEMPLATE_VIS output_iterator_tag {};
-struct _LIBCPP_TEMPLATE_VIS forward_iterator_tag : public input_iterator_tag {};
-struct _LIBCPP_TEMPLATE_VIS bidirectional_iterator_tag : public forward_iterator_tag {};
-struct _LIBCPP_TEMPLATE_VIS random_access_iterator_tag : public bidirectional_iterator_tag {};
-
-template <class _Tp>
-struct __has_iterator_typedefs
-{
-private:
- struct __two {char __lx; char __lxx;};
- template <class _Up> static __two __test(...);
- template <class _Up> static char __test(typename std::__void_t<typename _Up::iterator_category>::type* = 0,
- typename std::__void_t<typename _Up::difference_type>::type* = 0,
- typename std::__void_t<typename _Up::value_type>::type* = 0,
- typename std::__void_t<typename _Up::reference>::type* = 0,
- typename std::__void_t<typename _Up::pointer>::type* = 0
- );
-public:
- static const bool value = sizeof(__test<_Tp>(0,0,0,0,0)) == 1;
-};
-
-
-template <class _Tp>
-struct __has_iterator_category
-{
-private:
- struct __two {char __lx; char __lxx;};
- template <class _Up> static __two __test(...);
- template <class _Up> static char __test(typename _Up::iterator_category* = 0);
-public:
- static const bool value = sizeof(__test<_Tp>(0)) == 1;
-};
-
-template <class _Iter, bool> struct __iterator_traits_impl {};
-
-template <class _Iter>
-struct __iterator_traits_impl<_Iter, true>
-{
- typedef typename _Iter::difference_type difference_type;
- typedef typename _Iter::value_type value_type;
- typedef typename _Iter::pointer pointer;
- typedef typename _Iter::reference reference;
- typedef typename _Iter::iterator_category iterator_category;
-};
-
-template <class _Iter, bool> struct __iterator_traits {};
-
-template <class _Iter>
-struct __iterator_traits<_Iter, true>
- : __iterator_traits_impl
- <
- _Iter,
- is_convertible<typename _Iter::iterator_category, input_iterator_tag>::value ||
- is_convertible<typename _Iter::iterator_category, output_iterator_tag>::value
- >
-{};
-
-// iterator_traits<Iterator> will only have the nested types if Iterator::iterator_category
-// exists. Else iterator_traits<Iterator> will be an empty class. This is a
-// conforming extension which allows some programs to compile and behave as
-// the client expects instead of failing at compile time.
-
-template <class _Iter>
-struct _LIBCPP_TEMPLATE_VIS iterator_traits
- : __iterator_traits<_Iter, __has_iterator_typedefs<_Iter>::value> {};
-
-template<class _Tp>
-struct _LIBCPP_TEMPLATE_VIS iterator_traits<_Tp*>
-{
- typedef ptrdiff_t difference_type;
- typedef typename remove_cv<_Tp>::type value_type;
- typedef _Tp* pointer;
- typedef _Tp& reference;
- typedef random_access_iterator_tag iterator_category;
-};
-
-template <class _Tp, class _Up, bool = __has_iterator_category<iterator_traits<_Tp> >::value>
-struct __has_iterator_category_convertible_to
- : public integral_constant<bool, is_convertible<typename iterator_traits<_Tp>::iterator_category, _Up>::value>
-{};
-
-template <class _Tp, class _Up>
-struct __has_iterator_category_convertible_to<_Tp, _Up, false> : public false_type {};
-
-template <class _Tp>
-struct __is_input_iterator : public __has_iterator_category_convertible_to<_Tp, input_iterator_tag> {};
-
-template <class _Tp>
-struct __is_forward_iterator : public __has_iterator_category_convertible_to<_Tp, forward_iterator_tag> {};
-
-template <class _Tp>
-struct __is_bidirectional_iterator : public __has_iterator_category_convertible_to<_Tp, bidirectional_iterator_tag> {};
-
-template <class _Tp>
-struct __is_random_access_iterator : public __has_iterator_category_convertible_to<_Tp, random_access_iterator_tag> {};
-
-template <class _Tp>
-struct __is_exactly_input_iterator
- : public integral_constant<bool,
- __has_iterator_category_convertible_to<_Tp, input_iterator_tag>::value &&
- !__has_iterator_category_convertible_to<_Tp, forward_iterator_tag>::value> {};
-
-template<class _Category, class _Tp, class _Distance = ptrdiff_t,
- class _Pointer = _Tp*, class _Reference = _Tp&>
-struct _LIBCPP_TEMPLATE_VIS iterator
-{
- typedef _Tp value_type;
- typedef _Distance difference_type;
- typedef _Pointer pointer;
- typedef _Reference reference;
- typedef _Category iterator_category;
-};
-
-template <class _InputIter>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-void __advance(_InputIter& __i,
- typename iterator_traits<_InputIter>::difference_type __n, input_iterator_tag)
-{
- for (; __n > 0; --__n)
- ++__i;
-}
-
-template <class _BiDirIter>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-void __advance(_BiDirIter& __i,
- typename iterator_traits<_BiDirIter>::difference_type __n, bidirectional_iterator_tag)
-{
- if (__n >= 0)
- for (; __n > 0; --__n)
- ++__i;
- else
- for (; __n < 0; ++__n)
- --__i;
-}
-
-template <class _RandIter>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-void __advance(_RandIter& __i,
- typename iterator_traits<_RandIter>::difference_type __n, random_access_iterator_tag)
-{
- __i += __n;
-}
-
-template <class _InputIter>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-void advance(_InputIter& __i,
- typename iterator_traits<_InputIter>::difference_type __n)
-{
- __advance(__i, __n, typename iterator_traits<_InputIter>::iterator_category());
-}
-
-template <class _InputIter>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-typename iterator_traits<_InputIter>::difference_type
-__distance(_InputIter __first, _InputIter __last, input_iterator_tag)
-{
- typename iterator_traits<_InputIter>::difference_type __r(0);
- for (; __first != __last; ++__first)
- ++__r;
- return __r;
-}
-
-template <class _RandIter>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-typename iterator_traits<_RandIter>::difference_type
-__distance(_RandIter __first, _RandIter __last, random_access_iterator_tag)
-{
- return __last - __first;
-}
-
-template <class _InputIter>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-typename iterator_traits<_InputIter>::difference_type
-distance(_InputIter __first, _InputIter __last)
-{
- return __distance(__first, __last, typename iterator_traits<_InputIter>::iterator_category());
-}
-
-template <class _InputIter>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-typename enable_if
-<
- __is_input_iterator<_InputIter>::value,
- _InputIter
->::type
-next(_InputIter __x,
- typename iterator_traits<_InputIter>::difference_type __n = 1)
-{
- _VSTD::advance(__x, __n);
- return __x;
-}
-
-template <class _BidirectionalIter>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-typename enable_if
-<
- __is_bidirectional_iterator<_BidirectionalIter>::value,
- _BidirectionalIter
->::type
-prev(_BidirectionalIter __x,
- typename iterator_traits<_BidirectionalIter>::difference_type __n = 1)
-{
- _VSTD::advance(__x, -__n);
- return __x;
-}
-
-
-template <class _Tp, class = void>
-struct __is_stashing_iterator : false_type {};
-
-template <class _Tp>
-struct __is_stashing_iterator<_Tp, typename __void_t<typename _Tp::__stashing_iterator_tag>::type>
- : true_type {};
-
-template <class _Iter>
-class _LIBCPP_TEMPLATE_VIS reverse_iterator
- : public iterator<typename iterator_traits<_Iter>::iterator_category,
- typename iterator_traits<_Iter>::value_type,
- typename iterator_traits<_Iter>::difference_type,
- typename iterator_traits<_Iter>::pointer,
- typename iterator_traits<_Iter>::reference>
-{
-private:
- /*mutable*/ _Iter __t; // no longer used as of LWG #2360, not removed due to ABI break
-
- static_assert(!__is_stashing_iterator<_Iter>::value,
- "The specified iterator type cannot be used with reverse_iterator; "
- "Using stashing iterators with reverse_iterator causes undefined behavior");
-
-protected:
- _Iter current;
-public:
- typedef _Iter iterator_type;
- typedef typename iterator_traits<_Iter>::difference_type difference_type;
- typedef typename iterator_traits<_Iter>::reference reference;
- typedef typename iterator_traits<_Iter>::pointer pointer;
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reverse_iterator() : __t(), current() {}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- explicit reverse_iterator(_Iter __x) : __t(__x), current(__x) {}
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reverse_iterator(const reverse_iterator<_Up>& __u) : __t(__u.base()), current(__u.base()) {}
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reverse_iterator& operator=(const reverse_iterator<_Up>& __u)
- { __t = current = __u.base(); return *this; }
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- _Iter base() const {return current;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reference operator*() const {_Iter __tmp = current; return *--__tmp;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- pointer operator->() const {return _VSTD::addressof(operator*());}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reverse_iterator& operator++() {--current; return *this;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reverse_iterator operator++(int) {reverse_iterator __tmp(*this); --current; return __tmp;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reverse_iterator& operator--() {++current; return *this;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reverse_iterator operator--(int) {reverse_iterator __tmp(*this); ++current; return __tmp;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reverse_iterator operator+ (difference_type __n) const {return reverse_iterator(current - __n);}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reverse_iterator& operator+=(difference_type __n) {current -= __n; return *this;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reverse_iterator operator- (difference_type __n) const {return reverse_iterator(current + __n);}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reverse_iterator& operator-=(difference_type __n) {current += __n; return *this;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reference operator[](difference_type __n) const {return *(*this + __n);}
-};
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-bool
-operator==(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
-{
- return __x.base() == __y.base();
-}
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-bool
-operator<(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
-{
- return __x.base() > __y.base();
-}
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-bool
-operator!=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
-{
- return __x.base() != __y.base();
-}
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-bool
-operator>(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
-{
- return __x.base() < __y.base();
-}
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-bool
-operator>=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
-{
- return __x.base() <= __y.base();
-}
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-bool
-operator<=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
-{
- return __x.base() >= __y.base();
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-auto
-operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
--> decltype(__y.base() - __x.base())
-{
- return __y.base() - __x.base();
-}
-#else
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename reverse_iterator<_Iter1>::difference_type
-operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
-{
- return __y.base() - __x.base();
-}
-#endif
-
-template <class _Iter>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-reverse_iterator<_Iter>
-operator+(typename reverse_iterator<_Iter>::difference_type __n, const reverse_iterator<_Iter>& __x)
-{
- return reverse_iterator<_Iter>(__x.base() - __n);
-}
-
-#if _LIBCPP_STD_VER > 11
-template <class _Iter>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-reverse_iterator<_Iter> make_reverse_iterator(_Iter __i)
-{
- return reverse_iterator<_Iter>(__i);
-}
-#endif
-
-template <class _Container>
-class _LIBCPP_TEMPLATE_VIS back_insert_iterator
- : public iterator<output_iterator_tag,
- void,
- void,
- void,
- void>
-{
-protected:
- _Container* container;
-public:
- typedef _Container container_type;
-
- _LIBCPP_INLINE_VISIBILITY explicit back_insert_iterator(_Container& __x) : container(_VSTD::addressof(__x)) {}
- _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator=(const typename _Container::value_type& __value_)
- {container->push_back(__value_); return *this;}
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator=(typename _Container::value_type&& __value_)
- {container->push_back(_VSTD::move(__value_)); return *this;}
-#endif // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator*() {return *this;}
- _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator++() {return *this;}
- _LIBCPP_INLINE_VISIBILITY back_insert_iterator operator++(int) {return *this;}
-};
-
-template <class _Container>
-inline _LIBCPP_INLINE_VISIBILITY
-back_insert_iterator<_Container>
-back_inserter(_Container& __x)
-{
- return back_insert_iterator<_Container>(__x);
-}
-
-template <class _Container>
-class _LIBCPP_TEMPLATE_VIS front_insert_iterator
- : public iterator<output_iterator_tag,
- void,
- void,
- void,
- void>
-{
-protected:
- _Container* container;
-public:
- typedef _Container container_type;
-
- _LIBCPP_INLINE_VISIBILITY explicit front_insert_iterator(_Container& __x) : container(_VSTD::addressof(__x)) {}
- _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator=(const typename _Container::value_type& __value_)
- {container->push_front(__value_); return *this;}
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator=(typename _Container::value_type&& __value_)
- {container->push_front(_VSTD::move(__value_)); return *this;}
-#endif // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator*() {return *this;}
- _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator++() {return *this;}
- _LIBCPP_INLINE_VISIBILITY front_insert_iterator operator++(int) {return *this;}
-};
-
-template <class _Container>
-inline _LIBCPP_INLINE_VISIBILITY
-front_insert_iterator<_Container>
-front_inserter(_Container& __x)
-{
- return front_insert_iterator<_Container>(__x);
-}
-
-template <class _Container>
-class _LIBCPP_TEMPLATE_VIS insert_iterator
- : public iterator<output_iterator_tag,
- void,
- void,
- void,
- void>
-{
-protected:
- _Container* container;
- typename _Container::iterator iter;
-public:
- typedef _Container container_type;
-
- _LIBCPP_INLINE_VISIBILITY insert_iterator(_Container& __x, typename _Container::iterator __i)
- : container(_VSTD::addressof(__x)), iter(__i) {}
- _LIBCPP_INLINE_VISIBILITY insert_iterator& operator=(const typename _Container::value_type& __value_)
- {iter = container->insert(iter, __value_); ++iter; return *this;}
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY insert_iterator& operator=(typename _Container::value_type&& __value_)
- {iter = container->insert(iter, _VSTD::move(__value_)); ++iter; return *this;}
-#endif // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY insert_iterator& operator*() {return *this;}
- _LIBCPP_INLINE_VISIBILITY insert_iterator& operator++() {return *this;}
- _LIBCPP_INLINE_VISIBILITY insert_iterator& operator++(int) {return *this;}
-};
-
-template <class _Container>
-inline _LIBCPP_INLINE_VISIBILITY
-insert_iterator<_Container>
-inserter(_Container& __x, typename _Container::iterator __i)
-{
- return insert_iterator<_Container>(__x, __i);
-}
-
-template <class _Tp, class _CharT = char,
- class _Traits = char_traits<_CharT>, class _Distance = ptrdiff_t>
-class _LIBCPP_TEMPLATE_VIS istream_iterator
- : public iterator<input_iterator_tag, _Tp, _Distance, const _Tp*, const _Tp&>
-{
-public:
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef basic_istream<_CharT,_Traits> istream_type;
-private:
- istream_type* __in_stream_;
- _Tp __value_;
-public:
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR istream_iterator() : __in_stream_(0), __value_() {}
- _LIBCPP_INLINE_VISIBILITY istream_iterator(istream_type& __s) : __in_stream_(_VSTD::addressof(__s))
- {
- if (!(*__in_stream_ >> __value_))
- __in_stream_ = 0;
- }
-
- _LIBCPP_INLINE_VISIBILITY const _Tp& operator*() const {return __value_;}
- _LIBCPP_INLINE_VISIBILITY const _Tp* operator->() const {return _VSTD::addressof((operator*()));}
- _LIBCPP_INLINE_VISIBILITY istream_iterator& operator++()
- {
- if (!(*__in_stream_ >> __value_))
- __in_stream_ = 0;
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY istream_iterator operator++(int)
- {istream_iterator __t(*this); ++(*this); return __t;}
-
- template <class _Up, class _CharU, class _TraitsU, class _DistanceU>
- friend _LIBCPP_INLINE_VISIBILITY
- bool
- operator==(const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __x,
- const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __y);
-
- template <class _Up, class _CharU, class _TraitsU, class _DistanceU>
- friend _LIBCPP_INLINE_VISIBILITY
- bool
- operator==(const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __x,
- const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __y);
-};
-
-template <class _Tp, class _CharT, class _Traits, class _Distance>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __x,
- const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __y)
-{
- return __x.__in_stream_ == __y.__in_stream_;
-}
-
-template <class _Tp, class _CharT, class _Traits, class _Distance>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __x,
- const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _Tp, class _CharT = char, class _Traits = char_traits<_CharT> >
-class _LIBCPP_TEMPLATE_VIS ostream_iterator
- : public iterator<output_iterator_tag, void, void, void, void>
-{
-public:
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef basic_ostream<_CharT,_Traits> ostream_type;
-private:
- ostream_type* __out_stream_;
- const char_type* __delim_;
-public:
- _LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s) _NOEXCEPT
- : __out_stream_(_VSTD::addressof(__s)), __delim_(0) {}
- _LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s, const _CharT* __delimiter) _NOEXCEPT
- : __out_stream_(_VSTD::addressof(__s)), __delim_(__delimiter) {}
- _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator=(const _Tp& __value_)
- {
- *__out_stream_ << __value_;
- if (__delim_)
- *__out_stream_ << __delim_;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator*() {return *this;}
- _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator++() {return *this;}
- _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator++(int) {return *this;}
-};
-
-template<class _CharT, class _Traits>
-class _LIBCPP_TEMPLATE_VIS istreambuf_iterator
- : public iterator<input_iterator_tag, _CharT,
- typename _Traits::off_type, _CharT*,
- _CharT>
-{
-public:
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef typename _Traits::int_type int_type;
- typedef basic_streambuf<_CharT,_Traits> streambuf_type;
- typedef basic_istream<_CharT,_Traits> istream_type;
-private:
- mutable streambuf_type* __sbuf_;
-
- class __proxy
- {
- char_type __keep_;
- streambuf_type* __sbuf_;
- _LIBCPP_INLINE_VISIBILITY __proxy(char_type __c, streambuf_type* __s)
- : __keep_(__c), __sbuf_(__s) {}
- friend class istreambuf_iterator;
- public:
- _LIBCPP_INLINE_VISIBILITY char_type operator*() const {return __keep_;}
- };
-
- _LIBCPP_INLINE_VISIBILITY
- bool __test_for_eof() const
- {
- if (__sbuf_ && traits_type::eq_int_type(__sbuf_->sgetc(), traits_type::eof()))
- __sbuf_ = 0;
- return __sbuf_ == 0;
- }
-public:
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR istreambuf_iterator() _NOEXCEPT : __sbuf_(0) {}
- _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(istream_type& __s) _NOEXCEPT
- : __sbuf_(__s.rdbuf()) {}
- _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(streambuf_type* __s) _NOEXCEPT
- : __sbuf_(__s) {}
- _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(const __proxy& __p) _NOEXCEPT
- : __sbuf_(__p.__sbuf_) {}
-
- _LIBCPP_INLINE_VISIBILITY char_type operator*() const
- {return static_cast<char_type>(__sbuf_->sgetc());}
- _LIBCPP_INLINE_VISIBILITY istreambuf_iterator& operator++()
- {
- __sbuf_->sbumpc();
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY __proxy operator++(int)
- {
- return __proxy(__sbuf_->sbumpc(), __sbuf_);
- }
-
- _LIBCPP_INLINE_VISIBILITY bool equal(const istreambuf_iterator& __b) const
- {return __test_for_eof() == __b.__test_for_eof();}
-};
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator==(const istreambuf_iterator<_CharT,_Traits>& __a,
- const istreambuf_iterator<_CharT,_Traits>& __b)
- {return __a.equal(__b);}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator!=(const istreambuf_iterator<_CharT,_Traits>& __a,
- const istreambuf_iterator<_CharT,_Traits>& __b)
- {return !__a.equal(__b);}
-
-template <class _CharT, class _Traits>
-class _LIBCPP_TEMPLATE_VIS ostreambuf_iterator
- : public iterator<output_iterator_tag, void, void, void, void>
-{
-public:
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef basic_streambuf<_CharT,_Traits> streambuf_type;
- typedef basic_ostream<_CharT,_Traits> ostream_type;
-private:
- streambuf_type* __sbuf_;
-public:
- _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator(ostream_type& __s) _NOEXCEPT
- : __sbuf_(__s.rdbuf()) {}
- _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator(streambuf_type* __s) _NOEXCEPT
- : __sbuf_(__s) {}
- _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator=(_CharT __c)
- {
- if (__sbuf_ && traits_type::eq_int_type(__sbuf_->sputc(__c), traits_type::eof()))
- __sbuf_ = 0;
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator*() {return *this;}
- _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator++() {return *this;}
- _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator++(int) {return *this;}
- _LIBCPP_INLINE_VISIBILITY bool failed() const _NOEXCEPT {return __sbuf_ == 0;}
-
-#if !defined(__APPLE__) || \
- (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_8) || \
- (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_6_0)
-
- template <class _Ch, class _Tr>
- friend
- _LIBCPP_HIDDEN
- ostreambuf_iterator<_Ch, _Tr>
- __pad_and_output(ostreambuf_iterator<_Ch, _Tr> __s,
- const _Ch* __ob, const _Ch* __op, const _Ch* __oe,
- ios_base& __iob, _Ch __fl);
-#endif
-};
-
-template <class _Iter>
-class _LIBCPP_TEMPLATE_VIS move_iterator
-{
-private:
- _Iter __i;
-public:
- typedef _Iter iterator_type;
- typedef typename iterator_traits<iterator_type>::iterator_category iterator_category;
- typedef typename iterator_traits<iterator_type>::value_type value_type;
- typedef typename iterator_traits<iterator_type>::difference_type difference_type;
- typedef iterator_type pointer;
-#ifndef _LIBCPP_CXX03_LANG
- typedef typename iterator_traits<iterator_type>::reference __reference;
- typedef typename conditional<
- is_reference<__reference>::value,
- typename remove_reference<__reference>::type&&,
- __reference
- >::type reference;
-#else
- typedef typename iterator_traits<iterator_type>::reference reference;
-#endif
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- move_iterator() : __i() {}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- explicit move_iterator(_Iter __x) : __i(__x) {}
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- move_iterator(const move_iterator<_Up>& __u) : __i(__u.base()) {}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 _Iter base() const {return __i;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reference operator*() const { return static_cast<reference>(*__i); }
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- pointer operator->() const { return __i;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- move_iterator& operator++() {++__i; return *this;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- move_iterator operator++(int) {move_iterator __tmp(*this); ++__i; return __tmp;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- move_iterator& operator--() {--__i; return *this;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- move_iterator operator--(int) {move_iterator __tmp(*this); --__i; return __tmp;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- move_iterator operator+ (difference_type __n) const {return move_iterator(__i + __n);}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- move_iterator& operator+=(difference_type __n) {__i += __n; return *this;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- move_iterator operator- (difference_type __n) const {return move_iterator(__i - __n);}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- move_iterator& operator-=(difference_type __n) {__i -= __n; return *this;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- reference operator[](difference_type __n) const { return static_cast<reference>(__i[__n]); }
-};
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-bool
-operator==(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
-{
- return __x.base() == __y.base();
-}
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-bool
-operator<(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
-{
- return __x.base() < __y.base();
-}
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-bool
-operator!=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
-{
- return __x.base() != __y.base();
-}
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-bool
-operator>(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
-{
- return __x.base() > __y.base();
-}
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-bool
-operator>=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
-{
- return __x.base() >= __y.base();
-}
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-bool
-operator<=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
-{
- return __x.base() <= __y.base();
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-auto
-operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
--> decltype(__x.base() - __y.base())
-{
- return __x.base() - __y.base();
-}
-#else
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename move_iterator<_Iter1>::difference_type
-operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
-{
- return __x.base() - __y.base();
-}
-#endif
-
-template <class _Iter>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-move_iterator<_Iter>
-operator+(typename move_iterator<_Iter>::difference_type __n, const move_iterator<_Iter>& __x)
-{
- return move_iterator<_Iter>(__x.base() + __n);
-}
-
-template <class _Iter>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-move_iterator<_Iter>
-make_move_iterator(_Iter __i)
-{
- return move_iterator<_Iter>(__i);
-}
-
-// __wrap_iter
-
-template <class _Iter> class __wrap_iter;
-
-template <class _Iter1, class _Iter2>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-bool
-operator==(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
-
-template <class _Iter1, class _Iter2>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-bool
-operator<(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
-
-template <class _Iter1, class _Iter2>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-bool
-operator!=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
-
-template <class _Iter1, class _Iter2>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-bool
-operator>(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
-
-template <class _Iter1, class _Iter2>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-bool
-operator>=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
-
-template <class _Iter1, class _Iter2>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-bool
-operator<=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Iter1, class _Iter2>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-auto
-operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
--> decltype(__x.base() - __y.base());
-#else
-template <class _Iter1, class _Iter2>
-_LIBCPP_INLINE_VISIBILITY
-typename __wrap_iter<_Iter1>::difference_type
-operator-(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
-#endif
-
-template <class _Iter>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-__wrap_iter<_Iter>
-operator+(typename __wrap_iter<_Iter>::difference_type, __wrap_iter<_Iter>) _NOEXCEPT_DEBUG;
-
-template <class _Ip, class _Op> _Op _LIBCPP_INLINE_VISIBILITY copy(_Ip, _Ip, _Op);
-template <class _B1, class _B2> _B2 _LIBCPP_INLINE_VISIBILITY copy_backward(_B1, _B1, _B2);
-template <class _Ip, class _Op> _Op _LIBCPP_INLINE_VISIBILITY move(_Ip, _Ip, _Op);
-template <class _B1, class _B2> _B2 _LIBCPP_INLINE_VISIBILITY move_backward(_B1, _B1, _B2);
-
-#if _LIBCPP_DEBUG_LEVEL < 2
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-typename enable_if
-<
- is_trivially_copy_assignable<_Tp>::value,
- _Tp*
->::type
-__unwrap_iter(__wrap_iter<_Tp*>);
-
-#else
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-typename enable_if
-<
- is_trivially_copy_assignable<_Tp>::value,
- __wrap_iter<_Tp*>
->::type
-__unwrap_iter(__wrap_iter<_Tp*> __i);
-
-#endif
-
-template <class _Iter>
-class __wrap_iter
-{
-public:
- typedef _Iter iterator_type;
- typedef typename iterator_traits<iterator_type>::iterator_category iterator_category;
- typedef typename iterator_traits<iterator_type>::value_type value_type;
- typedef typename iterator_traits<iterator_type>::difference_type difference_type;
- typedef typename iterator_traits<iterator_type>::pointer pointer;
- typedef typename iterator_traits<iterator_type>::reference reference;
-private:
- iterator_type __i;
-public:
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter() _NOEXCEPT_DEBUG
-#if _LIBCPP_STD_VER > 11
- : __i{}
-#endif
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_i(this);
-#endif
- }
- template <class _Up> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
- __wrap_iter(const __wrap_iter<_Up>& __u,
- typename enable_if<is_convertible<_Up, iterator_type>::value>::type* = 0) _NOEXCEPT_DEBUG
- : __i(__u.base())
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__iterator_copy(this, &__u);
-#endif
- }
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
- __wrap_iter(const __wrap_iter& __x)
- : __i(__x.base())
- {
- __get_db()->__iterator_copy(this, &__x);
- }
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
- __wrap_iter& operator=(const __wrap_iter& __x)
- {
- if (this != &__x)
- {
- __get_db()->__iterator_copy(this, &__x);
- __i = __x.__i;
- }
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
- ~__wrap_iter()
- {
- __get_db()->__erase_i(this);
- }
-#endif
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG reference operator*() const _NOEXCEPT_DEBUG
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable iterator");
-#endif
- return *__i;
- }
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG pointer operator->() const _NOEXCEPT_DEBUG
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable iterator");
-#endif
- return (pointer)_VSTD::addressof(*__i);
- }
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter& operator++() _NOEXCEPT_DEBUG
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to increment non-incrementable iterator");
-#endif
- ++__i;
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter operator++(int) _NOEXCEPT_DEBUG
- {__wrap_iter __tmp(*this); ++(*this); return __tmp;}
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter& operator--() _NOEXCEPT_DEBUG
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__decrementable(this),
- "Attempted to decrement non-decrementable iterator");
-#endif
- --__i;
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter operator--(int) _NOEXCEPT_DEBUG
- {__wrap_iter __tmp(*this); --(*this); return __tmp;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter operator+ (difference_type __n) const _NOEXCEPT_DEBUG
- {__wrap_iter __w(*this); __w += __n; return __w;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter& operator+=(difference_type __n) _NOEXCEPT_DEBUG
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__addable(this, __n),
- "Attempted to add/subtract iterator outside of valid range");
-#endif
- __i += __n;
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter operator- (difference_type __n) const _NOEXCEPT_DEBUG
- {return *this + (-__n);}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter& operator-=(difference_type __n) _NOEXCEPT_DEBUG
- {*this += -__n; return *this;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG reference operator[](difference_type __n) const _NOEXCEPT_DEBUG
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__subscriptable(this, __n),
- "Attempted to subscript iterator outside of valid range");
-#endif
- return __i[__n];
- }
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG iterator_type base() const _NOEXCEPT_DEBUG {return __i;}
-
-private:
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter(const void* __p, iterator_type __x) : __i(__x)
- {
- __get_db()->__insert_ic(this, __p);
- }
-#else
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter(iterator_type __x) _NOEXCEPT_DEBUG : __i(__x) {}
-#endif
-
- template <class _Up> friend class __wrap_iter;
- template <class _CharT, class _Traits, class _Alloc> friend class basic_string;
- template <class _Tp, class _Alloc> friend class _LIBCPP_TEMPLATE_VIS vector;
- template <class _Tp, ptrdiff_t> friend class _LIBCPP_TEMPLATE_VIS span;
-
- template <class _Iter1, class _Iter2>
- _LIBCPP_CONSTEXPR_IF_NODEBUG friend
- bool
- operator==(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
-
- template <class _Iter1, class _Iter2>
- _LIBCPP_CONSTEXPR_IF_NODEBUG friend
- bool
- operator<(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
-
- template <class _Iter1, class _Iter2>
- _LIBCPP_CONSTEXPR_IF_NODEBUG friend
- bool
- operator!=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
-
- template <class _Iter1, class _Iter2>
- _LIBCPP_CONSTEXPR_IF_NODEBUG friend
- bool
- operator>(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
-
- template <class _Iter1, class _Iter2>
- _LIBCPP_CONSTEXPR_IF_NODEBUG friend
- bool
- operator>=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
-
- template <class _Iter1, class _Iter2>
- _LIBCPP_CONSTEXPR_IF_NODEBUG friend
- bool
- operator<=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
-
-#ifndef _LIBCPP_CXX03_LANG
- template <class _Iter1, class _Iter2>
- _LIBCPP_CONSTEXPR_IF_NODEBUG friend
- auto
- operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
- -> decltype(__x.base() - __y.base());
-#else
- template <class _Iter1, class _Iter2>
- _LIBCPP_CONSTEXPR_IF_NODEBUG friend
- typename __wrap_iter<_Iter1>::difference_type
- operator-(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
-#endif
-
- template <class _Iter1>
- _LIBCPP_CONSTEXPR_IF_NODEBUG friend
- __wrap_iter<_Iter1>
- operator+(typename __wrap_iter<_Iter1>::difference_type, __wrap_iter<_Iter1>) _NOEXCEPT_DEBUG;
-
- template <class _Ip, class _Op> friend _Op copy(_Ip, _Ip, _Op);
- template <class _B1, class _B2> friend _B2 copy_backward(_B1, _B1, _B2);
- template <class _Ip, class _Op> friend _Op move(_Ip, _Ip, _Op);
- template <class _B1, class _B2> friend _B2 move_backward(_B1, _B1, _B2);
-
-#if _LIBCPP_DEBUG_LEVEL < 2
- template <class _Tp>
- _LIBCPP_CONSTEXPR_IF_NODEBUG friend
- typename enable_if
- <
- is_trivially_copy_assignable<_Tp>::value,
- _Tp*
- >::type
- __unwrap_iter(__wrap_iter<_Tp*>);
-#else
- template <class _Tp>
- inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
- typename enable_if
- <
- is_trivially_copy_assignable<_Tp>::value,
- __wrap_iter<_Tp*>
- >::type
- __unwrap_iter(__wrap_iter<_Tp*> __i);
-#endif
-};
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-bool
-operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
-{
- return __x.base() == __y.base();
-}
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-bool
-operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__less_than_comparable(&__x, &__y),
- "Attempted to compare incomparable iterators");
-#endif
- return __x.base() < __y.base();
-}
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-bool
-operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
-{
- return !(__x == __y);
-}
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-bool
-operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
-{
- return __y < __x;
-}
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-bool
-operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
-{
- return !(__x < __y);
-}
-
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-bool
-operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
-{
- return !(__y < __x);
-}
-
-template <class _Iter1>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-bool
-operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT_DEBUG
-{
- return !(__x == __y);
-}
-
-template <class _Iter1>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-bool
-operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT_DEBUG
-{
- return __y < __x;
-}
-
-template <class _Iter1>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-bool
-operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT_DEBUG
-{
- return !(__x < __y);
-}
-
-template <class _Iter1>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-bool
-operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT_DEBUG
-{
- return !(__y < __x);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-auto
-operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
--> decltype(__x.base() - __y.base())
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__less_than_comparable(&__x, &__y),
- "Attempted to subtract incompatible iterators");
-#endif
- return __x.base() - __y.base();
-}
-#else
-template <class _Iter1, class _Iter2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-typename __wrap_iter<_Iter1>::difference_type
-operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__less_than_comparable(&__x, &__y),
- "Attempted to subtract incompatible iterators");
-#endif
- return __x.base() - __y.base();
-}
-#endif
-
-template <class _Iter>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
-__wrap_iter<_Iter>
-operator+(typename __wrap_iter<_Iter>::difference_type __n,
- __wrap_iter<_Iter> __x) _NOEXCEPT_DEBUG
-{
- __x += __n;
- return __x;
-}
-
-template <class _Iter>
-struct __libcpp_is_trivial_iterator
- : public _LIBCPP_BOOL_CONSTANT(is_pointer<_Iter>::value) {};
-
-template <class _Iter>
-struct __libcpp_is_trivial_iterator<move_iterator<_Iter> >
- : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {};
-
-template <class _Iter>
-struct __libcpp_is_trivial_iterator<reverse_iterator<_Iter> >
- : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {};
-
-template <class _Iter>
-struct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> >
- : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {};
-
-
-template <class _Tp, size_t _Np>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-_Tp*
-begin(_Tp (&__array)[_Np])
-{
- return __array;
-}
-
-template <class _Tp, size_t _Np>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-_Tp*
-end(_Tp (&__array)[_Np])
-{
- return __array + _Np;
-}
-
-#if !defined(_LIBCPP_CXX03_LANG)
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-auto
-begin(_Cp& __c) -> decltype(__c.begin())
-{
- return __c.begin();
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-auto
-begin(const _Cp& __c) -> decltype(__c.begin())
-{
- return __c.begin();
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-auto
-end(_Cp& __c) -> decltype(__c.end())
-{
- return __c.end();
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-auto
-end(const _Cp& __c) -> decltype(__c.end())
-{
- return __c.end();
-}
-
-#if _LIBCPP_STD_VER > 11
-
-template <class _Tp, size_t _Np>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-reverse_iterator<_Tp*> rbegin(_Tp (&__array)[_Np])
-{
- return reverse_iterator<_Tp*>(__array + _Np);
-}
-
-template <class _Tp, size_t _Np>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-reverse_iterator<_Tp*> rend(_Tp (&__array)[_Np])
-{
- return reverse_iterator<_Tp*>(__array);
-}
-
-template <class _Ep>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-reverse_iterator<const _Ep*> rbegin(initializer_list<_Ep> __il)
-{
- return reverse_iterator<const _Ep*>(__il.end());
-}
-
-template <class _Ep>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-reverse_iterator<const _Ep*> rend(initializer_list<_Ep> __il)
-{
- return reverse_iterator<const _Ep*>(__il.begin());
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-auto cbegin(const _Cp& __c) -> decltype(_VSTD::begin(__c))
-{
- return _VSTD::begin(__c);
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-auto cend(const _Cp& __c) -> decltype(_VSTD::end(__c))
-{
- return _VSTD::end(__c);
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-auto rbegin(_Cp& __c) -> decltype(__c.rbegin())
-{
- return __c.rbegin();
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-auto rbegin(const _Cp& __c) -> decltype(__c.rbegin())
-{
- return __c.rbegin();
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-auto rend(_Cp& __c) -> decltype(__c.rend())
-{
- return __c.rend();
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-auto rend(const _Cp& __c) -> decltype(__c.rend())
-{
- return __c.rend();
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-auto crbegin(const _Cp& __c) -> decltype(_VSTD::rbegin(__c))
-{
- return _VSTD::rbegin(__c);
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-auto crend(const _Cp& __c) -> decltype(_VSTD::rend(__c))
-{
- return _VSTD::rend(__c);
-}
-
-#endif
-
-
-#else // defined(_LIBCPP_CXX03_LANG)
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename _Cp::iterator
-begin(_Cp& __c)
-{
- return __c.begin();
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename _Cp::const_iterator
-begin(const _Cp& __c)
-{
- return __c.begin();
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename _Cp::iterator
-end(_Cp& __c)
-{
- return __c.end();
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename _Cp::const_iterator
-end(const _Cp& __c)
-{
- return __c.end();
-}
-
-#endif // !defined(_LIBCPP_CXX03_LANG)
-
-#if _LIBCPP_STD_VER > 14
-
-// #if _LIBCPP_STD_VER > 11
-// template <>
-// struct _LIBCPP_TEMPLATE_VIS plus<void>
-// {
-// template <class _T1, class _T2>
-// _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-// auto operator()(_T1&& __t, _T2&& __u) const
-// _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u)))
-// -> decltype (_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u))
-// { return _VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u); }
-// typedef void is_transparent;
-// };
-// #endif
-
-template <class _Cont>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr auto size(const _Cont& __c)
-_NOEXCEPT_(noexcept(__c.size()))
--> decltype (__c.size())
-{ return __c.size(); }
-
-template <class _Tp, size_t _Sz>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr size_t size(const _Tp (&)[_Sz]) noexcept { return _Sz; }
-
-template <class _Cont>
-_LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY
-constexpr auto empty(const _Cont& __c)
-_NOEXCEPT_(noexcept(__c.empty()))
--> decltype (__c.empty())
-{ return __c.empty(); }
-
-template <class _Tp, size_t _Sz>
-_LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY
-constexpr bool empty(const _Tp (&)[_Sz]) noexcept { return false; }
-
-template <class _Ep>
-_LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY
-constexpr bool empty(initializer_list<_Ep> __il) noexcept { return __il.size() == 0; }
-
-template <class _Cont> constexpr
-inline _LIBCPP_INLINE_VISIBILITY
-auto data(_Cont& __c)
-_NOEXCEPT_(noexcept(__c.data()))
--> decltype (__c.data())
-{ return __c.data(); }
-
-template <class _Cont> constexpr
-inline _LIBCPP_INLINE_VISIBILITY
-auto data(const _Cont& __c)
-_NOEXCEPT_(noexcept(__c.data()))
--> decltype (__c.data())
-{ return __c.data(); }
-
-template <class _Tp, size_t _Sz>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr _Tp* data(_Tp (&__array)[_Sz]) noexcept { return __array; }
-
-template <class _Ep>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr const _Ep* data(initializer_list<_Ep> __il) noexcept { return __il.begin(); }
-#endif
-
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_ITERATOR
diff --git a/lib/libcxx/include/limits b/lib/libcxx/include/limits
deleted file mode 100644
index 5ea9a9e6fdf..00000000000
--- a/lib/libcxx/include/limits
+++ /dev/null
@@ -1,819 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- limits ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_LIMITS
-#define _LIBCPP_LIMITS
-
-/*
- limits synopsis
-
-namespace std
-{
-
-template<class T>
-class numeric_limits
-{
-public:
- static constexpr bool is_specialized = false;
- static constexpr T min() noexcept;
- static constexpr T max() noexcept;
- static constexpr T lowest() noexcept;
-
- static constexpr int digits = 0;
- static constexpr int digits10 = 0;
- static constexpr int max_digits10 = 0;
- static constexpr bool is_signed = false;
- static constexpr bool is_integer = false;
- static constexpr bool is_exact = false;
- static constexpr int radix = 0;
- static constexpr T epsilon() noexcept;
- static constexpr T round_error() noexcept;
-
- static constexpr int min_exponent = 0;
- static constexpr int min_exponent10 = 0;
- static constexpr int max_exponent = 0;
- static constexpr int max_exponent10 = 0;
-
- static constexpr bool has_infinity = false;
- static constexpr bool has_quiet_NaN = false;
- static constexpr bool has_signaling_NaN = false;
- static constexpr float_denorm_style has_denorm = denorm_absent;
- static constexpr bool has_denorm_loss = false;
- static constexpr T infinity() noexcept;
- static constexpr T quiet_NaN() noexcept;
- static constexpr T signaling_NaN() noexcept;
- static constexpr T denorm_min() noexcept;
-
- static constexpr bool is_iec559 = false;
- static constexpr bool is_bounded = false;
- static constexpr bool is_modulo = false;
-
- static constexpr bool traps = false;
- static constexpr bool tinyness_before = false;
- static constexpr float_round_style round_style = round_toward_zero;
-};
-
-enum float_round_style
-{
- round_indeterminate = -1,
- round_toward_zero = 0,
- round_to_nearest = 1,
- round_toward_infinity = 2,
- round_toward_neg_infinity = 3
-};
-
-enum float_denorm_style
-{
- denorm_indeterminate = -1,
- denorm_absent = 0,
- denorm_present = 1
-};
-
-template<> class numeric_limits<cv bool>;
-
-template<> class numeric_limits<cv char>;
-template<> class numeric_limits<cv signed char>;
-template<> class numeric_limits<cv unsigned char>;
-template<> class numeric_limits<cv wchar_t>;
-template<> class numeric_limits<cv char8_t>; // C++20
-template<> class numeric_limits<cv char16_t>;
-template<> class numeric_limits<cv char32_t>;
-
-template<> class numeric_limits<cv short>;
-template<> class numeric_limits<cv int>;
-template<> class numeric_limits<cv long>;
-template<> class numeric_limits<cv long long>;
-template<> class numeric_limits<cv unsigned short>;
-template<> class numeric_limits<cv unsigned int>;
-template<> class numeric_limits<cv unsigned long>;
-template<> class numeric_limits<cv unsigned long long>;
-
-template<> class numeric_limits<cv float>;
-template<> class numeric_limits<cv double>;
-template<> class numeric_limits<cv long double>;
-
-} // std
-
-*/
-#include <__config>
-#include <type_traits>
-
-#if defined(_LIBCPP_COMPILER_MSVC)
-#include "support/win32/limits_msvc_win32.h"
-#endif // _LIBCPP_MSVCRT
-
-#if defined(__IBMCPP__)
-#include "support/ibm/limits.h"
-#endif // __IBMCPP__
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-#include <version>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-enum float_round_style
-{
- round_indeterminate = -1,
- round_toward_zero = 0,
- round_to_nearest = 1,
- round_toward_infinity = 2,
- round_toward_neg_infinity = 3
-};
-
-enum float_denorm_style
-{
- denorm_indeterminate = -1,
- denorm_absent = 0,
- denorm_present = 1
-};
-
-template <class _Tp, bool = is_arithmetic<_Tp>::value>
-class __libcpp_numeric_limits
-{
-protected:
- typedef _Tp type;
-
- static _LIBCPP_CONSTEXPR const bool is_specialized = false;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return type();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return type();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return type();}
-
- static _LIBCPP_CONSTEXPR const int digits = 0;
- static _LIBCPP_CONSTEXPR const int digits10 = 0;
- static _LIBCPP_CONSTEXPR const int max_digits10 = 0;
- static _LIBCPP_CONSTEXPR const bool is_signed = false;
- static _LIBCPP_CONSTEXPR const bool is_integer = false;
- static _LIBCPP_CONSTEXPR const bool is_exact = false;
- static _LIBCPP_CONSTEXPR const int radix = 0;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return type();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return type();}
-
- static _LIBCPP_CONSTEXPR const int min_exponent = 0;
- static _LIBCPP_CONSTEXPR const int min_exponent10 = 0;
- static _LIBCPP_CONSTEXPR const int max_exponent = 0;
- static _LIBCPP_CONSTEXPR const int max_exponent10 = 0;
-
- static _LIBCPP_CONSTEXPR const bool has_infinity = false;
- static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false;
- static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false;
- static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent;
- static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return type();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return type();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return type();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return type();}
-
- static _LIBCPP_CONSTEXPR const bool is_iec559 = false;
- static _LIBCPP_CONSTEXPR const bool is_bounded = false;
- static _LIBCPP_CONSTEXPR const bool is_modulo = false;
-
- static _LIBCPP_CONSTEXPR const bool traps = false;
- static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
- static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero;
-};
-
-template <class _Tp, int __digits, bool _IsSigned>
-struct __libcpp_compute_min
-{
- static _LIBCPP_CONSTEXPR const _Tp value = _Tp(_Tp(1) << __digits);
-};
-
-template <class _Tp, int __digits>
-struct __libcpp_compute_min<_Tp, __digits, false>
-{
- static _LIBCPP_CONSTEXPR const _Tp value = _Tp(0);
-};
-
-template <class _Tp>
-class __libcpp_numeric_limits<_Tp, true>
-{
-protected:
- typedef _Tp type;
-
- static _LIBCPP_CONSTEXPR const bool is_specialized = true;
-
- static _LIBCPP_CONSTEXPR const bool is_signed = type(-1) < type(0);
- static _LIBCPP_CONSTEXPR const int digits = static_cast<int>(sizeof(type) * __CHAR_BIT__ - is_signed);
- static _LIBCPP_CONSTEXPR const int digits10 = digits * 3 / 10;
- static _LIBCPP_CONSTEXPR const int max_digits10 = 0;
- static _LIBCPP_CONSTEXPR const type __min = __libcpp_compute_min<type, digits, is_signed>::value;
- static _LIBCPP_CONSTEXPR const type __max = is_signed ? type(type(~0) ^ __min) : type(~0);
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __min;}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __max;}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return min();}
-
- static _LIBCPP_CONSTEXPR const bool is_integer = true;
- static _LIBCPP_CONSTEXPR const bool is_exact = true;
- static _LIBCPP_CONSTEXPR const int radix = 2;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return type(0);}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return type(0);}
-
- static _LIBCPP_CONSTEXPR const int min_exponent = 0;
- static _LIBCPP_CONSTEXPR const int min_exponent10 = 0;
- static _LIBCPP_CONSTEXPR const int max_exponent = 0;
- static _LIBCPP_CONSTEXPR const int max_exponent10 = 0;
-
- static _LIBCPP_CONSTEXPR const bool has_infinity = false;
- static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false;
- static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false;
- static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent;
- static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return type(0);}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return type(0);}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return type(0);}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return type(0);}
-
- static _LIBCPP_CONSTEXPR const bool is_iec559 = false;
- static _LIBCPP_CONSTEXPR const bool is_bounded = true;
- static _LIBCPP_CONSTEXPR const bool is_modulo = !_VSTD::is_signed<_Tp>::value;
-
-#if defined(__i386__) || defined(__x86_64__) || defined(__pnacl__) || \
- defined(__wasm__)
- static _LIBCPP_CONSTEXPR const bool traps = true;
-#else
- static _LIBCPP_CONSTEXPR const bool traps = false;
-#endif
- static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
- static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero;
-};
-
-template <>
-class __libcpp_numeric_limits<bool, true>
-{
-protected:
- typedef bool type;
-
- static _LIBCPP_CONSTEXPR const bool is_specialized = true;
-
- static _LIBCPP_CONSTEXPR const bool is_signed = false;
- static _LIBCPP_CONSTEXPR const int digits = 1;
- static _LIBCPP_CONSTEXPR const int digits10 = 0;
- static _LIBCPP_CONSTEXPR const int max_digits10 = 0;
- static _LIBCPP_CONSTEXPR const type __min = false;
- static _LIBCPP_CONSTEXPR const type __max = true;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __min;}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __max;}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return min();}
-
- static _LIBCPP_CONSTEXPR const bool is_integer = true;
- static _LIBCPP_CONSTEXPR const bool is_exact = true;
- static _LIBCPP_CONSTEXPR const int radix = 2;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return type(0);}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return type(0);}
-
- static _LIBCPP_CONSTEXPR const int min_exponent = 0;
- static _LIBCPP_CONSTEXPR const int min_exponent10 = 0;
- static _LIBCPP_CONSTEXPR const int max_exponent = 0;
- static _LIBCPP_CONSTEXPR const int max_exponent10 = 0;
-
- static _LIBCPP_CONSTEXPR const bool has_infinity = false;
- static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false;
- static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false;
- static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent;
- static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return type(0);}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return type(0);}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return type(0);}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return type(0);}
-
- static _LIBCPP_CONSTEXPR const bool is_iec559 = false;
- static _LIBCPP_CONSTEXPR const bool is_bounded = true;
- static _LIBCPP_CONSTEXPR const bool is_modulo = false;
-
- static _LIBCPP_CONSTEXPR const bool traps = false;
- static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
- static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero;
-};
-
-template <>
-class __libcpp_numeric_limits<float, true>
-{
-protected:
- typedef float type;
-
- static _LIBCPP_CONSTEXPR const bool is_specialized = true;
-
- static _LIBCPP_CONSTEXPR const bool is_signed = true;
- static _LIBCPP_CONSTEXPR const int digits = __FLT_MANT_DIG__;
- static _LIBCPP_CONSTEXPR const int digits10 = __FLT_DIG__;
- static _LIBCPP_CONSTEXPR const int max_digits10 = 2+(digits * 30103l)/100000l;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __FLT_MIN__;}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __FLT_MAX__;}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();}
-
- static _LIBCPP_CONSTEXPR const bool is_integer = false;
- static _LIBCPP_CONSTEXPR const bool is_exact = false;
- static _LIBCPP_CONSTEXPR const int radix = __FLT_RADIX__;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __FLT_EPSILON__;}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return 0.5F;}
-
- static _LIBCPP_CONSTEXPR const int min_exponent = __FLT_MIN_EXP__;
- static _LIBCPP_CONSTEXPR const int min_exponent10 = __FLT_MIN_10_EXP__;
- static _LIBCPP_CONSTEXPR const int max_exponent = __FLT_MAX_EXP__;
- static _LIBCPP_CONSTEXPR const int max_exponent10 = __FLT_MAX_10_EXP__;
-
- static _LIBCPP_CONSTEXPR const bool has_infinity = true;
- static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true;
- static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true;
- static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present;
- static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __builtin_huge_valf();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __builtin_nanf("");}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __builtin_nansf("");}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __FLT_DENORM_MIN__;}
-
- static _LIBCPP_CONSTEXPR const bool is_iec559 = true;
- static _LIBCPP_CONSTEXPR const bool is_bounded = true;
- static _LIBCPP_CONSTEXPR const bool is_modulo = false;
-
- static _LIBCPP_CONSTEXPR const bool traps = false;
- static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
- static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest;
-};
-
-template <>
-class __libcpp_numeric_limits<double, true>
-{
-protected:
- typedef double type;
-
- static _LIBCPP_CONSTEXPR const bool is_specialized = true;
-
- static _LIBCPP_CONSTEXPR const bool is_signed = true;
- static _LIBCPP_CONSTEXPR const int digits = __DBL_MANT_DIG__;
- static _LIBCPP_CONSTEXPR const int digits10 = __DBL_DIG__;
- static _LIBCPP_CONSTEXPR const int max_digits10 = 2+(digits * 30103l)/100000l;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __DBL_MIN__;}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __DBL_MAX__;}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();}
-
- static _LIBCPP_CONSTEXPR const bool is_integer = false;
- static _LIBCPP_CONSTEXPR const bool is_exact = false;
- static _LIBCPP_CONSTEXPR const int radix = __FLT_RADIX__;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __DBL_EPSILON__;}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return 0.5;}
-
- static _LIBCPP_CONSTEXPR const int min_exponent = __DBL_MIN_EXP__;
- static _LIBCPP_CONSTEXPR const int min_exponent10 = __DBL_MIN_10_EXP__;
- static _LIBCPP_CONSTEXPR const int max_exponent = __DBL_MAX_EXP__;
- static _LIBCPP_CONSTEXPR const int max_exponent10 = __DBL_MAX_10_EXP__;
-
- static _LIBCPP_CONSTEXPR const bool has_infinity = true;
- static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true;
- static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true;
- static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present;
- static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __builtin_huge_val();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __builtin_nan("");}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __builtin_nans("");}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __DBL_DENORM_MIN__;}
-
- static _LIBCPP_CONSTEXPR const bool is_iec559 = true;
- static _LIBCPP_CONSTEXPR const bool is_bounded = true;
- static _LIBCPP_CONSTEXPR const bool is_modulo = false;
-
- static _LIBCPP_CONSTEXPR const bool traps = false;
- static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
- static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest;
-};
-
-template <>
-class __libcpp_numeric_limits<long double, true>
-{
-protected:
- typedef long double type;
-
- static _LIBCPP_CONSTEXPR const bool is_specialized = true;
-
- static _LIBCPP_CONSTEXPR const bool is_signed = true;
- static _LIBCPP_CONSTEXPR const int digits = __LDBL_MANT_DIG__;
- static _LIBCPP_CONSTEXPR const int digits10 = __LDBL_DIG__;
- static _LIBCPP_CONSTEXPR const int max_digits10 = 2+(digits * 30103l)/100000l;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __LDBL_MIN__;}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __LDBL_MAX__;}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();}
-
- static _LIBCPP_CONSTEXPR const bool is_integer = false;
- static _LIBCPP_CONSTEXPR const bool is_exact = false;
- static _LIBCPP_CONSTEXPR const int radix = __FLT_RADIX__;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __LDBL_EPSILON__;}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return 0.5;}
-
- static _LIBCPP_CONSTEXPR const int min_exponent = __LDBL_MIN_EXP__;
- static _LIBCPP_CONSTEXPR const int min_exponent10 = __LDBL_MIN_10_EXP__;
- static _LIBCPP_CONSTEXPR const int max_exponent = __LDBL_MAX_EXP__;
- static _LIBCPP_CONSTEXPR const int max_exponent10 = __LDBL_MAX_10_EXP__;
-
- static _LIBCPP_CONSTEXPR const bool has_infinity = true;
- static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true;
- static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true;
- static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present;
- static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __builtin_huge_vall();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __builtin_nanl("");}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __builtin_nansl("");}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __LDBL_DENORM_MIN__;}
-
-#if (defined(__ppc__) || defined(__ppc64__))
- static _LIBCPP_CONSTEXPR const bool is_iec559 = false;
-#else
- static _LIBCPP_CONSTEXPR const bool is_iec559 = true;
-#endif
- static _LIBCPP_CONSTEXPR const bool is_bounded = true;
- static _LIBCPP_CONSTEXPR const bool is_modulo = false;
-
- static _LIBCPP_CONSTEXPR const bool traps = false;
- static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
- static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest;
-};
-
-template <class _Tp>
-class _LIBCPP_TEMPLATE_VIS numeric_limits
- : private __libcpp_numeric_limits<typename remove_cv<_Tp>::type>
-{
- typedef __libcpp_numeric_limits<typename remove_cv<_Tp>::type> __base;
- typedef typename __base::type type;
-public:
- static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();}
-
- static _LIBCPP_CONSTEXPR const int digits = __base::digits;
- static _LIBCPP_CONSTEXPR const int digits10 = __base::digits10;
- static _LIBCPP_CONSTEXPR const int max_digits10 = __base::max_digits10;
- static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed;
- static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer;
- static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact;
- static _LIBCPP_CONSTEXPR const int radix = __base::radix;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();}
-
- static _LIBCPP_CONSTEXPR const int min_exponent = __base::min_exponent;
- static _LIBCPP_CONSTEXPR const int min_exponent10 = __base::min_exponent10;
- static _LIBCPP_CONSTEXPR const int max_exponent = __base::max_exponent;
- static _LIBCPP_CONSTEXPR const int max_exponent10 = __base::max_exponent10;
-
- static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity;
- static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN;
- static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN;
- static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm;
- static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();}
-
- static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559;
- static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded;
- static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo;
-
- static _LIBCPP_CONSTEXPR const bool traps = __base::traps;
- static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before;
- static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style;
-};
-
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_specialized;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::digits;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::digits10;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::max_digits10;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_signed;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_integer;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_exact;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::radix;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::min_exponent;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::min_exponent10;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::max_exponent;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::max_exponent10;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_infinity;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_quiet_NaN;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_signaling_NaN;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<_Tp>::has_denorm;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_denorm_loss;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_iec559;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_bounded;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_modulo;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::traps;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::tinyness_before;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const float_round_style numeric_limits<_Tp>::round_style;
-
-template <class _Tp>
-class _LIBCPP_TEMPLATE_VIS numeric_limits<const _Tp>
- : private numeric_limits<_Tp>
-{
- typedef numeric_limits<_Tp> __base;
- typedef _Tp type;
-public:
- static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();}
-
- static _LIBCPP_CONSTEXPR const int digits = __base::digits;
- static _LIBCPP_CONSTEXPR const int digits10 = __base::digits10;
- static _LIBCPP_CONSTEXPR const int max_digits10 = __base::max_digits10;
- static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed;
- static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer;
- static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact;
- static _LIBCPP_CONSTEXPR const int radix = __base::radix;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();}
-
- static _LIBCPP_CONSTEXPR const int min_exponent = __base::min_exponent;
- static _LIBCPP_CONSTEXPR const int min_exponent10 = __base::min_exponent10;
- static _LIBCPP_CONSTEXPR const int max_exponent = __base::max_exponent;
- static _LIBCPP_CONSTEXPR const int max_exponent10 = __base::max_exponent10;
-
- static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity;
- static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN;
- static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN;
- static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm;
- static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();}
-
- static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559;
- static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded;
- static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo;
-
- static _LIBCPP_CONSTEXPR const bool traps = __base::traps;
- static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before;
- static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style;
-};
-
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_specialized;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::digits;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::digits10;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::max_digits10;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_signed;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_integer;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_exact;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::radix;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::min_exponent;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::min_exponent10;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::max_exponent;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::max_exponent10;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_infinity;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_quiet_NaN;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_signaling_NaN;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<const _Tp>::has_denorm;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_denorm_loss;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_iec559;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_bounded;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_modulo;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::traps;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::tinyness_before;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const float_round_style numeric_limits<const _Tp>::round_style;
-
-template <class _Tp>
-class _LIBCPP_TEMPLATE_VIS numeric_limits<volatile _Tp>
- : private numeric_limits<_Tp>
-{
- typedef numeric_limits<_Tp> __base;
- typedef _Tp type;
-public:
- static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();}
-
- static _LIBCPP_CONSTEXPR const int digits = __base::digits;
- static _LIBCPP_CONSTEXPR const int digits10 = __base::digits10;
- static _LIBCPP_CONSTEXPR const int max_digits10 = __base::max_digits10;
- static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed;
- static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer;
- static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact;
- static _LIBCPP_CONSTEXPR const int radix = __base::radix;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();}
-
- static _LIBCPP_CONSTEXPR const int min_exponent = __base::min_exponent;
- static _LIBCPP_CONSTEXPR const int min_exponent10 = __base::min_exponent10;
- static _LIBCPP_CONSTEXPR const int max_exponent = __base::max_exponent;
- static _LIBCPP_CONSTEXPR const int max_exponent10 = __base::max_exponent10;
-
- static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity;
- static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN;
- static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN;
- static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm;
- static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();}
-
- static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559;
- static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded;
- static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo;
-
- static _LIBCPP_CONSTEXPR const bool traps = __base::traps;
- static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before;
- static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style;
-};
-
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_specialized;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::digits;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::digits10;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::max_digits10;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_signed;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_integer;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_exact;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::radix;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::min_exponent;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::min_exponent10;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::max_exponent;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::max_exponent10;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_infinity;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_quiet_NaN;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_signaling_NaN;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<volatile _Tp>::has_denorm;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_denorm_loss;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_iec559;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_bounded;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_modulo;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::traps;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::tinyness_before;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const float_round_style numeric_limits<volatile _Tp>::round_style;
-
-template <class _Tp>
-class _LIBCPP_TEMPLATE_VIS numeric_limits<const volatile _Tp>
- : private numeric_limits<_Tp>
-{
- typedef numeric_limits<_Tp> __base;
- typedef _Tp type;
-public:
- static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();}
-
- static _LIBCPP_CONSTEXPR const int digits = __base::digits;
- static _LIBCPP_CONSTEXPR const int digits10 = __base::digits10;
- static _LIBCPP_CONSTEXPR const int max_digits10 = __base::max_digits10;
- static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed;
- static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer;
- static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact;
- static _LIBCPP_CONSTEXPR const int radix = __base::radix;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();}
-
- static _LIBCPP_CONSTEXPR const int min_exponent = __base::min_exponent;
- static _LIBCPP_CONSTEXPR const int min_exponent10 = __base::min_exponent10;
- static _LIBCPP_CONSTEXPR const int max_exponent = __base::max_exponent;
- static _LIBCPP_CONSTEXPR const int max_exponent10 = __base::max_exponent10;
-
- static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity;
- static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN;
- static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN;
- static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm;
- static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss;
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();}
- _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();}
-
- static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559;
- static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded;
- static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo;
-
- static _LIBCPP_CONSTEXPR const bool traps = __base::traps;
- static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before;
- static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style;
-};
-
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_specialized;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::digits;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::digits10;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::max_digits10;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_signed;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_integer;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_exact;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::radix;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::min_exponent;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::min_exponent10;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::max_exponent;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::max_exponent10;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_infinity;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_quiet_NaN;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_signaling_NaN;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<const volatile _Tp>::has_denorm;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_denorm_loss;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_iec559;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_bounded;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_modulo;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::traps;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::tinyness_before;
-template <class _Tp>
- _LIBCPP_CONSTEXPR const float_round_style numeric_limits<const volatile _Tp>::round_style;
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_LIMITS
diff --git a/lib/libcxx/include/limits.h b/lib/libcxx/include/limits.h
deleted file mode 100644
index 1867b104857..00000000000
--- a/lib/libcxx/include/limits.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- limits.h ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_LIMITS_H
-#define _LIBCPP_LIMITS_H
-
-/*
- limits.h synopsis
-
-Macros:
-
- CHAR_BIT
- SCHAR_MIN
- SCHAR_MAX
- UCHAR_MAX
- CHAR_MIN
- CHAR_MAX
- MB_LEN_MAX
- SHRT_MIN
- SHRT_MAX
- USHRT_MAX
- INT_MIN
- INT_MAX
- UINT_MAX
- LONG_MIN
- LONG_MAX
- ULONG_MAX
- LLONG_MIN // C99
- LLONG_MAX // C99
- ULLONG_MAX // C99
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#ifndef __GNUC__
-#include_next <limits.h>
-#else
-// GCC header limits.h recursively includes itself through another header called
-// syslimits.h for some reason. This setup breaks down if we directly
-// #include_next GCC's limits.h (reasons not entirely clear to me). Therefore,
-// we manually re-create the necessary include sequence below:
-
-// Get the system limits.h defines (force recurse into the next level)
-#define _GCC_LIMITS_H_
-#define _GCC_NEXT_LIMITS_H
-#include_next <limits.h>
-
-// Get the ISO C defines
-#undef _GCC_LIMITS_H_
-#include_next <limits.h>
-#endif // __GNUC__
-
-#endif // _LIBCPP_LIMITS_H
diff --git a/lib/libcxx/include/list b/lib/libcxx/include/list
deleted file mode 100644
index c69e31d93a4..00000000000
--- a/lib/libcxx/include/list
+++ /dev/null
@@ -1,2474 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- list ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_LIST
-#define _LIBCPP_LIST
-
-/*
- list synopsis
-
-namespace std
-{
-
-template <class T, class Alloc = allocator<T> >
-class list
-{
-public:
-
- // types:
- typedef T value_type;
- typedef Alloc allocator_type;
- typedef typename allocator_type::reference reference;
- typedef typename allocator_type::const_reference const_reference;
- typedef typename allocator_type::pointer pointer;
- typedef typename allocator_type::const_pointer const_pointer;
- typedef implementation-defined iterator;
- typedef implementation-defined const_iterator;
- typedef implementation-defined size_type;
- typedef implementation-defined difference_type;
- typedef reverse_iterator<iterator> reverse_iterator;
- typedef reverse_iterator<const_iterator> const_reverse_iterator;
-
- list()
- noexcept(is_nothrow_default_constructible<allocator_type>::value);
- explicit list(const allocator_type& a);
- explicit list(size_type n);
- explicit list(size_type n, const allocator_type& a); // C++14
- list(size_type n, const value_type& value);
- list(size_type n, const value_type& value, const allocator_type& a);
- template <class Iter>
- list(Iter first, Iter last);
- template <class Iter>
- list(Iter first, Iter last, const allocator_type& a);
- list(const list& x);
- list(const list&, const allocator_type& a);
- list(list&& x)
- noexcept(is_nothrow_move_constructible<allocator_type>::value);
- list(list&&, const allocator_type& a);
- list(initializer_list<value_type>);
- list(initializer_list<value_type>, const allocator_type& a);
-
- ~list();
-
- list& operator=(const list& x);
- list& operator=(list&& x)
- noexcept(
- allocator_type::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value);
- list& operator=(initializer_list<value_type>);
- template <class Iter>
- void assign(Iter first, Iter last);
- void assign(size_type n, const value_type& t);
- void assign(initializer_list<value_type>);
-
- allocator_type get_allocator() const noexcept;
-
- iterator begin() noexcept;
- const_iterator begin() const noexcept;
- iterator end() noexcept;
- const_iterator end() const noexcept;
- reverse_iterator rbegin() noexcept;
- const_reverse_iterator rbegin() const noexcept;
- reverse_iterator rend() noexcept;
- const_reverse_iterator rend() const noexcept;
- const_iterator cbegin() const noexcept;
- const_iterator cend() const noexcept;
- const_reverse_iterator crbegin() const noexcept;
- const_reverse_iterator crend() const noexcept;
-
- reference front();
- const_reference front() const;
- reference back();
- const_reference back() const;
-
- bool empty() const noexcept;
- size_type size() const noexcept;
- size_type max_size() const noexcept;
-
- template <class... Args>
- reference emplace_front(Args&&... args); // reference in C++17
- void pop_front();
- template <class... Args>
- reference emplace_back(Args&&... args); // reference in C++17
- void pop_back();
- void push_front(const value_type& x);
- void push_front(value_type&& x);
- void push_back(const value_type& x);
- void push_back(value_type&& x);
- template <class... Args>
- iterator emplace(const_iterator position, Args&&... args);
- iterator insert(const_iterator position, const value_type& x);
- iterator insert(const_iterator position, value_type&& x);
- iterator insert(const_iterator position, size_type n, const value_type& x);
- template <class Iter>
- iterator insert(const_iterator position, Iter first, Iter last);
- iterator insert(const_iterator position, initializer_list<value_type> il);
-
- iterator erase(const_iterator position);
- iterator erase(const_iterator position, const_iterator last);
-
- void resize(size_type sz);
- void resize(size_type sz, const value_type& c);
-
- void swap(list&)
- noexcept(allocator_traits<allocator_type>::is_always_equal::value); // C++17
- void clear() noexcept;
-
- void splice(const_iterator position, list& x);
- void splice(const_iterator position, list&& x);
- void splice(const_iterator position, list& x, const_iterator i);
- void splice(const_iterator position, list&& x, const_iterator i);
- void splice(const_iterator position, list& x, const_iterator first,
- const_iterator last);
- void splice(const_iterator position, list&& x, const_iterator first,
- const_iterator last);
-
- void remove(const value_type& value);
- template <class Pred> void remove_if(Pred pred);
- void unique();
- template <class BinaryPredicate>
- void unique(BinaryPredicate binary_pred);
- void merge(list& x);
- void merge(list&& x);
- template <class Compare>
- void merge(list& x, Compare comp);
- template <class Compare>
- void merge(list&& x, Compare comp);
- void sort();
- template <class Compare>
- void sort(Compare comp);
- void reverse() noexcept;
-};
-
-
-template <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
- list(InputIterator, InputIterator, Allocator = Allocator())
- -> list<typename iterator_traits<InputIterator>::value_type, Allocator>; // C++17
-
-template <class T, class Alloc>
- bool operator==(const list<T,Alloc>& x, const list<T,Alloc>& y);
-template <class T, class Alloc>
- bool operator< (const list<T,Alloc>& x, const list<T,Alloc>& y);
-template <class T, class Alloc>
- bool operator!=(const list<T,Alloc>& x, const list<T,Alloc>& y);
-template <class T, class Alloc>
- bool operator> (const list<T,Alloc>& x, const list<T,Alloc>& y);
-template <class T, class Alloc>
- bool operator>=(const list<T,Alloc>& x, const list<T,Alloc>& y);
-template <class T, class Alloc>
- bool operator<=(const list<T,Alloc>& x, const list<T,Alloc>& y);
-
-template <class T, class Alloc>
- void swap(list<T,Alloc>& x, list<T,Alloc>& y)
- noexcept(noexcept(x.swap(y)));
-
-template <class T, class Allocator, class U>
- void erase(list<T, Allocator>& c, const U& value); // C++20
-template <class T, class Allocator, class Predicate>
- void erase_if(list<T, Allocator>& c, Predicate pred); // C++20
-
-} // std
-
-*/
-
-#include <__config>
-
-#include <memory>
-#include <limits>
-#include <initializer_list>
-#include <iterator>
-#include <algorithm>
-#include <type_traits>
-#include <version>
-
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Tp, class _VoidPtr> struct __list_node;
-template <class _Tp, class _VoidPtr> struct __list_node_base;
-
-template <class _Tp, class _VoidPtr>
-struct __list_node_pointer_traits {
- typedef typename __rebind_pointer<_VoidPtr, __list_node<_Tp, _VoidPtr> >::type
- __node_pointer;
- typedef typename __rebind_pointer<_VoidPtr, __list_node_base<_Tp, _VoidPtr> >::type
- __base_pointer;
-
-#if defined(_LIBCPP_ABI_LIST_REMOVE_NODE_POINTER_UB)
- typedef __base_pointer __link_pointer;
-#else
- typedef typename conditional<
- is_pointer<_VoidPtr>::value,
- __base_pointer,
- __node_pointer
- >::type __link_pointer;
-#endif
-
- typedef typename conditional<
- is_same<__link_pointer, __node_pointer>::value,
- __base_pointer,
- __node_pointer
- >::type __non_link_pointer;
-
- static _LIBCPP_INLINE_VISIBILITY
- __link_pointer __unsafe_link_pointer_cast(__link_pointer __p) {
- return __p;
- }
-
- static _LIBCPP_INLINE_VISIBILITY
- __link_pointer __unsafe_link_pointer_cast(__non_link_pointer __p) {
- return static_cast<__link_pointer>(static_cast<_VoidPtr>(__p));
- }
-
-};
-
-template <class _Tp, class _VoidPtr>
-struct __list_node_base
-{
- typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits;
- typedef typename _NodeTraits::__node_pointer __node_pointer;
- typedef typename _NodeTraits::__base_pointer __base_pointer;
- typedef typename _NodeTraits::__link_pointer __link_pointer;
-
- __link_pointer __prev_;
- __link_pointer __next_;
-
- _LIBCPP_INLINE_VISIBILITY
- __list_node_base() : __prev_(_NodeTraits::__unsafe_link_pointer_cast(__self())),
- __next_(_NodeTraits::__unsafe_link_pointer_cast(__self())) {}
-
- _LIBCPP_INLINE_VISIBILITY
- __base_pointer __self() {
- return pointer_traits<__base_pointer>::pointer_to(*this);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __node_pointer __as_node() {
- return static_cast<__node_pointer>(__self());
- }
-};
-
-template <class _Tp, class _VoidPtr>
-struct __list_node
- : public __list_node_base<_Tp, _VoidPtr>
-{
- _Tp __value_;
-
- typedef __list_node_base<_Tp, _VoidPtr> __base;
- typedef typename __base::__link_pointer __link_pointer;
-
- _LIBCPP_INLINE_VISIBILITY
- __link_pointer __as_link() {
- return static_cast<__link_pointer>(__base::__self());
- }
-};
-
-template <class _Tp, class _Alloc = allocator<_Tp> > class _LIBCPP_TEMPLATE_VIS list;
-template <class _Tp, class _Alloc> class __list_imp;
-template <class _Tp, class _VoidPtr> class _LIBCPP_TEMPLATE_VIS __list_const_iterator;
-
-template <class _Tp, class _VoidPtr>
-class _LIBCPP_TEMPLATE_VIS __list_iterator
-{
- typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits;
- typedef typename _NodeTraits::__link_pointer __link_pointer;
-
- __link_pointer __ptr_;
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_INLINE_VISIBILITY
- explicit __list_iterator(__link_pointer __p, const void* __c) _NOEXCEPT
- : __ptr_(__p)
- {
- __get_db()->__insert_ic(this, __c);
- }
-#else
- _LIBCPP_INLINE_VISIBILITY
- explicit __list_iterator(__link_pointer __p) _NOEXCEPT : __ptr_(__p) {}
-#endif
-
-
-
- template<class, class> friend class list;
- template<class, class> friend class __list_imp;
- template<class, class> friend class __list_const_iterator;
-public:
- typedef bidirectional_iterator_tag iterator_category;
- typedef _Tp value_type;
- typedef value_type& reference;
- typedef typename __rebind_pointer<_VoidPtr, value_type>::type pointer;
- typedef typename pointer_traits<pointer>::difference_type difference_type;
-
- _LIBCPP_INLINE_VISIBILITY
- __list_iterator() _NOEXCEPT : __ptr_(nullptr)
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_i(this);
-#endif
- }
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
-
- _LIBCPP_INLINE_VISIBILITY
- __list_iterator(const __list_iterator& __p)
- : __ptr_(__p.__ptr_)
- {
- __get_db()->__iterator_copy(this, &__p);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- ~__list_iterator()
- {
- __get_db()->__erase_i(this);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __list_iterator& operator=(const __list_iterator& __p)
- {
- if (this != &__p)
- {
- __get_db()->__iterator_copy(this, &__p);
- __ptr_ = __p.__ptr_;
- }
- return *this;
- }
-
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable list::iterator");
-#endif
- return __ptr_->__as_node()->__value_;
- }
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable list::iterator");
-#endif
- return pointer_traits<pointer>::pointer_to(__ptr_->__as_node()->__value_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __list_iterator& operator++()
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to increment non-incrementable list::iterator");
-#endif
- __ptr_ = __ptr_->__next_;
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY
- __list_iterator operator++(int) {__list_iterator __t(*this); ++(*this); return __t;}
-
- _LIBCPP_INLINE_VISIBILITY
- __list_iterator& operator--()
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__decrementable(this),
- "Attempted to decrement non-decrementable list::iterator");
-#endif
- __ptr_ = __ptr_->__prev_;
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY
- __list_iterator operator--(int) {__list_iterator __t(*this); --(*this); return __t;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __list_iterator& __x, const __list_iterator& __y)
- {
- return __x.__ptr_ == __y.__ptr_;
- }
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __list_iterator& __x, const __list_iterator& __y)
- {return !(__x == __y);}
-};
-
-template <class _Tp, class _VoidPtr>
-class _LIBCPP_TEMPLATE_VIS __list_const_iterator
-{
- typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits;
- typedef typename _NodeTraits::__link_pointer __link_pointer;
-
- __link_pointer __ptr_;
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_INLINE_VISIBILITY
- explicit __list_const_iterator(__link_pointer __p, const void* __c) _NOEXCEPT
- : __ptr_(__p)
- {
- __get_db()->__insert_ic(this, __c);
- }
-#else
- _LIBCPP_INLINE_VISIBILITY
- explicit __list_const_iterator(__link_pointer __p) _NOEXCEPT : __ptr_(__p) {}
-#endif
-
- template<class, class> friend class list;
- template<class, class> friend class __list_imp;
-public:
- typedef bidirectional_iterator_tag iterator_category;
- typedef _Tp value_type;
- typedef const value_type& reference;
- typedef typename __rebind_pointer<_VoidPtr, const value_type>::type pointer;
- typedef typename pointer_traits<pointer>::difference_type difference_type;
-
- _LIBCPP_INLINE_VISIBILITY
- __list_const_iterator() _NOEXCEPT : __ptr_(nullptr)
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_i(this);
-#endif
- }
- _LIBCPP_INLINE_VISIBILITY
- __list_const_iterator(const __list_iterator<_Tp, _VoidPtr>& __p) _NOEXCEPT
- : __ptr_(__p.__ptr_)
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__iterator_copy(this, &__p);
-#endif
- }
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
-
- _LIBCPP_INLINE_VISIBILITY
- __list_const_iterator(const __list_const_iterator& __p)
- : __ptr_(__p.__ptr_)
- {
- __get_db()->__iterator_copy(this, &__p);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- ~__list_const_iterator()
- {
- __get_db()->__erase_i(this);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __list_const_iterator& operator=(const __list_const_iterator& __p)
- {
- if (this != &__p)
- {
- __get_db()->__iterator_copy(this, &__p);
- __ptr_ = __p.__ptr_;
- }
- return *this;
- }
-
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable list::const_iterator");
-#endif
- return __ptr_->__as_node()->__value_;
- }
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable list::const_iterator");
-#endif
- return pointer_traits<pointer>::pointer_to(__ptr_->__as_node()->__value_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __list_const_iterator& operator++()
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to increment non-incrementable list::const_iterator");
-#endif
- __ptr_ = __ptr_->__next_;
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY
- __list_const_iterator operator++(int) {__list_const_iterator __t(*this); ++(*this); return __t;}
-
- _LIBCPP_INLINE_VISIBILITY
- __list_const_iterator& operator--()
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__decrementable(this),
- "Attempted to decrement non-decrementable list::const_iterator");
-#endif
- __ptr_ = __ptr_->__prev_;
- return *this;
- }
- _LIBCPP_INLINE_VISIBILITY
- __list_const_iterator operator--(int) {__list_const_iterator __t(*this); --(*this); return __t;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __list_const_iterator& __x, const __list_const_iterator& __y)
- {
- return __x.__ptr_ == __y.__ptr_;
- }
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __list_const_iterator& __x, const __list_const_iterator& __y)
- {return !(__x == __y);}
-};
-
-template <class _Tp, class _Alloc>
-class __list_imp
-{
- __list_imp(const __list_imp&);
- __list_imp& operator=(const __list_imp&);
-public:
- typedef _Alloc allocator_type;
- typedef allocator_traits<allocator_type> __alloc_traits;
- typedef typename __alloc_traits::size_type size_type;
-protected:
- typedef _Tp value_type;
- typedef typename __alloc_traits::void_pointer __void_pointer;
- typedef __list_iterator<value_type, __void_pointer> iterator;
- typedef __list_const_iterator<value_type, __void_pointer> const_iterator;
- typedef __list_node_base<value_type, __void_pointer> __node_base;
- typedef __list_node<value_type, __void_pointer> __node;
- typedef typename __rebind_alloc_helper<__alloc_traits, __node>::type __node_allocator;
- typedef allocator_traits<__node_allocator> __node_alloc_traits;
- typedef typename __node_alloc_traits::pointer __node_pointer;
- typedef typename __node_alloc_traits::pointer __node_const_pointer;
- typedef __list_node_pointer_traits<value_type, __void_pointer> __node_pointer_traits;
- typedef typename __node_pointer_traits::__link_pointer __link_pointer;
- typedef __link_pointer __link_const_pointer;
- typedef typename __alloc_traits::pointer pointer;
- typedef typename __alloc_traits::const_pointer const_pointer;
- typedef typename __alloc_traits::difference_type difference_type;
-
- typedef typename __rebind_alloc_helper<__alloc_traits, __node_base>::type __node_base_allocator;
- typedef typename allocator_traits<__node_base_allocator>::pointer __node_base_pointer;
- static_assert((!is_same<allocator_type, __node_allocator>::value),
- "internal allocator type must differ from user-specified "
- "type; otherwise overload resolution breaks");
-
- __node_base __end_;
- __compressed_pair<size_type, __node_allocator> __size_alloc_;
-
- _LIBCPP_INLINE_VISIBILITY
- __link_pointer __end_as_link() const _NOEXCEPT {
- return __node_pointer_traits::__unsafe_link_pointer_cast(
- const_cast<__node_base&>(__end_).__self());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- size_type& __sz() _NOEXCEPT {return __size_alloc_.first();}
- _LIBCPP_INLINE_VISIBILITY
- const size_type& __sz() const _NOEXCEPT
- {return __size_alloc_.first();}
- _LIBCPP_INLINE_VISIBILITY
- __node_allocator& __node_alloc() _NOEXCEPT
- {return __size_alloc_.second();}
- _LIBCPP_INLINE_VISIBILITY
- const __node_allocator& __node_alloc() const _NOEXCEPT
- {return __size_alloc_.second();}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type __node_alloc_max_size() const _NOEXCEPT {
- return __node_alloc_traits::max_size(__node_alloc());
- }
- _LIBCPP_INLINE_VISIBILITY
- static void __unlink_nodes(__link_pointer __f, __link_pointer __l) _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- __list_imp()
- _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value);
- _LIBCPP_INLINE_VISIBILITY
- __list_imp(const allocator_type& __a);
- _LIBCPP_INLINE_VISIBILITY
- __list_imp(const __node_allocator& __a);
-#ifndef _LIBCPP_CXX03_LANG
- __list_imp(__node_allocator&& __a) _NOEXCEPT;
-#endif
- ~__list_imp();
- void clear() _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- bool empty() const _NOEXCEPT {return __sz() == 0;}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return iterator(__end_.__next_, this);
-#else
- return iterator(__end_.__next_);
-#endif
- }
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return const_iterator(__end_.__next_, this);
-#else
- return const_iterator(__end_.__next_);
-#endif
- }
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return iterator(__end_as_link(), this);
-#else
- return iterator(__end_as_link());
-#endif
- }
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return const_iterator(__end_as_link(), this);
-#else
- return const_iterator(__end_as_link());
-#endif
- }
-
- void swap(__list_imp& __c)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT_DEBUG;
-#else
- _NOEXCEPT_DEBUG_(!__alloc_traits::propagate_on_container_swap::value ||
- __is_nothrow_swappable<allocator_type>::value);
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __list_imp& __c)
- {__copy_assign_alloc(__c, integral_constant<bool,
- __node_alloc_traits::propagate_on_container_copy_assignment::value>());}
-
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__list_imp& __c)
- _NOEXCEPT_(
- !__node_alloc_traits::propagate_on_container_move_assignment::value ||
- is_nothrow_move_assignable<__node_allocator>::value)
- {__move_assign_alloc(__c, integral_constant<bool,
- __node_alloc_traits::propagate_on_container_move_assignment::value>());}
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __list_imp& __c, true_type)
- {
- if (__node_alloc() != __c.__node_alloc())
- clear();
- __node_alloc() = __c.__node_alloc();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __list_imp&, false_type)
- {}
-
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__list_imp& __c, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value)
- {
- __node_alloc() = _VSTD::move(__c.__node_alloc());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__list_imp&, false_type)
- _NOEXCEPT
- {}
-
- _LIBCPP_INLINE_VISIBILITY
- void __invalidate_all_iterators() {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__invalidate_all(this);
-#endif
- }
-};
-
-// Unlink nodes [__f, __l]
-template <class _Tp, class _Alloc>
-inline
-void
-__list_imp<_Tp, _Alloc>::__unlink_nodes(__link_pointer __f, __link_pointer __l)
- _NOEXCEPT
-{
- __f->__prev_->__next_ = __l->__next_;
- __l->__next_->__prev_ = __f->__prev_;
-}
-
-template <class _Tp, class _Alloc>
-inline
-__list_imp<_Tp, _Alloc>::__list_imp()
- _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value)
- : __size_alloc_(0)
-{
-}
-
-template <class _Tp, class _Alloc>
-inline
-__list_imp<_Tp, _Alloc>::__list_imp(const allocator_type& __a)
- : __size_alloc_(0, __node_allocator(__a))
-{
-}
-
-template <class _Tp, class _Alloc>
-inline __list_imp<_Tp, _Alloc>::__list_imp(const __node_allocator& __a)
- : __size_alloc_(0, __a) {}
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Tp, class _Alloc>
-inline __list_imp<_Tp, _Alloc>::__list_imp(__node_allocator&& __a) _NOEXCEPT
- : __size_alloc_(0, std::move(__a)) {}
-#endif
-
-template <class _Tp, class _Alloc>
-__list_imp<_Tp, _Alloc>::~__list_imp() {
- clear();
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__erase_c(this);
-#endif
-}
-
-template <class _Tp, class _Alloc>
-void
-__list_imp<_Tp, _Alloc>::clear() _NOEXCEPT
-{
- if (!empty())
- {
- __node_allocator& __na = __node_alloc();
- __link_pointer __f = __end_.__next_;
- __link_pointer __l = __end_as_link();
- __unlink_nodes(__f, __l->__prev_);
- __sz() = 0;
- while (__f != __l)
- {
- __node_pointer __np = __f->__as_node();
- __f = __f->__next_;
- __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
- __node_alloc_traits::deallocate(__na, __np, 1);
- }
- __invalidate_all_iterators();
- }
-}
-
-template <class _Tp, class _Alloc>
-void
-__list_imp<_Tp, _Alloc>::swap(__list_imp& __c)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT_DEBUG
-#else
- _NOEXCEPT_DEBUG_(!__alloc_traits::propagate_on_container_swap::value ||
- __is_nothrow_swappable<allocator_type>::value)
-#endif
-{
- _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value ||
- this->__node_alloc() == __c.__node_alloc(),
- "list::swap: Either propagate_on_container_swap must be true"
- " or the allocators must compare equal");
- using _VSTD::swap;
- __swap_allocator(__node_alloc(), __c.__node_alloc());
- swap(__sz(), __c.__sz());
- swap(__end_, __c.__end_);
- if (__sz() == 0)
- __end_.__next_ = __end_.__prev_ = __end_as_link();
- else
- __end_.__prev_->__next_ = __end_.__next_->__prev_ = __end_as_link();
- if (__c.__sz() == 0)
- __c.__end_.__next_ = __c.__end_.__prev_ = __c.__end_as_link();
- else
- __c.__end_.__prev_->__next_ = __c.__end_.__next_->__prev_ = __c.__end_as_link();
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __libcpp_db* __db = __get_db();
- __c_node* __cn1 = __db->__find_c_and_lock(this);
- __c_node* __cn2 = __db->__find_c(&__c);
- std::swap(__cn1->beg_, __cn2->beg_);
- std::swap(__cn1->end_, __cn2->end_);
- std::swap(__cn1->cap_, __cn2->cap_);
- for (__i_node** __p = __cn1->end_; __p != __cn1->beg_;)
- {
- --__p;
- const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
- if (__i->__ptr_ == __c.__end_as_link())
- {
- __cn2->__add(*__p);
- if (--__cn1->end_ != __p)
- memmove(__p, __p+1, (__cn1->end_ - __p)*sizeof(__i_node*));
- }
- else
- (*__p)->__c_ = __cn1;
- }
- for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;)
- {
- --__p;
- const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
- if (__i->__ptr_ == __end_as_link())
- {
- __cn1->__add(*__p);
- if (--__cn2->end_ != __p)
- memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*));
- }
- else
- (*__p)->__c_ = __cn2;
- }
- __db->unlock();
-#endif
-}
-
-template <class _Tp, class _Alloc /*= allocator<_Tp>*/>
-class _LIBCPP_TEMPLATE_VIS list
- : private __list_imp<_Tp, _Alloc>
-{
- typedef __list_imp<_Tp, _Alloc> base;
- typedef typename base::__node __node;
- typedef typename base::__node_allocator __node_allocator;
- typedef typename base::__node_pointer __node_pointer;
- typedef typename base::__node_alloc_traits __node_alloc_traits;
- typedef typename base::__node_base __node_base;
- typedef typename base::__node_base_pointer __node_base_pointer;
- typedef typename base::__link_pointer __link_pointer;
-
-public:
- typedef _Tp value_type;
- typedef _Alloc allocator_type;
- static_assert((is_same<value_type, typename allocator_type::value_type>::value),
- "Invalid allocator::value_type");
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename base::pointer pointer;
- typedef typename base::const_pointer const_pointer;
- typedef typename base::size_type size_type;
- typedef typename base::difference_type difference_type;
- typedef typename base::iterator iterator;
- typedef typename base::const_iterator const_iterator;
- typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
- typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
-
- _LIBCPP_INLINE_VISIBILITY
- list()
- _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value)
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- }
- _LIBCPP_INLINE_VISIBILITY
- explicit list(const allocator_type& __a) : base(__a)
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- }
- explicit list(size_type __n);
-#if _LIBCPP_STD_VER > 11
- explicit list(size_type __n, const allocator_type& __a);
-#endif
- list(size_type __n, const value_type& __x);
- list(size_type __n, const value_type& __x, const allocator_type& __a);
- template <class _InpIter>
- list(_InpIter __f, _InpIter __l,
- typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0);
- template <class _InpIter>
- list(_InpIter __f, _InpIter __l, const allocator_type& __a,
- typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0);
-
- list(const list& __c);
- list(const list& __c, const allocator_type& __a);
- _LIBCPP_INLINE_VISIBILITY
- list& operator=(const list& __c);
-#ifndef _LIBCPP_CXX03_LANG
- list(initializer_list<value_type> __il);
- list(initializer_list<value_type> __il, const allocator_type& __a);
-
- _LIBCPP_INLINE_VISIBILITY
- list(list&& __c)
- _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value);
- _LIBCPP_INLINE_VISIBILITY
- list(list&& __c, const allocator_type& __a);
- _LIBCPP_INLINE_VISIBILITY
- list& operator=(list&& __c)
- _NOEXCEPT_(
- __node_alloc_traits::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<__node_allocator>::value);
-
- _LIBCPP_INLINE_VISIBILITY
- list& operator=(initializer_list<value_type> __il)
- {assign(__il.begin(), __il.end()); return *this;}
-
- _LIBCPP_INLINE_VISIBILITY
- void assign(initializer_list<value_type> __il)
- {assign(__il.begin(), __il.end());}
-#endif // _LIBCPP_CXX03_LANG
-
- template <class _InpIter>
- void assign(_InpIter __f, _InpIter __l,
- typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0);
- void assign(size_type __n, const value_type& __x);
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT {return base::__sz();}
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const _NOEXCEPT {return base::empty();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const _NOEXCEPT
- {
- return std::min<size_type>(
- base::__node_alloc_max_size(),
- numeric_limits<difference_type >::max());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT {return base::begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT {return base::begin();}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT {return base::end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT {return base::end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const _NOEXCEPT {return base::begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const _NOEXCEPT {return base::end();}
-
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rbegin() _NOEXCEPT
- {return reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rbegin() const _NOEXCEPT
- {return const_reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rend() _NOEXCEPT
- {return reverse_iterator(begin());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rend() const _NOEXCEPT
- {return const_reverse_iterator(begin());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crbegin() const _NOEXCEPT
- {return const_reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crend() const _NOEXCEPT
- {return const_reverse_iterator(begin());}
-
- _LIBCPP_INLINE_VISIBILITY
- reference front()
- {
- _LIBCPP_ASSERT(!empty(), "list::front called on empty list");
- return base::__end_.__next_->__as_node()->__value_;
- }
- _LIBCPP_INLINE_VISIBILITY
- const_reference front() const
- {
- _LIBCPP_ASSERT(!empty(), "list::front called on empty list");
- return base::__end_.__next_->__as_node()->__value_;
- }
- _LIBCPP_INLINE_VISIBILITY
- reference back()
- {
- _LIBCPP_ASSERT(!empty(), "list::back called on empty list");
- return base::__end_.__prev_->__as_node()->__value_;
- }
- _LIBCPP_INLINE_VISIBILITY
- const_reference back() const
- {
- _LIBCPP_ASSERT(!empty(), "list::back called on empty list");
- return base::__end_.__prev_->__as_node()->__value_;
- }
-
-#ifndef _LIBCPP_CXX03_LANG
- void push_front(value_type&& __x);
- void push_back(value_type&& __x);
-
- template <class... _Args>
-#if _LIBCPP_STD_VER > 14
- reference emplace_front(_Args&&... __args);
-#else
- void emplace_front(_Args&&... __args);
-#endif
- template <class... _Args>
-#if _LIBCPP_STD_VER > 14
- reference emplace_back(_Args&&... __args);
-#else
- void emplace_back(_Args&&... __args);
-#endif
- template <class... _Args>
- iterator emplace(const_iterator __p, _Args&&... __args);
-
- iterator insert(const_iterator __p, value_type&& __x);
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __p, initializer_list<value_type> __il)
- {return insert(__p, __il.begin(), __il.end());}
-#endif // _LIBCPP_CXX03_LANG
-
- void push_front(const value_type& __x);
- void push_back(const value_type& __x);
-
-#ifndef _LIBCPP_CXX03_LANG
- template <class _Arg>
- _LIBCPP_INLINE_VISIBILITY
- void __emplace_back(_Arg&& __arg) { emplace_back(_VSTD::forward<_Arg>(__arg)); }
-#else
- _LIBCPP_INLINE_VISIBILITY
- void __emplace_back(value_type const& __arg) { push_back(__arg); }
-#endif
-
- iterator insert(const_iterator __p, const value_type& __x);
- iterator insert(const_iterator __p, size_type __n, const value_type& __x);
- template <class _InpIter>
- iterator insert(const_iterator __p, _InpIter __f, _InpIter __l,
- typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0);
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(list& __c)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT_DEBUG
-#else
- _NOEXCEPT_DEBUG_(!__node_alloc_traits::propagate_on_container_swap::value ||
- __is_nothrow_swappable<__node_allocator>::value)
-#endif
- {base::swap(__c);}
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT {base::clear();}
-
- void pop_front();
- void pop_back();
-
- iterator erase(const_iterator __p);
- iterator erase(const_iterator __f, const_iterator __l);
-
- void resize(size_type __n);
- void resize(size_type __n, const value_type& __x);
-
- void splice(const_iterator __p, list& __c);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- void splice(const_iterator __p, list&& __c) {splice(__p, __c);}
- _LIBCPP_INLINE_VISIBILITY
- void splice(const_iterator __p, list&& __c, const_iterator __i)
- {splice(__p, __c, __i);}
- _LIBCPP_INLINE_VISIBILITY
- void splice(const_iterator __p, list&& __c, const_iterator __f, const_iterator __l)
- {splice(__p, __c, __f, __l);}
-#endif
- void splice(const_iterator __p, list& __c, const_iterator __i);
- void splice(const_iterator __p, list& __c, const_iterator __f, const_iterator __l);
-
- void remove(const value_type& __x);
- template <class _Pred> void remove_if(_Pred __pred);
- _LIBCPP_INLINE_VISIBILITY
- void unique();
- template <class _BinaryPred>
- void unique(_BinaryPred __binary_pred);
- _LIBCPP_INLINE_VISIBILITY
- void merge(list& __c);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- void merge(list&& __c) {merge(__c);}
-
- template <class _Comp>
- _LIBCPP_INLINE_VISIBILITY
- void merge(list&& __c, _Comp __comp) {merge(__c, __comp);}
-#endif
- template <class _Comp>
- void merge(list& __c, _Comp __comp);
-
- _LIBCPP_INLINE_VISIBILITY
- void sort();
- template <class _Comp>
- _LIBCPP_INLINE_VISIBILITY
- void sort(_Comp __comp);
-
- void reverse() _NOEXCEPT;
-
- bool __invariants() const;
-
- typedef __allocator_destructor<__node_allocator> __node_destructor;
- typedef unique_ptr<__node, __node_destructor> __hold_pointer;
-
- _LIBCPP_INLINE_VISIBILITY
- __hold_pointer __allocate_node(__node_allocator& __na) {
- __node_pointer __p = __node_alloc_traits::allocate(__na, 1);
- __p->__prev_ = nullptr;
- return __hold_pointer(__p, __node_destructor(__na, 1));
- }
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
-
- bool __dereferenceable(const const_iterator* __i) const;
- bool __decrementable(const const_iterator* __i) const;
- bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
- bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
-
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- static void __link_nodes (__link_pointer __p, __link_pointer __f, __link_pointer __l);
- _LIBCPP_INLINE_VISIBILITY
- void __link_nodes_at_front(__link_pointer __f, __link_pointer __l);
- _LIBCPP_INLINE_VISIBILITY
- void __link_nodes_at_back (__link_pointer __f, __link_pointer __l);
- iterator __iterator(size_type __n);
- template <class _Comp>
- static iterator __sort(iterator __f1, iterator __e2, size_type __n, _Comp& __comp);
-
- void __move_assign(list& __c, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value);
- void __move_assign(list& __c, false_type);
-};
-
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-template<class _InputIterator,
- class _Alloc = typename std::allocator<typename iterator_traits<_InputIterator>::value_type>,
- class = typename enable_if<__is_allocator<_Alloc>::value, void>::type
- >
-list(_InputIterator, _InputIterator)
- -> list<typename iterator_traits<_InputIterator>::value_type, _Alloc>;
-
-template<class _InputIterator,
- class _Alloc,
- class = typename enable_if<__is_allocator<_Alloc>::value, void>::type
- >
-list(_InputIterator, _InputIterator, _Alloc)
- -> list<typename iterator_traits<_InputIterator>::value_type, _Alloc>;
-#endif
-
-// Link in nodes [__f, __l] just prior to __p
-template <class _Tp, class _Alloc>
-inline
-void
-list<_Tp, _Alloc>::__link_nodes(__link_pointer __p, __link_pointer __f, __link_pointer __l)
-{
- __p->__prev_->__next_ = __f;
- __f->__prev_ = __p->__prev_;
- __p->__prev_ = __l;
- __l->__next_ = __p;
-}
-
-// Link in nodes [__f, __l] at the front of the list
-template <class _Tp, class _Alloc>
-inline
-void
-list<_Tp, _Alloc>::__link_nodes_at_front(__link_pointer __f, __link_pointer __l)
-{
- __f->__prev_ = base::__end_as_link();
- __l->__next_ = base::__end_.__next_;
- __l->__next_->__prev_ = __l;
- base::__end_.__next_ = __f;
-}
-
-// Link in nodes [__f, __l] at the back of the list
-template <class _Tp, class _Alloc>
-inline
-void
-list<_Tp, _Alloc>::__link_nodes_at_back(__link_pointer __f, __link_pointer __l)
-{
- __l->__next_ = base::__end_as_link();
- __f->__prev_ = base::__end_.__prev_;
- __f->__prev_->__next_ = __f;
- base::__end_.__prev_ = __l;
-}
-
-
-template <class _Tp, class _Alloc>
-inline
-typename list<_Tp, _Alloc>::iterator
-list<_Tp, _Alloc>::__iterator(size_type __n)
-{
- return __n <= base::__sz() / 2 ? _VSTD::next(begin(), __n)
- : _VSTD::prev(end(), base::__sz() - __n);
-}
-
-template <class _Tp, class _Alloc>
-list<_Tp, _Alloc>::list(size_type __n)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- for (; __n > 0; --__n)
-#ifndef _LIBCPP_CXX03_LANG
- emplace_back();
-#else
- push_back(value_type());
-#endif
-}
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp, class _Alloc>
-list<_Tp, _Alloc>::list(size_type __n, const allocator_type& __a) : base(__a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- for (; __n > 0; --__n)
- emplace_back();
-}
-#endif
-
-template <class _Tp, class _Alloc>
-list<_Tp, _Alloc>::list(size_type __n, const value_type& __x)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- for (; __n > 0; --__n)
- push_back(__x);
-}
-
-template <class _Tp, class _Alloc>
-list<_Tp, _Alloc>::list(size_type __n, const value_type& __x, const allocator_type& __a)
- : base(__a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- for (; __n > 0; --__n)
- push_back(__x);
-}
-
-template <class _Tp, class _Alloc>
-template <class _InpIter>
-list<_Tp, _Alloc>::list(_InpIter __f, _InpIter __l,
- typename enable_if<__is_input_iterator<_InpIter>::value>::type*)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- for (; __f != __l; ++__f)
- __emplace_back(*__f);
-}
-
-template <class _Tp, class _Alloc>
-template <class _InpIter>
-list<_Tp, _Alloc>::list(_InpIter __f, _InpIter __l, const allocator_type& __a,
- typename enable_if<__is_input_iterator<_InpIter>::value>::type*)
- : base(__a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- for (; __f != __l; ++__f)
- __emplace_back(*__f);
-}
-
-template <class _Tp, class _Alloc>
-list<_Tp, _Alloc>::list(const list& __c)
- : base(__node_alloc_traits::select_on_container_copy_construction(
- __c.__node_alloc())) {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- for (const_iterator __i = __c.begin(), __e = __c.end(); __i != __e; ++__i)
- push_back(*__i);
-}
-
-template <class _Tp, class _Alloc>
-list<_Tp, _Alloc>::list(const list& __c, const allocator_type& __a)
- : base(__a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- for (const_iterator __i = __c.begin(), __e = __c.end(); __i != __e; ++__i)
- push_back(*__i);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Alloc>
-list<_Tp, _Alloc>::list(initializer_list<value_type> __il, const allocator_type& __a)
- : base(__a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- for (typename initializer_list<value_type>::const_iterator __i = __il.begin(),
- __e = __il.end(); __i != __e; ++__i)
- push_back(*__i);
-}
-
-template <class _Tp, class _Alloc>
-list<_Tp, _Alloc>::list(initializer_list<value_type> __il)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- for (typename initializer_list<value_type>::const_iterator __i = __il.begin(),
- __e = __il.end(); __i != __e; ++__i)
- push_back(*__i);
-}
-
-template <class _Tp, class _Alloc>
-inline list<_Tp, _Alloc>::list(list&& __c)
- _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value)
- : base(_VSTD::move(__c.__node_alloc())) {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- splice(end(), __c);
-}
-
-template <class _Tp, class _Alloc>
-inline
-list<_Tp, _Alloc>::list(list&& __c, const allocator_type& __a)
- : base(__a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- if (__a == __c.get_allocator())
- splice(end(), __c);
- else
- {
- typedef move_iterator<iterator> _Ip;
- assign(_Ip(__c.begin()), _Ip(__c.end()));
- }
-}
-
-template <class _Tp, class _Alloc>
-inline
-list<_Tp, _Alloc>&
-list<_Tp, _Alloc>::operator=(list&& __c)
- _NOEXCEPT_(
- __node_alloc_traits::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<__node_allocator>::value)
-{
- __move_assign(__c, integral_constant<bool,
- __node_alloc_traits::propagate_on_container_move_assignment::value>());
- return *this;
-}
-
-template <class _Tp, class _Alloc>
-void
-list<_Tp, _Alloc>::__move_assign(list& __c, false_type)
-{
- if (base::__node_alloc() != __c.__node_alloc())
- {
- typedef move_iterator<iterator> _Ip;
- assign(_Ip(__c.begin()), _Ip(__c.end()));
- }
- else
- __move_assign(__c, true_type());
-}
-
-template <class _Tp, class _Alloc>
-void
-list<_Tp, _Alloc>::__move_assign(list& __c, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value)
-{
- clear();
- base::__move_assign_alloc(__c);
- splice(end(), __c);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Alloc>
-inline
-list<_Tp, _Alloc>&
-list<_Tp, _Alloc>::operator=(const list& __c)
-{
- if (this != &__c)
- {
- base::__copy_assign_alloc(__c);
- assign(__c.begin(), __c.end());
- }
- return *this;
-}
-
-template <class _Tp, class _Alloc>
-template <class _InpIter>
-void
-list<_Tp, _Alloc>::assign(_InpIter __f, _InpIter __l,
- typename enable_if<__is_input_iterator<_InpIter>::value>::type*)
-{
- iterator __i = begin();
- iterator __e = end();
- for (; __f != __l && __i != __e; ++__f, ++__i)
- *__i = *__f;
- if (__i == __e)
- insert(__e, __f, __l);
- else
- erase(__i, __e);
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__invalidate_all(this);
-#endif
-}
-
-template <class _Tp, class _Alloc>
-void
-list<_Tp, _Alloc>::assign(size_type __n, const value_type& __x)
-{
- iterator __i = begin();
- iterator __e = end();
- for (; __n > 0 && __i != __e; --__n, ++__i)
- *__i = __x;
- if (__i == __e)
- insert(__e, __n, __x);
- else
- erase(__i, __e);
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__invalidate_all(this);
-#endif
-}
-
-template <class _Tp, class _Alloc>
-inline
-_Alloc
-list<_Tp, _Alloc>::get_allocator() const _NOEXCEPT
-{
- return allocator_type(base::__node_alloc());
-}
-
-template <class _Tp, class _Alloc>
-typename list<_Tp, _Alloc>::iterator
-list<_Tp, _Alloc>::insert(const_iterator __p, const value_type& __x)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "list::insert(iterator, x) called with an iterator not"
- " referring to this list");
-#endif
- __node_allocator& __na = base::__node_alloc();
- __hold_pointer __hold = __allocate_node(__na);
- __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
- __link_nodes(__p.__ptr_, __hold->__as_link(), __hold->__as_link());
- ++base::__sz();
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return iterator(__hold.release()->__as_link(), this);
-#else
- return iterator(__hold.release()->__as_link());
-#endif
-}
-
-template <class _Tp, class _Alloc>
-typename list<_Tp, _Alloc>::iterator
-list<_Tp, _Alloc>::insert(const_iterator __p, size_type __n, const value_type& __x)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "list::insert(iterator, n, x) called with an iterator not"
- " referring to this list");
- iterator __r(__p.__ptr_, this);
-#else
- iterator __r(__p.__ptr_);
-#endif
- if (__n > 0)
- {
- size_type __ds = 0;
- __node_allocator& __na = base::__node_alloc();
- __hold_pointer __hold = __allocate_node(__na);
- __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
- ++__ds;
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __r = iterator(__hold->__as_link(), this);
-#else
- __r = iterator(__hold->__as_link());
-#endif
- __hold.release();
- iterator __e = __r;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (--__n; __n != 0; --__n, ++__e, ++__ds)
- {
- __hold.reset(__node_alloc_traits::allocate(__na, 1));
- __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
- __e.__ptr_->__next_ = __hold->__as_link();
- __hold->__prev_ = __e.__ptr_;
- __hold.release();
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- while (true)
- {
- __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
- __link_pointer __prev = __e.__ptr_->__prev_;
- __node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1);
- if (__prev == 0)
- break;
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __e = iterator(__prev, this);
-#else
- __e = iterator(__prev);
-#endif
- }
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- __link_nodes(__p.__ptr_, __r.__ptr_, __e.__ptr_);
- base::__sz() += __ds;
- }
- return __r;
-}
-
-template <class _Tp, class _Alloc>
-template <class _InpIter>
-typename list<_Tp, _Alloc>::iterator
-list<_Tp, _Alloc>::insert(const_iterator __p, _InpIter __f, _InpIter __l,
- typename enable_if<__is_input_iterator<_InpIter>::value>::type*)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "list::insert(iterator, range) called with an iterator not"
- " referring to this list");
- iterator __r(__p.__ptr_, this);
-#else
- iterator __r(__p.__ptr_);
-#endif
- if (__f != __l)
- {
- size_type __ds = 0;
- __node_allocator& __na = base::__node_alloc();
- __hold_pointer __hold = __allocate_node(__na);
- __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f);
- ++__ds;
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __r = iterator(__hold.get()->__as_link(), this);
-#else
- __r = iterator(__hold.get()->__as_link());
-#endif
- __hold.release();
- iterator __e = __r;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (++__f; __f != __l; ++__f, (void) ++__e, (void) ++__ds)
- {
- __hold.reset(__node_alloc_traits::allocate(__na, 1));
- __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f);
- __e.__ptr_->__next_ = __hold.get()->__as_link();
- __hold->__prev_ = __e.__ptr_;
- __hold.release();
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- while (true)
- {
- __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
- __link_pointer __prev = __e.__ptr_->__prev_;
- __node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1);
- if (__prev == 0)
- break;
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __e = iterator(__prev, this);
-#else
- __e = iterator(__prev);
-#endif
- }
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- __link_nodes(__p.__ptr_, __r.__ptr_, __e.__ptr_);
- base::__sz() += __ds;
- }
- return __r;
-}
-
-template <class _Tp, class _Alloc>
-void
-list<_Tp, _Alloc>::push_front(const value_type& __x)
-{
- __node_allocator& __na = base::__node_alloc();
- __hold_pointer __hold = __allocate_node(__na);
- __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
- __link_pointer __nl = __hold->__as_link();
- __link_nodes_at_front(__nl, __nl);
- ++base::__sz();
- __hold.release();
-}
-
-template <class _Tp, class _Alloc>
-void
-list<_Tp, _Alloc>::push_back(const value_type& __x)
-{
- __node_allocator& __na = base::__node_alloc();
- __hold_pointer __hold = __allocate_node(__na);
- __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
- __link_nodes_at_back(__hold.get()->__as_link(), __hold.get()->__as_link());
- ++base::__sz();
- __hold.release();
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Alloc>
-void
-list<_Tp, _Alloc>::push_front(value_type&& __x)
-{
- __node_allocator& __na = base::__node_alloc();
- __hold_pointer __hold = __allocate_node(__na);
- __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
- __link_nodes_at_front(__hold.get()->__as_link(), __hold.get()->__as_link());
- ++base::__sz();
- __hold.release();
-}
-
-template <class _Tp, class _Alloc>
-void
-list<_Tp, _Alloc>::push_back(value_type&& __x)
-{
- __node_allocator& __na = base::__node_alloc();
- __hold_pointer __hold = __allocate_node(__na);
- __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
- __link_nodes_at_back(__hold.get()->__as_link(), __hold.get()->__as_link());
- ++base::__sz();
- __hold.release();
-}
-
-template <class _Tp, class _Alloc>
-template <class... _Args>
-#if _LIBCPP_STD_VER > 14
-typename list<_Tp, _Alloc>::reference
-#else
-void
-#endif
-list<_Tp, _Alloc>::emplace_front(_Args&&... __args)
-{
- __node_allocator& __na = base::__node_alloc();
- __hold_pointer __hold = __allocate_node(__na);
- __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
- __link_nodes_at_front(__hold.get()->__as_link(), __hold.get()->__as_link());
- ++base::__sz();
-#if _LIBCPP_STD_VER > 14
- return __hold.release()->__value_;
-#else
- __hold.release();
-#endif
-}
-
-template <class _Tp, class _Alloc>
-template <class... _Args>
-#if _LIBCPP_STD_VER > 14
-typename list<_Tp, _Alloc>::reference
-#else
-void
-#endif
-list<_Tp, _Alloc>::emplace_back(_Args&&... __args)
-{
- __node_allocator& __na = base::__node_alloc();
- __hold_pointer __hold = __allocate_node(__na);
- __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
- __link_pointer __nl = __hold->__as_link();
- __link_nodes_at_back(__nl, __nl);
- ++base::__sz();
-#if _LIBCPP_STD_VER > 14
- return __hold.release()->__value_;
-#else
- __hold.release();
-#endif
-}
-
-template <class _Tp, class _Alloc>
-template <class... _Args>
-typename list<_Tp, _Alloc>::iterator
-list<_Tp, _Alloc>::emplace(const_iterator __p, _Args&&... __args)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "list::emplace(iterator, args...) called with an iterator not"
- " referring to this list");
-#endif
- __node_allocator& __na = base::__node_alloc();
- __hold_pointer __hold = __allocate_node(__na);
- __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
- __link_pointer __nl = __hold.get()->__as_link();
- __link_nodes(__p.__ptr_, __nl, __nl);
- ++base::__sz();
- __hold.release();
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return iterator(__nl, this);
-#else
- return iterator(__nl);
-#endif
-}
-
-template <class _Tp, class _Alloc>
-typename list<_Tp, _Alloc>::iterator
-list<_Tp, _Alloc>::insert(const_iterator __p, value_type&& __x)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "list::insert(iterator, x) called with an iterator not"
- " referring to this list");
-#endif
- __node_allocator& __na = base::__node_alloc();
- __hold_pointer __hold = __allocate_node(__na);
- __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
- __link_pointer __nl = __hold->__as_link();
- __link_nodes(__p.__ptr_, __nl, __nl);
- ++base::__sz();
- __hold.release();
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return iterator(__nl, this);
-#else
- return iterator(__nl);
-#endif
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Alloc>
-void
-list<_Tp, _Alloc>::pop_front()
-{
- _LIBCPP_ASSERT(!empty(), "list::pop_front() called with empty list");
- __node_allocator& __na = base::__node_alloc();
- __link_pointer __n = base::__end_.__next_;
- base::__unlink_nodes(__n, __n);
- --base::__sz();
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __c_node* __c = __get_db()->__find_c_and_lock(this);
- for (__i_node** __p = __c->end_; __p != __c->beg_; )
- {
- --__p;
- iterator* __i = static_cast<iterator*>((*__p)->__i_);
- if (__i->__ptr_ == __n)
- {
- (*__p)->__c_ = nullptr;
- if (--__c->end_ != __p)
- memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
- }
- }
- __get_db()->unlock();
-#endif
- __node_pointer __np = __n->__as_node();
- __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
- __node_alloc_traits::deallocate(__na, __np, 1);
-}
-
-template <class _Tp, class _Alloc>
-void
-list<_Tp, _Alloc>::pop_back()
-{
- _LIBCPP_ASSERT(!empty(), "list::pop_back() called with empty list");
- __node_allocator& __na = base::__node_alloc();
- __link_pointer __n = base::__end_.__prev_;
- base::__unlink_nodes(__n, __n);
- --base::__sz();
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __c_node* __c = __get_db()->__find_c_and_lock(this);
- for (__i_node** __p = __c->end_; __p != __c->beg_; )
- {
- --__p;
- iterator* __i = static_cast<iterator*>((*__p)->__i_);
- if (__i->__ptr_ == __n)
- {
- (*__p)->__c_ = nullptr;
- if (--__c->end_ != __p)
- memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
- }
- }
- __get_db()->unlock();
-#endif
- __node_pointer __np = __n->__as_node();
- __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
- __node_alloc_traits::deallocate(__na, __np, 1);
-}
-
-template <class _Tp, class _Alloc>
-typename list<_Tp, _Alloc>::iterator
-list<_Tp, _Alloc>::erase(const_iterator __p)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "list::erase(iterator) called with an iterator not"
- " referring to this list");
-#endif
- _LIBCPP_ASSERT(__p != end(),
- "list::erase(iterator) called with a non-dereferenceable iterator");
- __node_allocator& __na = base::__node_alloc();
- __link_pointer __n = __p.__ptr_;
- __link_pointer __r = __n->__next_;
- base::__unlink_nodes(__n, __n);
- --base::__sz();
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __c_node* __c = __get_db()->__find_c_and_lock(this);
- for (__i_node** __ip = __c->end_; __ip != __c->beg_; )
- {
- --__ip;
- iterator* __i = static_cast<iterator*>((*__ip)->__i_);
- if (__i->__ptr_ == __n)
- {
- (*__ip)->__c_ = nullptr;
- if (--__c->end_ != __ip)
- memmove(__ip, __ip+1, (__c->end_ - __ip)*sizeof(__i_node*));
- }
- }
- __get_db()->unlock();
-#endif
- __node_pointer __np = __n->__as_node();
- __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
- __node_alloc_traits::deallocate(__na, __np, 1);
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return iterator(__r, this);
-#else
- return iterator(__r);
-#endif
-}
-
-template <class _Tp, class _Alloc>
-typename list<_Tp, _Alloc>::iterator
-list<_Tp, _Alloc>::erase(const_iterator __f, const_iterator __l)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__f) == this,
- "list::erase(iterator, iterator) called with an iterator not"
- " referring to this list");
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__l) == this,
- "list::erase(iterator, iterator) called with an iterator not"
- " referring to this list");
-#endif
- if (__f != __l)
- {
- __node_allocator& __na = base::__node_alloc();
- base::__unlink_nodes(__f.__ptr_, __l.__ptr_->__prev_);
- while (__f != __l)
- {
- __link_pointer __n = __f.__ptr_;
- ++__f;
- --base::__sz();
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __c_node* __c = __get_db()->__find_c_and_lock(this);
- for (__i_node** __p = __c->end_; __p != __c->beg_; )
- {
- --__p;
- iterator* __i = static_cast<iterator*>((*__p)->__i_);
- if (__i->__ptr_ == __n)
- {
- (*__p)->__c_ = nullptr;
- if (--__c->end_ != __p)
- memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
- }
- }
- __get_db()->unlock();
-#endif
- __node_pointer __np = __n->__as_node();
- __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
- __node_alloc_traits::deallocate(__na, __np, 1);
- }
- }
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return iterator(__l.__ptr_, this);
-#else
- return iterator(__l.__ptr_);
-#endif
-}
-
-template <class _Tp, class _Alloc>
-void
-list<_Tp, _Alloc>::resize(size_type __n)
-{
- if (__n < base::__sz())
- erase(__iterator(__n), end());
- else if (__n > base::__sz())
- {
- __n -= base::__sz();
- size_type __ds = 0;
- __node_allocator& __na = base::__node_alloc();
- __hold_pointer __hold = __allocate_node(__na);
- __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_));
- ++__ds;
-#if _LIBCPP_DEBUG_LEVEL >= 2
- iterator __r = iterator(__hold.release()->__as_link(), this);
-#else
- iterator __r = iterator(__hold.release()->__as_link());
-#endif
- iterator __e = __r;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (--__n; __n != 0; --__n, ++__e, ++__ds)
- {
- __hold.reset(__node_alloc_traits::allocate(__na, 1));
- __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_));
- __e.__ptr_->__next_ = __hold.get()->__as_link();
- __hold->__prev_ = __e.__ptr_;
- __hold.release();
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- while (true)
- {
- __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
- __link_pointer __prev = __e.__ptr_->__prev_;
- __node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1);
- if (__prev == 0)
- break;
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __e = iterator(__prev, this);
-#else
- __e = iterator(__prev);
-#endif
- }
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- __link_nodes_at_back(__r.__ptr_, __e.__ptr_);
- base::__sz() += __ds;
- }
-}
-
-template <class _Tp, class _Alloc>
-void
-list<_Tp, _Alloc>::resize(size_type __n, const value_type& __x)
-{
- if (__n < base::__sz())
- erase(__iterator(__n), end());
- else if (__n > base::__sz())
- {
- __n -= base::__sz();
- size_type __ds = 0;
- __node_allocator& __na = base::__node_alloc();
- __hold_pointer __hold = __allocate_node(__na);
- __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
- ++__ds;
- __link_pointer __nl = __hold.release()->__as_link();
-#if _LIBCPP_DEBUG_LEVEL >= 2
- iterator __r = iterator(__nl, this);
-#else
- iterator __r = iterator(__nl);
-#endif
- iterator __e = __r;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (--__n; __n != 0; --__n, ++__e, ++__ds)
- {
- __hold.reset(__node_alloc_traits::allocate(__na, 1));
- __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
- __e.__ptr_->__next_ = __hold.get()->__as_link();
- __hold->__prev_ = __e.__ptr_;
- __hold.release();
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- while (true)
- {
- __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
- __link_pointer __prev = __e.__ptr_->__prev_;
- __node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1);
- if (__prev == 0)
- break;
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __e = iterator(__prev, this);
-#else
- __e = iterator(__prev);
-#endif
- }
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- __link_nodes(base::__end_as_link(), __r.__ptr_, __e.__ptr_);
- base::__sz() += __ds;
- }
-}
-
-template <class _Tp, class _Alloc>
-void
-list<_Tp, _Alloc>::splice(const_iterator __p, list& __c)
-{
- _LIBCPP_ASSERT(this != &__c,
- "list::splice(iterator, list) called with this == &list");
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "list::splice(iterator, list) called with an iterator not"
- " referring to this list");
-#endif
- if (!__c.empty())
- {
- __link_pointer __f = __c.__end_.__next_;
- __link_pointer __l = __c.__end_.__prev_;
- base::__unlink_nodes(__f, __l);
- __link_nodes(__p.__ptr_, __f, __l);
- base::__sz() += __c.__sz();
- __c.__sz() = 0;
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __libcpp_db* __db = __get_db();
- __c_node* __cn1 = __db->__find_c_and_lock(this);
- __c_node* __cn2 = __db->__find_c(&__c);
- for (__i_node** __ip = __cn2->end_; __ip != __cn2->beg_;)
- {
- --__ip;
- iterator* __i = static_cast<iterator*>((*__ip)->__i_);
- if (__i->__ptr_ != __c.__end_as_link())
- {
- __cn1->__add(*__ip);
- (*__ip)->__c_ = __cn1;
- if (--__cn2->end_ != __ip)
- memmove(__ip, __ip+1, (__cn2->end_ - __ip)*sizeof(__i_node*));
- }
- }
- __db->unlock();
-#endif
- }
-}
-
-template <class _Tp, class _Alloc>
-void
-list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __i)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "list::splice(iterator, list, iterator) called with first iterator not"
- " referring to this list");
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__i) == &__c,
- "list::splice(iterator, list, iterator) called with second iterator not"
- " referring to list argument");
- _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(&__i),
- "list::splice(iterator, list, iterator) called with second iterator not"
- " derefereceable");
-#endif
- if (__p.__ptr_ != __i.__ptr_ && __p.__ptr_ != __i.__ptr_->__next_)
- {
- __link_pointer __f = __i.__ptr_;
- base::__unlink_nodes(__f, __f);
- __link_nodes(__p.__ptr_, __f, __f);
- --__c.__sz();
- ++base::__sz();
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __libcpp_db* __db = __get_db();
- __c_node* __cn1 = __db->__find_c_and_lock(this);
- __c_node* __cn2 = __db->__find_c(&__c);
- for (__i_node** __ip = __cn2->end_; __ip != __cn2->beg_;)
- {
- --__ip;
- iterator* __j = static_cast<iterator*>((*__ip)->__i_);
- if (__j->__ptr_ == __f)
- {
- __cn1->__add(*__ip);
- (*__ip)->__c_ = __cn1;
- if (--__cn2->end_ != __ip)
- memmove(__ip, __ip+1, (__cn2->end_ - __ip)*sizeof(__i_node*));
- }
- }
- __db->unlock();
-#endif
- }
-}
-
-template <class _Tp, class _Alloc>
-void
-list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __f, const_iterator __l)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "list::splice(iterator, list, iterator, iterator) called with first iterator not"
- " referring to this list");
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__f) == &__c,
- "list::splice(iterator, list, iterator, iterator) called with second iterator not"
- " referring to list argument");
- if (this == &__c)
- {
- for (const_iterator __i = __f; __i != __l; ++__i)
- _LIBCPP_ASSERT(__i != __p,
- "list::splice(iterator, list, iterator, iterator)"
- " called with the first iterator within the range"
- " of the second and third iterators");
- }
-#endif
- if (__f != __l)
- {
- __link_pointer __first = __f.__ptr_;
- --__l;
- __link_pointer __last = __l.__ptr_;
- if (this != &__c)
- {
- size_type __s = _VSTD::distance(__f, __l) + 1;
- __c.__sz() -= __s;
- base::__sz() += __s;
- }
- base::__unlink_nodes(__first, __last);
- __link_nodes(__p.__ptr_, __first, __last);
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __libcpp_db* __db = __get_db();
- __c_node* __cn1 = __db->__find_c_and_lock(this);
- __c_node* __cn2 = __db->__find_c(&__c);
- for (__i_node** __ip = __cn2->end_; __ip != __cn2->beg_;)
- {
- --__ip;
- iterator* __j = static_cast<iterator*>((*__ip)->__i_);
- for (__link_pointer __k = __f.__ptr_;
- __k != __l.__ptr_; __k = __k->__next_)
- {
- if (__j->__ptr_ == __k)
- {
- __cn1->__add(*__ip);
- (*__ip)->__c_ = __cn1;
- if (--__cn2->end_ != __ip)
- memmove(__ip, __ip+1, (__cn2->end_ - __ip)*sizeof(__i_node*));
- }
- }
- }
- __db->unlock();
-#endif
- }
-}
-
-template <class _Tp, class _Alloc>
-void
-list<_Tp, _Alloc>::remove(const value_type& __x)
-{
- list<_Tp, _Alloc> __deleted_nodes(get_allocator()); // collect the nodes we're removing
- for (const_iterator __i = begin(), __e = end(); __i != __e;)
- {
- if (*__i == __x)
- {
- const_iterator __j = _VSTD::next(__i);
- for (; __j != __e && *__j == __x; ++__j)
- ;
- __deleted_nodes.splice(__deleted_nodes.end(), *this, __i, __j);
- __i = __j;
- if (__i != __e)
- ++__i;
- }
- else
- ++__i;
- }
-}
-
-template <class _Tp, class _Alloc>
-template <class _Pred>
-void
-list<_Tp, _Alloc>::remove_if(_Pred __pred)
-{
- for (iterator __i = begin(), __e = end(); __i != __e;)
- {
- if (__pred(*__i))
- {
- iterator __j = _VSTD::next(__i);
- for (; __j != __e && __pred(*__j); ++__j)
- ;
- __i = erase(__i, __j);
- if (__i != __e)
- ++__i;
- }
- else
- ++__i;
- }
-}
-
-template <class _Tp, class _Alloc>
-inline
-void
-list<_Tp, _Alloc>::unique()
-{
- unique(__equal_to<value_type>());
-}
-
-template <class _Tp, class _Alloc>
-template <class _BinaryPred>
-void
-list<_Tp, _Alloc>::unique(_BinaryPred __binary_pred)
-{
- for (iterator __i = begin(), __e = end(); __i != __e;)
- {
- iterator __j = _VSTD::next(__i);
- for (; __j != __e && __binary_pred(*__i, *__j); ++__j)
- ;
- if (++__i != __j)
- __i = erase(__i, __j);
- }
-}
-
-template <class _Tp, class _Alloc>
-inline
-void
-list<_Tp, _Alloc>::merge(list& __c)
-{
- merge(__c, __less<value_type>());
-}
-
-template <class _Tp, class _Alloc>
-template <class _Comp>
-void
-list<_Tp, _Alloc>::merge(list& __c, _Comp __comp)
-{
- if (this != _VSTD::addressof(__c))
- {
- iterator __f1 = begin();
- iterator __e1 = end();
- iterator __f2 = __c.begin();
- iterator __e2 = __c.end();
- while (__f1 != __e1 && __f2 != __e2)
- {
- if (__comp(*__f2, *__f1))
- {
- size_type __ds = 1;
- iterator __m2 = _VSTD::next(__f2);
- for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2, ++__ds)
- ;
- base::__sz() += __ds;
- __c.__sz() -= __ds;
- __link_pointer __f = __f2.__ptr_;
- __link_pointer __l = __m2.__ptr_->__prev_;
- __f2 = __m2;
- base::__unlink_nodes(__f, __l);
- __m2 = _VSTD::next(__f1);
- __link_nodes(__f1.__ptr_, __f, __l);
- __f1 = __m2;
- }
- else
- ++__f1;
- }
- splice(__e1, __c);
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __libcpp_db* __db = __get_db();
- __c_node* __cn1 = __db->__find_c_and_lock(this);
- __c_node* __cn2 = __db->__find_c(&__c);
- for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;)
- {
- --__p;
- iterator* __i = static_cast<iterator*>((*__p)->__i_);
- if (__i->__ptr_ != __c.__end_as_link())
- {
- __cn1->__add(*__p);
- (*__p)->__c_ = __cn1;
- if (--__cn2->end_ != __p)
- memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*));
- }
- }
- __db->unlock();
-#endif
- }
-}
-
-template <class _Tp, class _Alloc>
-inline
-void
-list<_Tp, _Alloc>::sort()
-{
- sort(__less<value_type>());
-}
-
-template <class _Tp, class _Alloc>
-template <class _Comp>
-inline
-void
-list<_Tp, _Alloc>::sort(_Comp __comp)
-{
- __sort(begin(), end(), base::__sz(), __comp);
-}
-
-template <class _Tp, class _Alloc>
-template <class _Comp>
-typename list<_Tp, _Alloc>::iterator
-list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __comp)
-{
- switch (__n)
- {
- case 0:
- case 1:
- return __f1;
- case 2:
- if (__comp(*--__e2, *__f1))
- {
- __link_pointer __f = __e2.__ptr_;
- base::__unlink_nodes(__f, __f);
- __link_nodes(__f1.__ptr_, __f, __f);
- return __e2;
- }
- return __f1;
- }
- size_type __n2 = __n / 2;
- iterator __e1 = _VSTD::next(__f1, __n2);
- iterator __r = __f1 = __sort(__f1, __e1, __n2, __comp);
- iterator __f2 = __e1 = __sort(__e1, __e2, __n - __n2, __comp);
- if (__comp(*__f2, *__f1))
- {
- iterator __m2 = _VSTD::next(__f2);
- for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2)
- ;
- __link_pointer __f = __f2.__ptr_;
- __link_pointer __l = __m2.__ptr_->__prev_;
- __r = __f2;
- __e1 = __f2 = __m2;
- base::__unlink_nodes(__f, __l);
- __m2 = _VSTD::next(__f1);
- __link_nodes(__f1.__ptr_, __f, __l);
- __f1 = __m2;
- }
- else
- ++__f1;
- while (__f1 != __e1 && __f2 != __e2)
- {
- if (__comp(*__f2, *__f1))
- {
- iterator __m2 = _VSTD::next(__f2);
- for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2)
- ;
- __link_pointer __f = __f2.__ptr_;
- __link_pointer __l = __m2.__ptr_->__prev_;
- if (__e1 == __f2)
- __e1 = __m2;
- __f2 = __m2;
- base::__unlink_nodes(__f, __l);
- __m2 = _VSTD::next(__f1);
- __link_nodes(__f1.__ptr_, __f, __l);
- __f1 = __m2;
- }
- else
- ++__f1;
- }
- return __r;
-}
-
-template <class _Tp, class _Alloc>
-void
-list<_Tp, _Alloc>::reverse() _NOEXCEPT
-{
- if (base::__sz() > 1)
- {
- iterator __e = end();
- for (iterator __i = begin(); __i.__ptr_ != __e.__ptr_;)
- {
- _VSTD::swap(__i.__ptr_->__prev_, __i.__ptr_->__next_);
- __i.__ptr_ = __i.__ptr_->__prev_;
- }
- _VSTD::swap(__e.__ptr_->__prev_, __e.__ptr_->__next_);
- }
-}
-
-template <class _Tp, class _Alloc>
-bool
-list<_Tp, _Alloc>::__invariants() const
-{
- return size() == _VSTD::distance(begin(), end());
-}
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
-
-template <class _Tp, class _Alloc>
-bool
-list<_Tp, _Alloc>::__dereferenceable(const const_iterator* __i) const
-{
- return __i->__ptr_ != this->__end_as_link();
-}
-
-template <class _Tp, class _Alloc>
-bool
-list<_Tp, _Alloc>::__decrementable(const const_iterator* __i) const
-{
- return !empty() && __i->__ptr_ != base::__end_.__next_;
-}
-
-template <class _Tp, class _Alloc>
-bool
-list<_Tp, _Alloc>::__addable(const const_iterator*, ptrdiff_t) const
-{
- return false;
-}
-
-template <class _Tp, class _Alloc>
-bool
-list<_Tp, _Alloc>::__subscriptable(const const_iterator*, ptrdiff_t) const
-{
- return false;
-}
-
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-
-template <class _Tp, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
-{
- return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
-}
-
-template <class _Tp, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator< (const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
-{
- return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
-}
-
-template <class _Tp, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _Tp, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator> (const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
-{
- return __y < __x;
-}
-
-template <class _Tp, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
-{
- return !(__x < __y);
-}
-
-template <class _Tp, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
-{
- return !(__y < __x);
-}
-
-template <class _Tp, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(list<_Tp, _Alloc>& __x, list<_Tp, _Alloc>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-#if _LIBCPP_STD_VER > 17
-template <class _Tp, class _Allocator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase_if(list<_Tp, _Allocator>& __c, _Predicate __pred)
-{ __c.remove_if(__pred); }
-
-template <class _Tp, class _Allocator, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase(list<_Tp, _Allocator>& __c, const _Up& __v)
-{ _VSTD::erase_if(__c, [&](auto& __elem) { return __elem == __v; }); }
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_LIST
diff --git a/lib/libcxx/include/locale b/lib/libcxx/include/locale
deleted file mode 100644
index aa6a9ab916e..00000000000
--- a/lib/libcxx/include/locale
+++ /dev/null
@@ -1,4360 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- locale ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_LOCALE
-#define _LIBCPP_LOCALE
-
-/*
- locale synopsis
-
-namespace std
-{
-
-class locale
-{
-public:
- // types:
- class facet;
- class id;
-
- typedef int category;
- static const category // values assigned here are for exposition only
- none = 0x000,
- collate = 0x010,
- ctype = 0x020,
- monetary = 0x040,
- numeric = 0x080,
- time = 0x100,
- messages = 0x200,
- all = collate | ctype | monetary | numeric | time | messages;
-
- // construct/copy/destroy:
- locale() noexcept;
- locale(const locale& other) noexcept;
- explicit locale(const char* std_name);
- explicit locale(const string& std_name);
- locale(const locale& other, const char* std_name, category);
- locale(const locale& other, const string& std_name, category);
- template <class Facet> locale(const locale& other, Facet* f);
- locale(const locale& other, const locale& one, category);
-
- ~locale(); // not virtual
-
- const locale& operator=(const locale& other) noexcept;
-
- template <class Facet> locale combine(const locale& other) const;
-
- // locale operations:
- basic_string<char> name() const;
- bool operator==(const locale& other) const;
- bool operator!=(const locale& other) const;
- template <class charT, class Traits, class Allocator>
- bool operator()(const basic_string<charT,Traits,Allocator>& s1,
- const basic_string<charT,Traits,Allocator>& s2) const;
-
- // global locale objects:
- static locale global(const locale&);
- static const locale& classic();
-};
-
-template <class Facet> const Facet& use_facet(const locale&);
-template <class Facet> bool has_facet(const locale&) noexcept;
-
-// 22.3.3, convenience interfaces:
-template <class charT> bool isspace (charT c, const locale& loc);
-template <class charT> bool isprint (charT c, const locale& loc);
-template <class charT> bool iscntrl (charT c, const locale& loc);
-template <class charT> bool isupper (charT c, const locale& loc);
-template <class charT> bool islower (charT c, const locale& loc);
-template <class charT> bool isalpha (charT c, const locale& loc);
-template <class charT> bool isdigit (charT c, const locale& loc);
-template <class charT> bool ispunct (charT c, const locale& loc);
-template <class charT> bool isxdigit(charT c, const locale& loc);
-template <class charT> bool isalnum (charT c, const locale& loc);
-template <class charT> bool isgraph (charT c, const locale& loc);
-template <class charT> charT toupper(charT c, const locale& loc);
-template <class charT> charT tolower(charT c, const locale& loc);
-
-template<class Codecvt, class Elem = wchar_t,
- class Wide_alloc = allocator<Elem>,
- class Byte_alloc = allocator<char>>
-class wstring_convert
-{
-public:
- typedef basic_string<char, char_traits<char>, Byte_alloc> byte_string;
- typedef basic_string<Elem, char_traits<Elem>, Wide_alloc> wide_string;
- typedef typename Codecvt::state_type state_type;
- typedef typename wide_string::traits_type::int_type int_type;
-
- explicit wstring_convert(Codecvt* pcvt = new Codecvt); // explicit in C++14
- wstring_convert(Codecvt* pcvt, state_type state);
- explicit wstring_convert(const byte_string& byte_err, // explicit in C++14
- const wide_string& wide_err = wide_string());
- wstring_convert(const wstring_convert&) = delete; // C++14
- wstring_convert & operator=(const wstring_convert &) = delete; // C++14
- ~wstring_convert();
-
- wide_string from_bytes(char byte);
- wide_string from_bytes(const char* ptr);
- wide_string from_bytes(const byte_string& str);
- wide_string from_bytes(const char* first, const char* last);
-
- byte_string to_bytes(Elem wchar);
- byte_string to_bytes(const Elem* wptr);
- byte_string to_bytes(const wide_string& wstr);
- byte_string to_bytes(const Elem* first, const Elem* last);
-
- size_t converted() const; // noexcept in C++14
- state_type state() const;
-};
-
-template <class Codecvt, class Elem = wchar_t, class Tr = char_traits<Elem>>
-class wbuffer_convert
- : public basic_streambuf<Elem, Tr>
-{
-public:
- typedef typename Tr::state_type state_type;
-
- explicit wbuffer_convert(streambuf* bytebuf = 0, Codecvt* pcvt = new Codecvt,
- state_type state = state_type()); // explicit in C++14
- wbuffer_convert(const wbuffer_convert&) = delete; // C++14
- wbuffer_convert & operator=(const wbuffer_convert &) = delete; // C++14
- ~wbuffer_convert(); // C++14
-
- streambuf* rdbuf() const;
- streambuf* rdbuf(streambuf* bytebuf);
-
- state_type state() const;
-};
-
-// 22.4.1 and 22.4.1.3, ctype:
-class ctype_base;
-template <class charT> class ctype;
-template <> class ctype<char>; // specialization
-template <class charT> class ctype_byname;
-template <> class ctype_byname<char>; // specialization
-
-class codecvt_base;
-template <class internT, class externT, class stateT> class codecvt;
-template <class internT, class externT, class stateT> class codecvt_byname;
-
-// 22.4.2 and 22.4.3, numeric:
-template <class charT, class InputIterator> class num_get;
-template <class charT, class OutputIterator> class num_put;
-template <class charT> class numpunct;
-template <class charT> class numpunct_byname;
-
-// 22.4.4, col lation:
-template <class charT> class collate;
-template <class charT> class collate_byname;
-
-// 22.4.5, date and time:
-class time_base;
-template <class charT, class InputIterator> class time_get;
-template <class charT, class InputIterator> class time_get_byname;
-template <class charT, class OutputIterator> class time_put;
-template <class charT, class OutputIterator> class time_put_byname;
-
-// 22.4.6, money:
-class money_base;
-template <class charT, class InputIterator> class money_get;
-template <class charT, class OutputIterator> class money_put;
-template <class charT, bool Intl> class moneypunct;
-template <class charT, bool Intl> class moneypunct_byname;
-
-// 22.4.7, message retrieval:
-class messages_base;
-template <class charT> class messages;
-template <class charT> class messages_byname;
-
-} // std
-
-*/
-
-#include <__config>
-#include <__locale>
-#include <__debug>
-#include <algorithm>
-#include <memory>
-#include <ios>
-#include <streambuf>
-#include <iterator>
-#include <limits>
-#include <version>
-#ifndef __APPLE__
-#include <cstdarg>
-#endif
-#include <cstdlib>
-#include <ctime>
-#include <cstdio>
-#ifdef _LIBCPP_HAS_CATOPEN
-#include <nl_types.h>
-#endif
-
-#ifdef __APPLE__
-#include <Availability.h>
-#endif
-
-#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
-#include <__bsd_locale_defaults.h>
-#else
-#include <__bsd_locale_fallbacks.h>
-#endif
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-#if defined(__APPLE__) || defined(__FreeBSD__)
-# define _LIBCPP_GET_C_LOCALE 0
-#elif defined(__CloudABI__) || defined(__NetBSD__)
-# define _LIBCPP_GET_C_LOCALE LC_C_LOCALE
-#else
-# define _LIBCPP_GET_C_LOCALE __cloc()
- // Get the C locale object
- _LIBCPP_FUNC_VIS locale_t __cloc();
-#define __cloc_defined
-#endif
-
-// __scan_keyword
-// Scans [__b, __e) until a match is found in the basic_strings range
-// [__kb, __ke) or until it can be shown that there is no match in [__kb, __ke).
-// __b will be incremented (visibly), consuming CharT until a match is found
-// or proved to not exist. A keyword may be "", in which will match anything.
-// If one keyword is a prefix of another, and the next CharT in the input
-// might match another keyword, the algorithm will attempt to find the longest
-// matching keyword. If the longer matching keyword ends up not matching, then
-// no keyword match is found. If no keyword match is found, __ke is returned
-// and failbit is set in __err.
-// Else an iterator pointing to the matching keyword is found. If more than
-// one keyword matches, an iterator to the first matching keyword is returned.
-// If on exit __b == __e, eofbit is set in __err. If __case_sensitive is false,
-// __ct is used to force to lower case before comparing characters.
-// Examples:
-// Keywords: "a", "abb"
-// If the input is "a", the first keyword matches and eofbit is set.
-// If the input is "abc", no match is found and "ab" are consumed.
-template <class _InputIterator, class _ForwardIterator, class _Ctype>
-_LIBCPP_HIDDEN
-_ForwardIterator
-__scan_keyword(_InputIterator& __b, _InputIterator __e,
- _ForwardIterator __kb, _ForwardIterator __ke,
- const _Ctype& __ct, ios_base::iostate& __err,
- bool __case_sensitive = true)
-{
- typedef typename iterator_traits<_InputIterator>::value_type _CharT;
- size_t __nkw = static_cast<size_t>(_VSTD::distance(__kb, __ke));
- const unsigned char __doesnt_match = '\0';
- const unsigned char __might_match = '\1';
- const unsigned char __does_match = '\2';
- unsigned char __statbuf[100];
- unsigned char* __status = __statbuf;
- unique_ptr<unsigned char, void(*)(void*)> __stat_hold(0, free);
- if (__nkw > sizeof(__statbuf))
- {
- __status = (unsigned char*)malloc(__nkw);
- if (__status == 0)
- __throw_bad_alloc();
- __stat_hold.reset(__status);
- }
- size_t __n_might_match = __nkw; // At this point, any keyword might match
- size_t __n_does_match = 0; // but none of them definitely do
- // Initialize all statuses to __might_match, except for "" keywords are __does_match
- unsigned char* __st = __status;
- for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, (void) ++__st)
- {
- if (!__ky->empty())
- *__st = __might_match;
- else
- {
- *__st = __does_match;
- --__n_might_match;
- ++__n_does_match;
- }
- }
- // While there might be a match, test keywords against the next CharT
- for (size_t __indx = 0; __b != __e && __n_might_match > 0; ++__indx)
- {
- // Peek at the next CharT but don't consume it
- _CharT __c = *__b;
- if (!__case_sensitive)
- __c = __ct.toupper(__c);
- bool __consume = false;
- // For each keyword which might match, see if the __indx character is __c
- // If a match if found, consume __c
- // If a match is found, and that is the last character in the keyword,
- // then that keyword matches.
- // If the keyword doesn't match this character, then change the keyword
- // to doesn't match
- __st = __status;
- for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, (void) ++__st)
- {
- if (*__st == __might_match)
- {
- _CharT __kc = (*__ky)[__indx];
- if (!__case_sensitive)
- __kc = __ct.toupper(__kc);
- if (__c == __kc)
- {
- __consume = true;
- if (__ky->size() == __indx+1)
- {
- *__st = __does_match;
- --__n_might_match;
- ++__n_does_match;
- }
- }
- else
- {
- *__st = __doesnt_match;
- --__n_might_match;
- }
- }
- }
- // consume if we matched a character
- if (__consume)
- {
- ++__b;
- // If we consumed a character and there might be a matched keyword that
- // was marked matched on a previous iteration, then such keywords
- // which are now marked as not matching.
- if (__n_might_match + __n_does_match > 1)
- {
- __st = __status;
- for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, (void) ++__st)
- {
- if (*__st == __does_match && __ky->size() != __indx+1)
- {
- *__st = __doesnt_match;
- --__n_does_match;
- }
- }
- }
- }
- }
- // We've exited the loop because we hit eof and/or we have no more "might matches".
- if (__b == __e)
- __err |= ios_base::eofbit;
- // Return the first matching result
- for (__st = __status; __kb != __ke; ++__kb, (void) ++__st)
- if (*__st == __does_match)
- break;
- if (__kb == __ke)
- __err |= ios_base::failbit;
- return __kb;
-}
-
-struct _LIBCPP_TYPE_VIS __num_get_base
-{
- static const int __num_get_buf_sz = 40;
-
- static int __get_base(ios_base&);
- static const char __src[33];
-};
-
-_LIBCPP_FUNC_VIS
-void __check_grouping(const string& __grouping, unsigned* __g, unsigned* __g_end,
- ios_base::iostate& __err);
-
-template <class _CharT>
-struct __num_get
- : protected __num_get_base
-{
- static string __stage2_float_prep(ios_base& __iob, _CharT* __atoms, _CharT& __decimal_point,
- _CharT& __thousands_sep);
-
- static int __stage2_float_loop(_CharT __ct, bool& __in_units, char& __exp,
- char* __a, char*& __a_end,
- _CharT __decimal_point, _CharT __thousands_sep,
- const string& __grouping, unsigned* __g,
- unsigned*& __g_end, unsigned& __dc, _CharT* __atoms);
-#ifndef _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET
- static string __stage2_int_prep(ios_base& __iob, _CharT* __atoms, _CharT& __thousands_sep);
- static int __stage2_int_loop(_CharT __ct, int __base, char* __a, char*& __a_end,
- unsigned& __dc, _CharT __thousands_sep, const string& __grouping,
- unsigned* __g, unsigned*& __g_end, _CharT* __atoms);
-
-#else
- static string __stage2_int_prep(ios_base& __iob, _CharT& __thousands_sep)
- {
- locale __loc = __iob.getloc();
- const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc);
- __thousands_sep = __np.thousands_sep();
- return __np.grouping();
- }
-
- const _CharT* __do_widen(ios_base& __iob, _CharT* __atoms) const
- {
- return __do_widen_p(__iob, __atoms);
- }
-
-
- static int __stage2_int_loop(_CharT __ct, int __base, char* __a, char*& __a_end,
- unsigned& __dc, _CharT __thousands_sep, const string& __grouping,
- unsigned* __g, unsigned*& __g_end, const _CharT* __atoms);
-private:
- template<typename T>
- const T* __do_widen_p(ios_base& __iob, T* __atoms) const
- {
- locale __loc = __iob.getloc();
- use_facet<ctype<T> >(__loc).widen(__src, __src + 26, __atoms);
- return __atoms;
- }
-
- const char* __do_widen_p(ios_base& __iob, char* __atoms) const
- {
- (void)__iob;
- (void)__atoms;
- return __src;
- }
-#endif
-};
-
-#ifndef _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET
-template <class _CharT>
-string
-__num_get<_CharT>::__stage2_int_prep(ios_base& __iob, _CharT* __atoms, _CharT& __thousands_sep)
-{
- locale __loc = __iob.getloc();
- use_facet<ctype<_CharT> >(__loc).widen(__src, __src + 26, __atoms);
- const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc);
- __thousands_sep = __np.thousands_sep();
- return __np.grouping();
-}
-#endif
-
-template <class _CharT>
-string
-__num_get<_CharT>::__stage2_float_prep(ios_base& __iob, _CharT* __atoms, _CharT& __decimal_point,
- _CharT& __thousands_sep)
-{
- locale __loc = __iob.getloc();
- use_facet<ctype<_CharT> >(__loc).widen(__src, __src + 32, __atoms);
- const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc);
- __decimal_point = __np.decimal_point();
- __thousands_sep = __np.thousands_sep();
- return __np.grouping();
-}
-
-template <class _CharT>
-int
-#ifndef _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET
-__num_get<_CharT>::__stage2_int_loop(_CharT __ct, int __base, char* __a, char*& __a_end,
- unsigned& __dc, _CharT __thousands_sep, const string& __grouping,
- unsigned* __g, unsigned*& __g_end, _CharT* __atoms)
-#else
-__num_get<_CharT>::__stage2_int_loop(_CharT __ct, int __base, char* __a, char*& __a_end,
- unsigned& __dc, _CharT __thousands_sep, const string& __grouping,
- unsigned* __g, unsigned*& __g_end, const _CharT* __atoms)
-
-#endif
-{
- if (__a_end == __a && (__ct == __atoms[24] || __ct == __atoms[25]))
- {
- *__a_end++ = __ct == __atoms[24] ? '+' : '-';
- __dc = 0;
- return 0;
- }
- if (__grouping.size() != 0 && __ct == __thousands_sep)
- {
- if (__g_end-__g < __num_get_buf_sz)
- {
- *__g_end++ = __dc;
- __dc = 0;
- }
- return 0;
- }
- ptrdiff_t __f = find(__atoms, __atoms + 26, __ct) - __atoms;
- if (__f >= 24)
- return -1;
- switch (__base)
- {
- case 8:
- case 10:
- if (__f >= __base)
- return -1;
- break;
- case 16:
- if (__f < 22)
- break;
- if (__a_end != __a && __a_end - __a <= 2 && __a_end[-1] == '0')
- {
- __dc = 0;
- *__a_end++ = __src[__f];
- return 0;
- }
- return -1;
- }
- *__a_end++ = __src[__f];
- ++__dc;
- return 0;
-}
-
-template <class _CharT>
-int
-__num_get<_CharT>::__stage2_float_loop(_CharT __ct, bool& __in_units, char& __exp, char* __a, char*& __a_end,
- _CharT __decimal_point, _CharT __thousands_sep, const string& __grouping,
- unsigned* __g, unsigned*& __g_end, unsigned& __dc, _CharT* __atoms)
-{
- if (__ct == __decimal_point)
- {
- if (!__in_units)
- return -1;
- __in_units = false;
- *__a_end++ = '.';
- if (__grouping.size() != 0 && __g_end-__g < __num_get_buf_sz)
- *__g_end++ = __dc;
- return 0;
- }
- if (__ct == __thousands_sep && __grouping.size() != 0)
- {
- if (!__in_units)
- return -1;
- if (__g_end-__g < __num_get_buf_sz)
- {
- *__g_end++ = __dc;
- __dc = 0;
- }
- return 0;
- }
- ptrdiff_t __f = find(__atoms, __atoms + 32, __ct) - __atoms;
- if (__f >= 32)
- return -1;
- char __x = __src[__f];
- if (__x == '-' || __x == '+')
- {
- if (__a_end == __a || (__a_end[-1] & 0x5F) == (__exp & 0x7F))
- {
- *__a_end++ = __x;
- return 0;
- }
- return -1;
- }
- if (__x == 'x' || __x == 'X')
- __exp = 'P';
- else if ((__x & 0x5F) == __exp)
- {
- __exp |= 0x80;
- if (__in_units)
- {
- __in_units = false;
- if (__grouping.size() != 0 && __g_end-__g < __num_get_buf_sz)
- *__g_end++ = __dc;
- }
- }
- *__a_end++ = __x;
- if (__f >= 22)
- return 0;
- ++__dc;
- return 0;
-}
-
-_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_get<char>)
-_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_get<wchar_t>)
-
-template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> >
-class _LIBCPP_TEMPLATE_VIS num_get
- : public locale::facet,
- private __num_get<_CharT>
-{
-public:
- typedef _CharT char_type;
- typedef _InputIterator iter_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit num_get(size_t __refs = 0)
- : locale::facet(__refs) {}
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, bool& __v) const
- {
- return do_get(__b, __e, __iob, __err, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, long& __v) const
- {
- return do_get(__b, __e, __iob, __err, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, long long& __v) const
- {
- return do_get(__b, __e, __iob, __err, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, unsigned short& __v) const
- {
- return do_get(__b, __e, __iob, __err, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, unsigned int& __v) const
- {
- return do_get(__b, __e, __iob, __err, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, unsigned long& __v) const
- {
- return do_get(__b, __e, __iob, __err, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, unsigned long long& __v) const
- {
- return do_get(__b, __e, __iob, __err, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, float& __v) const
- {
- return do_get(__b, __e, __iob, __err, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, double& __v) const
- {
- return do_get(__b, __e, __iob, __err, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, long double& __v) const
- {
- return do_get(__b, __e, __iob, __err, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, void*& __v) const
- {
- return do_get(__b, __e, __iob, __err, __v);
- }
-
- static locale::id id;
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- ~num_get() {}
-
- template <class _Fp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- iter_type __do_get_floating_point
- (iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, _Fp& __v) const;
-
- template <class _Signed>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- iter_type __do_get_signed
- (iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, _Signed& __v) const;
-
- template <class _Unsigned>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- iter_type __do_get_unsigned
- (iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, _Unsigned& __v) const;
-
-
- virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, bool& __v) const;
-
- virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, long& __v) const
- { return this->__do_get_signed ( __b, __e, __iob, __err, __v ); }
-
- virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, long long& __v) const
- { return this->__do_get_signed ( __b, __e, __iob, __err, __v ); }
-
- virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, unsigned short& __v) const
- { return this->__do_get_unsigned ( __b, __e, __iob, __err, __v ); }
-
- virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, unsigned int& __v) const
- { return this->__do_get_unsigned ( __b, __e, __iob, __err, __v ); }
-
- virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, unsigned long& __v) const
- { return this->__do_get_unsigned ( __b, __e, __iob, __err, __v ); }
-
- virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, unsigned long long& __v) const
- { return this->__do_get_unsigned ( __b, __e, __iob, __err, __v ); }
-
- virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, float& __v) const
- { return this->__do_get_floating_point ( __b, __e, __iob, __err, __v ); }
-
- virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, double& __v) const
- { return this->__do_get_floating_point ( __b, __e, __iob, __err, __v ); }
-
- virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, long double& __v) const
- { return this->__do_get_floating_point ( __b, __e, __iob, __err, __v ); }
-
- virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, void*& __v) const;
-};
-
-template <class _CharT, class _InputIterator>
-locale::id
-num_get<_CharT, _InputIterator>::id;
-
-template <class _Tp>
-_LIBCPP_HIDDEN _Tp
-__num_get_signed_integral(const char* __a, const char* __a_end,
- ios_base::iostate& __err, int __base)
-{
- if (__a != __a_end)
- {
- typename remove_reference<decltype(errno)>::type __save_errno = errno;
- errno = 0;
- char *__p2;
- long long __ll = strtoll_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE);
- typename remove_reference<decltype(errno)>::type __current_errno = errno;
- if (__current_errno == 0)
- errno = __save_errno;
- if (__p2 != __a_end)
- {
- __err = ios_base::failbit;
- return 0;
- }
- else if (__current_errno == ERANGE ||
- __ll < numeric_limits<_Tp>::min() ||
- numeric_limits<_Tp>::max() < __ll)
- {
- __err = ios_base::failbit;
- if (__ll > 0)
- return numeric_limits<_Tp>::max();
- else
- return numeric_limits<_Tp>::min();
- }
- return static_cast<_Tp>(__ll);
- }
- __err = ios_base::failbit;
- return 0;
-}
-
-template <class _Tp>
-_LIBCPP_HIDDEN _Tp
-__num_get_unsigned_integral(const char* __a, const char* __a_end,
- ios_base::iostate& __err, int __base)
-{
- if (__a != __a_end)
- {
- const bool __negate = *__a == '-';
- if (__negate && ++__a == __a_end) {
- __err = ios_base::failbit;
- return 0;
- }
- typename remove_reference<decltype(errno)>::type __save_errno = errno;
- errno = 0;
- char *__p2;
- unsigned long long __ll = strtoull_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE);
- typename remove_reference<decltype(errno)>::type __current_errno = errno;
- if (__current_errno == 0)
- errno = __save_errno;
- if (__p2 != __a_end)
- {
- __err = ios_base::failbit;
- return 0;
- }
- else if (__current_errno == ERANGE || numeric_limits<_Tp>::max() < __ll)
- {
- __err = ios_base::failbit;
- return numeric_limits<_Tp>::max();
- }
- _Tp __res = static_cast<_Tp>(__ll);
- if (__negate) __res = -__res;
- return __res;
- }
- __err = ios_base::failbit;
- return 0;
-}
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY
-_Tp __do_strtod(const char* __a, char** __p2);
-
-template <>
-inline _LIBCPP_INLINE_VISIBILITY
-float __do_strtod<float>(const char* __a, char** __p2) {
- return strtof_l(__a, __p2, _LIBCPP_GET_C_LOCALE);
-}
-
-template <>
-inline _LIBCPP_INLINE_VISIBILITY
-double __do_strtod<double>(const char* __a, char** __p2) {
- return strtod_l(__a, __p2, _LIBCPP_GET_C_LOCALE);
-}
-
-template <>
-inline _LIBCPP_INLINE_VISIBILITY
-long double __do_strtod<long double>(const char* __a, char** __p2) {
- return strtold_l(__a, __p2, _LIBCPP_GET_C_LOCALE);
-}
-
-template <class _Tp>
-_LIBCPP_HIDDEN
-_Tp
-__num_get_float(const char* __a, const char* __a_end, ios_base::iostate& __err)
-{
- if (__a != __a_end)
- {
- typename remove_reference<decltype(errno)>::type __save_errno = errno;
- errno = 0;
- char *__p2;
- _Tp __ld = __do_strtod<_Tp>(__a, &__p2);
- typename remove_reference<decltype(errno)>::type __current_errno = errno;
- if (__current_errno == 0)
- errno = __save_errno;
- if (__p2 != __a_end)
- {
- __err = ios_base::failbit;
- return 0;
- }
- else if (__current_errno == ERANGE)
- __err = ios_base::failbit;
- return __ld;
- }
- __err = ios_base::failbit;
- return 0;
-}
-
-template <class _CharT, class _InputIterator>
-_InputIterator
-num_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e,
- ios_base& __iob,
- ios_base::iostate& __err,
- bool& __v) const
-{
- if ((__iob.flags() & ios_base::boolalpha) == 0)
- {
- long __lv = -1;
- __b = do_get(__b, __e, __iob, __err, __lv);
- switch (__lv)
- {
- case 0:
- __v = false;
- break;
- case 1:
- __v = true;
- break;
- default:
- __v = true;
- __err = ios_base::failbit;
- break;
- }
- return __b;
- }
- const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__iob.getloc());
- const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__iob.getloc());
- typedef typename numpunct<_CharT>::string_type string_type;
- const string_type __names[2] = {__np.truename(), __np.falsename()};
- const string_type* __i = __scan_keyword(__b, __e, __names, __names+2,
- __ct, __err);
- __v = __i == __names;
- return __b;
-}
-
-// signed
-
-template <class _CharT, class _InputIterator>
-template <class _Signed>
-_InputIterator
-num_get<_CharT, _InputIterator>::__do_get_signed(iter_type __b, iter_type __e,
- ios_base& __iob,
- ios_base::iostate& __err,
- _Signed& __v) const
-{
- // Stage 1
- int __base = this->__get_base(__iob);
- // Stage 2
- char_type __thousands_sep;
- const int __atoms_size = 26;
-#ifdef _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET
- char_type __atoms1[__atoms_size];
- const char_type *__atoms = this->__do_widen(__iob, __atoms1);
- string __grouping = this->__stage2_int_prep(__iob, __thousands_sep);
-#else
- char_type __atoms[__atoms_size];
- string __grouping = this->__stage2_int_prep(__iob, __atoms, __thousands_sep);
-#endif
- string __buf;
- __buf.resize(__buf.capacity());
- char* __a = &__buf[0];
- char* __a_end = __a;
- unsigned __g[__num_get_base::__num_get_buf_sz];
- unsigned* __g_end = __g;
- unsigned __dc = 0;
- for (; __b != __e; ++__b)
- {
- if (__a_end == __a + __buf.size())
- {
- size_t __tmp = __buf.size();
- __buf.resize(2*__buf.size());
- __buf.resize(__buf.capacity());
- __a = &__buf[0];
- __a_end = __a + __tmp;
- }
- if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc,
- __thousands_sep, __grouping, __g, __g_end,
- __atoms))
- break;
- }
- if (__grouping.size() != 0 && __g_end-__g < __num_get_base::__num_get_buf_sz)
- *__g_end++ = __dc;
- // Stage 3
- __v = __num_get_signed_integral<_Signed>(__a, __a_end, __err, __base);
- // Digit grouping checked
- __check_grouping(__grouping, __g, __g_end, __err);
- // EOF checked
- if (__b == __e)
- __err |= ios_base::eofbit;
- return __b;
-}
-
-// unsigned
-
-template <class _CharT, class _InputIterator>
-template <class _Unsigned>
-_InputIterator
-num_get<_CharT, _InputIterator>::__do_get_unsigned(iter_type __b, iter_type __e,
- ios_base& __iob,
- ios_base::iostate& __err,
- _Unsigned& __v) const
-{
- // Stage 1
- int __base = this->__get_base(__iob);
- // Stage 2
- char_type __thousands_sep;
- const int __atoms_size = 26;
-#ifdef _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET
- char_type __atoms1[__atoms_size];
- const char_type *__atoms = this->__do_widen(__iob, __atoms1);
- string __grouping = this->__stage2_int_prep(__iob, __thousands_sep);
-#else
- char_type __atoms[__atoms_size];
- string __grouping = this->__stage2_int_prep(__iob, __atoms, __thousands_sep);
-#endif
- string __buf;
- __buf.resize(__buf.capacity());
- char* __a = &__buf[0];
- char* __a_end = __a;
- unsigned __g[__num_get_base::__num_get_buf_sz];
- unsigned* __g_end = __g;
- unsigned __dc = 0;
- for (; __b != __e; ++__b)
- {
- if (__a_end == __a + __buf.size())
- {
- size_t __tmp = __buf.size();
- __buf.resize(2*__buf.size());
- __buf.resize(__buf.capacity());
- __a = &__buf[0];
- __a_end = __a + __tmp;
- }
- if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc,
- __thousands_sep, __grouping, __g, __g_end,
- __atoms))
- break;
- }
- if (__grouping.size() != 0 && __g_end-__g < __num_get_base::__num_get_buf_sz)
- *__g_end++ = __dc;
- // Stage 3
- __v = __num_get_unsigned_integral<_Unsigned>(__a, __a_end, __err, __base);
- // Digit grouping checked
- __check_grouping(__grouping, __g, __g_end, __err);
- // EOF checked
- if (__b == __e)
- __err |= ios_base::eofbit;
- return __b;
-}
-
-// floating point
-
-template <class _CharT, class _InputIterator>
-template <class _Fp>
-_InputIterator
-num_get<_CharT, _InputIterator>::__do_get_floating_point(iter_type __b, iter_type __e,
- ios_base& __iob,
- ios_base::iostate& __err,
- _Fp& __v) const
-{
- // Stage 1, nothing to do
- // Stage 2
- char_type __atoms[32];
- char_type __decimal_point;
- char_type __thousands_sep;
- string __grouping = this->__stage2_float_prep(__iob, __atoms,
- __decimal_point,
- __thousands_sep);
- string __buf;
- __buf.resize(__buf.capacity());
- char* __a = &__buf[0];
- char* __a_end = __a;
- unsigned __g[__num_get_base::__num_get_buf_sz];
- unsigned* __g_end = __g;
- unsigned __dc = 0;
- bool __in_units = true;
- char __exp = 'E';
- for (; __b != __e; ++__b)
- {
- if (__a_end == __a + __buf.size())
- {
- size_t __tmp = __buf.size();
- __buf.resize(2*__buf.size());
- __buf.resize(__buf.capacity());
- __a = &__buf[0];
- __a_end = __a + __tmp;
- }
- if (this->__stage2_float_loop(*__b, __in_units, __exp, __a, __a_end,
- __decimal_point, __thousands_sep,
- __grouping, __g, __g_end,
- __dc, __atoms))
- break;
- }
- if (__grouping.size() != 0 && __in_units && __g_end-__g < __num_get_base::__num_get_buf_sz)
- *__g_end++ = __dc;
- // Stage 3
- __v = __num_get_float<_Fp>(__a, __a_end, __err);
- // Digit grouping checked
- __check_grouping(__grouping, __g, __g_end, __err);
- // EOF checked
- if (__b == __e)
- __err |= ios_base::eofbit;
- return __b;
-}
-
-template <class _CharT, class _InputIterator>
-_InputIterator
-num_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e,
- ios_base& __iob,
- ios_base::iostate& __err,
- void*& __v) const
-{
- // Stage 1
- int __base = 16;
- // Stage 2
- char_type __atoms[26];
- char_type __thousands_sep = 0;
- string __grouping;
- use_facet<ctype<_CharT> >(__iob.getloc()).widen(__num_get_base::__src,
- __num_get_base::__src + 26, __atoms);
- string __buf;
- __buf.resize(__buf.capacity());
- char* __a = &__buf[0];
- char* __a_end = __a;
- unsigned __g[__num_get_base::__num_get_buf_sz];
- unsigned* __g_end = __g;
- unsigned __dc = 0;
- for (; __b != __e; ++__b)
- {
- if (__a_end == __a + __buf.size())
- {
- size_t __tmp = __buf.size();
- __buf.resize(2*__buf.size());
- __buf.resize(__buf.capacity());
- __a = &__buf[0];
- __a_end = __a + __tmp;
- }
- if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc,
- __thousands_sep, __grouping,
- __g, __g_end, __atoms))
- break;
- }
- // Stage 3
- __buf.resize(__a_end - __a);
- if (__libcpp_sscanf_l(__buf.c_str(), _LIBCPP_GET_C_LOCALE, "%p", &__v) != 1)
- __err = ios_base::failbit;
- // EOF checked
- if (__b == __e)
- __err |= ios_base::eofbit;
- return __b;
-}
-
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_get<char>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_get<wchar_t>)
-
-struct _LIBCPP_TYPE_VIS __num_put_base
-{
-protected:
- static void __format_int(char* __fmt, const char* __len, bool __signd,
- ios_base::fmtflags __flags);
- static bool __format_float(char* __fmt, const char* __len,
- ios_base::fmtflags __flags);
- static char* __identify_padding(char* __nb, char* __ne,
- const ios_base& __iob);
-};
-
-template <class _CharT>
-struct __num_put
- : protected __num_put_base
-{
- static void __widen_and_group_int(char* __nb, char* __np, char* __ne,
- _CharT* __ob, _CharT*& __op, _CharT*& __oe,
- const locale& __loc);
- static void __widen_and_group_float(char* __nb, char* __np, char* __ne,
- _CharT* __ob, _CharT*& __op, _CharT*& __oe,
- const locale& __loc);
-};
-
-template <class _CharT>
-void
-__num_put<_CharT>::__widen_and_group_int(char* __nb, char* __np, char* __ne,
- _CharT* __ob, _CharT*& __op, _CharT*& __oe,
- const locale& __loc)
-{
- const ctype<_CharT>& __ct = use_facet<ctype<_CharT> > (__loc);
- const numpunct<_CharT>& __npt = use_facet<numpunct<_CharT> >(__loc);
- string __grouping = __npt.grouping();
- if (__grouping.empty())
- {
- __ct.widen(__nb, __ne, __ob);
- __oe = __ob + (__ne - __nb);
- }
- else
- {
- __oe = __ob;
- char* __nf = __nb;
- if (*__nf == '-' || *__nf == '+')
- *__oe++ = __ct.widen(*__nf++);
- if (__ne - __nf >= 2 && __nf[0] == '0' && (__nf[1] == 'x' ||
- __nf[1] == 'X'))
- {
- *__oe++ = __ct.widen(*__nf++);
- *__oe++ = __ct.widen(*__nf++);
- }
- reverse(__nf, __ne);
- _CharT __thousands_sep = __npt.thousands_sep();
- unsigned __dc = 0;
- unsigned __dg = 0;
- for (char* __p = __nf; __p < __ne; ++__p)
- {
- if (static_cast<unsigned>(__grouping[__dg]) > 0 &&
- __dc == static_cast<unsigned>(__grouping[__dg]))
- {
- *__oe++ = __thousands_sep;
- __dc = 0;
- if (__dg < __grouping.size()-1)
- ++__dg;
- }
- *__oe++ = __ct.widen(*__p);
- ++__dc;
- }
- reverse(__ob + (__nf - __nb), __oe);
- }
- if (__np == __ne)
- __op = __oe;
- else
- __op = __ob + (__np - __nb);
-}
-
-template <class _CharT>
-void
-__num_put<_CharT>::__widen_and_group_float(char* __nb, char* __np, char* __ne,
- _CharT* __ob, _CharT*& __op, _CharT*& __oe,
- const locale& __loc)
-{
- const ctype<_CharT>& __ct = use_facet<ctype<_CharT> > (__loc);
- const numpunct<_CharT>& __npt = use_facet<numpunct<_CharT> >(__loc);
- string __grouping = __npt.grouping();
- __oe = __ob;
- char* __nf = __nb;
- if (*__nf == '-' || *__nf == '+')
- *__oe++ = __ct.widen(*__nf++);
- char* __ns;
- if (__ne - __nf >= 2 && __nf[0] == '0' && (__nf[1] == 'x' ||
- __nf[1] == 'X'))
- {
- *__oe++ = __ct.widen(*__nf++);
- *__oe++ = __ct.widen(*__nf++);
- for (__ns = __nf; __ns < __ne; ++__ns)
- if (!isxdigit_l(*__ns, _LIBCPP_GET_C_LOCALE))
- break;
- }
- else
- {
- for (__ns = __nf; __ns < __ne; ++__ns)
- if (!isdigit_l(*__ns, _LIBCPP_GET_C_LOCALE))
- break;
- }
- if (__grouping.empty())
- {
- __ct.widen(__nf, __ns, __oe);
- __oe += __ns - __nf;
- }
- else
- {
- reverse(__nf, __ns);
- _CharT __thousands_sep = __npt.thousands_sep();
- unsigned __dc = 0;
- unsigned __dg = 0;
- for (char* __p = __nf; __p < __ns; ++__p)
- {
- if (__grouping[__dg] > 0 && __dc == static_cast<unsigned>(__grouping[__dg]))
- {
- *__oe++ = __thousands_sep;
- __dc = 0;
- if (__dg < __grouping.size()-1)
- ++__dg;
- }
- *__oe++ = __ct.widen(*__p);
- ++__dc;
- }
- reverse(__ob + (__nf - __nb), __oe);
- }
- for (__nf = __ns; __nf < __ne; ++__nf)
- {
- if (*__nf == '.')
- {
- *__oe++ = __npt.decimal_point();
- ++__nf;
- break;
- }
- else
- *__oe++ = __ct.widen(*__nf);
- }
- __ct.widen(__nf, __ne, __oe);
- __oe += __ne - __nf;
- if (__np == __ne)
- __op = __oe;
- else
- __op = __ob + (__np - __nb);
-}
-
-_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_put<char>)
-_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_put<wchar_t>)
-
-template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> >
-class _LIBCPP_TEMPLATE_VIS num_put
- : public locale::facet,
- private __num_put<_CharT>
-{
-public:
- typedef _CharT char_type;
- typedef _OutputIterator iter_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit num_put(size_t __refs = 0)
- : locale::facet(__refs) {}
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type put(iter_type __s, ios_base& __iob, char_type __fl,
- bool __v) const
- {
- return do_put(__s, __iob, __fl, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type put(iter_type __s, ios_base& __iob, char_type __fl,
- long __v) const
- {
- return do_put(__s, __iob, __fl, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type put(iter_type __s, ios_base& __iob, char_type __fl,
- long long __v) const
- {
- return do_put(__s, __iob, __fl, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type put(iter_type __s, ios_base& __iob, char_type __fl,
- unsigned long __v) const
- {
- return do_put(__s, __iob, __fl, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type put(iter_type __s, ios_base& __iob, char_type __fl,
- unsigned long long __v) const
- {
- return do_put(__s, __iob, __fl, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type put(iter_type __s, ios_base& __iob, char_type __fl,
- double __v) const
- {
- return do_put(__s, __iob, __fl, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type put(iter_type __s, ios_base& __iob, char_type __fl,
- long double __v) const
- {
- return do_put(__s, __iob, __fl, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type put(iter_type __s, ios_base& __iob, char_type __fl,
- const void* __v) const
- {
- return do_put(__s, __iob, __fl, __v);
- }
-
- static locale::id id;
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- ~num_put() {}
-
- virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl,
- bool __v) const;
- virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl,
- long __v) const;
- virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl,
- long long __v) const;
- virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl,
- unsigned long) const;
- virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl,
- unsigned long long) const;
- virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl,
- double __v) const;
- virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl,
- long double __v) const;
- virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl,
- const void* __v) const;
-};
-
-template <class _CharT, class _OutputIterator>
-locale::id
-num_put<_CharT, _OutputIterator>::id;
-
-template <class _CharT, class _OutputIterator>
-_LIBCPP_HIDDEN
-_OutputIterator
-__pad_and_output(_OutputIterator __s,
- const _CharT* __ob, const _CharT* __op, const _CharT* __oe,
- ios_base& __iob, _CharT __fl)
-{
- streamsize __sz = __oe - __ob;
- streamsize __ns = __iob.width();
- if (__ns > __sz)
- __ns -= __sz;
- else
- __ns = 0;
- for (;__ob < __op; ++__ob, ++__s)
- *__s = *__ob;
- for (; __ns; --__ns, ++__s)
- *__s = __fl;
- for (; __ob < __oe; ++__ob, ++__s)
- *__s = *__ob;
- __iob.width(0);
- return __s;
-}
-
-#if !defined(__APPLE__) || \
- (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_8) || \
- (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_6_0)
-
-template <class _CharT, class _Traits>
-_LIBCPP_HIDDEN
-ostreambuf_iterator<_CharT, _Traits>
-__pad_and_output(ostreambuf_iterator<_CharT, _Traits> __s,
- const _CharT* __ob, const _CharT* __op, const _CharT* __oe,
- ios_base& __iob, _CharT __fl)
-{
- if (__s.__sbuf_ == nullptr)
- return __s;
- streamsize __sz = __oe - __ob;
- streamsize __ns = __iob.width();
- if (__ns > __sz)
- __ns -= __sz;
- else
- __ns = 0;
- streamsize __np = __op - __ob;
- if (__np > 0)
- {
- if (__s.__sbuf_->sputn(__ob, __np) != __np)
- {
- __s.__sbuf_ = nullptr;
- return __s;
- }
- }
- if (__ns > 0)
- {
- basic_string<_CharT, _Traits> __sp(__ns, __fl);
- if (__s.__sbuf_->sputn(__sp.data(), __ns) != __ns)
- {
- __s.__sbuf_ = nullptr;
- return __s;
- }
- }
- __np = __oe - __op;
- if (__np > 0)
- {
- if (__s.__sbuf_->sputn(__op, __np) != __np)
- {
- __s.__sbuf_ = nullptr;
- return __s;
- }
- }
- __iob.width(0);
- return __s;
-}
-
-#endif
-
-template <class _CharT, class _OutputIterator>
-_OutputIterator
-num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
- char_type __fl, bool __v) const
-{
- if ((__iob.flags() & ios_base::boolalpha) == 0)
- return do_put(__s, __iob, __fl, (unsigned long)__v);
- const numpunct<char_type>& __np = use_facet<numpunct<char_type> >(__iob.getloc());
- typedef typename numpunct<char_type>::string_type string_type;
-#if _LIBCPP_DEBUG_LEVEL >= 2
- string_type __tmp(__v ? __np.truename() : __np.falsename());
- string_type __nm = _VSTD::move(__tmp);
-#else
- string_type __nm = __v ? __np.truename() : __np.falsename();
-#endif
- for (typename string_type::iterator __i = __nm.begin(); __i != __nm.end(); ++__i, ++__s)
- *__s = *__i;
- return __s;
-}
-
-template <class _CharT, class _OutputIterator>
-_OutputIterator
-num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
- char_type __fl, long __v) const
-{
- // Stage 1 - Get number in narrow char
- char __fmt[6] = {'%', 0};
- const char* __len = "l";
- this->__format_int(__fmt+1, __len, true, __iob.flags());
- const unsigned __nbuf = (numeric_limits<long>::digits / 3)
- + ((numeric_limits<long>::digits % 3) != 0)
- + ((__iob.flags() & ios_base::showbase) != 0)
- + 2;
- char __nar[__nbuf];
- int __nc = __libcpp_snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
- char* __ne = __nar + __nc;
- char* __np = this->__identify_padding(__nar, __ne, __iob);
- // Stage 2 - Widen __nar while adding thousands separators
- char_type __o[2*(__nbuf-1) - 1];
- char_type* __op; // pad here
- char_type* __oe; // end of output
- this->__widen_and_group_int(__nar, __np, __ne, __o, __op, __oe, __iob.getloc());
- // [__o, __oe) contains thousands_sep'd wide number
- // Stage 3 & 4
- return __pad_and_output(__s, __o, __op, __oe, __iob, __fl);
-}
-
-template <class _CharT, class _OutputIterator>
-_OutputIterator
-num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
- char_type __fl, long long __v) const
-{
- // Stage 1 - Get number in narrow char
- char __fmt[8] = {'%', 0};
- const char* __len = "ll";
- this->__format_int(__fmt+1, __len, true, __iob.flags());
- const unsigned __nbuf = (numeric_limits<long long>::digits / 3)
- + ((numeric_limits<long long>::digits % 3) != 0)
- + ((__iob.flags() & ios_base::showbase) != 0)
- + 2;
- char __nar[__nbuf];
- int __nc = __libcpp_snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
- char* __ne = __nar + __nc;
- char* __np = this->__identify_padding(__nar, __ne, __iob);
- // Stage 2 - Widen __nar while adding thousands separators
- char_type __o[2*(__nbuf-1) - 1];
- char_type* __op; // pad here
- char_type* __oe; // end of output
- this->__widen_and_group_int(__nar, __np, __ne, __o, __op, __oe, __iob.getloc());
- // [__o, __oe) contains thousands_sep'd wide number
- // Stage 3 & 4
- return __pad_and_output(__s, __o, __op, __oe, __iob, __fl);
-}
-
-template <class _CharT, class _OutputIterator>
-_OutputIterator
-num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
- char_type __fl, unsigned long __v) const
-{
- // Stage 1 - Get number in narrow char
- char __fmt[6] = {'%', 0};
- const char* __len = "l";
- this->__format_int(__fmt+1, __len, false, __iob.flags());
- const unsigned __nbuf = (numeric_limits<unsigned long>::digits / 3)
- + ((numeric_limits<unsigned long>::digits % 3) != 0)
- + ((__iob.flags() & ios_base::showbase) != 0)
- + 1;
- char __nar[__nbuf];
- int __nc = __libcpp_snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
- char* __ne = __nar + __nc;
- char* __np = this->__identify_padding(__nar, __ne, __iob);
- // Stage 2 - Widen __nar while adding thousands separators
- char_type __o[2*(__nbuf-1) - 1];
- char_type* __op; // pad here
- char_type* __oe; // end of output
- this->__widen_and_group_int(__nar, __np, __ne, __o, __op, __oe, __iob.getloc());
- // [__o, __oe) contains thousands_sep'd wide number
- // Stage 3 & 4
- return __pad_and_output(__s, __o, __op, __oe, __iob, __fl);
-}
-
-template <class _CharT, class _OutputIterator>
-_OutputIterator
-num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
- char_type __fl, unsigned long long __v) const
-{
- // Stage 1 - Get number in narrow char
- char __fmt[8] = {'%', 0};
- const char* __len = "ll";
- this->__format_int(__fmt+1, __len, false, __iob.flags());
- const unsigned __nbuf = (numeric_limits<unsigned long long>::digits / 3)
- + ((numeric_limits<unsigned long long>::digits % 3) != 0)
- + ((__iob.flags() & ios_base::showbase) != 0)
- + 1;
- char __nar[__nbuf];
- int __nc = __libcpp_snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
- char* __ne = __nar + __nc;
- char* __np = this->__identify_padding(__nar, __ne, __iob);
- // Stage 2 - Widen __nar while adding thousands separators
- char_type __o[2*(__nbuf-1) - 1];
- char_type* __op; // pad here
- char_type* __oe; // end of output
- this->__widen_and_group_int(__nar, __np, __ne, __o, __op, __oe, __iob.getloc());
- // [__o, __oe) contains thousands_sep'd wide number
- // Stage 3 & 4
- return __pad_and_output(__s, __o, __op, __oe, __iob, __fl);
-}
-
-template <class _CharT, class _OutputIterator>
-_OutputIterator
-num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
- char_type __fl, double __v) const
-{
- // Stage 1 - Get number in narrow char
- char __fmt[8] = {'%', 0};
- const char* __len = "";
- bool __specify_precision = this->__format_float(__fmt+1, __len, __iob.flags());
- const unsigned __nbuf = 30;
- char __nar[__nbuf];
- char* __nb = __nar;
- int __nc;
- if (__specify_precision)
- __nc = __libcpp_snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt,
- (int)__iob.precision(), __v);
- else
- __nc = __libcpp_snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt, __v);
- unique_ptr<char, void(*)(void*)> __nbh(0, free);
- if (__nc > static_cast<int>(__nbuf-1))
- {
- if (__specify_precision)
- __nc = __libcpp_asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, (int)__iob.precision(), __v);
- else
- __nc = __libcpp_asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, __v);
- if (__nc == -1)
- __throw_bad_alloc();
- __nbh.reset(__nb);
- }
- char* __ne = __nb + __nc;
- char* __np = this->__identify_padding(__nb, __ne, __iob);
- // Stage 2 - Widen __nar while adding thousands separators
- char_type __o[2*(__nbuf-1) - 1];
- char_type* __ob = __o;
- unique_ptr<char_type, void(*)(void*)> __obh(0, free);
- if (__nb != __nar)
- {
- __ob = (char_type*)malloc(2*static_cast<size_t>(__nc)*sizeof(char_type));
- if (__ob == 0)
- __throw_bad_alloc();
- __obh.reset(__ob);
- }
- char_type* __op; // pad here
- char_type* __oe; // end of output
- this->__widen_and_group_float(__nb, __np, __ne, __ob, __op, __oe, __iob.getloc());
- // [__o, __oe) contains thousands_sep'd wide number
- // Stage 3 & 4
- __s = __pad_and_output(__s, __ob, __op, __oe, __iob, __fl);
- return __s;
-}
-
-template <class _CharT, class _OutputIterator>
-_OutputIterator
-num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
- char_type __fl, long double __v) const
-{
- // Stage 1 - Get number in narrow char
- char __fmt[8] = {'%', 0};
- const char* __len = "L";
- bool __specify_precision = this->__format_float(__fmt+1, __len, __iob.flags());
- const unsigned __nbuf = 30;
- char __nar[__nbuf];
- char* __nb = __nar;
- int __nc;
- if (__specify_precision)
- __nc = __libcpp_snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt,
- (int)__iob.precision(), __v);
- else
- __nc = __libcpp_snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt, __v);
- unique_ptr<char, void(*)(void*)> __nbh(0, free);
- if (__nc > static_cast<int>(__nbuf-1))
- {
- if (__specify_precision)
- __nc = __libcpp_asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, (int)__iob.precision(), __v);
- else
- __nc = __libcpp_asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, __v);
- if (__nc == -1)
- __throw_bad_alloc();
- __nbh.reset(__nb);
- }
- char* __ne = __nb + __nc;
- char* __np = this->__identify_padding(__nb, __ne, __iob);
- // Stage 2 - Widen __nar while adding thousands separators
- char_type __o[2*(__nbuf-1) - 1];
- char_type* __ob = __o;
- unique_ptr<char_type, void(*)(void*)> __obh(0, free);
- if (__nb != __nar)
- {
- __ob = (char_type*)malloc(2*static_cast<size_t>(__nc)*sizeof(char_type));
- if (__ob == 0)
- __throw_bad_alloc();
- __obh.reset(__ob);
- }
- char_type* __op; // pad here
- char_type* __oe; // end of output
- this->__widen_and_group_float(__nb, __np, __ne, __ob, __op, __oe, __iob.getloc());
- // [__o, __oe) contains thousands_sep'd wide number
- // Stage 3 & 4
- __s = __pad_and_output(__s, __ob, __op, __oe, __iob, __fl);
- return __s;
-}
-
-template <class _CharT, class _OutputIterator>
-_OutputIterator
-num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
- char_type __fl, const void* __v) const
-{
- // Stage 1 - Get pointer in narrow char
- char __fmt[6] = "%p";
- const unsigned __nbuf = 20;
- char __nar[__nbuf];
- int __nc = __libcpp_snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
- char* __ne = __nar + __nc;
- char* __np = this->__identify_padding(__nar, __ne, __iob);
- // Stage 2 - Widen __nar
- char_type __o[2*(__nbuf-1) - 1];
- char_type* __op; // pad here
- char_type* __oe; // end of output
- const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc());
- __ct.widen(__nar, __ne, __o);
- __oe = __o + (__ne - __nar);
- if (__np == __ne)
- __op = __oe;
- else
- __op = __o + (__np - __nar);
- // [__o, __oe) contains wide number
- // Stage 3 & 4
- return __pad_and_output(__s, __o, __op, __oe, __iob, __fl);
-}
-
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_put<char>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_put<wchar_t>)
-
-template <class _CharT, class _InputIterator>
-_LIBCPP_HIDDEN
-int
-__get_up_to_n_digits(_InputIterator& __b, _InputIterator __e,
- ios_base::iostate& __err, const ctype<_CharT>& __ct, int __n)
-{
- // Precondition: __n >= 1
- if (__b == __e)
- {
- __err |= ios_base::eofbit | ios_base::failbit;
- return 0;
- }
- // get first digit
- _CharT __c = *__b;
- if (!__ct.is(ctype_base::digit, __c))
- {
- __err |= ios_base::failbit;
- return 0;
- }
- int __r = __ct.narrow(__c, 0) - '0';
- for (++__b, (void) --__n; __b != __e && __n > 0; ++__b, (void) --__n)
- {
- // get next digit
- __c = *__b;
- if (!__ct.is(ctype_base::digit, __c))
- return __r;
- __r = __r * 10 + __ct.narrow(__c, 0) - '0';
- }
- if (__b == __e)
- __err |= ios_base::eofbit;
- return __r;
-}
-
-class _LIBCPP_TYPE_VIS time_base
-{
-public:
- enum dateorder {no_order, dmy, mdy, ymd, ydm};
-};
-
-template <class _CharT>
-class _LIBCPP_TEMPLATE_VIS __time_get_c_storage
-{
-protected:
- typedef basic_string<_CharT> string_type;
-
- virtual const string_type* __weeks() const;
- virtual const string_type* __months() const;
- virtual const string_type* __am_pm() const;
- virtual const string_type& __c() const;
- virtual const string_type& __r() const;
- virtual const string_type& __x() const;
- virtual const string_type& __X() const;
-
- _LIBCPP_INLINE_VISIBILITY
- ~__time_get_c_storage() {}
-};
-
-template <> _LIBCPP_FUNC_VIS const string* __time_get_c_storage<char>::__weeks() const;
-template <> _LIBCPP_FUNC_VIS const string* __time_get_c_storage<char>::__months() const;
-template <> _LIBCPP_FUNC_VIS const string* __time_get_c_storage<char>::__am_pm() const;
-template <> _LIBCPP_FUNC_VIS const string& __time_get_c_storage<char>::__c() const;
-template <> _LIBCPP_FUNC_VIS const string& __time_get_c_storage<char>::__r() const;
-template <> _LIBCPP_FUNC_VIS const string& __time_get_c_storage<char>::__x() const;
-template <> _LIBCPP_FUNC_VIS const string& __time_get_c_storage<char>::__X() const;
-
-template <> _LIBCPP_FUNC_VIS const wstring* __time_get_c_storage<wchar_t>::__weeks() const;
-template <> _LIBCPP_FUNC_VIS const wstring* __time_get_c_storage<wchar_t>::__months() const;
-template <> _LIBCPP_FUNC_VIS const wstring* __time_get_c_storage<wchar_t>::__am_pm() const;
-template <> _LIBCPP_FUNC_VIS const wstring& __time_get_c_storage<wchar_t>::__c() const;
-template <> _LIBCPP_FUNC_VIS const wstring& __time_get_c_storage<wchar_t>::__r() const;
-template <> _LIBCPP_FUNC_VIS const wstring& __time_get_c_storage<wchar_t>::__x() const;
-template <> _LIBCPP_FUNC_VIS const wstring& __time_get_c_storage<wchar_t>::__X() const;
-
-template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> >
-class _LIBCPP_TEMPLATE_VIS time_get
- : public locale::facet,
- public time_base,
- private __time_get_c_storage<_CharT>
-{
-public:
- typedef _CharT char_type;
- typedef _InputIterator iter_type;
- typedef time_base::dateorder dateorder;
- typedef basic_string<char_type> string_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit time_get(size_t __refs = 0)
- : locale::facet(__refs) {}
-
- _LIBCPP_INLINE_VISIBILITY
- dateorder date_order() const
- {
- return this->do_date_order();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get_time(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, tm* __tm) const
- {
- return do_get_time(__b, __e, __iob, __err, __tm);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get_date(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, tm* __tm) const
- {
- return do_get_date(__b, __e, __iob, __err, __tm);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get_weekday(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, tm* __tm) const
- {
- return do_get_weekday(__b, __e, __iob, __err, __tm);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get_monthname(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, tm* __tm) const
- {
- return do_get_monthname(__b, __e, __iob, __err, __tm);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get_year(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, tm* __tm) const
- {
- return do_get_year(__b, __e, __iob, __err, __tm);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, tm *__tm,
- char __fmt, char __mod = 0) const
- {
- return do_get(__b, __e, __iob, __err, __tm, __fmt, __mod);
- }
-
- iter_type get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, tm* __tm,
- const char_type* __fmtb, const char_type* __fmte) const;
-
- static locale::id id;
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- ~time_get() {}
-
- virtual dateorder do_date_order() const;
- virtual iter_type do_get_time(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, tm* __tm) const;
- virtual iter_type do_get_date(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, tm* __tm) const;
- virtual iter_type do_get_weekday(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, tm* __tm) const;
- virtual iter_type do_get_monthname(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, tm* __tm) const;
- virtual iter_type do_get_year(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, tm* __tm) const;
- virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob,
- ios_base::iostate& __err, tm* __tm,
- char __fmt, char __mod) const;
-private:
- void __get_white_space(iter_type& __b, iter_type __e,
- ios_base::iostate& __err, const ctype<char_type>& __ct) const;
- void __get_percent(iter_type& __b, iter_type __e, ios_base::iostate& __err,
- const ctype<char_type>& __ct) const;
-
- void __get_weekdayname(int& __m,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const;
- void __get_monthname(int& __m,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const;
- void __get_day(int& __d,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const;
- void __get_month(int& __m,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const;
- void __get_year(int& __y,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const;
- void __get_year4(int& __y,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const;
- void __get_hour(int& __d,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const;
- void __get_12_hour(int& __h,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const;
- void __get_am_pm(int& __h,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const;
- void __get_minute(int& __m,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const;
- void __get_second(int& __s,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const;
- void __get_weekday(int& __w,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const;
- void __get_day_year_num(int& __w,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const;
-};
-
-template <class _CharT, class _InputIterator>
-locale::id
-time_get<_CharT, _InputIterator>::id;
-
-// time_get primitives
-
-template <class _CharT, class _InputIterator>
-void
-time_get<_CharT, _InputIterator>::__get_weekdayname(int& __w,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const
-{
- // Note: ignoring case comes from the POSIX strptime spec
- const string_type* __wk = this->__weeks();
- ptrdiff_t __i = __scan_keyword(__b, __e, __wk, __wk+14, __ct, __err, false) - __wk;
- if (__i < 14)
- __w = __i % 7;
-}
-
-template <class _CharT, class _InputIterator>
-void
-time_get<_CharT, _InputIterator>::__get_monthname(int& __m,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const
-{
- // Note: ignoring case comes from the POSIX strptime spec
- const string_type* __month = this->__months();
- ptrdiff_t __i = __scan_keyword(__b, __e, __month, __month+24, __ct, __err, false) - __month;
- if (__i < 24)
- __m = __i % 12;
-}
-
-template <class _CharT, class _InputIterator>
-void
-time_get<_CharT, _InputIterator>::__get_day(int& __d,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const
-{
- int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2);
- if (!(__err & ios_base::failbit) && 1 <= __t && __t <= 31)
- __d = __t;
- else
- __err |= ios_base::failbit;
-}
-
-template <class _CharT, class _InputIterator>
-void
-time_get<_CharT, _InputIterator>::__get_month(int& __m,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const
-{
- int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2) - 1;
- if (!(__err & ios_base::failbit) && __t <= 11)
- __m = __t;
- else
- __err |= ios_base::failbit;
-}
-
-template <class _CharT, class _InputIterator>
-void
-time_get<_CharT, _InputIterator>::__get_year(int& __y,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const
-{
- int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 4);
- if (!(__err & ios_base::failbit))
- {
- if (__t < 69)
- __t += 2000;
- else if (69 <= __t && __t <= 99)
- __t += 1900;
- __y = __t - 1900;
- }
-}
-
-template <class _CharT, class _InputIterator>
-void
-time_get<_CharT, _InputIterator>::__get_year4(int& __y,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const
-{
- int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 4);
- if (!(__err & ios_base::failbit))
- __y = __t - 1900;
-}
-
-template <class _CharT, class _InputIterator>
-void
-time_get<_CharT, _InputIterator>::__get_hour(int& __h,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const
-{
- int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2);
- if (!(__err & ios_base::failbit) && __t <= 23)
- __h = __t;
- else
- __err |= ios_base::failbit;
-}
-
-template <class _CharT, class _InputIterator>
-void
-time_get<_CharT, _InputIterator>::__get_12_hour(int& __h,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const
-{
- int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2);
- if (!(__err & ios_base::failbit) && 1 <= __t && __t <= 12)
- __h = __t;
- else
- __err |= ios_base::failbit;
-}
-
-template <class _CharT, class _InputIterator>
-void
-time_get<_CharT, _InputIterator>::__get_minute(int& __m,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const
-{
- int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2);
- if (!(__err & ios_base::failbit) && __t <= 59)
- __m = __t;
- else
- __err |= ios_base::failbit;
-}
-
-template <class _CharT, class _InputIterator>
-void
-time_get<_CharT, _InputIterator>::__get_second(int& __s,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const
-{
- int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2);
- if (!(__err & ios_base::failbit) && __t <= 60)
- __s = __t;
- else
- __err |= ios_base::failbit;
-}
-
-template <class _CharT, class _InputIterator>
-void
-time_get<_CharT, _InputIterator>::__get_weekday(int& __w,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const
-{
- int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 1);
- if (!(__err & ios_base::failbit) && __t <= 6)
- __w = __t;
- else
- __err |= ios_base::failbit;
-}
-
-template <class _CharT, class _InputIterator>
-void
-time_get<_CharT, _InputIterator>::__get_day_year_num(int& __d,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const
-{
- int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 3);
- if (!(__err & ios_base::failbit) && __t <= 365)
- __d = __t;
- else
- __err |= ios_base::failbit;
-}
-
-template <class _CharT, class _InputIterator>
-void
-time_get<_CharT, _InputIterator>::__get_white_space(iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const
-{
- for (; __b != __e && __ct.is(ctype_base::space, *__b); ++__b)
- ;
- if (__b == __e)
- __err |= ios_base::eofbit;
-}
-
-template <class _CharT, class _InputIterator>
-void
-time_get<_CharT, _InputIterator>::__get_am_pm(int& __h,
- iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const
-{
- const string_type* __ap = this->__am_pm();
- if (__ap[0].size() + __ap[1].size() == 0)
- {
- __err |= ios_base::failbit;
- return;
- }
- ptrdiff_t __i = __scan_keyword(__b, __e, __ap, __ap+2, __ct, __err, false) - __ap;
- if (__i == 0 && __h == 12)
- __h = 0;
- else if (__i == 1 && __h < 12)
- __h += 12;
-}
-
-template <class _CharT, class _InputIterator>
-void
-time_get<_CharT, _InputIterator>::__get_percent(iter_type& __b, iter_type __e,
- ios_base::iostate& __err,
- const ctype<char_type>& __ct) const
-{
- if (__b == __e)
- {
- __err |= ios_base::eofbit | ios_base::failbit;
- return;
- }
- if (__ct.narrow(*__b, 0) != '%')
- __err |= ios_base::failbit;
- else if(++__b == __e)
- __err |= ios_base::eofbit;
-}
-
-// time_get end primitives
-
-template <class _CharT, class _InputIterator>
-_InputIterator
-time_get<_CharT, _InputIterator>::get(iter_type __b, iter_type __e,
- ios_base& __iob,
- ios_base::iostate& __err, tm* __tm,
- const char_type* __fmtb, const char_type* __fmte) const
-{
- const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc());
- __err = ios_base::goodbit;
- while (__fmtb != __fmte && __err == ios_base::goodbit)
- {
- if (__b == __e)
- {
- __err = ios_base::failbit;
- break;
- }
- if (__ct.narrow(*__fmtb, 0) == '%')
- {
- if (++__fmtb == __fmte)
- {
- __err = ios_base::failbit;
- break;
- }
- char __cmd = __ct.narrow(*__fmtb, 0);
- char __opt = '\0';
- if (__cmd == 'E' || __cmd == '0')
- {
- if (++__fmtb == __fmte)
- {
- __err = ios_base::failbit;
- break;
- }
- __opt = __cmd;
- __cmd = __ct.narrow(*__fmtb, 0);
- }
- __b = do_get(__b, __e, __iob, __err, __tm, __cmd, __opt);
- ++__fmtb;
- }
- else if (__ct.is(ctype_base::space, *__fmtb))
- {
- for (++__fmtb; __fmtb != __fmte && __ct.is(ctype_base::space, *__fmtb); ++__fmtb)
- ;
- for ( ; __b != __e && __ct.is(ctype_base::space, *__b); ++__b)
- ;
- }
- else if (__ct.toupper(*__b) == __ct.toupper(*__fmtb))
- {
- ++__b;
- ++__fmtb;
- }
- else
- __err = ios_base::failbit;
- }
- if (__b == __e)
- __err |= ios_base::eofbit;
- return __b;
-}
-
-template <class _CharT, class _InputIterator>
-typename time_get<_CharT, _InputIterator>::dateorder
-time_get<_CharT, _InputIterator>::do_date_order() const
-{
- return mdy;
-}
-
-template <class _CharT, class _InputIterator>
-_InputIterator
-time_get<_CharT, _InputIterator>::do_get_time(iter_type __b, iter_type __e,
- ios_base& __iob,
- ios_base::iostate& __err,
- tm* __tm) const
-{
- const char_type __fmt[] = {'%', 'H', ':', '%', 'M', ':', '%', 'S'};
- return get(__b, __e, __iob, __err, __tm, __fmt, __fmt + sizeof(__fmt)/sizeof(__fmt[0]));
-}
-
-template <class _CharT, class _InputIterator>
-_InputIterator
-time_get<_CharT, _InputIterator>::do_get_date(iter_type __b, iter_type __e,
- ios_base& __iob,
- ios_base::iostate& __err,
- tm* __tm) const
-{
- const string_type& __fmt = this->__x();
- return get(__b, __e, __iob, __err, __tm, __fmt.data(), __fmt.data() + __fmt.size());
-}
-
-template <class _CharT, class _InputIterator>
-_InputIterator
-time_get<_CharT, _InputIterator>::do_get_weekday(iter_type __b, iter_type __e,
- ios_base& __iob,
- ios_base::iostate& __err,
- tm* __tm) const
-{
- const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc());
- __get_weekdayname(__tm->tm_wday, __b, __e, __err, __ct);
- return __b;
-}
-
-template <class _CharT, class _InputIterator>
-_InputIterator
-time_get<_CharT, _InputIterator>::do_get_monthname(iter_type __b, iter_type __e,
- ios_base& __iob,
- ios_base::iostate& __err,
- tm* __tm) const
-{
- const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc());
- __get_monthname(__tm->tm_mon, __b, __e, __err, __ct);
- return __b;
-}
-
-template <class _CharT, class _InputIterator>
-_InputIterator
-time_get<_CharT, _InputIterator>::do_get_year(iter_type __b, iter_type __e,
- ios_base& __iob,
- ios_base::iostate& __err,
- tm* __tm) const
-{
- const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc());
- __get_year(__tm->tm_year, __b, __e, __err, __ct);
- return __b;
-}
-
-template <class _CharT, class _InputIterator>
-_InputIterator
-time_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e,
- ios_base& __iob,
- ios_base::iostate& __err, tm* __tm,
- char __fmt, char) const
-{
- __err = ios_base::goodbit;
- const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc());
- switch (__fmt)
- {
- case 'a':
- case 'A':
- __get_weekdayname(__tm->tm_wday, __b, __e, __err, __ct);
- break;
- case 'b':
- case 'B':
- case 'h':
- __get_monthname(__tm->tm_mon, __b, __e, __err, __ct);
- break;
- case 'c':
- {
- const string_type& __fm = this->__c();
- __b = get(__b, __e, __iob, __err, __tm, __fm.data(), __fm.data() + __fm.size());
- }
- break;
- case 'd':
- case 'e':
- __get_day(__tm->tm_mday, __b, __e, __err, __ct);
- break;
- case 'D':
- {
- const char_type __fm[] = {'%', 'm', '/', '%', 'd', '/', '%', 'y'};
- __b = get(__b, __e, __iob, __err, __tm, __fm, __fm + sizeof(__fm)/sizeof(__fm[0]));
- }
- break;
- case 'F':
- {
- const char_type __fm[] = {'%', 'Y', '-', '%', 'm', '-', '%', 'd'};
- __b = get(__b, __e, __iob, __err, __tm, __fm, __fm + sizeof(__fm)/sizeof(__fm[0]));
- }
- break;
- case 'H':
- __get_hour(__tm->tm_hour, __b, __e, __err, __ct);
- break;
- case 'I':
- __get_12_hour(__tm->tm_hour, __b, __e, __err, __ct);
- break;
- case 'j':
- __get_day_year_num(__tm->tm_yday, __b, __e, __err, __ct);
- break;
- case 'm':
- __get_month(__tm->tm_mon, __b, __e, __err, __ct);
- break;
- case 'M':
- __get_minute(__tm->tm_min, __b, __e, __err, __ct);
- break;
- case 'n':
- case 't':
- __get_white_space(__b, __e, __err, __ct);
- break;
- case 'p':
- __get_am_pm(__tm->tm_hour, __b, __e, __err, __ct);
- break;
- case 'r':
- {
- const char_type __fm[] = {'%', 'I', ':', '%', 'M', ':', '%', 'S', ' ', '%', 'p'};
- __b = get(__b, __e, __iob, __err, __tm, __fm, __fm + sizeof(__fm)/sizeof(__fm[0]));
- }
- break;
- case 'R':
- {
- const char_type __fm[] = {'%', 'H', ':', '%', 'M'};
- __b = get(__b, __e, __iob, __err, __tm, __fm, __fm + sizeof(__fm)/sizeof(__fm[0]));
- }
- break;
- case 'S':
- __get_second(__tm->tm_sec, __b, __e, __err, __ct);
- break;
- case 'T':
- {
- const char_type __fm[] = {'%', 'H', ':', '%', 'M', ':', '%', 'S'};
- __b = get(__b, __e, __iob, __err, __tm, __fm, __fm + sizeof(__fm)/sizeof(__fm[0]));
- }
- break;
- case 'w':
- __get_weekday(__tm->tm_wday, __b, __e, __err, __ct);
- break;
- case 'x':
- return do_get_date(__b, __e, __iob, __err, __tm);
- case 'X':
- {
- const string_type& __fm = this->__X();
- __b = get(__b, __e, __iob, __err, __tm, __fm.data(), __fm.data() + __fm.size());
- }
- break;
- case 'y':
- __get_year(__tm->tm_year, __b, __e, __err, __ct);
- break;
- case 'Y':
- __get_year4(__tm->tm_year, __b, __e, __err, __ct);
- break;
- case '%':
- __get_percent(__b, __e, __err, __ct);
- break;
- default:
- __err |= ios_base::failbit;
- }
- return __b;
-}
-
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get<char>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get<wchar_t>)
-
-class _LIBCPP_TYPE_VIS __time_get
-{
-protected:
- locale_t __loc_;
-
- __time_get(const char* __nm);
- __time_get(const string& __nm);
- ~__time_get();
-};
-
-template <class _CharT>
-class _LIBCPP_TEMPLATE_VIS __time_get_storage
- : public __time_get
-{
-protected:
- typedef basic_string<_CharT> string_type;
-
- string_type __weeks_[14];
- string_type __months_[24];
- string_type __am_pm_[2];
- string_type __c_;
- string_type __r_;
- string_type __x_;
- string_type __X_;
-
- explicit __time_get_storage(const char* __nm);
- explicit __time_get_storage(const string& __nm);
-
- _LIBCPP_INLINE_VISIBILITY ~__time_get_storage() {}
-
- time_base::dateorder __do_date_order() const;
-
-private:
- void init(const ctype<_CharT>&);
- string_type __analyze(char __fmt, const ctype<_CharT>&);
-};
-
-#define _LIBCPP_TIME_GET_STORAGE_EXPLICIT_INSTANTIATION(_CharT) \
-template <> _LIBCPP_FUNC_VIS time_base::dateorder __time_get_storage<_CharT>::__do_date_order() const; \
-template <> _LIBCPP_FUNC_VIS __time_get_storage<_CharT>::__time_get_storage(const char*); \
-template <> _LIBCPP_FUNC_VIS __time_get_storage<_CharT>::__time_get_storage(const string&); \
-template <> _LIBCPP_FUNC_VIS void __time_get_storage<_CharT>::init(const ctype<_CharT>&); \
-template <> _LIBCPP_FUNC_VIS __time_get_storage<_CharT>::string_type __time_get_storage<_CharT>::__analyze(char, const ctype<_CharT>&); \
-extern template _LIBCPP_FUNC_VIS time_base::dateorder __time_get_storage<_CharT>::__do_date_order() const; \
-extern template _LIBCPP_FUNC_VIS __time_get_storage<_CharT>::__time_get_storage(const char*); \
-extern template _LIBCPP_FUNC_VIS __time_get_storage<_CharT>::__time_get_storage(const string&); \
-extern template _LIBCPP_FUNC_VIS void __time_get_storage<_CharT>::init(const ctype<_CharT>&); \
-extern template _LIBCPP_FUNC_VIS __time_get_storage<_CharT>::string_type __time_get_storage<_CharT>::__analyze(char, const ctype<_CharT>&); \
-/**/
-
-_LIBCPP_TIME_GET_STORAGE_EXPLICIT_INSTANTIATION(char)
-_LIBCPP_TIME_GET_STORAGE_EXPLICIT_INSTANTIATION(wchar_t)
-#undef _LIBCPP_TIME_GET_STORAGE_EXPLICIT_INSTANTIATION
-
-template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> >
-class _LIBCPP_TEMPLATE_VIS time_get_byname
- : public time_get<_CharT, _InputIterator>,
- private __time_get_storage<_CharT>
-{
-public:
- typedef time_base::dateorder dateorder;
- typedef _InputIterator iter_type;
- typedef _CharT char_type;
- typedef basic_string<char_type> string_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit time_get_byname(const char* __nm, size_t __refs = 0)
- : time_get<_CharT, _InputIterator>(__refs),
- __time_get_storage<_CharT>(__nm) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit time_get_byname(const string& __nm, size_t __refs = 0)
- : time_get<_CharT, _InputIterator>(__refs),
- __time_get_storage<_CharT>(__nm) {}
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- ~time_get_byname() {}
-
- _LIBCPP_INLINE_VISIBILITY
- virtual dateorder do_date_order() const {return this->__do_date_order();}
-private:
- _LIBCPP_INLINE_VISIBILITY
- virtual const string_type* __weeks() const {return this->__weeks_;}
- _LIBCPP_INLINE_VISIBILITY
- virtual const string_type* __months() const {return this->__months_;}
- _LIBCPP_INLINE_VISIBILITY
- virtual const string_type* __am_pm() const {return this->__am_pm_;}
- _LIBCPP_INLINE_VISIBILITY
- virtual const string_type& __c() const {return this->__c_;}
- _LIBCPP_INLINE_VISIBILITY
- virtual const string_type& __r() const {return this->__r_;}
- _LIBCPP_INLINE_VISIBILITY
- virtual const string_type& __x() const {return this->__x_;}
- _LIBCPP_INLINE_VISIBILITY
- virtual const string_type& __X() const {return this->__X_;}
-};
-
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get_byname<char>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get_byname<wchar_t>)
-
-class _LIBCPP_TYPE_VIS __time_put
-{
- locale_t __loc_;
-protected:
- _LIBCPP_INLINE_VISIBILITY __time_put() : __loc_(_LIBCPP_GET_C_LOCALE) {}
- __time_put(const char* __nm);
- __time_put(const string& __nm);
- ~__time_put();
- void __do_put(char* __nb, char*& __ne, const tm* __tm,
- char __fmt, char __mod) const;
- void __do_put(wchar_t* __wb, wchar_t*& __we, const tm* __tm,
- char __fmt, char __mod) const;
-};
-
-template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> >
-class _LIBCPP_TEMPLATE_VIS time_put
- : public locale::facet,
- private __time_put
-{
-public:
- typedef _CharT char_type;
- typedef _OutputIterator iter_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit time_put(size_t __refs = 0)
- : locale::facet(__refs) {}
-
- iter_type put(iter_type __s, ios_base& __iob, char_type __fl, const tm* __tm,
- const char_type* __pb, const char_type* __pe) const;
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type put(iter_type __s, ios_base& __iob, char_type __fl,
- const tm* __tm, char __fmt, char __mod = 0) const
- {
- return do_put(__s, __iob, __fl, __tm, __fmt, __mod);
- }
-
- static locale::id id;
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- ~time_put() {}
- virtual iter_type do_put(iter_type __s, ios_base&, char_type, const tm* __tm,
- char __fmt, char __mod) const;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit time_put(const char* __nm, size_t __refs)
- : locale::facet(__refs),
- __time_put(__nm) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit time_put(const string& __nm, size_t __refs)
- : locale::facet(__refs),
- __time_put(__nm) {}
-};
-
-template <class _CharT, class _OutputIterator>
-locale::id
-time_put<_CharT, _OutputIterator>::id;
-
-template <class _CharT, class _OutputIterator>
-_OutputIterator
-time_put<_CharT, _OutputIterator>::put(iter_type __s, ios_base& __iob,
- char_type __fl, const tm* __tm,
- const char_type* __pb,
- const char_type* __pe) const
-{
- const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc());
- for (; __pb != __pe; ++__pb)
- {
- if (__ct.narrow(*__pb, 0) == '%')
- {
- if (++__pb == __pe)
- {
- *__s++ = __pb[-1];
- break;
- }
- char __mod = 0;
- char __fmt = __ct.narrow(*__pb, 0);
- if (__fmt == 'E' || __fmt == 'O')
- {
- if (++__pb == __pe)
- {
- *__s++ = __pb[-2];
- *__s++ = __pb[-1];
- break;
- }
- __mod = __fmt;
- __fmt = __ct.narrow(*__pb, 0);
- }
- __s = do_put(__s, __iob, __fl, __tm, __fmt, __mod);
- }
- else
- *__s++ = *__pb;
- }
- return __s;
-}
-
-template <class _CharT, class _OutputIterator>
-_OutputIterator
-time_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base&,
- char_type, const tm* __tm,
- char __fmt, char __mod) const
-{
- char_type __nar[100];
- char_type* __nb = __nar;
- char_type* __ne = __nb + 100;
- __do_put(__nb, __ne, __tm, __fmt, __mod);
- return _VSTD::copy(__nb, __ne, __s);
-}
-
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put<char>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put<wchar_t>)
-
-template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> >
-class _LIBCPP_TEMPLATE_VIS time_put_byname
- : public time_put<_CharT, _OutputIterator>
-{
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit time_put_byname(const char* __nm, size_t __refs = 0)
- : time_put<_CharT, _OutputIterator>(__nm, __refs) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit time_put_byname(const string& __nm, size_t __refs = 0)
- : time_put<_CharT, _OutputIterator>(__nm, __refs) {}
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- ~time_put_byname() {}
-};
-
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put_byname<char>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put_byname<wchar_t>)
-
-// money_base
-
-class _LIBCPP_TYPE_VIS money_base
-{
-public:
- enum part {none, space, symbol, sign, value};
- struct pattern {char field[4];};
-
- _LIBCPP_INLINE_VISIBILITY money_base() {}
-};
-
-// moneypunct
-
-template <class _CharT, bool _International = false>
-class _LIBCPP_TEMPLATE_VIS moneypunct
- : public locale::facet,
- public money_base
-{
-public:
- typedef _CharT char_type;
- typedef basic_string<char_type> string_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit moneypunct(size_t __refs = 0)
- : locale::facet(__refs) {}
-
- _LIBCPP_INLINE_VISIBILITY char_type decimal_point() const {return do_decimal_point();}
- _LIBCPP_INLINE_VISIBILITY char_type thousands_sep() const {return do_thousands_sep();}
- _LIBCPP_INLINE_VISIBILITY string grouping() const {return do_grouping();}
- _LIBCPP_INLINE_VISIBILITY string_type curr_symbol() const {return do_curr_symbol();}
- _LIBCPP_INLINE_VISIBILITY string_type positive_sign() const {return do_positive_sign();}
- _LIBCPP_INLINE_VISIBILITY string_type negative_sign() const {return do_negative_sign();}
- _LIBCPP_INLINE_VISIBILITY int frac_digits() const {return do_frac_digits();}
- _LIBCPP_INLINE_VISIBILITY pattern pos_format() const {return do_pos_format();}
- _LIBCPP_INLINE_VISIBILITY pattern neg_format() const {return do_neg_format();}
-
- static locale::id id;
- static const bool intl = _International;
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- ~moneypunct() {}
-
- virtual char_type do_decimal_point() const {return numeric_limits<char_type>::max();}
- virtual char_type do_thousands_sep() const {return numeric_limits<char_type>::max();}
- virtual string do_grouping() const {return string();}
- virtual string_type do_curr_symbol() const {return string_type();}
- virtual string_type do_positive_sign() const {return string_type();}
- virtual string_type do_negative_sign() const {return string_type(1, '-');}
- virtual int do_frac_digits() const {return 0;}
- virtual pattern do_pos_format() const
- {pattern __p = {{symbol, sign, none, value}}; return __p;}
- virtual pattern do_neg_format() const
- {pattern __p = {{symbol, sign, none, value}}; return __p;}
-};
-
-template <class _CharT, bool _International>
-locale::id
-moneypunct<_CharT, _International>::id;
-
-template <class _CharT, bool _International>
-const bool
-moneypunct<_CharT, _International>::intl;
-
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<char, false>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<char, true>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<wchar_t, false>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<wchar_t, true>)
-
-// moneypunct_byname
-
-template <class _CharT, bool _International = false>
-class _LIBCPP_TEMPLATE_VIS moneypunct_byname
- : public moneypunct<_CharT, _International>
-{
-public:
- typedef money_base::pattern pattern;
- typedef _CharT char_type;
- typedef basic_string<char_type> string_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit moneypunct_byname(const char* __nm, size_t __refs = 0)
- : moneypunct<_CharT, _International>(__refs) {init(__nm);}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit moneypunct_byname(const string& __nm, size_t __refs = 0)
- : moneypunct<_CharT, _International>(__refs) {init(__nm.c_str());}
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- ~moneypunct_byname() {}
-
- virtual char_type do_decimal_point() const {return __decimal_point_;}
- virtual char_type do_thousands_sep() const {return __thousands_sep_;}
- virtual string do_grouping() const {return __grouping_;}
- virtual string_type do_curr_symbol() const {return __curr_symbol_;}
- virtual string_type do_positive_sign() const {return __positive_sign_;}
- virtual string_type do_negative_sign() const {return __negative_sign_;}
- virtual int do_frac_digits() const {return __frac_digits_;}
- virtual pattern do_pos_format() const {return __pos_format_;}
- virtual pattern do_neg_format() const {return __neg_format_;}
-
-private:
- char_type __decimal_point_;
- char_type __thousands_sep_;
- string __grouping_;
- string_type __curr_symbol_;
- string_type __positive_sign_;
- string_type __negative_sign_;
- int __frac_digits_;
- pattern __pos_format_;
- pattern __neg_format_;
-
- void init(const char*);
-};
-
-template<> _LIBCPP_FUNC_VIS void moneypunct_byname<char, false>::init(const char*);
-template<> _LIBCPP_FUNC_VIS void moneypunct_byname<char, true>::init(const char*);
-template<> _LIBCPP_FUNC_VIS void moneypunct_byname<wchar_t, false>::init(const char*);
-template<> _LIBCPP_FUNC_VIS void moneypunct_byname<wchar_t, true>::init(const char*);
-
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<char, false>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<char, true>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<wchar_t, false>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<wchar_t, true>)
-
-// money_get
-
-template <class _CharT>
-class __money_get
-{
-protected:
- typedef _CharT char_type;
- typedef basic_string<char_type> string_type;
-
- _LIBCPP_INLINE_VISIBILITY __money_get() {}
-
- static void __gather_info(bool __intl, const locale& __loc,
- money_base::pattern& __pat, char_type& __dp,
- char_type& __ts, string& __grp,
- string_type& __sym, string_type& __psn,
- string_type& __nsn, int& __fd);
-};
-
-template <class _CharT>
-void
-__money_get<_CharT>::__gather_info(bool __intl, const locale& __loc,
- money_base::pattern& __pat, char_type& __dp,
- char_type& __ts, string& __grp,
- string_type& __sym, string_type& __psn,
- string_type& __nsn, int& __fd)
-{
- if (__intl)
- {
- const moneypunct<char_type, true>& __mp =
- use_facet<moneypunct<char_type, true> >(__loc);
- __pat = __mp.neg_format();
- __nsn = __mp.negative_sign();
- __psn = __mp.positive_sign();
- __dp = __mp.decimal_point();
- __ts = __mp.thousands_sep();
- __grp = __mp.grouping();
- __sym = __mp.curr_symbol();
- __fd = __mp.frac_digits();
- }
- else
- {
- const moneypunct<char_type, false>& __mp =
- use_facet<moneypunct<char_type, false> >(__loc);
- __pat = __mp.neg_format();
- __nsn = __mp.negative_sign();
- __psn = __mp.positive_sign();
- __dp = __mp.decimal_point();
- __ts = __mp.thousands_sep();
- __grp = __mp.grouping();
- __sym = __mp.curr_symbol();
- __fd = __mp.frac_digits();
- }
-}
-
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_get<char>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_get<wchar_t>)
-
-template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> >
-class _LIBCPP_TEMPLATE_VIS money_get
- : public locale::facet,
- private __money_get<_CharT>
-{
-public:
- typedef _CharT char_type;
- typedef _InputIterator iter_type;
- typedef basic_string<char_type> string_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit money_get(size_t __refs = 0)
- : locale::facet(__refs) {}
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get(iter_type __b, iter_type __e, bool __intl, ios_base& __iob,
- ios_base::iostate& __err, long double& __v) const
- {
- return do_get(__b, __e, __intl, __iob, __err, __v);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type get(iter_type __b, iter_type __e, bool __intl, ios_base& __iob,
- ios_base::iostate& __err, string_type& __v) const
- {
- return do_get(__b, __e, __intl, __iob, __err, __v);
- }
-
- static locale::id id;
-
-protected:
-
- _LIBCPP_INLINE_VISIBILITY
- ~money_get() {}
-
- virtual iter_type do_get(iter_type __b, iter_type __e, bool __intl,
- ios_base& __iob, ios_base::iostate& __err,
- long double& __v) const;
- virtual iter_type do_get(iter_type __b, iter_type __e, bool __intl,
- ios_base& __iob, ios_base::iostate& __err,
- string_type& __v) const;
-
-private:
- static bool __do_get(iter_type& __b, iter_type __e,
- bool __intl, const locale& __loc,
- ios_base::fmtflags __flags, ios_base::iostate& __err,
- bool& __neg, const ctype<char_type>& __ct,
- unique_ptr<char_type, void(*)(void*)>& __wb,
- char_type*& __wn, char_type* __we);
-};
-
-template <class _CharT, class _InputIterator>
-locale::id
-money_get<_CharT, _InputIterator>::id;
-
-_LIBCPP_FUNC_VIS void __do_nothing(void*);
-
-template <class _Tp>
-_LIBCPP_HIDDEN
-void
-__double_or_nothing(unique_ptr<_Tp, void(*)(void*)>& __b, _Tp*& __n, _Tp*& __e)
-{
- bool __owns = __b.get_deleter() != __do_nothing;
- size_t __cur_cap = static_cast<size_t>(__e-__b.get()) * sizeof(_Tp);
- size_t __new_cap = __cur_cap < numeric_limits<size_t>::max() / 2 ?
- 2 * __cur_cap : numeric_limits<size_t>::max();
- if (__new_cap == 0)
- __new_cap = sizeof(_Tp);
- size_t __n_off = static_cast<size_t>(__n - __b.get());
- _Tp* __t = (_Tp*)realloc(__owns ? __b.get() : 0, __new_cap);
- if (__t == 0)
- __throw_bad_alloc();
- if (__owns)
- __b.release();
- __b = unique_ptr<_Tp, void(*)(void*)>(__t, free);
- __new_cap /= sizeof(_Tp);
- __n = __b.get() + __n_off;
- __e = __b.get() + __new_cap;
-}
-
-// true == success
-template <class _CharT, class _InputIterator>
-bool
-money_get<_CharT, _InputIterator>::__do_get(iter_type& __b, iter_type __e,
- bool __intl, const locale& __loc,
- ios_base::fmtflags __flags,
- ios_base::iostate& __err,
- bool& __neg,
- const ctype<char_type>& __ct,
- unique_ptr<char_type, void(*)(void*)>& __wb,
- char_type*& __wn, char_type* __we)
-{
- const unsigned __bz = 100;
- unsigned __gbuf[__bz];
- unique_ptr<unsigned, void(*)(void*)> __gb(__gbuf, __do_nothing);
- unsigned* __gn = __gb.get();
- unsigned* __ge = __gn + __bz;
- money_base::pattern __pat;
- char_type __dp;
- char_type __ts;
- string __grp;
- string_type __sym;
- string_type __psn;
- string_type __nsn;
- // Capture the spaces read into money_base::{space,none} so they
- // can be compared to initial spaces in __sym.
- string_type __spaces;
- int __fd;
- __money_get<_CharT>::__gather_info(__intl, __loc, __pat, __dp, __ts, __grp,
- __sym, __psn, __nsn, __fd);
- const string_type* __trailing_sign = 0;
- __wn = __wb.get();
- for (unsigned __p = 0; __p < 4 && __b != __e; ++__p)
- {
- switch (__pat.field[__p])
- {
- case money_base::space:
- if (__p != 3)
- {
- if (__ct.is(ctype_base::space, *__b))
- __spaces.push_back(*__b++);
- else
- {
- __err |= ios_base::failbit;
- return false;
- }
- }
- _LIBCPP_FALLTHROUGH();
- case money_base::none:
- if (__p != 3)
- {
- while (__b != __e && __ct.is(ctype_base::space, *__b))
- __spaces.push_back(*__b++);
- }
- break;
- case money_base::sign:
- if (__psn.size() + __nsn.size() > 0)
- {
- if (__psn.size() == 0 || __nsn.size() == 0)
- { // sign is optional
- if (__psn.size() > 0)
- { // __nsn.size() == 0
- if (*__b == __psn[0])
- {
- ++__b;
- if (__psn.size() > 1)
- __trailing_sign = &__psn;
- }
- else
- __neg = true;
- }
- else if (*__b == __nsn[0]) // __nsn.size() > 0 && __psn.size() == 0
- {
- ++__b;
- __neg = true;
- if (__nsn.size() > 1)
- __trailing_sign = &__nsn;
- }
- }
- else // sign is required
- {
- if (*__b == __psn[0])
- {
- ++__b;
- if (__psn.size() > 1)
- __trailing_sign = &__psn;
- }
- else if (*__b == __nsn[0])
- {
- ++__b;
- __neg = true;
- if (__nsn.size() > 1)
- __trailing_sign = &__nsn;
- }
- else
- {
- __err |= ios_base::failbit;
- return false;
- }
- }
- }
- break;
- case money_base::symbol:
- {
- bool __more_needed = __trailing_sign ||
- (__p < 2) ||
- (__p == 2 && __pat.field[3] != static_cast<char>(money_base::none));
- bool __sb = (__flags & ios_base::showbase) != 0;
- if (__sb || __more_needed)
- {
- typename string_type::const_iterator __sym_space_end = __sym.begin();
- if (__p > 0 && (__pat.field[__p - 1] == money_base::none ||
- __pat.field[__p - 1] == money_base::space)) {
- // Match spaces we've already read against spaces at
- // the beginning of __sym.
- while (__sym_space_end != __sym.end() &&
- __ct.is(ctype_base::space, *__sym_space_end))
- ++__sym_space_end;
- const size_t __num_spaces = __sym_space_end - __sym.begin();
- if (__num_spaces > __spaces.size() ||
- !equal(__spaces.end() - __num_spaces, __spaces.end(),
- __sym.begin())) {
- // No match. Put __sym_space_end back at the
- // beginning of __sym, which will prevent a
- // match in the next loop.
- __sym_space_end = __sym.begin();
- }
- }
- typename string_type::const_iterator __sym_curr_char = __sym_space_end;
- while (__sym_curr_char != __sym.end() && __b != __e &&
- *__b == *__sym_curr_char) {
- ++__b;
- ++__sym_curr_char;
- }
- if (__sb && __sym_curr_char != __sym.end())
- {
- __err |= ios_base::failbit;
- return false;
- }
- }
- }
- break;
- case money_base::value:
- {
- unsigned __ng = 0;
- for (; __b != __e; ++__b)
- {
- char_type __c = *__b;
- if (__ct.is(ctype_base::digit, __c))
- {
- if (__wn == __we)
- __double_or_nothing(__wb, __wn, __we);
- *__wn++ = __c;
- ++__ng;
- }
- else if (__grp.size() > 0 && __ng > 0 && __c == __ts)
- {
- if (__gn == __ge)
- __double_or_nothing(__gb, __gn, __ge);
- *__gn++ = __ng;
- __ng = 0;
- }
- else
- break;
- }
- if (__gb.get() != __gn && __ng > 0)
- {
- if (__gn == __ge)
- __double_or_nothing(__gb, __gn, __ge);
- *__gn++ = __ng;
- }
- if (__fd > 0)
- {
- if (__b == __e || *__b != __dp)
- {
- __err |= ios_base::failbit;
- return false;
- }
- for (++__b; __fd > 0; --__fd, ++__b)
- {
- if (__b == __e || !__ct.is(ctype_base::digit, *__b))
- {
- __err |= ios_base::failbit;
- return false;
- }
- if (__wn == __we)
- __double_or_nothing(__wb, __wn, __we);
- *__wn++ = *__b;
- }
- }
- if (__wn == __wb.get())
- {
- __err |= ios_base::failbit;
- return false;
- }
- }
- break;
- }
- }
- if (__trailing_sign)
- {
- for (unsigned __i = 1; __i < __trailing_sign->size(); ++__i, ++__b)
- {
- if (__b == __e || *__b != (*__trailing_sign)[__i])
- {
- __err |= ios_base::failbit;
- return false;
- }
- }
- }
- if (__gb.get() != __gn)
- {
- ios_base::iostate __et = ios_base::goodbit;
- __check_grouping(__grp, __gb.get(), __gn, __et);
- if (__et)
- {
- __err |= ios_base::failbit;
- return false;
- }
- }
- return true;
-}
-
-template <class _CharT, class _InputIterator>
-_InputIterator
-money_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e,
- bool __intl, ios_base& __iob,
- ios_base::iostate& __err,
- long double& __v) const
-{
- const int __bz = 100;
- char_type __wbuf[__bz];
- unique_ptr<char_type, void(*)(void*)> __wb(__wbuf, __do_nothing);
- char_type* __wn;
- char_type* __we = __wbuf + __bz;
- locale __loc = __iob.getloc();
- const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__loc);
- bool __neg = false;
- if (__do_get(__b, __e, __intl, __loc, __iob.flags(), __err, __neg, __ct,
- __wb, __wn, __we))
- {
- const char __src[] = "0123456789";
- char_type __atoms[sizeof(__src)-1];
- __ct.widen(__src, __src + (sizeof(__src)-1), __atoms);
- char __nbuf[__bz];
- char* __nc = __nbuf;
- unique_ptr<char, void(*)(void*)> __h(0, free);
- if (__wn - __wb.get() > __bz-2)
- {
- __h.reset((char*)malloc(static_cast<size_t>(__wn - __wb.get() + 2)));
- if (__h.get() == 0)
- __throw_bad_alloc();
- __nc = __h.get();
- }
- if (__neg)
- *__nc++ = '-';
- for (const char_type* __w = __wb.get(); __w < __wn; ++__w, ++__nc)
- *__nc = __src[find(__atoms, _VSTD::end(__atoms), *__w) - __atoms];
- *__nc = char();
- if (sscanf(__nbuf, "%Lf", &__v) != 1)
- __throw_runtime_error("money_get error");
- }
- if (__b == __e)
- __err |= ios_base::eofbit;
- return __b;
-}
-
-template <class _CharT, class _InputIterator>
-_InputIterator
-money_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e,
- bool __intl, ios_base& __iob,
- ios_base::iostate& __err,
- string_type& __v) const
-{
- const int __bz = 100;
- char_type __wbuf[__bz];
- unique_ptr<char_type, void(*)(void*)> __wb(__wbuf, __do_nothing);
- char_type* __wn;
- char_type* __we = __wbuf + __bz;
- locale __loc = __iob.getloc();
- const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__loc);
- bool __neg = false;
- if (__do_get(__b, __e, __intl, __loc, __iob.flags(), __err, __neg, __ct,
- __wb, __wn, __we))
- {
- __v.clear();
- if (__neg)
- __v.push_back(__ct.widen('-'));
- char_type __z = __ct.widen('0');
- char_type* __w;
- for (__w = __wb.get(); __w < __wn-1; ++__w)
- if (*__w != __z)
- break;
- __v.append(__w, __wn);
- }
- if (__b == __e)
- __err |= ios_base::eofbit;
- return __b;
-}
-
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_get<char>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_get<wchar_t>)
-
-// money_put
-
-template <class _CharT>
-class __money_put
-{
-protected:
- typedef _CharT char_type;
- typedef basic_string<char_type> string_type;
-
- _LIBCPP_INLINE_VISIBILITY __money_put() {}
-
- static void __gather_info(bool __intl, bool __neg, const locale& __loc,
- money_base::pattern& __pat, char_type& __dp,
- char_type& __ts, string& __grp,
- string_type& __sym, string_type& __sn,
- int& __fd);
- static void __format(char_type* __mb, char_type*& __mi, char_type*& __me,
- ios_base::fmtflags __flags,
- const char_type* __db, const char_type* __de,
- const ctype<char_type>& __ct, bool __neg,
- const money_base::pattern& __pat, char_type __dp,
- char_type __ts, const string& __grp,
- const string_type& __sym, const string_type& __sn,
- int __fd);
-};
-
-template <class _CharT>
-void
-__money_put<_CharT>::__gather_info(bool __intl, bool __neg, const locale& __loc,
- money_base::pattern& __pat, char_type& __dp,
- char_type& __ts, string& __grp,
- string_type& __sym, string_type& __sn,
- int& __fd)
-{
- if (__intl)
- {
- const moneypunct<char_type, true>& __mp =
- use_facet<moneypunct<char_type, true> >(__loc);
- if (__neg)
- {
- __pat = __mp.neg_format();
- __sn = __mp.negative_sign();
- }
- else
- {
- __pat = __mp.pos_format();
- __sn = __mp.positive_sign();
- }
- __dp = __mp.decimal_point();
- __ts = __mp.thousands_sep();
- __grp = __mp.grouping();
- __sym = __mp.curr_symbol();
- __fd = __mp.frac_digits();
- }
- else
- {
- const moneypunct<char_type, false>& __mp =
- use_facet<moneypunct<char_type, false> >(__loc);
- if (__neg)
- {
- __pat = __mp.neg_format();
- __sn = __mp.negative_sign();
- }
- else
- {
- __pat = __mp.pos_format();
- __sn = __mp.positive_sign();
- }
- __dp = __mp.decimal_point();
- __ts = __mp.thousands_sep();
- __grp = __mp.grouping();
- __sym = __mp.curr_symbol();
- __fd = __mp.frac_digits();
- }
-}
-
-template <class _CharT>
-void
-__money_put<_CharT>::__format(char_type* __mb, char_type*& __mi, char_type*& __me,
- ios_base::fmtflags __flags,
- const char_type* __db, const char_type* __de,
- const ctype<char_type>& __ct, bool __neg,
- const money_base::pattern& __pat, char_type __dp,
- char_type __ts, const string& __grp,
- const string_type& __sym, const string_type& __sn,
- int __fd)
-{
- __me = __mb;
- for (unsigned __p = 0; __p < 4; ++__p)
- {
- switch (__pat.field[__p])
- {
- case money_base::none:
- __mi = __me;
- break;
- case money_base::space:
- __mi = __me;
- *__me++ = __ct.widen(' ');
- break;
- case money_base::sign:
- if (!__sn.empty())
- *__me++ = __sn[0];
- break;
- case money_base::symbol:
- if (!__sym.empty() && (__flags & ios_base::showbase))
- __me = _VSTD::copy(__sym.begin(), __sym.end(), __me);
- break;
- case money_base::value:
- {
- // remember start of value so we can reverse it
- char_type* __t = __me;
- // find beginning of digits
- if (__neg)
- ++__db;
- // find end of digits
- const char_type* __d;
- for (__d = __db; __d < __de; ++__d)
- if (!__ct.is(ctype_base::digit, *__d))
- break;
- // print fractional part
- if (__fd > 0)
- {
- int __f;
- for (__f = __fd; __d > __db && __f > 0; --__f)
- *__me++ = *--__d;
- char_type __z = __f > 0 ? __ct.widen('0') : char_type();
- for (; __f > 0; --__f)
- *__me++ = __z;
- *__me++ = __dp;
- }
- // print units part
- if (__d == __db)
- {
- *__me++ = __ct.widen('0');
- }
- else
- {
- unsigned __ng = 0;
- unsigned __ig = 0;
- unsigned __gl = __grp.empty() ? numeric_limits<unsigned>::max()
- : static_cast<unsigned>(__grp[__ig]);
- while (__d != __db)
- {
- if (__ng == __gl)
- {
- *__me++ = __ts;
- __ng = 0;
- if (++__ig < __grp.size())
- __gl = __grp[__ig] == numeric_limits<char>::max() ?
- numeric_limits<unsigned>::max() :
- static_cast<unsigned>(__grp[__ig]);
- }
- *__me++ = *--__d;
- ++__ng;
- }
- }
- // reverse it
- reverse(__t, __me);
- }
- break;
- }
- }
- // print rest of sign, if any
- if (__sn.size() > 1)
- __me = _VSTD::copy(__sn.begin()+1, __sn.end(), __me);
- // set alignment
- if ((__flags & ios_base::adjustfield) == ios_base::left)
- __mi = __me;
- else if ((__flags & ios_base::adjustfield) != ios_base::internal)
- __mi = __mb;
-}
-
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_put<char>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_put<wchar_t>)
-
-template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> >
-class _LIBCPP_TEMPLATE_VIS money_put
- : public locale::facet,
- private __money_put<_CharT>
-{
-public:
- typedef _CharT char_type;
- typedef _OutputIterator iter_type;
- typedef basic_string<char_type> string_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit money_put(size_t __refs = 0)
- : locale::facet(__refs) {}
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type put(iter_type __s, bool __intl, ios_base& __iob, char_type __fl,
- long double __units) const
- {
- return do_put(__s, __intl, __iob, __fl, __units);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iter_type put(iter_type __s, bool __intl, ios_base& __iob, char_type __fl,
- const string_type& __digits) const
- {
- return do_put(__s, __intl, __iob, __fl, __digits);
- }
-
- static locale::id id;
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- ~money_put() {}
-
- virtual iter_type do_put(iter_type __s, bool __intl, ios_base& __iob,
- char_type __fl, long double __units) const;
- virtual iter_type do_put(iter_type __s, bool __intl, ios_base& __iob,
- char_type __fl, const string_type& __digits) const;
-};
-
-template <class _CharT, class _OutputIterator>
-locale::id
-money_put<_CharT, _OutputIterator>::id;
-
-template <class _CharT, class _OutputIterator>
-_OutputIterator
-money_put<_CharT, _OutputIterator>::do_put(iter_type __s, bool __intl,
- ios_base& __iob, char_type __fl,
- long double __units) const
-{
- // convert to char
- const size_t __bs = 100;
- char __buf[__bs];
- char* __bb = __buf;
- char_type __digits[__bs];
- char_type* __db = __digits;
- size_t __n = static_cast<size_t>(snprintf(__bb, __bs, "%.0Lf", __units));
- unique_ptr<char, void(*)(void*)> __hn(0, free);
- unique_ptr<char_type, void(*)(void*)> __hd(0, free);
- // secure memory for digit storage
- if (__n > __bs-1)
- {
- __n = static_cast<size_t>(__libcpp_asprintf_l(&__bb, _LIBCPP_GET_C_LOCALE, "%.0Lf", __units));
- if (__n == -1)
- __throw_bad_alloc();
- __hn.reset(__bb);
- __hd.reset((char_type*)malloc(__n * sizeof(char_type)));
- if (__hd == nullptr)
- __throw_bad_alloc();
- __db = __hd.get();
- }
- // gather info
- locale __loc = __iob.getloc();
- const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__loc);
- __ct.widen(__bb, __bb + __n, __db);
- bool __neg = __n > 0 && __bb[0] == '-';
- money_base::pattern __pat;
- char_type __dp;
- char_type __ts;
- string __grp;
- string_type __sym;
- string_type __sn;
- int __fd;
- this->__gather_info(__intl, __neg, __loc, __pat, __dp, __ts, __grp, __sym, __sn, __fd);
- // secure memory for formatting
- char_type __mbuf[__bs];
- char_type* __mb = __mbuf;
- unique_ptr<char_type, void(*)(void*)> __hw(0, free);
- size_t __exn = static_cast<int>(__n) > __fd ?
- (__n - static_cast<size_t>(__fd)) * 2 + __sn.size() +
- __sym.size() + static_cast<size_t>(__fd) + 1
- : __sn.size() + __sym.size() + static_cast<size_t>(__fd) + 2;
- if (__exn > __bs)
- {
- __hw.reset((char_type*)malloc(__exn * sizeof(char_type)));
- __mb = __hw.get();
- if (__mb == 0)
- __throw_bad_alloc();
- }
- // format
- char_type* __mi;
- char_type* __me;
- this->__format(__mb, __mi, __me, __iob.flags(),
- __db, __db + __n, __ct,
- __neg, __pat, __dp, __ts, __grp, __sym, __sn, __fd);
- return __pad_and_output(__s, __mb, __mi, __me, __iob, __fl);
-}
-
-template <class _CharT, class _OutputIterator>
-_OutputIterator
-money_put<_CharT, _OutputIterator>::do_put(iter_type __s, bool __intl,
- ios_base& __iob, char_type __fl,
- const string_type& __digits) const
-{
- // gather info
- locale __loc = __iob.getloc();
- const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__loc);
- bool __neg = __digits.size() > 0 && __digits[0] == __ct.widen('-');
- money_base::pattern __pat;
- char_type __dp;
- char_type __ts;
- string __grp;
- string_type __sym;
- string_type __sn;
- int __fd;
- this->__gather_info(__intl, __neg, __loc, __pat, __dp, __ts, __grp, __sym, __sn, __fd);
- // secure memory for formatting
- char_type __mbuf[100];
- char_type* __mb = __mbuf;
- unique_ptr<char_type, void(*)(void*)> __h(0, free);
- size_t __exn = static_cast<int>(__digits.size()) > __fd ?
- (__digits.size() - static_cast<size_t>(__fd)) * 2 +
- __sn.size() + __sym.size() + static_cast<size_t>(__fd) + 1
- : __sn.size() + __sym.size() + static_cast<size_t>(__fd) + 2;
- if (__exn > 100)
- {
- __h.reset((char_type*)malloc(__exn * sizeof(char_type)));
- __mb = __h.get();
- if (__mb == 0)
- __throw_bad_alloc();
- }
- // format
- char_type* __mi;
- char_type* __me;
- this->__format(__mb, __mi, __me, __iob.flags(),
- __digits.data(), __digits.data() + __digits.size(), __ct,
- __neg, __pat, __dp, __ts, __grp, __sym, __sn, __fd);
- return __pad_and_output(__s, __mb, __mi, __me, __iob, __fl);
-}
-
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_put<char>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_put<wchar_t>)
-
-// messages
-
-class _LIBCPP_TYPE_VIS messages_base
-{
-public:
- typedef ptrdiff_t catalog;
-
- _LIBCPP_INLINE_VISIBILITY messages_base() {}
-};
-
-template <class _CharT>
-class _LIBCPP_TEMPLATE_VIS messages
- : public locale::facet,
- public messages_base
-{
-public:
- typedef _CharT char_type;
- typedef basic_string<_CharT> string_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit messages(size_t __refs = 0)
- : locale::facet(__refs) {}
-
- _LIBCPP_INLINE_VISIBILITY
- catalog open(const basic_string<char>& __nm, const locale& __loc) const
- {
- return do_open(__nm, __loc);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- string_type get(catalog __c, int __set, int __msgid,
- const string_type& __dflt) const
- {
- return do_get(__c, __set, __msgid, __dflt);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void close(catalog __c) const
- {
- do_close(__c);
- }
-
- static locale::id id;
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- ~messages() {}
-
- virtual catalog do_open(const basic_string<char>&, const locale&) const;
- virtual string_type do_get(catalog, int __set, int __msgid,
- const string_type& __dflt) const;
- virtual void do_close(catalog) const;
-};
-
-template <class _CharT>
-locale::id
-messages<_CharT>::id;
-
-template <class _CharT>
-typename messages<_CharT>::catalog
-messages<_CharT>::do_open(const basic_string<char>& __nm, const locale&) const
-{
-#ifdef _LIBCPP_HAS_CATOPEN
- catalog __cat = (catalog)catopen(__nm.c_str(), NL_CAT_LOCALE);
- if (__cat != -1)
- __cat = static_cast<catalog>((static_cast<size_t>(__cat) >> 1));
- return __cat;
-#else // !_LIBCPP_HAS_CATOPEN
- _LIBCPP_UNUSED_VAR(__nm);
- return -1;
-#endif // _LIBCPP_HAS_CATOPEN
-}
-
-template <class _CharT>
-typename messages<_CharT>::string_type
-messages<_CharT>::do_get(catalog __c, int __set, int __msgid,
- const string_type& __dflt) const
-{
-#ifdef _LIBCPP_HAS_CATOPEN
- string __ndflt;
- __narrow_to_utf8<sizeof(char_type)*__CHAR_BIT__>()(back_inserter(__ndflt),
- __dflt.c_str(),
- __dflt.c_str() + __dflt.size());
- if (__c != -1)
- __c <<= 1;
- nl_catd __cat = (nl_catd)__c;
- char* __n = catgets(__cat, __set, __msgid, __ndflt.c_str());
- string_type __w;
- __widen_from_utf8<sizeof(char_type)*__CHAR_BIT__>()(back_inserter(__w),
- __n, __n + strlen(__n));
- return __w;
-#else // !_LIBCPP_HAS_CATOPEN
- _LIBCPP_UNUSED_VAR(__c);
- _LIBCPP_UNUSED_VAR(__set);
- _LIBCPP_UNUSED_VAR(__msgid);
- return __dflt;
-#endif // _LIBCPP_HAS_CATOPEN
-}
-
-template <class _CharT>
-void
-messages<_CharT>::do_close(catalog __c) const
-{
-#ifdef _LIBCPP_HAS_CATOPEN
- if (__c != -1)
- __c <<= 1;
- nl_catd __cat = (nl_catd)__c;
- catclose(__cat);
-#else // !_LIBCPP_HAS_CATOPEN
- _LIBCPP_UNUSED_VAR(__c);
-#endif // _LIBCPP_HAS_CATOPEN
-}
-
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages<char>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages<wchar_t>)
-
-template <class _CharT>
-class _LIBCPP_TEMPLATE_VIS messages_byname
- : public messages<_CharT>
-{
-public:
- typedef messages_base::catalog catalog;
- typedef basic_string<_CharT> string_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit messages_byname(const char*, size_t __refs = 0)
- : messages<_CharT>(__refs) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit messages_byname(const string&, size_t __refs = 0)
- : messages<_CharT>(__refs) {}
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- ~messages_byname() {}
-};
-
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages_byname<char>)
-_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages_byname<wchar_t>)
-
-template<class _Codecvt, class _Elem = wchar_t,
- class _Wide_alloc = allocator<_Elem>,
- class _Byte_alloc = allocator<char> >
-class _LIBCPP_TEMPLATE_VIS wstring_convert
-{
-public:
- typedef basic_string<char, char_traits<char>, _Byte_alloc> byte_string;
- typedef basic_string<_Elem, char_traits<_Elem>, _Wide_alloc> wide_string;
- typedef typename _Codecvt::state_type state_type;
- typedef typename wide_string::traits_type::int_type int_type;
-
-private:
- byte_string __byte_err_string_;
- wide_string __wide_err_string_;
- _Codecvt* __cvtptr_;
- state_type __cvtstate_;
- size_t __cvtcount_;
-
- wstring_convert(const wstring_convert& __wc);
- wstring_convert& operator=(const wstring_convert& __wc);
-public:
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_EXPLICIT_AFTER_CXX11 wstring_convert(_Codecvt* __pcvt = new _Codecvt);
- _LIBCPP_INLINE_VISIBILITY
- wstring_convert(_Codecvt* __pcvt, state_type __state);
- _LIBCPP_EXPLICIT_AFTER_CXX11 wstring_convert(const byte_string& __byte_err,
- const wide_string& __wide_err = wide_string());
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- wstring_convert(wstring_convert&& __wc);
-#endif
- ~wstring_convert();
-
- _LIBCPP_INLINE_VISIBILITY
- wide_string from_bytes(char __byte)
- {return from_bytes(&__byte, &__byte+1);}
- _LIBCPP_INLINE_VISIBILITY
- wide_string from_bytes(const char* __ptr)
- {return from_bytes(__ptr, __ptr + char_traits<char>::length(__ptr));}
- _LIBCPP_INLINE_VISIBILITY
- wide_string from_bytes(const byte_string& __str)
- {return from_bytes(__str.data(), __str.data() + __str.size());}
- wide_string from_bytes(const char* __first, const char* __last);
-
- _LIBCPP_INLINE_VISIBILITY
- byte_string to_bytes(_Elem __wchar)
- {return to_bytes(&__wchar, &__wchar+1);}
- _LIBCPP_INLINE_VISIBILITY
- byte_string to_bytes(const _Elem* __wptr)
- {return to_bytes(__wptr, __wptr + char_traits<_Elem>::length(__wptr));}
- _LIBCPP_INLINE_VISIBILITY
- byte_string to_bytes(const wide_string& __wstr)
- {return to_bytes(__wstr.data(), __wstr.data() + __wstr.size());}
- byte_string to_bytes(const _Elem* __first, const _Elem* __last);
-
- _LIBCPP_INLINE_VISIBILITY
- size_t converted() const _NOEXCEPT {return __cvtcount_;}
- _LIBCPP_INLINE_VISIBILITY
- state_type state() const {return __cvtstate_;}
-};
-
-template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc>
-inline
-wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::
- wstring_convert(_Codecvt* __pcvt)
- : __cvtptr_(__pcvt), __cvtstate_(), __cvtcount_(0)
-{
-}
-
-template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc>
-inline
-wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::
- wstring_convert(_Codecvt* __pcvt, state_type __state)
- : __cvtptr_(__pcvt), __cvtstate_(__state), __cvtcount_(0)
-{
-}
-
-template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc>
-wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::
- wstring_convert(const byte_string& __byte_err, const wide_string& __wide_err)
- : __byte_err_string_(__byte_err), __wide_err_string_(__wide_err),
- __cvtstate_(), __cvtcount_(0)
-{
- __cvtptr_ = new _Codecvt;
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc>
-inline
-wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::
- wstring_convert(wstring_convert&& __wc)
- : __byte_err_string_(_VSTD::move(__wc.__byte_err_string_)),
- __wide_err_string_(_VSTD::move(__wc.__wide_err_string_)),
- __cvtptr_(__wc.__cvtptr_),
- __cvtstate_(__wc.__cvtstate_), __cvtcount_(__wc.__cvtcount_)
-{
- __wc.__cvtptr_ = nullptr;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc>
-wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::~wstring_convert()
-{
- delete __cvtptr_;
-}
-
-template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc>
-typename wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::wide_string
-wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::
- from_bytes(const char* __frm, const char* __frm_end)
-{
- __cvtcount_ = 0;
- if (__cvtptr_ != nullptr)
- {
- wide_string __ws(2*(__frm_end - __frm), _Elem());
- if (__frm != __frm_end)
- __ws.resize(__ws.capacity());
- codecvt_base::result __r = codecvt_base::ok;
- state_type __st = __cvtstate_;
- if (__frm != __frm_end)
- {
- _Elem* __to = &__ws[0];
- _Elem* __to_end = __to + __ws.size();
- const char* __frm_nxt;
- do
- {
- _Elem* __to_nxt;
- __r = __cvtptr_->in(__st, __frm, __frm_end, __frm_nxt,
- __to, __to_end, __to_nxt);
- __cvtcount_ += __frm_nxt - __frm;
- if (__frm_nxt == __frm)
- {
- __r = codecvt_base::error;
- }
- else if (__r == codecvt_base::noconv)
- {
- __ws.resize(__to - &__ws[0]);
- // This only gets executed if _Elem is char
- __ws.append((const _Elem*)__frm, (const _Elem*)__frm_end);
- __frm = __frm_nxt;
- __r = codecvt_base::ok;
- }
- else if (__r == codecvt_base::ok)
- {
- __ws.resize(__to_nxt - &__ws[0]);
- __frm = __frm_nxt;
- }
- else if (__r == codecvt_base::partial)
- {
- ptrdiff_t __s = __to_nxt - &__ws[0];
- __ws.resize(2 * __s);
- __to = &__ws[0] + __s;
- __to_end = &__ws[0] + __ws.size();
- __frm = __frm_nxt;
- }
- } while (__r == codecvt_base::partial && __frm_nxt < __frm_end);
- }
- if (__r == codecvt_base::ok)
- return __ws;
- }
-
- if (__wide_err_string_.empty())
- __throw_range_error("wstring_convert: from_bytes error");
-
- return __wide_err_string_;
-}
-
-template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc>
-typename wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::byte_string
-wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::
- to_bytes(const _Elem* __frm, const _Elem* __frm_end)
-{
- __cvtcount_ = 0;
- if (__cvtptr_ != nullptr)
- {
- byte_string __bs(2*(__frm_end - __frm), char());
- if (__frm != __frm_end)
- __bs.resize(__bs.capacity());
- codecvt_base::result __r = codecvt_base::ok;
- state_type __st = __cvtstate_;
- if (__frm != __frm_end)
- {
- char* __to = &__bs[0];
- char* __to_end = __to + __bs.size();
- const _Elem* __frm_nxt;
- do
- {
- char* __to_nxt;
- __r = __cvtptr_->out(__st, __frm, __frm_end, __frm_nxt,
- __to, __to_end, __to_nxt);
- __cvtcount_ += __frm_nxt - __frm;
- if (__frm_nxt == __frm)
- {
- __r = codecvt_base::error;
- }
- else if (__r == codecvt_base::noconv)
- {
- __bs.resize(__to - &__bs[0]);
- // This only gets executed if _Elem is char
- __bs.append((const char*)__frm, (const char*)__frm_end);
- __frm = __frm_nxt;
- __r = codecvt_base::ok;
- }
- else if (__r == codecvt_base::ok)
- {
- __bs.resize(__to_nxt - &__bs[0]);
- __frm = __frm_nxt;
- }
- else if (__r == codecvt_base::partial)
- {
- ptrdiff_t __s = __to_nxt - &__bs[0];
- __bs.resize(2 * __s);
- __to = &__bs[0] + __s;
- __to_end = &__bs[0] + __bs.size();
- __frm = __frm_nxt;
- }
- } while (__r == codecvt_base::partial && __frm_nxt < __frm_end);
- }
- if (__r == codecvt_base::ok)
- {
- size_t __s = __bs.size();
- __bs.resize(__bs.capacity());
- char* __to = &__bs[0] + __s;
- char* __to_end = __to + __bs.size();
- do
- {
- char* __to_nxt;
- __r = __cvtptr_->unshift(__st, __to, __to_end, __to_nxt);
- if (__r == codecvt_base::noconv)
- {
- __bs.resize(__to - &__bs[0]);
- __r = codecvt_base::ok;
- }
- else if (__r == codecvt_base::ok)
- {
- __bs.resize(__to_nxt - &__bs[0]);
- }
- else if (__r == codecvt_base::partial)
- {
- ptrdiff_t __sp = __to_nxt - &__bs[0];
- __bs.resize(2 * __sp);
- __to = &__bs[0] + __sp;
- __to_end = &__bs[0] + __bs.size();
- }
- } while (__r == codecvt_base::partial);
- if (__r == codecvt_base::ok)
- return __bs;
- }
- }
-
- if (__byte_err_string_.empty())
- __throw_range_error("wstring_convert: to_bytes error");
-
- return __byte_err_string_;
-}
-
-template <class _Codecvt, class _Elem = wchar_t, class _Tr = char_traits<_Elem> >
-class _LIBCPP_TEMPLATE_VIS wbuffer_convert
- : public basic_streambuf<_Elem, _Tr>
-{
-public:
- // types:
- typedef _Elem char_type;
- typedef _Tr traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
- typedef typename _Codecvt::state_type state_type;
-
-private:
- char* __extbuf_;
- const char* __extbufnext_;
- const char* __extbufend_;
- char __extbuf_min_[8];
- size_t __ebs_;
- char_type* __intbuf_;
- size_t __ibs_;
- streambuf* __bufptr_;
- _Codecvt* __cv_;
- state_type __st_;
- ios_base::openmode __cm_;
- bool __owns_eb_;
- bool __owns_ib_;
- bool __always_noconv_;
-
- wbuffer_convert(const wbuffer_convert&);
- wbuffer_convert& operator=(const wbuffer_convert&);
-public:
- _LIBCPP_EXPLICIT_AFTER_CXX11 wbuffer_convert(streambuf* __bytebuf = 0,
- _Codecvt* __pcvt = new _Codecvt, state_type __state = state_type());
- ~wbuffer_convert();
-
- _LIBCPP_INLINE_VISIBILITY
- streambuf* rdbuf() const {return __bufptr_;}
- _LIBCPP_INLINE_VISIBILITY
- streambuf* rdbuf(streambuf* __bytebuf)
- {
- streambuf* __r = __bufptr_;
- __bufptr_ = __bytebuf;
- return __r;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- state_type state() const {return __st_;}
-
-protected:
- virtual int_type underflow();
- virtual int_type pbackfail(int_type __c = traits_type::eof());
- virtual int_type overflow (int_type __c = traits_type::eof());
- virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* __s,
- streamsize __n);
- virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
- ios_base::openmode __wch = ios_base::in | ios_base::out);
- virtual pos_type seekpos(pos_type __sp,
- ios_base::openmode __wch = ios_base::in | ios_base::out);
- virtual int sync();
-
-private:
- bool __read_mode();
- void __write_mode();
- wbuffer_convert* __close();
-};
-
-template <class _Codecvt, class _Elem, class _Tr>
-wbuffer_convert<_Codecvt, _Elem, _Tr>::
- wbuffer_convert(streambuf* __bytebuf, _Codecvt* __pcvt, state_type __state)
- : __extbuf_(0),
- __extbufnext_(0),
- __extbufend_(0),
- __ebs_(0),
- __intbuf_(0),
- __ibs_(0),
- __bufptr_(__bytebuf),
- __cv_(__pcvt),
- __st_(__state),
- __cm_(0),
- __owns_eb_(false),
- __owns_ib_(false),
- __always_noconv_(__cv_ ? __cv_->always_noconv() : false)
-{
- setbuf(0, 4096);
-}
-
-template <class _Codecvt, class _Elem, class _Tr>
-wbuffer_convert<_Codecvt, _Elem, _Tr>::~wbuffer_convert()
-{
- __close();
- delete __cv_;
- if (__owns_eb_)
- delete [] __extbuf_;
- if (__owns_ib_)
- delete [] __intbuf_;
-}
-
-template <class _Codecvt, class _Elem, class _Tr>
-typename wbuffer_convert<_Codecvt, _Elem, _Tr>::int_type
-wbuffer_convert<_Codecvt, _Elem, _Tr>::underflow()
-{
- if (__cv_ == 0 || __bufptr_ == 0)
- return traits_type::eof();
- bool __initial = __read_mode();
- char_type __1buf;
- if (this->gptr() == 0)
- this->setg(&__1buf, &__1buf+1, &__1buf+1);
- const size_t __unget_sz = __initial ? 0 : min<size_t>((this->egptr() - this->eback()) / 2, 4);
- int_type __c = traits_type::eof();
- if (this->gptr() == this->egptr())
- {
- memmove(this->eback(), this->egptr() - __unget_sz, __unget_sz * sizeof(char_type));
- if (__always_noconv_)
- {
- streamsize __nmemb = static_cast<streamsize>(this->egptr() - this->eback() - __unget_sz);
- __nmemb = __bufptr_->sgetn((char*)this->eback() + __unget_sz, __nmemb);
- if (__nmemb != 0)
- {
- this->setg(this->eback(),
- this->eback() + __unget_sz,
- this->eback() + __unget_sz + __nmemb);
- __c = *this->gptr();
- }
- }
- else
- {
- _LIBCPP_ASSERT(!(__extbufnext_ == NULL && (__extbufend_ != __extbufnext_)), "underflow moving from NULL" );
- if (__extbufend_ != __extbufnext_)
- memmove(__extbuf_, __extbufnext_, __extbufend_ - __extbufnext_);
- __extbufnext_ = __extbuf_ + (__extbufend_ - __extbufnext_);
- __extbufend_ = __extbuf_ + (__extbuf_ == __extbuf_min_ ? sizeof(__extbuf_min_) : __ebs_);
- streamsize __nmemb = _VSTD::min(static_cast<streamsize>(this->egptr() - this->eback() - __unget_sz),
- static_cast<streamsize>(__extbufend_ - __extbufnext_));
- codecvt_base::result __r;
- // FIXME: Do we ever need to restore the state here?
- //state_type __svs = __st_;
- streamsize __nr = __bufptr_->sgetn(const_cast<char*>(__extbufnext_), __nmemb);
- if (__nr != 0)
- {
- __extbufend_ = __extbufnext_ + __nr;
- char_type* __inext;
- __r = __cv_->in(__st_, __extbuf_, __extbufend_, __extbufnext_,
- this->eback() + __unget_sz,
- this->egptr(), __inext);
- if (__r == codecvt_base::noconv)
- {
- this->setg((char_type*)__extbuf_, (char_type*)__extbuf_,
- (char_type*) const_cast<char *>(__extbufend_));
- __c = *this->gptr();
- }
- else if (__inext != this->eback() + __unget_sz)
- {
- this->setg(this->eback(), this->eback() + __unget_sz, __inext);
- __c = *this->gptr();
- }
- }
- }
- }
- else
- __c = *this->gptr();
- if (this->eback() == &__1buf)
- this->setg(0, 0, 0);
- return __c;
-}
-
-template <class _Codecvt, class _Elem, class _Tr>
-typename wbuffer_convert<_Codecvt, _Elem, _Tr>::int_type
-wbuffer_convert<_Codecvt, _Elem, _Tr>::pbackfail(int_type __c)
-{
- if (__cv_ != 0 && __bufptr_ != 0 && this->eback() < this->gptr())
- {
- if (traits_type::eq_int_type(__c, traits_type::eof()))
- {
- this->gbump(-1);
- return traits_type::not_eof(__c);
- }
- if (traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1]))
- {
- this->gbump(-1);
- *this->gptr() = traits_type::to_char_type(__c);
- return __c;
- }
- }
- return traits_type::eof();
-}
-
-template <class _Codecvt, class _Elem, class _Tr>
-typename wbuffer_convert<_Codecvt, _Elem, _Tr>::int_type
-wbuffer_convert<_Codecvt, _Elem, _Tr>::overflow(int_type __c)
-{
- if (__cv_ == 0 || __bufptr_ == 0)
- return traits_type::eof();
- __write_mode();
- char_type __1buf;
- char_type* __pb_save = this->pbase();
- char_type* __epb_save = this->epptr();
- if (!traits_type::eq_int_type(__c, traits_type::eof()))
- {
- if (this->pptr() == 0)
- this->setp(&__1buf, &__1buf+1);
- *this->pptr() = traits_type::to_char_type(__c);
- this->pbump(1);
- }
- if (this->pptr() != this->pbase())
- {
- if (__always_noconv_)
- {
- streamsize __nmemb = static_cast<streamsize>(this->pptr() - this->pbase());
- if (__bufptr_->sputn((const char*)this->pbase(), __nmemb) != __nmemb)
- return traits_type::eof();
- }
- else
- {
- char* __extbe = __extbuf_;
- codecvt_base::result __r;
- do
- {
- const char_type* __e;
- __r = __cv_->out(__st_, this->pbase(), this->pptr(), __e,
- __extbuf_, __extbuf_ + __ebs_, __extbe);
- if (__e == this->pbase())
- return traits_type::eof();
- if (__r == codecvt_base::noconv)
- {
- streamsize __nmemb = static_cast<size_t>(this->pptr() - this->pbase());
- if (__bufptr_->sputn((const char*)this->pbase(), __nmemb) != __nmemb)
- return traits_type::eof();
- }
- else if (__r == codecvt_base::ok || __r == codecvt_base::partial)
- {
- streamsize __nmemb = static_cast<size_t>(__extbe - __extbuf_);
- if (__bufptr_->sputn(__extbuf_, __nmemb) != __nmemb)
- return traits_type::eof();
- if (__r == codecvt_base::partial)
- {
- this->setp(const_cast<char_type *>(__e), this->pptr());
- this->__pbump(this->epptr() - this->pbase());
- }
- }
- else
- return traits_type::eof();
- } while (__r == codecvt_base::partial);
- }
- this->setp(__pb_save, __epb_save);
- }
- return traits_type::not_eof(__c);
-}
-
-template <class _Codecvt, class _Elem, class _Tr>
-basic_streambuf<_Elem, _Tr>*
-wbuffer_convert<_Codecvt, _Elem, _Tr>::setbuf(char_type* __s, streamsize __n)
-{
- this->setg(0, 0, 0);
- this->setp(0, 0);
- if (__owns_eb_)
- delete [] __extbuf_;
- if (__owns_ib_)
- delete [] __intbuf_;
- __ebs_ = __n;
- if (__ebs_ > sizeof(__extbuf_min_))
- {
- if (__always_noconv_ && __s)
- {
- __extbuf_ = (char*)__s;
- __owns_eb_ = false;
- }
- else
- {
- __extbuf_ = new char[__ebs_];
- __owns_eb_ = true;
- }
- }
- else
- {
- __extbuf_ = __extbuf_min_;
- __ebs_ = sizeof(__extbuf_min_);
- __owns_eb_ = false;
- }
- if (!__always_noconv_)
- {
- __ibs_ = max<streamsize>(__n, sizeof(__extbuf_min_));
- if (__s && __ibs_ >= sizeof(__extbuf_min_))
- {
- __intbuf_ = __s;
- __owns_ib_ = false;
- }
- else
- {
- __intbuf_ = new char_type[__ibs_];
- __owns_ib_ = true;
- }
- }
- else
- {
- __ibs_ = 0;
- __intbuf_ = 0;
- __owns_ib_ = false;
- }
- return this;
-}
-
-template <class _Codecvt, class _Elem, class _Tr>
-typename wbuffer_convert<_Codecvt, _Elem, _Tr>::pos_type
-wbuffer_convert<_Codecvt, _Elem, _Tr>::seekoff(off_type __off, ios_base::seekdir __way,
- ios_base::openmode __om)
-{
- int __width = __cv_->encoding();
- if (__cv_ == 0 || __bufptr_ == 0 || (__width <= 0 && __off != 0) || sync())
- return pos_type(off_type(-1));
- // __width > 0 || __off == 0, now check __way
- if (__way != ios_base::beg && __way != ios_base::cur && __way != ios_base::end)
- return pos_type(off_type(-1));
- pos_type __r = __bufptr_->pubseekoff(__width * __off, __way, __om);
- __r.state(__st_);
- return __r;
-}
-
-template <class _Codecvt, class _Elem, class _Tr>
-typename wbuffer_convert<_Codecvt, _Elem, _Tr>::pos_type
-wbuffer_convert<_Codecvt, _Elem, _Tr>::seekpos(pos_type __sp, ios_base::openmode __wch)
-{
- if (__cv_ == 0 || __bufptr_ == 0 || sync())
- return pos_type(off_type(-1));
- if (__bufptr_->pubseekpos(__sp, __wch) == pos_type(off_type(-1)))
- return pos_type(off_type(-1));
- return __sp;
-}
-
-template <class _Codecvt, class _Elem, class _Tr>
-int
-wbuffer_convert<_Codecvt, _Elem, _Tr>::sync()
-{
- if (__cv_ == 0 || __bufptr_ == 0)
- return 0;
- if (__cm_ & ios_base::out)
- {
- if (this->pptr() != this->pbase())
- if (overflow() == traits_type::eof())
- return -1;
- codecvt_base::result __r;
- do
- {
- char* __extbe;
- __r = __cv_->unshift(__st_, __extbuf_, __extbuf_ + __ebs_, __extbe);
- streamsize __nmemb = static_cast<streamsize>(__extbe - __extbuf_);
- if (__bufptr_->sputn(__extbuf_, __nmemb) != __nmemb)
- return -1;
- } while (__r == codecvt_base::partial);
- if (__r == codecvt_base::error)
- return -1;
- if (__bufptr_->pubsync())
- return -1;
- }
- else if (__cm_ & ios_base::in)
- {
- off_type __c;
- if (__always_noconv_)
- __c = this->egptr() - this->gptr();
- else
- {
- int __width = __cv_->encoding();
- __c = __extbufend_ - __extbufnext_;
- if (__width > 0)
- __c += __width * (this->egptr() - this->gptr());
- else
- {
- if (this->gptr() != this->egptr())
- {
- reverse(this->gptr(), this->egptr());
- codecvt_base::result __r;
- const char_type* __e = this->gptr();
- char* __extbe;
- do
- {
- __r = __cv_->out(__st_, __e, this->egptr(), __e,
- __extbuf_, __extbuf_ + __ebs_, __extbe);
- switch (__r)
- {
- case codecvt_base::noconv:
- __c += this->egptr() - this->gptr();
- break;
- case codecvt_base::ok:
- case codecvt_base::partial:
- __c += __extbe - __extbuf_;
- break;
- default:
- return -1;
- }
- } while (__r == codecvt_base::partial);
- }
- }
- }
- if (__bufptr_->pubseekoff(-__c, ios_base::cur, __cm_) == pos_type(off_type(-1)))
- return -1;
- this->setg(0, 0, 0);
- __cm_ = 0;
- }
- return 0;
-}
-
-template <class _Codecvt, class _Elem, class _Tr>
-bool
-wbuffer_convert<_Codecvt, _Elem, _Tr>::__read_mode()
-{
- if (!(__cm_ & ios_base::in))
- {
- this->setp(0, 0);
- if (__always_noconv_)
- this->setg((char_type*)__extbuf_,
- (char_type*)__extbuf_ + __ebs_,
- (char_type*)__extbuf_ + __ebs_);
- else
- this->setg(__intbuf_, __intbuf_ + __ibs_, __intbuf_ + __ibs_);
- __cm_ = ios_base::in;
- return true;
- }
- return false;
-}
-
-template <class _Codecvt, class _Elem, class _Tr>
-void
-wbuffer_convert<_Codecvt, _Elem, _Tr>::__write_mode()
-{
- if (!(__cm_ & ios_base::out))
- {
- this->setg(0, 0, 0);
- if (__ebs_ > sizeof(__extbuf_min_))
- {
- if (__always_noconv_)
- this->setp((char_type*)__extbuf_,
- (char_type*)__extbuf_ + (__ebs_ - 1));
- else
- this->setp(__intbuf_, __intbuf_ + (__ibs_ - 1));
- }
- else
- this->setp(0, 0);
- __cm_ = ios_base::out;
- }
-}
-
-template <class _Codecvt, class _Elem, class _Tr>
-wbuffer_convert<_Codecvt, _Elem, _Tr>*
-wbuffer_convert<_Codecvt, _Elem, _Tr>::__close()
-{
- wbuffer_convert* __rt = 0;
- if (__cv_ != 0 && __bufptr_ != 0)
- {
- __rt = this;
- if ((__cm_ & ios_base::out) && sync())
- __rt = 0;
- }
- return __rt;
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_LOCALE
diff --git a/lib/libcxx/include/locale.h b/lib/libcxx/include/locale.h
deleted file mode 100644
index cad7b8b53eb..00000000000
--- a/lib/libcxx/include/locale.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- locale.h --------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_LOCALE_H
-#define _LIBCPP_LOCALE_H
-
-/*
- locale.h synopsis
-
-Macros:
-
- LC_ALL
- LC_COLLATE
- LC_CTYPE
- LC_MONETARY
- LC_NUMERIC
- LC_TIME
-
-Types:
-
- lconv
-
-Functions:
-
- setlocale
- localeconv
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#include_next <locale.h>
-
-#endif // _LIBCPP_LOCALE_H
diff --git a/lib/libcxx/include/map b/lib/libcxx/include/map
deleted file mode 100644
index 616bb46cfcc..00000000000
--- a/lib/libcxx/include/map
+++ /dev/null
@@ -1,2178 +0,0 @@
-// -*- C++ -*-
-//===----------------------------- map ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_MAP
-#define _LIBCPP_MAP
-
-/*
-
- map synopsis
-
-namespace std
-{
-
-template <class Key, class T, class Compare = less<Key>,
- class Allocator = allocator<pair<const Key, T>>>
-class map
-{
-public:
- // types:
- typedef Key key_type;
- typedef T mapped_type;
- typedef pair<const key_type, mapped_type> value_type;
- typedef Compare key_compare;
- typedef Allocator allocator_type;
- typedef typename allocator_type::reference reference;
- typedef typename allocator_type::const_reference const_reference;
- typedef typename allocator_type::pointer pointer;
- typedef typename allocator_type::const_pointer const_pointer;
- typedef typename allocator_type::size_type size_type;
- typedef typename allocator_type::difference_type difference_type;
-
- typedef implementation-defined iterator;
- typedef implementation-defined const_iterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
- typedef unspecified node_type; // C++17
- typedef INSERT_RETURN_TYPE<iterator, node_type> insert_return_type; // C++17
-
- class value_compare
- : public binary_function<value_type, value_type, bool>
- {
- friend class map;
- protected:
- key_compare comp;
-
- value_compare(key_compare c);
- public:
- bool operator()(const value_type& x, const value_type& y) const;
- };
-
- // construct/copy/destroy:
- map()
- noexcept(
- is_nothrow_default_constructible<allocator_type>::value &&
- is_nothrow_default_constructible<key_compare>::value &&
- is_nothrow_copy_constructible<key_compare>::value);
- explicit map(const key_compare& comp);
- map(const key_compare& comp, const allocator_type& a);
- template <class InputIterator>
- map(InputIterator first, InputIterator last,
- const key_compare& comp = key_compare());
- template <class InputIterator>
- map(InputIterator first, InputIterator last,
- const key_compare& comp, const allocator_type& a);
- map(const map& m);
- map(map&& m)
- noexcept(
- is_nothrow_move_constructible<allocator_type>::value &&
- is_nothrow_move_constructible<key_compare>::value);
- explicit map(const allocator_type& a);
- map(const map& m, const allocator_type& a);
- map(map&& m, const allocator_type& a);
- map(initializer_list<value_type> il, const key_compare& comp = key_compare());
- map(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a);
- template <class InputIterator>
- map(InputIterator first, InputIterator last, const allocator_type& a)
- : map(first, last, Compare(), a) {} // C++14
- map(initializer_list<value_type> il, const allocator_type& a)
- : map(il, Compare(), a) {} // C++14
- ~map();
-
- map& operator=(const map& m);
- map& operator=(map&& m)
- noexcept(
- allocator_type::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value &&
- is_nothrow_move_assignable<key_compare>::value);
- map& operator=(initializer_list<value_type> il);
-
- // iterators:
- iterator begin() noexcept;
- const_iterator begin() const noexcept;
- iterator end() noexcept;
- const_iterator end() const noexcept;
-
- reverse_iterator rbegin() noexcept;
- const_reverse_iterator rbegin() const noexcept;
- reverse_iterator rend() noexcept;
- const_reverse_iterator rend() const noexcept;
-
- const_iterator cbegin() const noexcept;
- const_iterator cend() const noexcept;
- const_reverse_iterator crbegin() const noexcept;
- const_reverse_iterator crend() const noexcept;
-
- // capacity:
- bool empty() const noexcept;
- size_type size() const noexcept;
- size_type max_size() const noexcept;
-
- // element access:
- mapped_type& operator[](const key_type& k);
- mapped_type& operator[](key_type&& k);
-
- mapped_type& at(const key_type& k);
- const mapped_type& at(const key_type& k) const;
-
- // modifiers:
- template <class... Args>
- pair<iterator, bool> emplace(Args&&... args);
- template <class... Args>
- iterator emplace_hint(const_iterator position, Args&&... args);
- pair<iterator, bool> insert(const value_type& v);
- pair<iterator, bool> insert( value_type&& v); // C++17
- template <class P>
- pair<iterator, bool> insert(P&& p);
- iterator insert(const_iterator position, const value_type& v);
- iterator insert(const_iterator position, value_type&& v); // C++17
- template <class P>
- iterator insert(const_iterator position, P&& p);
- template <class InputIterator>
- void insert(InputIterator first, InputIterator last);
- void insert(initializer_list<value_type> il);
-
- node_type extract(const_iterator position); // C++17
- node_type extract(const key_type& x); // C++17
- insert_return_type insert(node_type&& nh); // C++17
- iterator insert(const_iterator hint, node_type&& nh); // C++17
-
- template <class... Args>
- pair<iterator, bool> try_emplace(const key_type& k, Args&&... args); // C++17
- template <class... Args>
- pair<iterator, bool> try_emplace(key_type&& k, Args&&... args); // C++17
- template <class... Args>
- iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17
- template <class... Args>
- iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args); // C++17
- template <class M>
- pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj); // C++17
- template <class M>
- pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj); // C++17
- template <class M>
- iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj); // C++17
- template <class M>
- iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj); // C++17
-
- iterator erase(const_iterator position);
- iterator erase(iterator position); // C++14
- size_type erase(const key_type& k);
- iterator erase(const_iterator first, const_iterator last);
- void clear() noexcept;
-
- template<class C2>
- void merge(map<Key, T, C2, Allocator>& source); // C++17
- template<class C2>
- void merge(map<Key, T, C2, Allocator>&& source); // C++17
- template<class C2>
- void merge(multimap<Key, T, C2, Allocator>& source); // C++17
- template<class C2>
- void merge(multimap<Key, T, C2, Allocator>&& source); // C++17
-
- void swap(map& m)
- noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
- is_nothrow_swappable<key_compare>::value); // C++17
-
- // observers:
- allocator_type get_allocator() const noexcept;
- key_compare key_comp() const;
- value_compare value_comp() const;
-
- // map operations:
- iterator find(const key_type& k);
- const_iterator find(const key_type& k) const;
- template<typename K>
- iterator find(const K& x); // C++14
- template<typename K>
- const_iterator find(const K& x) const; // C++14
- template<typename K>
- size_type count(const K& x) const; // C++14
-
- size_type count(const key_type& k) const;
- iterator lower_bound(const key_type& k);
- const_iterator lower_bound(const key_type& k) const;
- template<typename K>
- iterator lower_bound(const K& x); // C++14
- template<typename K>
- const_iterator lower_bound(const K& x) const; // C++14
-
- iterator upper_bound(const key_type& k);
- const_iterator upper_bound(const key_type& k) const;
- template<typename K>
- iterator upper_bound(const K& x); // C++14
- template<typename K>
- const_iterator upper_bound(const K& x) const; // C++14
-
- pair<iterator,iterator> equal_range(const key_type& k);
- pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
- template<typename K>
- pair<iterator,iterator> equal_range(const K& x); // C++14
- template<typename K>
- pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14
-};
-
-template <class Key, class T, class Compare, class Allocator>
-bool
-operator==(const map<Key, T, Compare, Allocator>& x,
- const map<Key, T, Compare, Allocator>& y);
-
-template <class Key, class T, class Compare, class Allocator>
-bool
-operator< (const map<Key, T, Compare, Allocator>& x,
- const map<Key, T, Compare, Allocator>& y);
-
-template <class Key, class T, class Compare, class Allocator>
-bool
-operator!=(const map<Key, T, Compare, Allocator>& x,
- const map<Key, T, Compare, Allocator>& y);
-
-template <class Key, class T, class Compare, class Allocator>
-bool
-operator> (const map<Key, T, Compare, Allocator>& x,
- const map<Key, T, Compare, Allocator>& y);
-
-template <class Key, class T, class Compare, class Allocator>
-bool
-operator>=(const map<Key, T, Compare, Allocator>& x,
- const map<Key, T, Compare, Allocator>& y);
-
-template <class Key, class T, class Compare, class Allocator>
-bool
-operator<=(const map<Key, T, Compare, Allocator>& x,
- const map<Key, T, Compare, Allocator>& y);
-
-// specialized algorithms:
-template <class Key, class T, class Compare, class Allocator>
-void
-swap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y)
- noexcept(noexcept(x.swap(y)));
-
-template <class Key, class T, class Compare, class Allocator, class Predicate>
- void erase_if(map<Key, T, Compare, Allocator>& c, Predicate pred); // C++20
-
-
-template <class Key, class T, class Compare = less<Key>,
- class Allocator = allocator<pair<const Key, T>>>
-class multimap
-{
-public:
- // types:
- typedef Key key_type;
- typedef T mapped_type;
- typedef pair<const key_type,mapped_type> value_type;
- typedef Compare key_compare;
- typedef Allocator allocator_type;
- typedef typename allocator_type::reference reference;
- typedef typename allocator_type::const_reference const_reference;
- typedef typename allocator_type::size_type size_type;
- typedef typename allocator_type::difference_type difference_type;
- typedef typename allocator_type::pointer pointer;
- typedef typename allocator_type::const_pointer const_pointer;
-
- typedef implementation-defined iterator;
- typedef implementation-defined const_iterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
- typedef unspecified node_type; // C++17
-
- class value_compare
- : public binary_function<value_type,value_type,bool>
- {
- friend class multimap;
- protected:
- key_compare comp;
- value_compare(key_compare c);
- public:
- bool operator()(const value_type& x, const value_type& y) const;
- };
-
- // construct/copy/destroy:
- multimap()
- noexcept(
- is_nothrow_default_constructible<allocator_type>::value &&
- is_nothrow_default_constructible<key_compare>::value &&
- is_nothrow_copy_constructible<key_compare>::value);
- explicit multimap(const key_compare& comp);
- multimap(const key_compare& comp, const allocator_type& a);
- template <class InputIterator>
- multimap(InputIterator first, InputIterator last, const key_compare& comp);
- template <class InputIterator>
- multimap(InputIterator first, InputIterator last, const key_compare& comp,
- const allocator_type& a);
- multimap(const multimap& m);
- multimap(multimap&& m)
- noexcept(
- is_nothrow_move_constructible<allocator_type>::value &&
- is_nothrow_move_constructible<key_compare>::value);
- explicit multimap(const allocator_type& a);
- multimap(const multimap& m, const allocator_type& a);
- multimap(multimap&& m, const allocator_type& a);
- multimap(initializer_list<value_type> il, const key_compare& comp = key_compare());
- multimap(initializer_list<value_type> il, const key_compare& comp,
- const allocator_type& a);
- template <class InputIterator>
- multimap(InputIterator first, InputIterator last, const allocator_type& a)
- : multimap(first, last, Compare(), a) {} // C++14
- multimap(initializer_list<value_type> il, const allocator_type& a)
- : multimap(il, Compare(), a) {} // C++14
- ~multimap();
-
- multimap& operator=(const multimap& m);
- multimap& operator=(multimap&& m)
- noexcept(
- allocator_type::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value &&
- is_nothrow_move_assignable<key_compare>::value);
- multimap& operator=(initializer_list<value_type> il);
-
- // iterators:
- iterator begin() noexcept;
- const_iterator begin() const noexcept;
- iterator end() noexcept;
- const_iterator end() const noexcept;
-
- reverse_iterator rbegin() noexcept;
- const_reverse_iterator rbegin() const noexcept;
- reverse_iterator rend() noexcept;
- const_reverse_iterator rend() const noexcept;
-
- const_iterator cbegin() const noexcept;
- const_iterator cend() const noexcept;
- const_reverse_iterator crbegin() const noexcept;
- const_reverse_iterator crend() const noexcept;
-
- // capacity:
- bool empty() const noexcept;
- size_type size() const noexcept;
- size_type max_size() const noexcept;
-
- // modifiers:
- template <class... Args>
- iterator emplace(Args&&... args);
- template <class... Args>
- iterator emplace_hint(const_iterator position, Args&&... args);
- iterator insert(const value_type& v);
- iterator insert( value_type&& v); // C++17
- template <class P>
- iterator insert(P&& p);
- iterator insert(const_iterator position, const value_type& v);
- iterator insert(const_iterator position, value_type&& v); // C++17
- template <class P>
- iterator insert(const_iterator position, P&& p);
- template <class InputIterator>
- void insert(InputIterator first, InputIterator last);
- void insert(initializer_list<value_type> il);
-
- node_type extract(const_iterator position); // C++17
- node_type extract(const key_type& x); // C++17
- iterator insert(node_type&& nh); // C++17
- iterator insert(const_iterator hint, node_type&& nh); // C++17
-
- iterator erase(const_iterator position);
- iterator erase(iterator position); // C++14
- size_type erase(const key_type& k);
- iterator erase(const_iterator first, const_iterator last);
- void clear() noexcept;
-
- template<class C2>
- void merge(multimap<Key, T, C2, Allocator>& source); // C++17
- template<class C2>
- void merge(multimap<Key, T, C2, Allocator>&& source); // C++17
- template<class C2>
- void merge(map<Key, T, C2, Allocator>& source); // C++17
- template<class C2>
- void merge(map<Key, T, C2, Allocator>&& source); // C++17
-
- void swap(multimap& m)
- noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
- is_nothrow_swappable<key_compare>::value); // C++17
-
- // observers:
- allocator_type get_allocator() const noexcept;
- key_compare key_comp() const;
- value_compare value_comp() const;
-
- // map operations:
- iterator find(const key_type& k);
- const_iterator find(const key_type& k) const;
- template<typename K>
- iterator find(const K& x); // C++14
- template<typename K>
- const_iterator find(const K& x) const; // C++14
- template<typename K>
- size_type count(const K& x) const; // C++14
-
- size_type count(const key_type& k) const;
- iterator lower_bound(const key_type& k);
- const_iterator lower_bound(const key_type& k) const;
- template<typename K>
- iterator lower_bound(const K& x); // C++14
- template<typename K>
- const_iterator lower_bound(const K& x) const; // C++14
-
- iterator upper_bound(const key_type& k);
- const_iterator upper_bound(const key_type& k) const;
- template<typename K>
- iterator upper_bound(const K& x); // C++14
- template<typename K>
- const_iterator upper_bound(const K& x) const; // C++14
-
- pair<iterator,iterator> equal_range(const key_type& k);
- pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
- template<typename K>
- pair<iterator,iterator> equal_range(const K& x); // C++14
- template<typename K>
- pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14
-};
-
-template <class Key, class T, class Compare, class Allocator>
-bool
-operator==(const multimap<Key, T, Compare, Allocator>& x,
- const multimap<Key, T, Compare, Allocator>& y);
-
-template <class Key, class T, class Compare, class Allocator>
-bool
-operator< (const multimap<Key, T, Compare, Allocator>& x,
- const multimap<Key, T, Compare, Allocator>& y);
-
-template <class Key, class T, class Compare, class Allocator>
-bool
-operator!=(const multimap<Key, T, Compare, Allocator>& x,
- const multimap<Key, T, Compare, Allocator>& y);
-
-template <class Key, class T, class Compare, class Allocator>
-bool
-operator> (const multimap<Key, T, Compare, Allocator>& x,
- const multimap<Key, T, Compare, Allocator>& y);
-
-template <class Key, class T, class Compare, class Allocator>
-bool
-operator>=(const multimap<Key, T, Compare, Allocator>& x,
- const multimap<Key, T, Compare, Allocator>& y);
-
-template <class Key, class T, class Compare, class Allocator>
-bool
-operator<=(const multimap<Key, T, Compare, Allocator>& x,
- const multimap<Key, T, Compare, Allocator>& y);
-
-// specialized algorithms:
-template <class Key, class T, class Compare, class Allocator>
-void
-swap(multimap<Key, T, Compare, Allocator>& x,
- multimap<Key, T, Compare, Allocator>& y)
- noexcept(noexcept(x.swap(y)));
-
-template <class Key, class T, class Compare, class Allocator, class Predicate>
- void erase_if(multimap<Key, T, Compare, Allocator>& c, Predicate pred); // C++20
-
-} // std
-
-*/
-
-#include <__config>
-#include <__tree>
-#include <__node_handle>
-#include <iterator>
-#include <memory>
-#include <utility>
-#include <functional>
-#include <initializer_list>
-#include <type_traits>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Key, class _CP, class _Compare,
- bool = is_empty<_Compare>::value && !__libcpp_is_final<_Compare>::value>
-class __map_value_compare
- : private _Compare
-{
-public:
- _LIBCPP_INLINE_VISIBILITY
- __map_value_compare()
- _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
- : _Compare() {}
- _LIBCPP_INLINE_VISIBILITY
- __map_value_compare(_Compare c)
- _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
- : _Compare(c) {}
- _LIBCPP_INLINE_VISIBILITY
- const _Compare& key_comp() const _NOEXCEPT {return *this;}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _CP& __x, const _CP& __y) const
- {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y.__get_value().first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _CP& __x, const _Key& __y) const
- {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Key& __x, const _CP& __y) const
- {return static_cast<const _Compare&>(*this)(__x, __y.__get_value().first);}
- void swap(__map_value_compare&__y)
- _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
- {
- using _VSTD::swap;
- swap(static_cast<_Compare&>(*this), static_cast<_Compare&>(__y));
- }
-
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
- operator () ( const _K2& __x, const _CP& __y ) const
- {return static_cast<const _Compare&>(*this) (__x, __y.__get_value().first);}
-
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
- operator () (const _CP& __x, const _K2& __y) const
- {return static_cast<const _Compare&>(*this) (__x.__get_value().first, __y);}
-#endif
-};
-
-template <class _Key, class _CP, class _Compare>
-class __map_value_compare<_Key, _CP, _Compare, false>
-{
- _Compare comp;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- __map_value_compare()
- _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
- : comp() {}
- _LIBCPP_INLINE_VISIBILITY
- __map_value_compare(_Compare c)
- _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
- : comp(c) {}
- _LIBCPP_INLINE_VISIBILITY
- const _Compare& key_comp() const _NOEXCEPT {return comp;}
-
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _CP& __x, const _CP& __y) const
- {return comp(__x.__get_value().first, __y.__get_value().first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _CP& __x, const _Key& __y) const
- {return comp(__x.__get_value().first, __y);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Key& __x, const _CP& __y) const
- {return comp(__x, __y.__get_value().first);}
- void swap(__map_value_compare&__y)
- _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
- {
- using _VSTD::swap;
- swap(comp, __y.comp);
- }
-
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
- operator () ( const _K2& __x, const _CP& __y ) const
- {return comp (__x, __y.__get_value().first);}
-
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
- operator () (const _CP& __x, const _K2& __y) const
- {return comp (__x.__get_value().first, __y);}
-#endif
-};
-
-template <class _Key, class _CP, class _Compare, bool __b>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(__map_value_compare<_Key, _CP, _Compare, __b>& __x,
- __map_value_compare<_Key, _CP, _Compare, __b>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-template <class _Allocator>
-class __map_node_destructor
-{
- typedef _Allocator allocator_type;
- typedef allocator_traits<allocator_type> __alloc_traits;
-
-public:
- typedef typename __alloc_traits::pointer pointer;
-
-private:
- allocator_type& __na_;
-
- __map_node_destructor& operator=(const __map_node_destructor&);
-
-public:
- bool __first_constructed;
- bool __second_constructed;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT
- : __na_(__na),
- __first_constructed(false),
- __second_constructed(false)
- {}
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT
- : __na_(__x.__na_),
- __first_constructed(__x.__value_constructed),
- __second_constructed(__x.__value_constructed)
- {
- __x.__value_constructed = false;
- }
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- void operator()(pointer __p) _NOEXCEPT
- {
- if (__second_constructed)
- __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second));
- if (__first_constructed)
- __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first));
- if (__p)
- __alloc_traits::deallocate(__na_, __p, 1);
- }
-};
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
- class map;
-template <class _Key, class _Tp, class _Compare, class _Allocator>
- class multimap;
-template <class _TreeIterator> class __map_const_iterator;
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Key, class _Tp>
-struct __value_type
-{
- typedef _Key key_type;
- typedef _Tp mapped_type;
- typedef pair<const key_type, mapped_type> value_type;
- typedef pair<key_type&, mapped_type&> __nc_ref_pair_type;
- typedef pair<key_type&&, mapped_type&&> __nc_rref_pair_type;
-
-private:
- value_type __cc;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- value_type& __get_value()
- {
-#if _LIBCPP_STD_VER > 14
- return *_VSTD::launder(_VSTD::addressof(__cc));
-#else
- return __cc;
-#endif
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const value_type& __get_value() const
- {
-#if _LIBCPP_STD_VER > 14
- return *_VSTD::launder(_VSTD::addressof(__cc));
-#else
- return __cc;
-#endif
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __nc_ref_pair_type __ref()
- {
- value_type& __v = __get_value();
- return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __nc_rref_pair_type __move()
- {
- value_type& __v = __get_value();
- return __nc_rref_pair_type(
- _VSTD::move(const_cast<key_type&>(__v.first)),
- _VSTD::move(__v.second));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __value_type& operator=(const __value_type& __v)
- {
- __ref() = __v.__get_value();
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __value_type& operator=(__value_type&& __v)
- {
- __ref() = __v.__move();
- return *this;
- }
-
- template <class _ValueTp,
- class = typename enable_if<
- __is_same_uncvref<_ValueTp, value_type>::value
- >::type
- >
- _LIBCPP_INLINE_VISIBILITY
- __value_type& operator=(_ValueTp&& __v)
- {
- __ref() = _VSTD::forward<_ValueTp>(__v);
- return *this;
- }
-
-private:
- __value_type() _LIBCPP_EQUAL_DELETE;
- ~__value_type() _LIBCPP_EQUAL_DELETE;
- __value_type(const __value_type& __v) _LIBCPP_EQUAL_DELETE;
- __value_type(__value_type&& __v) _LIBCPP_EQUAL_DELETE;
-};
-
-#else
-
-template <class _Key, class _Tp>
-struct __value_type
-{
- typedef _Key key_type;
- typedef _Tp mapped_type;
- typedef pair<const key_type, mapped_type> value_type;
-
-private:
- value_type __cc;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- value_type& __get_value() { return __cc; }
- _LIBCPP_INLINE_VISIBILITY
- const value_type& __get_value() const { return __cc; }
-
-private:
- __value_type();
- __value_type(__value_type const&);
- __value_type& operator=(__value_type const&);
- ~__value_type();
-};
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp>
-struct __extract_key_value_types;
-
-template <class _Key, class _Tp>
-struct __extract_key_value_types<__value_type<_Key, _Tp> >
-{
- typedef _Key const __key_type;
- typedef _Tp __mapped_type;
-};
-
-template <class _TreeIterator>
-class _LIBCPP_TEMPLATE_VIS __map_iterator
-{
- typedef typename _TreeIterator::_NodeTypes _NodeTypes;
- typedef typename _TreeIterator::__pointer_traits __pointer_traits;
-
- _TreeIterator __i_;
-
-public:
- typedef bidirectional_iterator_tag iterator_category;
- typedef typename _NodeTypes::__map_value_type value_type;
- typedef typename _TreeIterator::difference_type difference_type;
- typedef value_type& reference;
- typedef typename _NodeTypes::__map_value_type_pointer pointer;
-
- _LIBCPP_INLINE_VISIBILITY
- __map_iterator() _NOEXCEPT {}
-
- _LIBCPP_INLINE_VISIBILITY
- __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {return __i_->__get_value();}
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
-
- _LIBCPP_INLINE_VISIBILITY
- __map_iterator& operator++() {++__i_; return *this;}
- _LIBCPP_INLINE_VISIBILITY
- __map_iterator operator++(int)
- {
- __map_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __map_iterator& operator--() {--__i_; return *this;}
- _LIBCPP_INLINE_VISIBILITY
- __map_iterator operator--(int)
- {
- __map_iterator __t(*this);
- --(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __map_iterator& __x, const __map_iterator& __y)
- {return __x.__i_ == __y.__i_;}
- friend
- _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __map_iterator& __x, const __map_iterator& __y)
- {return __x.__i_ != __y.__i_;}
-
- template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
- template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator;
-};
-
-template <class _TreeIterator>
-class _LIBCPP_TEMPLATE_VIS __map_const_iterator
-{
- typedef typename _TreeIterator::_NodeTypes _NodeTypes;
- typedef typename _TreeIterator::__pointer_traits __pointer_traits;
-
- _TreeIterator __i_;
-
-public:
- typedef bidirectional_iterator_tag iterator_category;
- typedef typename _NodeTypes::__map_value_type value_type;
- typedef typename _TreeIterator::difference_type difference_type;
- typedef const value_type& reference;
- typedef typename _NodeTypes::__const_map_value_type_pointer pointer;
-
- _LIBCPP_INLINE_VISIBILITY
- __map_const_iterator() _NOEXCEPT {}
-
- _LIBCPP_INLINE_VISIBILITY
- __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
- _LIBCPP_INLINE_VISIBILITY
- __map_const_iterator(__map_iterator<
- typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT
- : __i_(__i.__i_) {}
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {return __i_->__get_value();}
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
-
- _LIBCPP_INLINE_VISIBILITY
- __map_const_iterator& operator++() {++__i_; return *this;}
- _LIBCPP_INLINE_VISIBILITY
- __map_const_iterator operator++(int)
- {
- __map_const_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __map_const_iterator& operator--() {--__i_; return *this;}
- _LIBCPP_INLINE_VISIBILITY
- __map_const_iterator operator--(int)
- {
- __map_const_iterator __t(*this);
- --(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y)
- {return __x.__i_ == __y.__i_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y)
- {return __x.__i_ != __y.__i_;}
-
- template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
- template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
- template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator;
-};
-
-template <class _Key, class _Tp, class _Compare = less<_Key>,
- class _Allocator = allocator<pair<const _Key, _Tp> > >
-class _LIBCPP_TEMPLATE_VIS map
-{
-public:
- // types:
- typedef _Key key_type;
- typedef _Tp mapped_type;
- typedef pair<const key_type, mapped_type> value_type;
- typedef _Compare key_compare;
- typedef _Allocator allocator_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
-
- static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
- static_assert((is_same<typename allocator_type::value_type, value_type>::value),
- "Allocator::value_type must be same type as value_type");
-
- class _LIBCPP_TEMPLATE_VIS value_compare
- : public binary_function<value_type, value_type, bool>
- {
- friend class map;
- protected:
- key_compare comp;
-
- _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {}
- public:
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const value_type& __x, const value_type& __y) const
- {return comp(__x.first, __y.first);}
- };
-
-private:
-
- typedef _VSTD::__value_type<key_type, mapped_type> __value_type;
- typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
- typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
- __value_type>::type __allocator_type;
- typedef __tree<__value_type, __vc, __allocator_type> __base;
- typedef typename __base::__node_traits __node_traits;
- typedef allocator_traits<allocator_type> __alloc_traits;
-
- __base __tree_;
-
-public:
- typedef typename __alloc_traits::pointer pointer;
- typedef typename __alloc_traits::const_pointer const_pointer;
- typedef typename __alloc_traits::size_type size_type;
- typedef typename __alloc_traits::difference_type difference_type;
- typedef __map_iterator<typename __base::iterator> iterator;
- typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
- typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
- typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
-
-#if _LIBCPP_STD_VER > 14
- typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
- typedef __insert_return_type<iterator, node_type> insert_return_type;
-#endif
-
- template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
- friend class _LIBCPP_TEMPLATE_VIS map;
- template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
- friend class _LIBCPP_TEMPLATE_VIS multimap;
-
- _LIBCPP_INLINE_VISIBILITY
- map()
- _NOEXCEPT_(
- is_nothrow_default_constructible<allocator_type>::value &&
- is_nothrow_default_constructible<key_compare>::value &&
- is_nothrow_copy_constructible<key_compare>::value)
- : __tree_(__vc(key_compare())) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit map(const key_compare& __comp)
- _NOEXCEPT_(
- is_nothrow_default_constructible<allocator_type>::value &&
- is_nothrow_copy_constructible<key_compare>::value)
- : __tree_(__vc(__comp)) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit map(const key_compare& __comp, const allocator_type& __a)
- : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
-
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- map(_InputIterator __f, _InputIterator __l,
- const key_compare& __comp = key_compare())
- : __tree_(__vc(__comp))
- {
- insert(__f, __l);
- }
-
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- map(_InputIterator __f, _InputIterator __l,
- const key_compare& __comp, const allocator_type& __a)
- : __tree_(__vc(__comp), typename __base::allocator_type(__a))
- {
- insert(__f, __l);
- }
-
-#if _LIBCPP_STD_VER > 11
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- map(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
- : map(__f, __l, key_compare(), __a) {}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- map(const map& __m)
- : __tree_(__m.__tree_)
- {
- insert(__m.begin(), __m.end());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- map& operator=(const map& __m)
- {
-#ifndef _LIBCPP_CXX03_LANG
- __tree_ = __m.__tree_;
-#else
- if (this != &__m) {
- __tree_.clear();
- __tree_.value_comp() = __m.__tree_.value_comp();
- __tree_.__copy_assign_alloc(__m.__tree_);
- insert(__m.begin(), __m.end());
- }
-#endif
- return *this;
- }
-
-#ifndef _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- map(map&& __m)
- _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
- : __tree_(_VSTD::move(__m.__tree_))
- {
- }
-
- map(map&& __m, const allocator_type& __a);
-
- _LIBCPP_INLINE_VISIBILITY
- map& operator=(map&& __m)
- _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
- {
- __tree_ = _VSTD::move(__m.__tree_);
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- map(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
- : __tree_(__vc(__comp))
- {
- insert(__il.begin(), __il.end());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
- : __tree_(__vc(__comp), typename __base::allocator_type(__a))
- {
- insert(__il.begin(), __il.end());
- }
-
-#if _LIBCPP_STD_VER > 11
- _LIBCPP_INLINE_VISIBILITY
- map(initializer_list<value_type> __il, const allocator_type& __a)
- : map(__il, key_compare(), __a) {}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- map& operator=(initializer_list<value_type> __il)
- {
- __tree_.__assign_unique(__il.begin(), __il.end());
- return *this;
- }
-
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- explicit map(const allocator_type& __a)
- : __tree_(typename __base::allocator_type(__a))
- {
- }
-
- _LIBCPP_INLINE_VISIBILITY
- map(const map& __m, const allocator_type& __a)
- : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
- {
- insert(__m.begin(), __m.end());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT {return __tree_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT {return __tree_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT {return __tree_.end();}
-
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rbegin() const _NOEXCEPT
- {return const_reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rend() _NOEXCEPT
- {return reverse_iterator(begin());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rend() const _NOEXCEPT
- {return const_reverse_iterator(begin());}
-
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const _NOEXCEPT {return begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const _NOEXCEPT {return end();}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crend() const _NOEXCEPT {return rend();}
-
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT {return __tree_.size();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
-
- mapped_type& operator[](const key_type& __k);
-#ifndef _LIBCPP_CXX03_LANG
- mapped_type& operator[](key_type&& __k);
-#endif
-
- mapped_type& at(const key_type& __k);
- const mapped_type& at(const key_type& __k) const;
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
- _LIBCPP_INLINE_VISIBILITY
- key_compare key_comp() const {return __tree_.value_comp().key_comp();}
- _LIBCPP_INLINE_VISIBILITY
- value_compare value_comp() const {return value_compare(__tree_.value_comp().key_comp());}
-
-#ifndef _LIBCPP_CXX03_LANG
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> emplace(_Args&& ...__args) {
- return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
- }
-
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
- return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...);
- }
-
- template <class _Pp,
- class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> insert(_Pp&& __p)
- {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));}
-
- template <class _Pp,
- class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __pos, _Pp&& __p)
- {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));}
-
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool>
- insert(const value_type& __v) {return __tree_.__insert_unique(__v);}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator
- insert(const_iterator __p, const value_type& __v)
- {return __tree_.__insert_unique(__p.__i_, __v);}
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool>
- insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __p, value_type&& __v)
- {return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));}
-
- _LIBCPP_INLINE_VISIBILITY
- void insert(initializer_list<value_type> __il)
- {insert(__il.begin(), __il.end());}
-#endif
-
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- void insert(_InputIterator __f, _InputIterator __l)
- {
- for (const_iterator __e = cend(); __f != __l; ++__f)
- insert(__e.__i_, *__f);
- }
-
-#if _LIBCPP_STD_VER > 14
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
- {
- return __tree_.__emplace_unique_key_args(__k,
- _VSTD::piecewise_construct,
- _VSTD::forward_as_tuple(__k),
- _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
- }
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
- {
- return __tree_.__emplace_unique_key_args(__k,
- _VSTD::piecewise_construct,
- _VSTD::forward_as_tuple(_VSTD::move(__k)),
- _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
- }
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
- {
- return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
- _VSTD::piecewise_construct,
- _VSTD::forward_as_tuple(__k),
- _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
- }
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
- {
- return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
- _VSTD::piecewise_construct,
- _VSTD::forward_as_tuple(_VSTD::move(__k)),
- _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
- }
-
- template <class _Vp>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
- {
- iterator __p = lower_bound(__k);
- if ( __p != end() && !key_comp()(__k, __p->first))
- {
- __p->second = _VSTD::forward<_Vp>(__v);
- return _VSTD::make_pair(__p, false);
- }
- return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true);
- }
-
- template <class _Vp>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
- {
- iterator __p = lower_bound(__k);
- if ( __p != end() && !key_comp()(__k, __p->first))
- {
- __p->second = _VSTD::forward<_Vp>(__v);
- return _VSTD::make_pair(__p, false);
- }
- return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true);
- }
-
- template <class _Vp>
- _LIBCPP_INLINE_VISIBILITY
- iterator insert_or_assign(const_iterator __h, const key_type& __k, _Vp&& __v)
- {
- iterator __p = lower_bound(__k);
- if ( __p != end() && !key_comp()(__k, __p->first))
- {
- __p->second = _VSTD::forward<_Vp>(__v);
- return __p;
- }
- return emplace_hint(__h, __k, _VSTD::forward<_Vp>(__v));
- }
-
- template <class _Vp>
- _LIBCPP_INLINE_VISIBILITY
- iterator insert_or_assign(const_iterator __h, key_type&& __k, _Vp&& __v)
- {
- iterator __p = lower_bound(__k);
- if ( __p != end() && !key_comp()(__k, __p->first))
- {
- __p->second = _VSTD::forward<_Vp>(__v);
- return __p;
- }
- return emplace_hint(__h, _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
- }
-
-#endif // _LIBCPP_STD_VER > 14
-
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(iterator __p) {return __tree_.erase(__p.__i_);}
- _LIBCPP_INLINE_VISIBILITY
- size_type erase(const key_type& __k)
- {return __tree_.__erase_unique(__k);}
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __f, const_iterator __l)
- {return __tree_.erase(__f.__i_, __l.__i_);}
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT {__tree_.clear();}
-
-#if _LIBCPP_STD_VER > 14
- _LIBCPP_INLINE_VISIBILITY
- insert_return_type insert(node_type&& __nh)
- {
- _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
- "node_type with incompatible allocator passed to map::insert()");
- return __tree_.template __node_handle_insert_unique<
- node_type, insert_return_type>(_VSTD::move(__nh));
- }
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __hint, node_type&& __nh)
- {
- _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
- "node_type with incompatible allocator passed to map::insert()");
- return __tree_.template __node_handle_insert_unique<node_type>(
- __hint.__i_, _VSTD::move(__nh));
- }
- _LIBCPP_INLINE_VISIBILITY
- node_type extract(key_type const& __key)
- {
- return __tree_.template __node_handle_extract<node_type>(__key);
- }
- _LIBCPP_INLINE_VISIBILITY
- node_type extract(const_iterator __it)
- {
- return __tree_.template __node_handle_extract<node_type>(__it.__i_);
- }
- template <class _Compare2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(map<key_type, mapped_type, _Compare2, allocator_type>& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- __tree_.__node_handle_merge_unique(__source.__tree_);
- }
- template <class _Compare2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(map<key_type, mapped_type, _Compare2, allocator_type>&& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- __tree_.__node_handle_merge_unique(__source.__tree_);
- }
- template <class _Compare2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- __tree_.__node_handle_merge_unique(__source.__tree_);
- }
- template <class _Compare2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>&& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- __tree_.__node_handle_merge_unique(__source.__tree_);
- }
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(map& __m)
- _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
- {__tree_.swap(__m.__tree_);}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator find(const key_type& __k) {return __tree_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
- find(const _K2& __k) {return __tree_.find(__k);}
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
- find(const _K2& __k) const {return __tree_.find(__k);}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- size_type count(const key_type& __k) const
- {return __tree_.__count_unique(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
- count(const _K2& __k) const {return __tree_.__count_multi(__k);}
-#endif
- _LIBCPP_INLINE_VISIBILITY
- iterator lower_bound(const key_type& __k)
- {return __tree_.lower_bound(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator lower_bound(const key_type& __k) const
- {return __tree_.lower_bound(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
- lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
-
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
- lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- iterator upper_bound(const key_type& __k)
- {return __tree_.upper_bound(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator upper_bound(const key_type& __k) const
- {return __tree_.upper_bound(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
- upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
- upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator,iterator> equal_range(const key_type& __k)
- {return __tree_.__equal_range_unique(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
- {return __tree_.__equal_range_unique(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
- equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);}
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
- equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
-#endif
-
-private:
- typedef typename __base::__node __node;
- typedef typename __base::__node_allocator __node_allocator;
- typedef typename __base::__node_pointer __node_pointer;
- typedef typename __base::__node_base_pointer __node_base_pointer;
- typedef typename __base::__parent_pointer __parent_pointer;
-
- typedef __map_node_destructor<__node_allocator> _Dp;
- typedef unique_ptr<__node, _Dp> __node_holder;
-
-#ifdef _LIBCPP_CXX03_LANG
- __node_holder __construct_node_with_key(const key_type& __k);
-#endif
-};
-
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-map<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a)
- : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
-{
- if (__a != __m.get_allocator())
- {
- const_iterator __e = cend();
- while (!__m.empty())
- __tree_.__insert_unique(__e.__i_,
- __m.__tree_.remove(__m.begin().__i_)->__value_.__move());
- }
-}
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-_Tp&
-map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
-{
- return __tree_.__emplace_unique_key_args(__k,
- _VSTD::piecewise_construct,
- _VSTD::forward_as_tuple(__k),
- _VSTD::forward_as_tuple()).first->__get_value().second;
-}
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-_Tp&
-map<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k)
-{
- return __tree_.__emplace_unique_key_args(__k,
- _VSTD::piecewise_construct,
- _VSTD::forward_as_tuple(_VSTD::move(__k)),
- _VSTD::forward_as_tuple()).first->__get_value().second;
-}
-
-#else // _LIBCPP_CXX03_LANG
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
-map<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k)
-{
- __node_allocator& __na = __tree_.__node_alloc();
- __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k);
- __h.get_deleter().__first_constructed = true;
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second));
- __h.get_deleter().__second_constructed = true;
- return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03
-}
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-_Tp&
-map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
-{
- __parent_pointer __parent;
- __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
- __node_pointer __r = static_cast<__node_pointer>(__child);
- if (__child == nullptr)
- {
- __node_holder __h = __construct_node_with_key(__k);
- __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
- __r = __h.release();
- }
- return __r->__value_.__get_value().second;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-_Tp&
-map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k)
-{
- __parent_pointer __parent;
- __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (__child == nullptr)
- throw out_of_range("map::at: key not found");
-#endif // _LIBCPP_NO_EXCEPTIONS
- return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
-}
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-const _Tp&
-map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const
-{
- __parent_pointer __parent;
- __node_base_pointer __child = __tree_.__find_equal(__parent, __k);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (__child == nullptr)
- throw out_of_range("map::at: key not found");
-#endif // _LIBCPP_NO_EXCEPTIONS
- return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
-}
-
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const map<_Key, _Tp, _Compare, _Allocator>& __x,
- const map<_Key, _Tp, _Compare, _Allocator>& __y)
-{
- return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
-}
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator< (const map<_Key, _Tp, _Compare, _Allocator>& __x,
- const map<_Key, _Tp, _Compare, _Allocator>& __y)
-{
- return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
-}
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
- const map<_Key, _Tp, _Compare, _Allocator>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator> (const map<_Key, _Tp, _Compare, _Allocator>& __x,
- const map<_Key, _Tp, _Compare, _Allocator>& __y)
-{
- return __y < __x;
-}
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
- const map<_Key, _Tp, _Compare, _Allocator>& __y)
-{
- return !(__x < __y);
-}
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
- const map<_Key, _Tp, _Compare, _Allocator>& __y)
-{
- return !(__y < __x);
-}
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(map<_Key, _Tp, _Compare, _Allocator>& __x,
- map<_Key, _Tp, _Compare, _Allocator>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-#if _LIBCPP_STD_VER > 17
-template <class _Key, class _Tp, class _Compare, class _Allocator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase_if(map<_Key, _Tp, _Compare, _Allocator>& __c, _Predicate __pred)
-{ __libcpp_erase_if_container(__c, __pred); }
-#endif
-
-
-template <class _Key, class _Tp, class _Compare = less<_Key>,
- class _Allocator = allocator<pair<const _Key, _Tp> > >
-class _LIBCPP_TEMPLATE_VIS multimap
-{
-public:
- // types:
- typedef _Key key_type;
- typedef _Tp mapped_type;
- typedef pair<const key_type, mapped_type> value_type;
- typedef _Compare key_compare;
- typedef _Allocator allocator_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
-
- static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
- static_assert((is_same<typename allocator_type::value_type, value_type>::value),
- "Allocator::value_type must be same type as value_type");
-
- class _LIBCPP_TEMPLATE_VIS value_compare
- : public binary_function<value_type, value_type, bool>
- {
- friend class multimap;
- protected:
- key_compare comp;
-
- _LIBCPP_INLINE_VISIBILITY
- value_compare(key_compare c) : comp(c) {}
- public:
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const value_type& __x, const value_type& __y) const
- {return comp(__x.first, __y.first);}
- };
-
-private:
-
- typedef _VSTD::__value_type<key_type, mapped_type> __value_type;
- typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
- typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
- __value_type>::type __allocator_type;
- typedef __tree<__value_type, __vc, __allocator_type> __base;
- typedef typename __base::__node_traits __node_traits;
- typedef allocator_traits<allocator_type> __alloc_traits;
-
- __base __tree_;
-
-public:
- typedef typename __alloc_traits::pointer pointer;
- typedef typename __alloc_traits::const_pointer const_pointer;
- typedef typename __alloc_traits::size_type size_type;
- typedef typename __alloc_traits::difference_type difference_type;
- typedef __map_iterator<typename __base::iterator> iterator;
- typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
- typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
- typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
-
-#if _LIBCPP_STD_VER > 14
- typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
-#endif
-
- template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
- friend class _LIBCPP_TEMPLATE_VIS map;
- template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
- friend class _LIBCPP_TEMPLATE_VIS multimap;
-
- _LIBCPP_INLINE_VISIBILITY
- multimap()
- _NOEXCEPT_(
- is_nothrow_default_constructible<allocator_type>::value &&
- is_nothrow_default_constructible<key_compare>::value &&
- is_nothrow_copy_constructible<key_compare>::value)
- : __tree_(__vc(key_compare())) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit multimap(const key_compare& __comp)
- _NOEXCEPT_(
- is_nothrow_default_constructible<allocator_type>::value &&
- is_nothrow_copy_constructible<key_compare>::value)
- : __tree_(__vc(__comp)) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit multimap(const key_compare& __comp, const allocator_type& __a)
- : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
-
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- multimap(_InputIterator __f, _InputIterator __l,
- const key_compare& __comp = key_compare())
- : __tree_(__vc(__comp))
- {
- insert(__f, __l);
- }
-
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- multimap(_InputIterator __f, _InputIterator __l,
- const key_compare& __comp, const allocator_type& __a)
- : __tree_(__vc(__comp), typename __base::allocator_type(__a))
- {
- insert(__f, __l);
- }
-
-#if _LIBCPP_STD_VER > 11
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
- : multimap(__f, __l, key_compare(), __a) {}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- multimap(const multimap& __m)
- : __tree_(__m.__tree_.value_comp(),
- __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc()))
- {
- insert(__m.begin(), __m.end());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- multimap& operator=(const multimap& __m)
- {
-#ifndef _LIBCPP_CXX03_LANG
- __tree_ = __m.__tree_;
-#else
- if (this != &__m) {
- __tree_.clear();
- __tree_.value_comp() = __m.__tree_.value_comp();
- __tree_.__copy_assign_alloc(__m.__tree_);
- insert(__m.begin(), __m.end());
- }
-#endif
- return *this;
- }
-
-#ifndef _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- multimap(multimap&& __m)
- _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
- : __tree_(_VSTD::move(__m.__tree_))
- {
- }
-
- multimap(multimap&& __m, const allocator_type& __a);
-
- _LIBCPP_INLINE_VISIBILITY
- multimap& operator=(multimap&& __m)
- _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
- {
- __tree_ = _VSTD::move(__m.__tree_);
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
- : __tree_(__vc(__comp))
- {
- insert(__il.begin(), __il.end());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
- : __tree_(__vc(__comp), typename __base::allocator_type(__a))
- {
- insert(__il.begin(), __il.end());
- }
-
-#if _LIBCPP_STD_VER > 11
- _LIBCPP_INLINE_VISIBILITY
- multimap(initializer_list<value_type> __il, const allocator_type& __a)
- : multimap(__il, key_compare(), __a) {}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- multimap& operator=(initializer_list<value_type> __il)
- {
- __tree_.__assign_multi(__il.begin(), __il.end());
- return *this;
- }
-
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- explicit multimap(const allocator_type& __a)
- : __tree_(typename __base::allocator_type(__a))
- {
- }
-
- _LIBCPP_INLINE_VISIBILITY
- multimap(const multimap& __m, const allocator_type& __a)
- : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
- {
- insert(__m.begin(), __m.end());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT {return __tree_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT {return __tree_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT {return __tree_.end();}
-
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rbegin() const _NOEXCEPT
- {return const_reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rend() const _NOEXCEPT
- {return const_reverse_iterator(begin());}
-
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const _NOEXCEPT {return begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const _NOEXCEPT {return end();}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crend() const _NOEXCEPT {return rend();}
-
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT {return __tree_.size();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
- _LIBCPP_INLINE_VISIBILITY
- key_compare key_comp() const {return __tree_.value_comp().key_comp();}
- _LIBCPP_INLINE_VISIBILITY
- value_compare value_comp() const
- {return value_compare(__tree_.value_comp().key_comp());}
-
-#ifndef _LIBCPP_CXX03_LANG
-
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator emplace(_Args&& ...__args) {
- return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
- }
-
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
- return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
- }
-
- template <class _Pp,
- class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(_Pp&& __p)
- {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));}
-
- template <class _Pp,
- class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __pos, _Pp&& __p)
- {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(value_type&& __v)
- {return __tree_.__insert_multi(_VSTD::move(__v));}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __p, value_type&& __v)
- {return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));}
-
-
- _LIBCPP_INLINE_VISIBILITY
- void insert(initializer_list<value_type> __il)
- {insert(__il.begin(), __il.end());}
-
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __p, const value_type& __v)
- {return __tree_.__insert_multi(__p.__i_, __v);}
-
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- void insert(_InputIterator __f, _InputIterator __l)
- {
- for (const_iterator __e = cend(); __f != __l; ++__f)
- __tree_.__insert_multi(__e.__i_, *__f);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(iterator __p) {return __tree_.erase(__p.__i_);}
- _LIBCPP_INLINE_VISIBILITY
- size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __f, const_iterator __l)
- {return __tree_.erase(__f.__i_, __l.__i_);}
-
-#if _LIBCPP_STD_VER > 14
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(node_type&& __nh)
- {
- _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
- "node_type with incompatible allocator passed to multimap::insert()");
- return __tree_.template __node_handle_insert_multi<node_type>(
- _VSTD::move(__nh));
- }
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __hint, node_type&& __nh)
- {
- _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
- "node_type with incompatible allocator passed to multimap::insert()");
- return __tree_.template __node_handle_insert_multi<node_type>(
- __hint.__i_, _VSTD::move(__nh));
- }
- _LIBCPP_INLINE_VISIBILITY
- node_type extract(key_type const& __key)
- {
- return __tree_.template __node_handle_extract<node_type>(__key);
- }
- _LIBCPP_INLINE_VISIBILITY
- node_type extract(const_iterator __it)
- {
- return __tree_.template __node_handle_extract<node_type>(
- __it.__i_);
- }
- template <class _Compare2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- return __tree_.__node_handle_merge_multi(__source.__tree_);
- }
- template <class _Compare2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>&& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- return __tree_.__node_handle_merge_multi(__source.__tree_);
- }
- template <class _Compare2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(map<key_type, mapped_type, _Compare2, allocator_type>& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- return __tree_.__node_handle_merge_multi(__source.__tree_);
- }
- template <class _Compare2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(map<key_type, mapped_type, _Compare2, allocator_type>&& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- return __tree_.__node_handle_merge_multi(__source.__tree_);
- }
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT {__tree_.clear();}
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(multimap& __m)
- _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
- {__tree_.swap(__m.__tree_);}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator find(const key_type& __k) {return __tree_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
- find(const _K2& __k) {return __tree_.find(__k);}
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
- find(const _K2& __k) const {return __tree_.find(__k);}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- size_type count(const key_type& __k) const
- {return __tree_.__count_multi(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
- count(const _K2& __k) const {return __tree_.__count_multi(__k);}
-#endif
- _LIBCPP_INLINE_VISIBILITY
- iterator lower_bound(const key_type& __k)
- {return __tree_.lower_bound(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator lower_bound(const key_type& __k) const
- {return __tree_.lower_bound(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
- lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
-
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
- lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- iterator upper_bound(const key_type& __k)
- {return __tree_.upper_bound(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator upper_bound(const key_type& __k) const
- {return __tree_.upper_bound(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
- upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
- upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator,iterator> equal_range(const key_type& __k)
- {return __tree_.__equal_range_multi(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
- {return __tree_.__equal_range_multi(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
- equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);}
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
- equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
-#endif
-
-private:
- typedef typename __base::__node __node;
- typedef typename __base::__node_allocator __node_allocator;
- typedef typename __base::__node_pointer __node_pointer;
-
- typedef __map_node_destructor<__node_allocator> _Dp;
- typedef unique_ptr<__node, _Dp> __node_holder;
-};
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-multimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a)
- : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
-{
- if (__a != __m.get_allocator())
- {
- const_iterator __e = cend();
- while (!__m.empty())
- __tree_.__insert_multi(__e.__i_,
- _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__move()));
- }
-}
-#endif
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
- const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
-{
- return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
-}
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
- const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
-{
- return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
-}
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
- const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
- const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
-{
- return __y < __x;
-}
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
- const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
-{
- return !(__x < __y);
-}
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
- const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
-{
- return !(__y < __x);
-}
-
-template <class _Key, class _Tp, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(multimap<_Key, _Tp, _Compare, _Allocator>& __x,
- multimap<_Key, _Tp, _Compare, _Allocator>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-#if _LIBCPP_STD_VER > 17
-template <class _Key, class _Tp, class _Compare, class _Allocator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase_if(multimap<_Key, _Tp, _Compare, _Allocator>& __c, _Predicate __pred)
-{ __libcpp_erase_if_container(__c, __pred); }
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_MAP
diff --git a/lib/libcxx/include/math.h b/lib/libcxx/include/math.h
deleted file mode 100644
index 3cc72aa2791..00000000000
--- a/lib/libcxx/include/math.h
+++ /dev/null
@@ -1,1531 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- math.h ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_MATH_H
-#define _LIBCPP_MATH_H
-
-/*
- math.h synopsis
-
-Macros:
-
- HUGE_VAL
- HUGE_VALF // C99
- HUGE_VALL // C99
- INFINITY // C99
- NAN // C99
- FP_INFINITE // C99
- FP_NAN // C99
- FP_NORMAL // C99
- FP_SUBNORMAL // C99
- FP_ZERO // C99
- FP_FAST_FMA // C99
- FP_FAST_FMAF // C99
- FP_FAST_FMAL // C99
- FP_ILOGB0 // C99
- FP_ILOGBNAN // C99
- MATH_ERRNO // C99
- MATH_ERREXCEPT // C99
- math_errhandling // C99
-
-Types:
-
- float_t // C99
- double_t // C99
-
-// C90
-
-floating_point abs(floating_point x);
-
-floating_point acos (arithmetic x);
-float acosf(float x);
-long double acosl(long double x);
-
-floating_point asin (arithmetic x);
-float asinf(float x);
-long double asinl(long double x);
-
-floating_point atan (arithmetic x);
-float atanf(float x);
-long double atanl(long double x);
-
-floating_point atan2 (arithmetic y, arithmetic x);
-float atan2f(float y, float x);
-long double atan2l(long double y, long double x);
-
-floating_point ceil (arithmetic x);
-float ceilf(float x);
-long double ceill(long double x);
-
-floating_point cos (arithmetic x);
-float cosf(float x);
-long double cosl(long double x);
-
-floating_point cosh (arithmetic x);
-float coshf(float x);
-long double coshl(long double x);
-
-floating_point exp (arithmetic x);
-float expf(float x);
-long double expl(long double x);
-
-floating_point fabs (arithmetic x);
-float fabsf(float x);
-long double fabsl(long double x);
-
-floating_point floor (arithmetic x);
-float floorf(float x);
-long double floorl(long double x);
-
-floating_point fmod (arithmetic x, arithmetic y);
-float fmodf(float x, float y);
-long double fmodl(long double x, long double y);
-
-floating_point frexp (arithmetic value, int* exp);
-float frexpf(float value, int* exp);
-long double frexpl(long double value, int* exp);
-
-floating_point ldexp (arithmetic value, int exp);
-float ldexpf(float value, int exp);
-long double ldexpl(long double value, int exp);
-
-floating_point log (arithmetic x);
-float logf(float x);
-long double logl(long double x);
-
-floating_point log10 (arithmetic x);
-float log10f(float x);
-long double log10l(long double x);
-
-floating_point modf (floating_point value, floating_point* iptr);
-float modff(float value, float* iptr);
-long double modfl(long double value, long double* iptr);
-
-floating_point pow (arithmetic x, arithmetic y);
-float powf(float x, float y);
-long double powl(long double x, long double y);
-
-floating_point sin (arithmetic x);
-float sinf(float x);
-long double sinl(long double x);
-
-floating_point sinh (arithmetic x);
-float sinhf(float x);
-long double sinhl(long double x);
-
-floating_point sqrt (arithmetic x);
-float sqrtf(float x);
-long double sqrtl(long double x);
-
-floating_point tan (arithmetic x);
-float tanf(float x);
-long double tanl(long double x);
-
-floating_point tanh (arithmetic x);
-float tanhf(float x);
-long double tanhl(long double x);
-
-// C99
-
-bool signbit(arithmetic x);
-
-int fpclassify(arithmetic x);
-
-bool isfinite(arithmetic x);
-bool isinf(arithmetic x);
-bool isnan(arithmetic x);
-bool isnormal(arithmetic x);
-
-bool isgreater(arithmetic x, arithmetic y);
-bool isgreaterequal(arithmetic x, arithmetic y);
-bool isless(arithmetic x, arithmetic y);
-bool islessequal(arithmetic x, arithmetic y);
-bool islessgreater(arithmetic x, arithmetic y);
-bool isunordered(arithmetic x, arithmetic y);
-
-floating_point acosh (arithmetic x);
-float acoshf(float x);
-long double acoshl(long double x);
-
-floating_point asinh (arithmetic x);
-float asinhf(float x);
-long double asinhl(long double x);
-
-floating_point atanh (arithmetic x);
-float atanhf(float x);
-long double atanhl(long double x);
-
-floating_point cbrt (arithmetic x);
-float cbrtf(float x);
-long double cbrtl(long double x);
-
-floating_point copysign (arithmetic x, arithmetic y);
-float copysignf(float x, float y);
-long double copysignl(long double x, long double y);
-
-floating_point erf (arithmetic x);
-float erff(float x);
-long double erfl(long double x);
-
-floating_point erfc (arithmetic x);
-float erfcf(float x);
-long double erfcl(long double x);
-
-floating_point exp2 (arithmetic x);
-float exp2f(float x);
-long double exp2l(long double x);
-
-floating_point expm1 (arithmetic x);
-float expm1f(float x);
-long double expm1l(long double x);
-
-floating_point fdim (arithmetic x, arithmetic y);
-float fdimf(float x, float y);
-long double fdiml(long double x, long double y);
-
-floating_point fma (arithmetic x, arithmetic y, arithmetic z);
-float fmaf(float x, float y, float z);
-long double fmal(long double x, long double y, long double z);
-
-floating_point fmax (arithmetic x, arithmetic y);
-float fmaxf(float x, float y);
-long double fmaxl(long double x, long double y);
-
-floating_point fmin (arithmetic x, arithmetic y);
-float fminf(float x, float y);
-long double fminl(long double x, long double y);
-
-floating_point hypot (arithmetic x, arithmetic y);
-float hypotf(float x, float y);
-long double hypotl(long double x, long double y);
-
-int ilogb (arithmetic x);
-int ilogbf(float x);
-int ilogbl(long double x);
-
-floating_point lgamma (arithmetic x);
-float lgammaf(float x);
-long double lgammal(long double x);
-
-long long llrint (arithmetic x);
-long long llrintf(float x);
-long long llrintl(long double x);
-
-long long llround (arithmetic x);
-long long llroundf(float x);
-long long llroundl(long double x);
-
-floating_point log1p (arithmetic x);
-float log1pf(float x);
-long double log1pl(long double x);
-
-floating_point log2 (arithmetic x);
-float log2f(float x);
-long double log2l(long double x);
-
-floating_point logb (arithmetic x);
-float logbf(float x);
-long double logbl(long double x);
-
-long lrint (arithmetic x);
-long lrintf(float x);
-long lrintl(long double x);
-
-long lround (arithmetic x);
-long lroundf(float x);
-long lroundl(long double x);
-
-double nan (const char* str);
-float nanf(const char* str);
-long double nanl(const char* str);
-
-floating_point nearbyint (arithmetic x);
-float nearbyintf(float x);
-long double nearbyintl(long double x);
-
-floating_point nextafter (arithmetic x, arithmetic y);
-float nextafterf(float x, float y);
-long double nextafterl(long double x, long double y);
-
-floating_point nexttoward (arithmetic x, long double y);
-float nexttowardf(float x, long double y);
-long double nexttowardl(long double x, long double y);
-
-floating_point remainder (arithmetic x, arithmetic y);
-float remainderf(float x, float y);
-long double remainderl(long double x, long double y);
-
-floating_point remquo (arithmetic x, arithmetic y, int* pquo);
-float remquof(float x, float y, int* pquo);
-long double remquol(long double x, long double y, int* pquo);
-
-floating_point rint (arithmetic x);
-float rintf(float x);
-long double rintl(long double x);
-
-floating_point round (arithmetic x);
-float roundf(float x);
-long double roundl(long double x);
-
-floating_point scalbln (arithmetic x, long ex);
-float scalblnf(float x, long ex);
-long double scalblnl(long double x, long ex);
-
-floating_point scalbn (arithmetic x, int ex);
-float scalbnf(float x, int ex);
-long double scalbnl(long double x, int ex);
-
-floating_point tgamma (arithmetic x);
-float tgammaf(float x);
-long double tgammal(long double x);
-
-floating_point trunc (arithmetic x);
-float truncf(float x);
-long double truncl(long double x);
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#include_next <math.h>
-
-#ifdef __cplusplus
-
-// We support including .h headers inside 'extern "C"' contexts, so switch
-// back to C++ linkage before including these C++ headers.
-extern "C++" {
-
-#include <type_traits>
-#include <limits>
-
-// signbit
-
-#ifdef signbit
-
-template <class _A1>
-_LIBCPP_INLINE_VISIBILITY
-bool
-__libcpp_signbit(_A1 __lcpp_x) _NOEXCEPT
-{
- return signbit(__lcpp_x);
-}
-
-#undef signbit
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type
-signbit(_A1 __lcpp_x) _NOEXCEPT
-{
- return __libcpp_signbit((typename std::__promote<_A1>::type)__lcpp_x);
-}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<
- std::is_integral<_A1>::value && std::is_signed<_A1>::value, bool>::type
-signbit(_A1 __lcpp_x) _NOEXCEPT
-{ return __lcpp_x < 0; }
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<
- std::is_integral<_A1>::value && !std::is_signed<_A1>::value, bool>::type
-signbit(_A1) _NOEXCEPT
-{ return false; }
-
-#elif defined(_LIBCPP_MSVCRT)
-
-template <typename _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type
-signbit(_A1 __lcpp_x) _NOEXCEPT
-{
- return ::signbit(static_cast<typename std::__promote<_A1>::type>(__lcpp_x));
-}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<
- std::is_integral<_A1>::value && std::is_signed<_A1>::value, bool>::type
-signbit(_A1 __lcpp_x) _NOEXCEPT
-{ return __lcpp_x < 0; }
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<
- std::is_integral<_A1>::value && !std::is_signed<_A1>::value, bool>::type
-signbit(_A1) _NOEXCEPT
-{ return false; }
-
-#endif // signbit
-
-// fpclassify
-
-#ifdef fpclassify
-
-template <class _A1>
-_LIBCPP_INLINE_VISIBILITY
-int
-__libcpp_fpclassify(_A1 __lcpp_x) _NOEXCEPT
-{
- return fpclassify(__lcpp_x);
-}
-
-#undef fpclassify
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_floating_point<_A1>::value, int>::type
-fpclassify(_A1 __lcpp_x) _NOEXCEPT
-{
- return __libcpp_fpclassify((typename std::__promote<_A1>::type)__lcpp_x);
-}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, int>::type
-fpclassify(_A1 __lcpp_x) _NOEXCEPT
-{ return __lcpp_x == 0 ? FP_ZERO : FP_NORMAL; }
-
-#elif defined(_LIBCPP_MSVCRT)
-
-template <typename _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type
-fpclassify(_A1 __lcpp_x) _NOEXCEPT
-{
- return ::fpclassify(static_cast<typename std::__promote<_A1>::type>(__lcpp_x));
-}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, int>::type
-fpclassify(_A1 __lcpp_x) _NOEXCEPT
-{ return __lcpp_x == 0 ? FP_ZERO : FP_NORMAL; }
-
-#endif // fpclassify
-
-// isfinite
-
-#ifdef isfinite
-
-template <class _A1>
-_LIBCPP_INLINE_VISIBILITY
-bool
-__libcpp_isfinite(_A1 __lcpp_x) _NOEXCEPT
-{
- return isfinite(__lcpp_x);
-}
-
-#undef isfinite
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<
- std::is_arithmetic<_A1>::value && std::numeric_limits<_A1>::has_infinity,
- bool>::type
-isfinite(_A1 __lcpp_x) _NOEXCEPT
-{
- return __libcpp_isfinite((typename std::__promote<_A1>::type)__lcpp_x);
-}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<
- std::is_arithmetic<_A1>::value && !std::numeric_limits<_A1>::has_infinity,
- bool>::type
-isfinite(_A1) _NOEXCEPT
-{ return true; }
-
-#endif // isfinite
-
-// isinf
-
-#ifdef isinf
-
-template <class _A1>
-_LIBCPP_INLINE_VISIBILITY
-bool
-__libcpp_isinf(_A1 __lcpp_x) _NOEXCEPT
-{
- return isinf(__lcpp_x);
-}
-
-#undef isinf
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<
- std::is_arithmetic<_A1>::value && std::numeric_limits<_A1>::has_infinity,
- bool>::type
-isinf(_A1 __lcpp_x) _NOEXCEPT
-{
- return __libcpp_isinf((typename std::__promote<_A1>::type)__lcpp_x);
-}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<
- std::is_arithmetic<_A1>::value && !std::numeric_limits<_A1>::has_infinity,
- bool>::type
-isinf(_A1) _NOEXCEPT
-{ return false; }
-
-#ifdef _LIBCPP_PREFERRED_OVERLOAD
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-isinf(float __lcpp_x) _NOEXCEPT { return __libcpp_isinf(__lcpp_x); }
-
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
-bool
-isinf(double __lcpp_x) _NOEXCEPT { return __libcpp_isinf(__lcpp_x); }
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-isinf(long double __lcpp_x) _NOEXCEPT { return __libcpp_isinf(__lcpp_x); }
-#endif
-
-#endif // isinf
-
-// isnan
-
-#ifdef isnan
-
-template <class _A1>
-_LIBCPP_INLINE_VISIBILITY
-bool
-__libcpp_isnan(_A1 __lcpp_x) _NOEXCEPT
-{
- return isnan(__lcpp_x);
-}
-
-#undef isnan
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type
-isnan(_A1 __lcpp_x) _NOEXCEPT
-{
- return __libcpp_isnan((typename std::__promote<_A1>::type)__lcpp_x);
-}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, bool>::type
-isnan(_A1) _NOEXCEPT
-{ return false; }
-
-#ifdef _LIBCPP_PREFERRED_OVERLOAD
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-isnan(float __lcpp_x) _NOEXCEPT { return __libcpp_isnan(__lcpp_x); }
-
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
-bool
-isnan(double __lcpp_x) _NOEXCEPT { return __libcpp_isnan(__lcpp_x); }
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-isnan(long double __lcpp_x) _NOEXCEPT { return __libcpp_isnan(__lcpp_x); }
-#endif
-
-#endif // isnan
-
-// isnormal
-
-#ifdef isnormal
-
-template <class _A1>
-_LIBCPP_INLINE_VISIBILITY
-bool
-__libcpp_isnormal(_A1 __lcpp_x) _NOEXCEPT
-{
- return isnormal(__lcpp_x);
-}
-
-#undef isnormal
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type
-isnormal(_A1 __lcpp_x) _NOEXCEPT
-{
- return __libcpp_isnormal((typename std::__promote<_A1>::type)__lcpp_x);
-}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, bool>::type
-isnormal(_A1 __lcpp_x) _NOEXCEPT
-{ return __lcpp_x != 0; }
-
-#endif // isnormal
-
-// isgreater
-
-#ifdef isgreater
-
-template <class _A1, class _A2>
-_LIBCPP_INLINE_VISIBILITY
-bool
-__libcpp_isgreater(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- return isgreater(__lcpp_x, __lcpp_y);
-}
-
-#undef isgreater
-
-template <class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value,
- bool
->::type
-isgreater(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2>::type type;
- return __libcpp_isgreater((type)__lcpp_x, (type)__lcpp_y);
-}
-
-#endif // isgreater
-
-// isgreaterequal
-
-#ifdef isgreaterequal
-
-template <class _A1, class _A2>
-_LIBCPP_INLINE_VISIBILITY
-bool
-__libcpp_isgreaterequal(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- return isgreaterequal(__lcpp_x, __lcpp_y);
-}
-
-#undef isgreaterequal
-
-template <class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value,
- bool
->::type
-isgreaterequal(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2>::type type;
- return __libcpp_isgreaterequal((type)__lcpp_x, (type)__lcpp_y);
-}
-
-#endif // isgreaterequal
-
-// isless
-
-#ifdef isless
-
-template <class _A1, class _A2>
-_LIBCPP_INLINE_VISIBILITY
-bool
-__libcpp_isless(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- return isless(__lcpp_x, __lcpp_y);
-}
-
-#undef isless
-
-template <class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value,
- bool
->::type
-isless(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2>::type type;
- return __libcpp_isless((type)__lcpp_x, (type)__lcpp_y);
-}
-
-#endif // isless
-
-// islessequal
-
-#ifdef islessequal
-
-template <class _A1, class _A2>
-_LIBCPP_INLINE_VISIBILITY
-bool
-__libcpp_islessequal(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- return islessequal(__lcpp_x, __lcpp_y);
-}
-
-#undef islessequal
-
-template <class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value,
- bool
->::type
-islessequal(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2>::type type;
- return __libcpp_islessequal((type)__lcpp_x, (type)__lcpp_y);
-}
-
-#endif // islessequal
-
-// islessgreater
-
-#ifdef islessgreater
-
-template <class _A1, class _A2>
-_LIBCPP_INLINE_VISIBILITY
-bool
-__libcpp_islessgreater(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- return islessgreater(__lcpp_x, __lcpp_y);
-}
-
-#undef islessgreater
-
-template <class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value,
- bool
->::type
-islessgreater(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2>::type type;
- return __libcpp_islessgreater((type)__lcpp_x, (type)__lcpp_y);
-}
-
-#endif // islessgreater
-
-// isunordered
-
-#ifdef isunordered
-
-template <class _A1, class _A2>
-_LIBCPP_INLINE_VISIBILITY
-bool
-__libcpp_isunordered(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- return isunordered(__lcpp_x, __lcpp_y);
-}
-
-#undef isunordered
-
-template <class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value,
- bool
->::type
-isunordered(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2>::type type;
- return __libcpp_isunordered((type)__lcpp_x, (type)__lcpp_y);
-}
-
-#endif // isunordered
-
-// abs
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY
-float
-abs(float __lcpp_x) _NOEXCEPT {return ::fabsf(__lcpp_x);}
-
-inline _LIBCPP_INLINE_VISIBILITY
-double
-abs(double __lcpp_x) _NOEXCEPT {return ::fabs(__lcpp_x);}
-
-inline _LIBCPP_INLINE_VISIBILITY
-long double
-abs(long double __lcpp_x) _NOEXCEPT {return ::fabsl(__lcpp_x);}
-#endif // !(defined(_AIX) || defined(__sun__))
-
-// acos
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float acos(float __lcpp_x) _NOEXCEPT {return ::acosf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double acos(long double __lcpp_x) _NOEXCEPT {return ::acosl(__lcpp_x);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-acos(_A1 __lcpp_x) _NOEXCEPT {return ::acos((double)__lcpp_x);}
-
-// asin
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float asin(float __lcpp_x) _NOEXCEPT {return ::asinf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double asin(long double __lcpp_x) _NOEXCEPT {return ::asinl(__lcpp_x);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-asin(_A1 __lcpp_x) _NOEXCEPT {return ::asin((double)__lcpp_x);}
-
-// atan
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float atan(float __lcpp_x) _NOEXCEPT {return ::atanf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double atan(long double __lcpp_x) _NOEXCEPT {return ::atanl(__lcpp_x);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-atan(_A1 __lcpp_x) _NOEXCEPT {return ::atan((double)__lcpp_x);}
-
-// atan2
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float atan2(float __lcpp_y, float __lcpp_x) _NOEXCEPT {return ::atan2f(__lcpp_y, __lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double atan2(long double __lcpp_y, long double __lcpp_x) _NOEXCEPT {return ::atan2l(__lcpp_y, __lcpp_x);}
-#endif
-
-template <class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::__lazy_enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value,
- std::__promote<_A1, _A2>
->::type
-atan2(_A1 __lcpp_y, _A2 __lcpp_x) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2>::type __result_type;
- static_assert((!(std::is_same<_A1, __result_type>::value &&
- std::is_same<_A2, __result_type>::value)), "");
- return ::atan2((__result_type)__lcpp_y, (__result_type)__lcpp_x);
-}
-
-// ceil
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float ceil(float __lcpp_x) _NOEXCEPT {return ::ceilf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double ceil(long double __lcpp_x) _NOEXCEPT {return ::ceill(__lcpp_x);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-ceil(_A1 __lcpp_x) _NOEXCEPT {return ::ceil((double)__lcpp_x);}
-
-// cos
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float cos(float __lcpp_x) _NOEXCEPT {return ::cosf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double cos(long double __lcpp_x) _NOEXCEPT {return ::cosl(__lcpp_x);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-cos(_A1 __lcpp_x) _NOEXCEPT {return ::cos((double)__lcpp_x);}
-
-// cosh
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float cosh(float __lcpp_x) _NOEXCEPT {return ::coshf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double cosh(long double __lcpp_x) _NOEXCEPT {return ::coshl(__lcpp_x);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-cosh(_A1 __lcpp_x) _NOEXCEPT {return ::cosh((double)__lcpp_x);}
-
-// exp
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float exp(float __lcpp_x) _NOEXCEPT {return ::expf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double exp(long double __lcpp_x) _NOEXCEPT {return ::expl(__lcpp_x);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-exp(_A1 __lcpp_x) _NOEXCEPT {return ::exp((double)__lcpp_x);}
-
-// fabs
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float fabs(float __lcpp_x) _NOEXCEPT {return ::fabsf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double fabs(long double __lcpp_x) _NOEXCEPT {return ::fabsl(__lcpp_x);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-fabs(_A1 __lcpp_x) _NOEXCEPT {return ::fabs((double)__lcpp_x);}
-
-// floor
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float floor(float __lcpp_x) _NOEXCEPT {return ::floorf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double floor(long double __lcpp_x) _NOEXCEPT {return ::floorl(__lcpp_x);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-floor(_A1 __lcpp_x) _NOEXCEPT {return ::floor((double)__lcpp_x);}
-
-// fmod
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float fmod(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return ::fmodf(__lcpp_x, __lcpp_y);}
-inline _LIBCPP_INLINE_VISIBILITY long double fmod(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::fmodl(__lcpp_x, __lcpp_y);}
-#endif
-
-template <class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::__lazy_enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value,
- std::__promote<_A1, _A2>
->::type
-fmod(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2>::type __result_type;
- static_assert((!(std::is_same<_A1, __result_type>::value &&
- std::is_same<_A2, __result_type>::value)), "");
- return ::fmod((__result_type)__lcpp_x, (__result_type)__lcpp_y);
-}
-
-// frexp
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float frexp(float __lcpp_x, int* __lcpp_e) _NOEXCEPT {return ::frexpf(__lcpp_x, __lcpp_e);}
-inline _LIBCPP_INLINE_VISIBILITY long double frexp(long double __lcpp_x, int* __lcpp_e) _NOEXCEPT {return ::frexpl(__lcpp_x, __lcpp_e);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-frexp(_A1 __lcpp_x, int* __lcpp_e) _NOEXCEPT {return ::frexp((double)__lcpp_x, __lcpp_e);}
-
-// ldexp
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float ldexp(float __lcpp_x, int __lcpp_e) _NOEXCEPT {return ::ldexpf(__lcpp_x, __lcpp_e);}
-inline _LIBCPP_INLINE_VISIBILITY long double ldexp(long double __lcpp_x, int __lcpp_e) _NOEXCEPT {return ::ldexpl(__lcpp_x, __lcpp_e);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-ldexp(_A1 __lcpp_x, int __lcpp_e) _NOEXCEPT {return ::ldexp((double)__lcpp_x, __lcpp_e);}
-
-// log
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float log(float __lcpp_x) _NOEXCEPT {return ::logf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double log(long double __lcpp_x) _NOEXCEPT {return ::logl(__lcpp_x);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-log(_A1 __lcpp_x) _NOEXCEPT {return ::log((double)__lcpp_x);}
-
-// log10
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float log10(float __lcpp_x) _NOEXCEPT {return ::log10f(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double log10(long double __lcpp_x) _NOEXCEPT {return ::log10l(__lcpp_x);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-log10(_A1 __lcpp_x) _NOEXCEPT {return ::log10((double)__lcpp_x);}
-
-// modf
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float modf(float __lcpp_x, float* __lcpp_y) _NOEXCEPT {return ::modff(__lcpp_x, __lcpp_y);}
-inline _LIBCPP_INLINE_VISIBILITY long double modf(long double __lcpp_x, long double* __lcpp_y) _NOEXCEPT {return ::modfl(__lcpp_x, __lcpp_y);}
-#endif
-
-// pow
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float pow(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return ::powf(__lcpp_x, __lcpp_y);}
-inline _LIBCPP_INLINE_VISIBILITY long double pow(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::powl(__lcpp_x, __lcpp_y);}
-#endif
-
-template <class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::__lazy_enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value,
- std::__promote<_A1, _A2>
->::type
-pow(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2>::type __result_type;
- static_assert((!(std::is_same<_A1, __result_type>::value &&
- std::is_same<_A2, __result_type>::value)), "");
- return ::pow((__result_type)__lcpp_x, (__result_type)__lcpp_y);
-}
-
-// sin
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float sin(float __lcpp_x) _NOEXCEPT {return ::sinf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double sin(long double __lcpp_x) _NOEXCEPT {return ::sinl(__lcpp_x);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-sin(_A1 __lcpp_x) _NOEXCEPT {return ::sin((double)__lcpp_x);}
-
-// sinh
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float sinh(float __lcpp_x) _NOEXCEPT {return ::sinhf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double sinh(long double __lcpp_x) _NOEXCEPT {return ::sinhl(__lcpp_x);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-sinh(_A1 __lcpp_x) _NOEXCEPT {return ::sinh((double)__lcpp_x);}
-
-// sqrt
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float sqrt(float __lcpp_x) _NOEXCEPT {return ::sqrtf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double sqrt(long double __lcpp_x) _NOEXCEPT {return ::sqrtl(__lcpp_x);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-sqrt(_A1 __lcpp_x) _NOEXCEPT {return ::sqrt((double)__lcpp_x);}
-
-// tan
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float tan(float __lcpp_x) _NOEXCEPT {return ::tanf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double tan(long double __lcpp_x) _NOEXCEPT {return ::tanl(__lcpp_x);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-tan(_A1 __lcpp_x) _NOEXCEPT {return ::tan((double)__lcpp_x);}
-
-// tanh
-
-#if !(defined(_AIX) || defined(__sun__))
-inline _LIBCPP_INLINE_VISIBILITY float tanh(float __lcpp_x) _NOEXCEPT {return ::tanhf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double tanh(long double __lcpp_x) _NOEXCEPT {return ::tanhl(__lcpp_x);}
-#endif
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-tanh(_A1 __lcpp_x) _NOEXCEPT {return ::tanh((double)__lcpp_x);}
-
-// acosh
-
-inline _LIBCPP_INLINE_VISIBILITY float acosh(float __lcpp_x) _NOEXCEPT {return ::acoshf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double acosh(long double __lcpp_x) _NOEXCEPT {return ::acoshl(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-acosh(_A1 __lcpp_x) _NOEXCEPT {return ::acosh((double)__lcpp_x);}
-
-// asinh
-
-inline _LIBCPP_INLINE_VISIBILITY float asinh(float __lcpp_x) _NOEXCEPT {return ::asinhf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double asinh(long double __lcpp_x) _NOEXCEPT {return ::asinhl(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-asinh(_A1 __lcpp_x) _NOEXCEPT {return ::asinh((double)__lcpp_x);}
-
-// atanh
-
-inline _LIBCPP_INLINE_VISIBILITY float atanh(float __lcpp_x) _NOEXCEPT {return ::atanhf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double atanh(long double __lcpp_x) _NOEXCEPT {return ::atanhl(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-atanh(_A1 __lcpp_x) _NOEXCEPT {return ::atanh((double)__lcpp_x);}
-
-// cbrt
-
-inline _LIBCPP_INLINE_VISIBILITY float cbrt(float __lcpp_x) _NOEXCEPT {return ::cbrtf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double cbrt(long double __lcpp_x) _NOEXCEPT {return ::cbrtl(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-cbrt(_A1 __lcpp_x) _NOEXCEPT {return ::cbrt((double)__lcpp_x);}
-
-// copysign
-
-inline _LIBCPP_INLINE_VISIBILITY float copysign(float __lcpp_x,
- float __lcpp_y) _NOEXCEPT {
- return ::copysignf(__lcpp_x, __lcpp_y);
-}
-inline _LIBCPP_INLINE_VISIBILITY long double
-copysign(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {
- return ::copysignl(__lcpp_x, __lcpp_y);
-}
-
-template <class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::__lazy_enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value,
- std::__promote<_A1, _A2>
->::type
-copysign(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2>::type __result_type;
- static_assert((!(std::is_same<_A1, __result_type>::value &&
- std::is_same<_A2, __result_type>::value)), "");
- return ::copysign((__result_type)__lcpp_x, (__result_type)__lcpp_y);
-}
-
-// erf
-
-inline _LIBCPP_INLINE_VISIBILITY float erf(float __lcpp_x) _NOEXCEPT {return ::erff(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double erf(long double __lcpp_x) _NOEXCEPT {return ::erfl(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-erf(_A1 __lcpp_x) _NOEXCEPT {return ::erf((double)__lcpp_x);}
-
-// erfc
-
-inline _LIBCPP_INLINE_VISIBILITY float erfc(float __lcpp_x) _NOEXCEPT {return ::erfcf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double erfc(long double __lcpp_x) _NOEXCEPT {return ::erfcl(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-erfc(_A1 __lcpp_x) _NOEXCEPT {return ::erfc((double)__lcpp_x);}
-
-// exp2
-
-inline _LIBCPP_INLINE_VISIBILITY float exp2(float __lcpp_x) _NOEXCEPT {return ::exp2f(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double exp2(long double __lcpp_x) _NOEXCEPT {return ::exp2l(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-exp2(_A1 __lcpp_x) _NOEXCEPT {return ::exp2((double)__lcpp_x);}
-
-// expm1
-
-inline _LIBCPP_INLINE_VISIBILITY float expm1(float __lcpp_x) _NOEXCEPT {return ::expm1f(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double expm1(long double __lcpp_x) _NOEXCEPT {return ::expm1l(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-expm1(_A1 __lcpp_x) _NOEXCEPT {return ::expm1((double)__lcpp_x);}
-
-// fdim
-
-inline _LIBCPP_INLINE_VISIBILITY float fdim(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return ::fdimf(__lcpp_x, __lcpp_y);}
-inline _LIBCPP_INLINE_VISIBILITY long double fdim(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::fdiml(__lcpp_x, __lcpp_y);}
-
-template <class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::__lazy_enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value,
- std::__promote<_A1, _A2>
->::type
-fdim(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2>::type __result_type;
- static_assert((!(std::is_same<_A1, __result_type>::value &&
- std::is_same<_A2, __result_type>::value)), "");
- return ::fdim((__result_type)__lcpp_x, (__result_type)__lcpp_y);
-}
-
-// fma
-
-inline _LIBCPP_INLINE_VISIBILITY float fma(float __lcpp_x, float __lcpp_y, float __lcpp_z) _NOEXCEPT {return ::fmaf(__lcpp_x, __lcpp_y, __lcpp_z);}
-inline _LIBCPP_INLINE_VISIBILITY long double fma(long double __lcpp_x, long double __lcpp_y, long double __lcpp_z) _NOEXCEPT {return ::fmal(__lcpp_x, __lcpp_y, __lcpp_z);}
-
-template <class _A1, class _A2, class _A3>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::__lazy_enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value &&
- std::is_arithmetic<_A3>::value,
- std::__promote<_A1, _A2, _A3>
->::type
-fma(_A1 __lcpp_x, _A2 __lcpp_y, _A3 __lcpp_z) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2, _A3>::type __result_type;
- static_assert((!(std::is_same<_A1, __result_type>::value &&
- std::is_same<_A2, __result_type>::value &&
- std::is_same<_A3, __result_type>::value)), "");
- return ::fma((__result_type)__lcpp_x, (__result_type)__lcpp_y, (__result_type)__lcpp_z);
-}
-
-// fmax
-
-inline _LIBCPP_INLINE_VISIBILITY float fmax(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return ::fmaxf(__lcpp_x, __lcpp_y);}
-inline _LIBCPP_INLINE_VISIBILITY long double fmax(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::fmaxl(__lcpp_x, __lcpp_y);}
-
-template <class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::__lazy_enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value,
- std::__promote<_A1, _A2>
->::type
-fmax(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2>::type __result_type;
- static_assert((!(std::is_same<_A1, __result_type>::value &&
- std::is_same<_A2, __result_type>::value)), "");
- return ::fmax((__result_type)__lcpp_x, (__result_type)__lcpp_y);
-}
-
-// fmin
-
-inline _LIBCPP_INLINE_VISIBILITY float fmin(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return ::fminf(__lcpp_x, __lcpp_y);}
-inline _LIBCPP_INLINE_VISIBILITY long double fmin(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::fminl(__lcpp_x, __lcpp_y);}
-
-template <class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::__lazy_enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value,
- std::__promote<_A1, _A2>
->::type
-fmin(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2>::type __result_type;
- static_assert((!(std::is_same<_A1, __result_type>::value &&
- std::is_same<_A2, __result_type>::value)), "");
- return ::fmin((__result_type)__lcpp_x, (__result_type)__lcpp_y);
-}
-
-// hypot
-
-inline _LIBCPP_INLINE_VISIBILITY float hypot(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return ::hypotf(__lcpp_x, __lcpp_y);}
-inline _LIBCPP_INLINE_VISIBILITY long double hypot(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::hypotl(__lcpp_x, __lcpp_y);}
-
-template <class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::__lazy_enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value,
- std::__promote<_A1, _A2>
->::type
-hypot(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2>::type __result_type;
- static_assert((!(std::is_same<_A1, __result_type>::value &&
- std::is_same<_A2, __result_type>::value)), "");
- return ::hypot((__result_type)__lcpp_x, (__result_type)__lcpp_y);
-}
-
-// ilogb
-
-inline _LIBCPP_INLINE_VISIBILITY int ilogb(float __lcpp_x) _NOEXCEPT {return ::ilogbf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY int ilogb(long double __lcpp_x) _NOEXCEPT {return ::ilogbl(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, int>::type
-ilogb(_A1 __lcpp_x) _NOEXCEPT {return ::ilogb((double)__lcpp_x);}
-
-// lgamma
-
-inline _LIBCPP_INLINE_VISIBILITY float lgamma(float __lcpp_x) _NOEXCEPT {return ::lgammaf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double lgamma(long double __lcpp_x) _NOEXCEPT {return ::lgammal(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-lgamma(_A1 __lcpp_x) _NOEXCEPT {return ::lgamma((double)__lcpp_x);}
-
-// llrint
-
-inline _LIBCPP_INLINE_VISIBILITY long long llrint(float __lcpp_x) _NOEXCEPT {return ::llrintf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long long llrint(long double __lcpp_x) _NOEXCEPT {return ::llrintl(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, long long>::type
-llrint(_A1 __lcpp_x) _NOEXCEPT {return ::llrint((double)__lcpp_x);}
-
-// llround
-
-inline _LIBCPP_INLINE_VISIBILITY long long llround(float __lcpp_x) _NOEXCEPT {return ::llroundf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long long llround(long double __lcpp_x) _NOEXCEPT {return ::llroundl(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, long long>::type
-llround(_A1 __lcpp_x) _NOEXCEPT {return ::llround((double)__lcpp_x);}
-
-// log1p
-
-inline _LIBCPP_INLINE_VISIBILITY float log1p(float __lcpp_x) _NOEXCEPT {return ::log1pf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double log1p(long double __lcpp_x) _NOEXCEPT {return ::log1pl(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-log1p(_A1 __lcpp_x) _NOEXCEPT {return ::log1p((double)__lcpp_x);}
-
-// log2
-
-inline _LIBCPP_INLINE_VISIBILITY float log2(float __lcpp_x) _NOEXCEPT {return ::log2f(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double log2(long double __lcpp_x) _NOEXCEPT {return ::log2l(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-log2(_A1 __lcpp_x) _NOEXCEPT {return ::log2((double)__lcpp_x);}
-
-// logb
-
-inline _LIBCPP_INLINE_VISIBILITY float logb(float __lcpp_x) _NOEXCEPT {return ::logbf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double logb(long double __lcpp_x) _NOEXCEPT {return ::logbl(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-logb(_A1 __lcpp_x) _NOEXCEPT {return ::logb((double)__lcpp_x);}
-
-// lrint
-
-inline _LIBCPP_INLINE_VISIBILITY long lrint(float __lcpp_x) _NOEXCEPT {return ::lrintf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long lrint(long double __lcpp_x) _NOEXCEPT {return ::lrintl(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, long>::type
-lrint(_A1 __lcpp_x) _NOEXCEPT {return ::lrint((double)__lcpp_x);}
-
-// lround
-
-inline _LIBCPP_INLINE_VISIBILITY long lround(float __lcpp_x) _NOEXCEPT {return ::lroundf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long lround(long double __lcpp_x) _NOEXCEPT {return ::lroundl(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, long>::type
-lround(_A1 __lcpp_x) _NOEXCEPT {return ::lround((double)__lcpp_x);}
-
-// nan
-
-// nearbyint
-
-inline _LIBCPP_INLINE_VISIBILITY float nearbyint(float __lcpp_x) _NOEXCEPT {return ::nearbyintf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double nearbyint(long double __lcpp_x) _NOEXCEPT {return ::nearbyintl(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-nearbyint(_A1 __lcpp_x) _NOEXCEPT {return ::nearbyint((double)__lcpp_x);}
-
-// nextafter
-
-inline _LIBCPP_INLINE_VISIBILITY float nextafter(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return ::nextafterf(__lcpp_x, __lcpp_y);}
-inline _LIBCPP_INLINE_VISIBILITY long double nextafter(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::nextafterl(__lcpp_x, __lcpp_y);}
-
-template <class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::__lazy_enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value,
- std::__promote<_A1, _A2>
->::type
-nextafter(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2>::type __result_type;
- static_assert((!(std::is_same<_A1, __result_type>::value &&
- std::is_same<_A2, __result_type>::value)), "");
- return ::nextafter((__result_type)__lcpp_x, (__result_type)__lcpp_y);
-}
-
-// nexttoward
-
-inline _LIBCPP_INLINE_VISIBILITY float nexttoward(float __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::nexttowardf(__lcpp_x, __lcpp_y);}
-inline _LIBCPP_INLINE_VISIBILITY long double nexttoward(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::nexttowardl(__lcpp_x, __lcpp_y);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-nexttoward(_A1 __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::nexttoward((double)__lcpp_x, __lcpp_y);}
-
-// remainder
-
-inline _LIBCPP_INLINE_VISIBILITY float remainder(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return ::remainderf(__lcpp_x, __lcpp_y);}
-inline _LIBCPP_INLINE_VISIBILITY long double remainder(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::remainderl(__lcpp_x, __lcpp_y);}
-
-template <class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::__lazy_enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value,
- std::__promote<_A1, _A2>
->::type
-remainder(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2>::type __result_type;
- static_assert((!(std::is_same<_A1, __result_type>::value &&
- std::is_same<_A2, __result_type>::value)), "");
- return ::remainder((__result_type)__lcpp_x, (__result_type)__lcpp_y);
-}
-
-// remquo
-
-inline _LIBCPP_INLINE_VISIBILITY float remquo(float __lcpp_x, float __lcpp_y, int* __lcpp_z) _NOEXCEPT {return ::remquof(__lcpp_x, __lcpp_y, __lcpp_z);}
-inline _LIBCPP_INLINE_VISIBILITY long double remquo(long double __lcpp_x, long double __lcpp_y, int* __lcpp_z) _NOEXCEPT {return ::remquol(__lcpp_x, __lcpp_y, __lcpp_z);}
-
-template <class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::__lazy_enable_if
-<
- std::is_arithmetic<_A1>::value &&
- std::is_arithmetic<_A2>::value,
- std::__promote<_A1, _A2>
->::type
-remquo(_A1 __lcpp_x, _A2 __lcpp_y, int* __lcpp_z) _NOEXCEPT
-{
- typedef typename std::__promote<_A1, _A2>::type __result_type;
- static_assert((!(std::is_same<_A1, __result_type>::value &&
- std::is_same<_A2, __result_type>::value)), "");
- return ::remquo((__result_type)__lcpp_x, (__result_type)__lcpp_y, __lcpp_z);
-}
-
-// rint
-
-inline _LIBCPP_INLINE_VISIBILITY float rint(float __lcpp_x) _NOEXCEPT {return ::rintf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double rint(long double __lcpp_x) _NOEXCEPT {return ::rintl(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-rint(_A1 __lcpp_x) _NOEXCEPT {return ::rint((double)__lcpp_x);}
-
-// round
-
-inline _LIBCPP_INLINE_VISIBILITY float round(float __lcpp_x) _NOEXCEPT {return ::roundf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double round(long double __lcpp_x) _NOEXCEPT {return ::roundl(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-round(_A1 __lcpp_x) _NOEXCEPT {return ::round((double)__lcpp_x);}
-
-// scalbln
-
-inline _LIBCPP_INLINE_VISIBILITY float scalbln(float __lcpp_x, long __lcpp_y) _NOEXCEPT {return ::scalblnf(__lcpp_x, __lcpp_y);}
-inline _LIBCPP_INLINE_VISIBILITY long double scalbln(long double __lcpp_x, long __lcpp_y) _NOEXCEPT {return ::scalblnl(__lcpp_x, __lcpp_y);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-scalbln(_A1 __lcpp_x, long __lcpp_y) _NOEXCEPT {return ::scalbln((double)__lcpp_x, __lcpp_y);}
-
-// scalbn
-
-inline _LIBCPP_INLINE_VISIBILITY float scalbn(float __lcpp_x, int __lcpp_y) _NOEXCEPT {return ::scalbnf(__lcpp_x, __lcpp_y);}
-inline _LIBCPP_INLINE_VISIBILITY long double scalbn(long double __lcpp_x, int __lcpp_y) _NOEXCEPT {return ::scalbnl(__lcpp_x, __lcpp_y);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-scalbn(_A1 __lcpp_x, int __lcpp_y) _NOEXCEPT {return ::scalbn((double)__lcpp_x, __lcpp_y);}
-
-// tgamma
-
-inline _LIBCPP_INLINE_VISIBILITY float tgamma(float __lcpp_x) _NOEXCEPT {return ::tgammaf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double tgamma(long double __lcpp_x) _NOEXCEPT {return ::tgammal(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-tgamma(_A1 __lcpp_x) _NOEXCEPT {return ::tgamma((double)__lcpp_x);}
-
-// trunc
-
-inline _LIBCPP_INLINE_VISIBILITY float trunc(float __lcpp_x) _NOEXCEPT {return ::truncf(__lcpp_x);}
-inline _LIBCPP_INLINE_VISIBILITY long double trunc(long double __lcpp_x) _NOEXCEPT {return ::truncl(__lcpp_x);}
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_integral<_A1>::value, double>::type
-trunc(_A1 __lcpp_x) _NOEXCEPT {return ::trunc((double)__lcpp_x);}
-
-} // extern "C++"
-
-#endif // __cplusplus
-
-#else // _LIBCPP_MATH_H
-
-// This include lives outside the header guard in order to support an MSVC
-// extension which allows users to do:
-//
-// #define _USE_MATH_DEFINES
-// #include <math.h>
-//
-// and receive the definitions of mathematical constants, even if <math.h>
-// has previously been included.
-#if defined(_LIBCPP_MSVCRT) && defined(_USE_MATH_DEFINES)
-#include_next <math.h>
-#endif
-
-#endif // _LIBCPP_MATH_H
diff --git a/lib/libcxx/include/memory b/lib/libcxx/include/memory
deleted file mode 100644
index ce2c3576623..00000000000
--- a/lib/libcxx/include/memory
+++ /dev/null
@@ -1,5676 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- memory ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_MEMORY
-#define _LIBCPP_MEMORY
-
-/*
- memory synopsis
-
-namespace std
-{
-
-struct allocator_arg_t { };
-inline constexpr allocator_arg_t allocator_arg = allocator_arg_t();
-
-template <class T, class Alloc> struct uses_allocator;
-
-template <class Ptr>
-struct pointer_traits
-{
- typedef Ptr pointer;
- typedef <details> element_type;
- typedef <details> difference_type;
-
- template <class U> using rebind = <details>;
-
- static pointer pointer_to(<details>);
-};
-
-template <class T>
-struct pointer_traits<T*>
-{
- typedef T* pointer;
- typedef T element_type;
- typedef ptrdiff_t difference_type;
-
- template <class U> using rebind = U*;
-
- static pointer pointer_to(<details>) noexcept; // constexpr in C++20
-};
-
-template <class T> constexpr T* to_address(T* p) noexcept; // C++20
-template <class Ptr> auto to_address(const Ptr& p) noexcept; // C++20
-
-template <class Alloc>
-struct allocator_traits
-{
- typedef Alloc allocator_type;
- typedef typename allocator_type::value_type
- value_type;
-
- typedef Alloc::pointer | value_type* pointer;
- typedef Alloc::const_pointer
- | pointer_traits<pointer>::rebind<const value_type>
- const_pointer;
- typedef Alloc::void_pointer
- | pointer_traits<pointer>::rebind<void>
- void_pointer;
- typedef Alloc::const_void_pointer
- | pointer_traits<pointer>::rebind<const void>
- const_void_pointer;
- typedef Alloc::difference_type
- | pointer_traits<pointer>::difference_type
- difference_type;
- typedef Alloc::size_type
- | make_unsigned<difference_type>::type
- size_type;
- typedef Alloc::propagate_on_container_copy_assignment
- | false_type propagate_on_container_copy_assignment;
- typedef Alloc::propagate_on_container_move_assignment
- | false_type propagate_on_container_move_assignment;
- typedef Alloc::propagate_on_container_swap
- | false_type propagate_on_container_swap;
- typedef Alloc::is_always_equal
- | is_empty is_always_equal;
-
- template <class T> using rebind_alloc = Alloc::rebind<U>::other | Alloc<T, Args...>;
- template <class T> using rebind_traits = allocator_traits<rebind_alloc<T>>;
-
- static pointer allocate(allocator_type& a, size_type n); // [[nodiscard]] in C++20
- static pointer allocate(allocator_type& a, size_type n, const_void_pointer hint); // [[nodiscard]] in C++20
-
- static void deallocate(allocator_type& a, pointer p, size_type n) noexcept;
-
- template <class T, class... Args>
- static void construct(allocator_type& a, T* p, Args&&... args);
-
- template <class T>
- static void destroy(allocator_type& a, T* p);
-
- static size_type max_size(const allocator_type& a); // noexcept in C++14
-
- static allocator_type
- select_on_container_copy_construction(const allocator_type& a);
-};
-
-template <>
-class allocator<void>
-{
-public:
- typedef void* pointer;
- typedef const void* const_pointer;
- typedef void value_type;
-
- template <class _Up> struct rebind {typedef allocator<_Up> other;};
-};
-
-template <class T>
-class allocator
-{
-public:
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- typedef T* pointer;
- typedef const T* const_pointer;
- typedef typename add_lvalue_reference<T>::type reference;
- typedef typename add_lvalue_reference<const T>::type const_reference;
- typedef T value_type;
-
- template <class U> struct rebind {typedef allocator<U> other;};
-
- constexpr allocator() noexcept; // constexpr in C++20
- constexpr allocator(const allocator&) noexcept; // constexpr in C++20
- template <class U>
- constexpr allocator(const allocator<U>&) noexcept; // constexpr in C++20
- ~allocator();
- pointer address(reference x) const noexcept;
- const_pointer address(const_reference x) const noexcept;
- pointer allocate(size_type, allocator<void>::const_pointer hint = 0);
- void deallocate(pointer p, size_type n) noexcept;
- size_type max_size() const noexcept;
- template<class U, class... Args>
- void construct(U* p, Args&&... args);
- template <class U>
- void destroy(U* p);
-};
-
-template <class T, class U>
-bool operator==(const allocator<T>&, const allocator<U>&) noexcept;
-
-template <class T, class U>
-bool operator!=(const allocator<T>&, const allocator<U>&) noexcept;
-
-template <class OutputIterator, class T>
-class raw_storage_iterator
- : public iterator<output_iterator_tag,
- T, // purposefully not C++03
- ptrdiff_t, // purposefully not C++03
- T*, // purposefully not C++03
- raw_storage_iterator&> // purposefully not C++03
-{
-public:
- explicit raw_storage_iterator(OutputIterator x);
- raw_storage_iterator& operator*();
- raw_storage_iterator& operator=(const T& element);
- raw_storage_iterator& operator++();
- raw_storage_iterator operator++(int);
-};
-
-template <class T> pair<T*,ptrdiff_t> get_temporary_buffer(ptrdiff_t n) noexcept;
-template <class T> void return_temporary_buffer(T* p) noexcept;
-
-template <class T> T* addressof(T& r) noexcept;
-template <class T> T* addressof(const T&& r) noexcept = delete;
-
-template <class InputIterator, class ForwardIterator>
-ForwardIterator
-uninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result);
-
-template <class InputIterator, class Size, class ForwardIterator>
-ForwardIterator
-uninitialized_copy_n(InputIterator first, Size n, ForwardIterator result);
-
-template <class ForwardIterator, class T>
-void uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x);
-
-template <class ForwardIterator, class Size, class T>
-ForwardIterator
-uninitialized_fill_n(ForwardIterator first, Size n, const T& x);
-
-template <class T>
-void destroy_at(T* location);
-
-template <class ForwardIterator>
- void destroy(ForwardIterator first, ForwardIterator last);
-
-template <class ForwardIterator, class Size>
- ForwardIterator destroy_n(ForwardIterator first, Size n);
-
-template <class InputIterator, class ForwardIterator>
- ForwardIterator uninitialized_move(InputIterator first, InputIterator last, ForwardIterator result);
-
-template <class InputIterator, class Size, class ForwardIterator>
- pair<InputIterator,ForwardIterator> uninitialized_move_n(InputIterator first, Size n, ForwardIterator result);
-
-template <class ForwardIterator>
- void uninitialized_value_construct(ForwardIterator first, ForwardIterator last);
-
-template <class ForwardIterator, class Size>
- ForwardIterator uninitialized_value_construct_n(ForwardIterator first, Size n);
-
-template <class ForwardIterator>
- void uninitialized_default_construct(ForwardIterator first, ForwardIterator last);
-
-template <class ForwardIterator, class Size>
- ForwardIterator uninitialized_default_construct_n(ForwardIterator first, Size n);
-
-template <class Y> struct auto_ptr_ref {}; // deprecated in C++11, removed in C++17
-
-template<class X>
-class auto_ptr // deprecated in C++11, removed in C++17
-{
-public:
- typedef X element_type;
-
- explicit auto_ptr(X* p =0) throw();
- auto_ptr(auto_ptr&) throw();
- template<class Y> auto_ptr(auto_ptr<Y>&) throw();
- auto_ptr& operator=(auto_ptr&) throw();
- template<class Y> auto_ptr& operator=(auto_ptr<Y>&) throw();
- auto_ptr& operator=(auto_ptr_ref<X> r) throw();
- ~auto_ptr() throw();
-
- typename add_lvalue_reference<X>::type operator*() const throw();
- X* operator->() const throw();
- X* get() const throw();
- X* release() throw();
- void reset(X* p =0) throw();
-
- auto_ptr(auto_ptr_ref<X>) throw();
- template<class Y> operator auto_ptr_ref<Y>() throw();
- template<class Y> operator auto_ptr<Y>() throw();
-};
-
-template <class T>
-struct default_delete
-{
- constexpr default_delete() noexcept = default;
- template <class U> default_delete(const default_delete<U>&) noexcept;
-
- void operator()(T*) const noexcept;
-};
-
-template <class T>
-struct default_delete<T[]>
-{
- constexpr default_delete() noexcept = default;
- void operator()(T*) const noexcept;
- template <class U> void operator()(U*) const = delete;
-};
-
-template <class T, class D = default_delete<T>>
-class unique_ptr
-{
-public:
- typedef see below pointer;
- typedef T element_type;
- typedef D deleter_type;
-
- // constructors
- constexpr unique_ptr() noexcept;
- explicit unique_ptr(pointer p) noexcept;
- unique_ptr(pointer p, see below d1) noexcept;
- unique_ptr(pointer p, see below d2) noexcept;
- unique_ptr(unique_ptr&& u) noexcept;
- unique_ptr(nullptr_t) noexcept : unique_ptr() { }
- template <class U, class E>
- unique_ptr(unique_ptr<U, E>&& u) noexcept;
- template <class U>
- unique_ptr(auto_ptr<U>&& u) noexcept; // removed in C++17
-
- // destructor
- ~unique_ptr();
-
- // assignment
- unique_ptr& operator=(unique_ptr&& u) noexcept;
- template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept;
- unique_ptr& operator=(nullptr_t) noexcept;
-
- // observers
- typename add_lvalue_reference<T>::type operator*() const;
- pointer operator->() const noexcept;
- pointer get() const noexcept;
- deleter_type& get_deleter() noexcept;
- const deleter_type& get_deleter() const noexcept;
- explicit operator bool() const noexcept;
-
- // modifiers
- pointer release() noexcept;
- void reset(pointer p = pointer()) noexcept;
- void swap(unique_ptr& u) noexcept;
-};
-
-template <class T, class D>
-class unique_ptr<T[], D>
-{
-public:
- typedef implementation-defined pointer;
- typedef T element_type;
- typedef D deleter_type;
-
- // constructors
- constexpr unique_ptr() noexcept;
- explicit unique_ptr(pointer p) noexcept;
- unique_ptr(pointer p, see below d) noexcept;
- unique_ptr(pointer p, see below d) noexcept;
- unique_ptr(unique_ptr&& u) noexcept;
- unique_ptr(nullptr_t) noexcept : unique_ptr() { }
-
- // destructor
- ~unique_ptr();
-
- // assignment
- unique_ptr& operator=(unique_ptr&& u) noexcept;
- unique_ptr& operator=(nullptr_t) noexcept;
-
- // observers
- T& operator[](size_t i) const;
- pointer get() const noexcept;
- deleter_type& get_deleter() noexcept;
- const deleter_type& get_deleter() const noexcept;
- explicit operator bool() const noexcept;
-
- // modifiers
- pointer release() noexcept;
- void reset(pointer p = pointer()) noexcept;
- void reset(nullptr_t) noexcept;
- template <class U> void reset(U) = delete;
- void swap(unique_ptr& u) noexcept;
-};
-
-template <class T, class D>
- void swap(unique_ptr<T, D>& x, unique_ptr<T, D>& y) noexcept;
-
-template <class T1, class D1, class T2, class D2>
- bool operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
-template <class T1, class D1, class T2, class D2>
- bool operator!=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
-template <class T1, class D1, class T2, class D2>
- bool operator<(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
-template <class T1, class D1, class T2, class D2>
- bool operator<=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
-template <class T1, class D1, class T2, class D2>
- bool operator>(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
-template <class T1, class D1, class T2, class D2>
- bool operator>=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
-
-template <class T, class D>
- bool operator==(const unique_ptr<T, D>& x, nullptr_t) noexcept;
-template <class T, class D>
- bool operator==(nullptr_t, const unique_ptr<T, D>& y) noexcept;
-template <class T, class D>
- bool operator!=(const unique_ptr<T, D>& x, nullptr_t) noexcept;
-template <class T, class D>
- bool operator!=(nullptr_t, const unique_ptr<T, D>& y) noexcept;
-
-template <class T, class D>
- bool operator<(const unique_ptr<T, D>& x, nullptr_t);
-template <class T, class D>
- bool operator<(nullptr_t, const unique_ptr<T, D>& y);
-template <class T, class D>
- bool operator<=(const unique_ptr<T, D>& x, nullptr_t);
-template <class T, class D>
- bool operator<=(nullptr_t, const unique_ptr<T, D>& y);
-template <class T, class D>
- bool operator>(const unique_ptr<T, D>& x, nullptr_t);
-template <class T, class D>
- bool operator>(nullptr_t, const unique_ptr<T, D>& y);
-template <class T, class D>
- bool operator>=(const unique_ptr<T, D>& x, nullptr_t);
-template <class T, class D>
- bool operator>=(nullptr_t, const unique_ptr<T, D>& y);
-
-class bad_weak_ptr
- : public std::exception
-{
- bad_weak_ptr() noexcept;
-};
-
-template<class T, class... Args> unique_ptr<T> make_unique(Args&&... args); // C++14
-template<class T> unique_ptr<T> make_unique(size_t n); // C++14
-template<class T, class... Args> unspecified make_unique(Args&&...) = delete; // C++14, T == U[N]
-
-template<class E, class T, class Y, class D>
- basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, unique_ptr<Y, D> const& p);
-
-template<class T>
-class shared_ptr
-{
-public:
- typedef T element_type;
- typedef weak_ptr<T> weak_type; // C++17
-
- // constructors:
- constexpr shared_ptr() noexcept;
- template<class Y> explicit shared_ptr(Y* p);
- template<class Y, class D> shared_ptr(Y* p, D d);
- template<class Y, class D, class A> shared_ptr(Y* p, D d, A a);
- template <class D> shared_ptr(nullptr_t p, D d);
- template <class D, class A> shared_ptr(nullptr_t p, D d, A a);
- template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept;
- shared_ptr(const shared_ptr& r) noexcept;
- template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept;
- shared_ptr(shared_ptr&& r) noexcept;
- template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept;
- template<class Y> explicit shared_ptr(const weak_ptr<Y>& r);
- template<class Y> shared_ptr(auto_ptr<Y>&& r); // removed in C++17
- template <class Y, class D> shared_ptr(unique_ptr<Y, D>&& r);
- shared_ptr(nullptr_t) : shared_ptr() { }
-
- // destructor:
- ~shared_ptr();
-
- // assignment:
- shared_ptr& operator=(const shared_ptr& r) noexcept;
- template<class Y> shared_ptr& operator=(const shared_ptr<Y>& r) noexcept;
- shared_ptr& operator=(shared_ptr&& r) noexcept;
- template<class Y> shared_ptr& operator=(shared_ptr<Y>&& r);
- template<class Y> shared_ptr& operator=(auto_ptr<Y>&& r); // removed in C++17
- template <class Y, class D> shared_ptr& operator=(unique_ptr<Y, D>&& r);
-
- // modifiers:
- void swap(shared_ptr& r) noexcept;
- void reset() noexcept;
- template<class Y> void reset(Y* p);
- template<class Y, class D> void reset(Y* p, D d);
- template<class Y, class D, class A> void reset(Y* p, D d, A a);
-
- // observers:
- T* get() const noexcept;
- T& operator*() const noexcept;
- T* operator->() const noexcept;
- long use_count() const noexcept;
- bool unique() const noexcept;
- explicit operator bool() const noexcept;
- template<class U> bool owner_before(shared_ptr<U> const& b) const noexcept;
- template<class U> bool owner_before(weak_ptr<U> const& b) const noexcept;
-};
-
-// shared_ptr comparisons:
-template<class T, class U>
- bool operator==(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
-template<class T, class U>
- bool operator!=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
-template<class T, class U>
- bool operator<(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
-template<class T, class U>
- bool operator>(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
-template<class T, class U>
- bool operator<=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
-template<class T, class U>
- bool operator>=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
-
-template <class T>
- bool operator==(const shared_ptr<T>& x, nullptr_t) noexcept;
-template <class T>
- bool operator==(nullptr_t, const shared_ptr<T>& y) noexcept;
-template <class T>
- bool operator!=(const shared_ptr<T>& x, nullptr_t) noexcept;
-template <class T>
- bool operator!=(nullptr_t, const shared_ptr<T>& y) noexcept;
-template <class T>
- bool operator<(const shared_ptr<T>& x, nullptr_t) noexcept;
-template <class T>
-bool operator<(nullptr_t, const shared_ptr<T>& y) noexcept;
-template <class T>
- bool operator<=(const shared_ptr<T>& x, nullptr_t) noexcept;
-template <class T>
- bool operator<=(nullptr_t, const shared_ptr<T>& y) noexcept;
-template <class T>
- bool operator>(const shared_ptr<T>& x, nullptr_t) noexcept;
-template <class T>
- bool operator>(nullptr_t, const shared_ptr<T>& y) noexcept;
-template <class T>
- bool operator>=(const shared_ptr<T>& x, nullptr_t) noexcept;
-template <class T>
- bool operator>=(nullptr_t, const shared_ptr<T>& y) noexcept;
-
-// shared_ptr specialized algorithms:
-template<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b) noexcept;
-
-// shared_ptr casts:
-template<class T, class U>
- shared_ptr<T> static_pointer_cast(shared_ptr<U> const& r) noexcept;
-template<class T, class U>
- shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const& r) noexcept;
-template<class T, class U>
- shared_ptr<T> const_pointer_cast(shared_ptr<U> const& r) noexcept;
-
-// shared_ptr I/O:
-template<class E, class T, class Y>
- basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, shared_ptr<Y> const& p);
-
-// shared_ptr get_deleter:
-template<class D, class T> D* get_deleter(shared_ptr<T> const& p) noexcept;
-
-template<class T, class... Args>
- shared_ptr<T> make_shared(Args&&... args);
-template<class T, class A, class... Args>
- shared_ptr<T> allocate_shared(const A& a, Args&&... args);
-
-template<class T>
-class weak_ptr
-{
-public:
- typedef T element_type;
-
- // constructors
- constexpr weak_ptr() noexcept;
- template<class Y> weak_ptr(shared_ptr<Y> const& r) noexcept;
- weak_ptr(weak_ptr const& r) noexcept;
- template<class Y> weak_ptr(weak_ptr<Y> const& r) noexcept;
- weak_ptr(weak_ptr&& r) noexcept; // C++14
- template<class Y> weak_ptr(weak_ptr<Y>&& r) noexcept; // C++14
-
- // destructor
- ~weak_ptr();
-
- // assignment
- weak_ptr& operator=(weak_ptr const& r) noexcept;
- template<class Y> weak_ptr& operator=(weak_ptr<Y> const& r) noexcept;
- template<class Y> weak_ptr& operator=(shared_ptr<Y> const& r) noexcept;
- weak_ptr& operator=(weak_ptr&& r) noexcept; // C++14
- template<class Y> weak_ptr& operator=(weak_ptr<Y>&& r) noexcept; // C++14
-
- // modifiers
- void swap(weak_ptr& r) noexcept;
- void reset() noexcept;
-
- // observers
- long use_count() const noexcept;
- bool expired() const noexcept;
- shared_ptr<T> lock() const noexcept;
- template<class U> bool owner_before(shared_ptr<U> const& b) const noexcept;
- template<class U> bool owner_before(weak_ptr<U> const& b) const noexcept;
-};
-
-// weak_ptr specialized algorithms:
-template<class T> void swap(weak_ptr<T>& a, weak_ptr<T>& b) noexcept;
-
-// class owner_less:
-template<class T> struct owner_less;
-
-template<class T>
-struct owner_less<shared_ptr<T>>
- : binary_function<shared_ptr<T>, shared_ptr<T>, bool>
-{
- typedef bool result_type;
- bool operator()(shared_ptr<T> const&, shared_ptr<T> const&) const noexcept;
- bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const noexcept;
- bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const noexcept;
-};
-
-template<class T>
-struct owner_less<weak_ptr<T>>
- : binary_function<weak_ptr<T>, weak_ptr<T>, bool>
-{
- typedef bool result_type;
- bool operator()(weak_ptr<T> const&, weak_ptr<T> const&) const noexcept;
- bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const noexcept;
- bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const noexcept;
-};
-
-template <> // Added in C++14
-struct owner_less<void>
-{
- template <class _Tp, class _Up>
- bool operator()( shared_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const noexcept;
- template <class _Tp, class _Up>
- bool operator()( shared_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const noexcept;
- template <class _Tp, class _Up>
- bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const noexcept;
- template <class _Tp, class _Up>
- bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const noexcept;
-
- typedef void is_transparent;
-};
-
-template<class T>
-class enable_shared_from_this
-{
-protected:
- constexpr enable_shared_from_this() noexcept;
- enable_shared_from_this(enable_shared_from_this const&) noexcept;
- enable_shared_from_this& operator=(enable_shared_from_this const&) noexcept;
- ~enable_shared_from_this();
-public:
- shared_ptr<T> shared_from_this();
- shared_ptr<T const> shared_from_this() const;
-};
-
-template<class T>
- bool atomic_is_lock_free(const shared_ptr<T>* p);
-template<class T>
- shared_ptr<T> atomic_load(const shared_ptr<T>* p);
-template<class T>
- shared_ptr<T> atomic_load_explicit(const shared_ptr<T>* p, memory_order mo);
-template<class T>
- void atomic_store(shared_ptr<T>* p, shared_ptr<T> r);
-template<class T>
- void atomic_store_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo);
-template<class T>
- shared_ptr<T> atomic_exchange(shared_ptr<T>* p, shared_ptr<T> r);
-template<class T>
- shared_ptr<T>
- atomic_exchange_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo);
-template<class T>
- bool
- atomic_compare_exchange_weak(shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w);
-template<class T>
- bool
- atomic_compare_exchange_strong( shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w);
-template<class T>
- bool
- atomic_compare_exchange_weak_explicit(shared_ptr<T>* p, shared_ptr<T>* v,
- shared_ptr<T> w, memory_order success,
- memory_order failure);
-template<class T>
- bool
- atomic_compare_exchange_strong_explicit(shared_ptr<T>* p, shared_ptr<T>* v,
- shared_ptr<T> w, memory_order success,
- memory_order failure);
-// Hash support
-template <class T> struct hash;
-template <class T, class D> struct hash<unique_ptr<T, D> >;
-template <class T> struct hash<shared_ptr<T> >;
-
-template <class T, class Alloc>
- inline constexpr bool uses_allocator_v = uses_allocator<T, Alloc>::value;
-
-// Pointer safety
-enum class pointer_safety { relaxed, preferred, strict };
-void declare_reachable(void *p);
-template <class T> T *undeclare_reachable(T *p);
-void declare_no_pointers(char *p, size_t n);
-void undeclare_no_pointers(char *p, size_t n);
-pointer_safety get_pointer_safety() noexcept;
-
-void* align(size_t alignment, size_t size, void*& ptr, size_t& space);
-
-} // std
-
-*/
-
-#include <__config>
-#include <type_traits>
-#include <typeinfo>
-#include <cstddef>
-#include <cstdint>
-#include <new>
-#include <utility>
-#include <limits>
-#include <iterator>
-#include <__functional_base>
-#include <iosfwd>
-#include <tuple>
-#include <stdexcept>
-#include <cstring>
-#include <cassert>
-#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
-# include <atomic>
-#endif
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _ValueType>
-inline _LIBCPP_INLINE_VISIBILITY
-_ValueType __libcpp_relaxed_load(_ValueType const* __value) {
-#if !defined(_LIBCPP_HAS_NO_THREADS) && \
- defined(__ATOMIC_RELAXED) && \
- (__has_builtin(__atomic_load_n) || _GNUC_VER >= 407)
- return __atomic_load_n(__value, __ATOMIC_RELAXED);
-#else
- return *__value;
-#endif
-}
-
-template <class _ValueType>
-inline _LIBCPP_INLINE_VISIBILITY
-_ValueType __libcpp_acquire_load(_ValueType const* __value) {
-#if !defined(_LIBCPP_HAS_NO_THREADS) && \
- defined(__ATOMIC_ACQUIRE) && \
- (__has_builtin(__atomic_load_n) || _GNUC_VER >= 407)
- return __atomic_load_n(__value, __ATOMIC_ACQUIRE);
-#else
- return *__value;
-#endif
-}
-
-// addressof moved to <type_traits>
-
-template <class _Tp> class allocator;
-
-template <>
-class _LIBCPP_TEMPLATE_VIS allocator<void>
-{
-public:
- typedef void* pointer;
- typedef const void* const_pointer;
- typedef void value_type;
-
- template <class _Up> struct rebind {typedef allocator<_Up> other;};
-};
-
-template <>
-class _LIBCPP_TEMPLATE_VIS allocator<const void>
-{
-public:
- typedef const void* pointer;
- typedef const void* const_pointer;
- typedef const void value_type;
-
- template <class _Up> struct rebind {typedef allocator<_Up> other;};
-};
-
-// pointer_traits
-
-template <class _Tp, class = void>
-struct __has_element_type : false_type {};
-
-template <class _Tp>
-struct __has_element_type<_Tp,
- typename __void_t<typename _Tp::element_type>::type> : true_type {};
-
-template <class _Ptr, bool = __has_element_type<_Ptr>::value>
-struct __pointer_traits_element_type;
-
-template <class _Ptr>
-struct __pointer_traits_element_type<_Ptr, true>
-{
- typedef typename _Ptr::element_type type;
-};
-
-#ifndef _LIBCPP_HAS_NO_VARIADICS
-
-template <template <class, class...> class _Sp, class _Tp, class ..._Args>
-struct __pointer_traits_element_type<_Sp<_Tp, _Args...>, true>
-{
- typedef typename _Sp<_Tp, _Args...>::element_type type;
-};
-
-template <template <class, class...> class _Sp, class _Tp, class ..._Args>
-struct __pointer_traits_element_type<_Sp<_Tp, _Args...>, false>
-{
- typedef _Tp type;
-};
-
-#else // _LIBCPP_HAS_NO_VARIADICS
-
-template <template <class> class _Sp, class _Tp>
-struct __pointer_traits_element_type<_Sp<_Tp>, true>
-{
- typedef typename _Sp<_Tp>::element_type type;
-};
-
-template <template <class> class _Sp, class _Tp>
-struct __pointer_traits_element_type<_Sp<_Tp>, false>
-{
- typedef _Tp type;
-};
-
-template <template <class, class> class _Sp, class _Tp, class _A0>
-struct __pointer_traits_element_type<_Sp<_Tp, _A0>, true>
-{
- typedef typename _Sp<_Tp, _A0>::element_type type;
-};
-
-template <template <class, class> class _Sp, class _Tp, class _A0>
-struct __pointer_traits_element_type<_Sp<_Tp, _A0>, false>
-{
- typedef _Tp type;
-};
-
-template <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1>
-struct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, true>
-{
- typedef typename _Sp<_Tp, _A0, _A1>::element_type type;
-};
-
-template <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1>
-struct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, false>
-{
- typedef _Tp type;
-};
-
-template <template <class, class, class, class> class _Sp, class _Tp, class _A0,
- class _A1, class _A2>
-struct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, true>
-{
- typedef typename _Sp<_Tp, _A0, _A1, _A2>::element_type type;
-};
-
-template <template <class, class, class, class> class _Sp, class _Tp, class _A0,
- class _A1, class _A2>
-struct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, false>
-{
- typedef _Tp type;
-};
-
-#endif // _LIBCPP_HAS_NO_VARIADICS
-
-template <class _Tp, class = void>
-struct __has_difference_type : false_type {};
-
-template <class _Tp>
-struct __has_difference_type<_Tp,
- typename __void_t<typename _Tp::difference_type>::type> : true_type {};
-
-template <class _Ptr, bool = __has_difference_type<_Ptr>::value>
-struct __pointer_traits_difference_type
-{
- typedef ptrdiff_t type;
-};
-
-template <class _Ptr>
-struct __pointer_traits_difference_type<_Ptr, true>
-{
- typedef typename _Ptr::difference_type type;
-};
-
-template <class _Tp, class _Up>
-struct __has_rebind
-{
-private:
- struct __two {char __lx; char __lxx;};
- template <class _Xp> static __two __test(...);
- template <class _Xp> static char __test(typename _Xp::template rebind<_Up>* = 0);
-public:
- static const bool value = sizeof(__test<_Tp>(0)) == 1;
-};
-
-template <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value>
-struct __pointer_traits_rebind
-{
-#ifndef _LIBCPP_CXX03_LANG
- typedef typename _Tp::template rebind<_Up> type;
-#else
- typedef typename _Tp::template rebind<_Up>::other type;
-#endif
-};
-
-#ifndef _LIBCPP_HAS_NO_VARIADICS
-
-template <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up>
-struct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, true>
-{
-#ifndef _LIBCPP_CXX03_LANG
- typedef typename _Sp<_Tp, _Args...>::template rebind<_Up> type;
-#else
- typedef typename _Sp<_Tp, _Args...>::template rebind<_Up>::other type;
-#endif
-};
-
-template <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up>
-struct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, false>
-{
- typedef _Sp<_Up, _Args...> type;
-};
-
-#else // _LIBCPP_HAS_NO_VARIADICS
-
-template <template <class> class _Sp, class _Tp, class _Up>
-struct __pointer_traits_rebind<_Sp<_Tp>, _Up, true>
-{
-#ifndef _LIBCPP_CXX03_LANG
- typedef typename _Sp<_Tp>::template rebind<_Up> type;
-#else
- typedef typename _Sp<_Tp>::template rebind<_Up>::other type;
-#endif
-};
-
-template <template <class> class _Sp, class _Tp, class _Up>
-struct __pointer_traits_rebind<_Sp<_Tp>, _Up, false>
-{
- typedef _Sp<_Up> type;
-};
-
-template <template <class, class> class _Sp, class _Tp, class _A0, class _Up>
-struct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, true>
-{
-#ifndef _LIBCPP_CXX03_LANG
- typedef typename _Sp<_Tp, _A0>::template rebind<_Up> type;
-#else
- typedef typename _Sp<_Tp, _A0>::template rebind<_Up>::other type;
-#endif
-};
-
-template <template <class, class> class _Sp, class _Tp, class _A0, class _Up>
-struct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, false>
-{
- typedef _Sp<_Up, _A0> type;
-};
-
-template <template <class, class, class> class _Sp, class _Tp, class _A0,
- class _A1, class _Up>
-struct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, true>
-{
-#ifndef _LIBCPP_CXX03_LANG
- typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up> type;
-#else
- typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up>::other type;
-#endif
-};
-
-template <template <class, class, class> class _Sp, class _Tp, class _A0,
- class _A1, class _Up>
-struct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, false>
-{
- typedef _Sp<_Up, _A0, _A1> type;
-};
-
-template <template <class, class, class, class> class _Sp, class _Tp, class _A0,
- class _A1, class _A2, class _Up>
-struct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, true>
-{
-#ifndef _LIBCPP_CXX03_LANG
- typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up> type;
-#else
- typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type;
-#endif
-};
-
-template <template <class, class, class, class> class _Sp, class _Tp, class _A0,
- class _A1, class _A2, class _Up>
-struct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, false>
-{
- typedef _Sp<_Up, _A0, _A1, _A2> type;
-};
-
-#endif // _LIBCPP_HAS_NO_VARIADICS
-
-template <class _Ptr>
-struct _LIBCPP_TEMPLATE_VIS pointer_traits
-{
- typedef _Ptr pointer;
- typedef typename __pointer_traits_element_type<pointer>::type element_type;
- typedef typename __pointer_traits_difference_type<pointer>::type difference_type;
-
-#ifndef _LIBCPP_CXX03_LANG
- template <class _Up> using rebind = typename __pointer_traits_rebind<pointer, _Up>::type;
-#else
- template <class _Up> struct rebind
- {typedef typename __pointer_traits_rebind<pointer, _Up>::type other;};
-#endif // _LIBCPP_CXX03_LANG
-
-private:
- struct __nat {};
-public:
- _LIBCPP_INLINE_VISIBILITY
- static pointer pointer_to(typename conditional<is_void<element_type>::value,
- __nat, element_type>::type& __r)
- {return pointer::pointer_to(__r);}
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS pointer_traits<_Tp*>
-{
- typedef _Tp* pointer;
- typedef _Tp element_type;
- typedef ptrdiff_t difference_type;
-
-#ifndef _LIBCPP_CXX03_LANG
- template <class _Up> using rebind = _Up*;
-#else
- template <class _Up> struct rebind {typedef _Up* other;};
-#endif
-
-private:
- struct __nat {};
-public:
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
- static pointer pointer_to(typename conditional<is_void<element_type>::value,
- __nat, element_type>::type& __r) _NOEXCEPT
- {return _VSTD::addressof(__r);}
-};
-
-template <class _From, class _To>
-struct __rebind_pointer {
-#ifndef _LIBCPP_CXX03_LANG
- typedef typename pointer_traits<_From>::template rebind<_To> type;
-#else
- typedef typename pointer_traits<_From>::template rebind<_To>::other type;
-#endif
-};
-
-// allocator_traits
-
-template <class _Tp, class = void>
-struct __has_pointer_type : false_type {};
-
-template <class _Tp>
-struct __has_pointer_type<_Tp,
- typename __void_t<typename _Tp::pointer>::type> : true_type {};
-
-namespace __pointer_type_imp
-{
-
-template <class _Tp, class _Dp, bool = __has_pointer_type<_Dp>::value>
-struct __pointer_type
-{
- typedef typename _Dp::pointer type;
-};
-
-template <class _Tp, class _Dp>
-struct __pointer_type<_Tp, _Dp, false>
-{
- typedef _Tp* type;
-};
-
-} // __pointer_type_imp
-
-template <class _Tp, class _Dp>
-struct __pointer_type
-{
- typedef typename __pointer_type_imp::__pointer_type<_Tp, typename remove_reference<_Dp>::type>::type type;
-};
-
-template <class _Tp, class = void>
-struct __has_const_pointer : false_type {};
-
-template <class _Tp>
-struct __has_const_pointer<_Tp,
- typename __void_t<typename _Tp::const_pointer>::type> : true_type {};
-
-template <class _Tp, class _Ptr, class _Alloc, bool = __has_const_pointer<_Alloc>::value>
-struct __const_pointer
-{
- typedef typename _Alloc::const_pointer type;
-};
-
-template <class _Tp, class _Ptr, class _Alloc>
-struct __const_pointer<_Tp, _Ptr, _Alloc, false>
-{
-#ifndef _LIBCPP_CXX03_LANG
- typedef typename pointer_traits<_Ptr>::template rebind<const _Tp> type;
-#else
- typedef typename pointer_traits<_Ptr>::template rebind<const _Tp>::other type;
-#endif
-};
-
-template <class _Tp, class = void>
-struct __has_void_pointer : false_type {};
-
-template <class _Tp>
-struct __has_void_pointer<_Tp,
- typename __void_t<typename _Tp::void_pointer>::type> : true_type {};
-
-template <class _Ptr, class _Alloc, bool = __has_void_pointer<_Alloc>::value>
-struct __void_pointer
-{
- typedef typename _Alloc::void_pointer type;
-};
-
-template <class _Ptr, class _Alloc>
-struct __void_pointer<_Ptr, _Alloc, false>
-{
-#ifndef _LIBCPP_CXX03_LANG
- typedef typename pointer_traits<_Ptr>::template rebind<void> type;
-#else
- typedef typename pointer_traits<_Ptr>::template rebind<void>::other type;
-#endif
-};
-
-template <class _Tp, class = void>
-struct __has_const_void_pointer : false_type {};
-
-template <class _Tp>
-struct __has_const_void_pointer<_Tp,
- typename __void_t<typename _Tp::const_void_pointer>::type> : true_type {};
-
-template <class _Ptr, class _Alloc, bool = __has_const_void_pointer<_Alloc>::value>
-struct __const_void_pointer
-{
- typedef typename _Alloc::const_void_pointer type;
-};
-
-template <class _Ptr, class _Alloc>
-struct __const_void_pointer<_Ptr, _Alloc, false>
-{
-#ifndef _LIBCPP_CXX03_LANG
- typedef typename pointer_traits<_Ptr>::template rebind<const void> type;
-#else
- typedef typename pointer_traits<_Ptr>::template rebind<const void>::other type;
-#endif
-};
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-_Tp*
-__to_raw_pointer(_Tp* __p) _NOEXCEPT
-{
- return __p;
-}
-
-#if _LIBCPP_STD_VER <= 17
-template <class _Pointer>
-inline _LIBCPP_INLINE_VISIBILITY
-typename pointer_traits<_Pointer>::element_type*
-__to_raw_pointer(_Pointer __p) _NOEXCEPT
-{
- return _VSTD::__to_raw_pointer(__p.operator->());
-}
-#else
-template <class _Pointer>
-inline _LIBCPP_INLINE_VISIBILITY
-auto
-__to_raw_pointer(const _Pointer& __p) _NOEXCEPT
--> decltype(pointer_traits<_Pointer>::to_address(__p))
-{
- return pointer_traits<_Pointer>::to_address(__p);
-}
-
-template <class _Pointer, class... _None>
-inline _LIBCPP_INLINE_VISIBILITY
-auto
-__to_raw_pointer(const _Pointer& __p, _None...) _NOEXCEPT
-{
- return _VSTD::__to_raw_pointer(__p.operator->());
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY constexpr
-_Tp*
-to_address(_Tp* __p) _NOEXCEPT
-{
- static_assert(!is_function_v<_Tp>, "_Tp is a function type");
- return __p;
-}
-
-template <class _Pointer>
-inline _LIBCPP_INLINE_VISIBILITY
-auto
-to_address(const _Pointer& __p) _NOEXCEPT
-{
- return _VSTD::__to_raw_pointer(__p);
-}
-#endif
-
-template <class _Tp, class = void>
-struct __has_size_type : false_type {};
-
-template <class _Tp>
-struct __has_size_type<_Tp,
- typename __void_t<typename _Tp::size_type>::type> : true_type {};
-
-template <class _Alloc, class _DiffType, bool = __has_size_type<_Alloc>::value>
-struct __size_type
-{
- typedef typename make_unsigned<_DiffType>::type type;
-};
-
-template <class _Alloc, class _DiffType>
-struct __size_type<_Alloc, _DiffType, true>
-{
- typedef typename _Alloc::size_type type;
-};
-
-template <class _Tp, class = void>
-struct __has_propagate_on_container_copy_assignment : false_type {};
-
-template <class _Tp>
-struct __has_propagate_on_container_copy_assignment<_Tp,
- typename __void_t<typename _Tp::propagate_on_container_copy_assignment>::type>
- : true_type {};
-
-template <class _Alloc, bool = __has_propagate_on_container_copy_assignment<_Alloc>::value>
-struct __propagate_on_container_copy_assignment
-{
- typedef false_type type;
-};
-
-template <class _Alloc>
-struct __propagate_on_container_copy_assignment<_Alloc, true>
-{
- typedef typename _Alloc::propagate_on_container_copy_assignment type;
-};
-
-template <class _Tp, class = void>
-struct __has_propagate_on_container_move_assignment : false_type {};
-
-template <class _Tp>
-struct __has_propagate_on_container_move_assignment<_Tp,
- typename __void_t<typename _Tp::propagate_on_container_move_assignment>::type>
- : true_type {};
-
-template <class _Alloc, bool = __has_propagate_on_container_move_assignment<_Alloc>::value>
-struct __propagate_on_container_move_assignment
-{
- typedef false_type type;
-};
-
-template <class _Alloc>
-struct __propagate_on_container_move_assignment<_Alloc, true>
-{
- typedef typename _Alloc::propagate_on_container_move_assignment type;
-};
-
-template <class _Tp, class = void>
-struct __has_propagate_on_container_swap : false_type {};
-
-template <class _Tp>
-struct __has_propagate_on_container_swap<_Tp,
- typename __void_t<typename _Tp::propagate_on_container_swap>::type>
- : true_type {};
-
-template <class _Alloc, bool = __has_propagate_on_container_swap<_Alloc>::value>
-struct __propagate_on_container_swap
-{
- typedef false_type type;
-};
-
-template <class _Alloc>
-struct __propagate_on_container_swap<_Alloc, true>
-{
- typedef typename _Alloc::propagate_on_container_swap type;
-};
-
-template <class _Tp, class = void>
-struct __has_is_always_equal : false_type {};
-
-template <class _Tp>
-struct __has_is_always_equal<_Tp,
- typename __void_t<typename _Tp::is_always_equal>::type>
- : true_type {};
-
-template <class _Alloc, bool = __has_is_always_equal<_Alloc>::value>
-struct __is_always_equal
-{
- typedef typename _VSTD::is_empty<_Alloc>::type type;
-};
-
-template <class _Alloc>
-struct __is_always_equal<_Alloc, true>
-{
- typedef typename _Alloc::is_always_equal type;
-};
-
-template <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value>
-struct __has_rebind_other
-{
-private:
- struct __two {char __lx; char __lxx;};
- template <class _Xp> static __two __test(...);
- template <class _Xp> static char __test(typename _Xp::template rebind<_Up>::other* = 0);
-public:
- static const bool value = sizeof(__test<_Tp>(0)) == 1;
-};
-
-template <class _Tp, class _Up>
-struct __has_rebind_other<_Tp, _Up, false>
-{
- static const bool value = false;
-};
-
-template <class _Tp, class _Up, bool = __has_rebind_other<_Tp, _Up>::value>
-struct __allocator_traits_rebind
-{
- typedef typename _Tp::template rebind<_Up>::other type;
-};
-
-#ifndef _LIBCPP_HAS_NO_VARIADICS
-
-template <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up>
-struct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, true>
-{
- typedef typename _Alloc<_Tp, _Args...>::template rebind<_Up>::other type;
-};
-
-template <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up>
-struct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, false>
-{
- typedef _Alloc<_Up, _Args...> type;
-};
-
-#else // _LIBCPP_HAS_NO_VARIADICS
-
-template <template <class> class _Alloc, class _Tp, class _Up>
-struct __allocator_traits_rebind<_Alloc<_Tp>, _Up, true>
-{
- typedef typename _Alloc<_Tp>::template rebind<_Up>::other type;
-};
-
-template <template <class> class _Alloc, class _Tp, class _Up>
-struct __allocator_traits_rebind<_Alloc<_Tp>, _Up, false>
-{
- typedef _Alloc<_Up> type;
-};
-
-template <template <class, class> class _Alloc, class _Tp, class _A0, class _Up>
-struct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, true>
-{
- typedef typename _Alloc<_Tp, _A0>::template rebind<_Up>::other type;
-};
-
-template <template <class, class> class _Alloc, class _Tp, class _A0, class _Up>
-struct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, false>
-{
- typedef _Alloc<_Up, _A0> type;
-};
-
-template <template <class, class, class> class _Alloc, class _Tp, class _A0,
- class _A1, class _Up>
-struct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, true>
-{
- typedef typename _Alloc<_Tp, _A0, _A1>::template rebind<_Up>::other type;
-};
-
-template <template <class, class, class> class _Alloc, class _Tp, class _A0,
- class _A1, class _Up>
-struct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, false>
-{
- typedef _Alloc<_Up, _A0, _A1> type;
-};
-
-template <template <class, class, class, class> class _Alloc, class _Tp, class _A0,
- class _A1, class _A2, class _Up>
-struct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, true>
-{
- typedef typename _Alloc<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type;
-};
-
-template <template <class, class, class, class> class _Alloc, class _Tp, class _A0,
- class _A1, class _A2, class _Up>
-struct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, false>
-{
- typedef _Alloc<_Up, _A0, _A1, _A2> type;
-};
-
-#endif // _LIBCPP_HAS_NO_VARIADICS
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Alloc, class _SizeType, class _ConstVoidPtr>
-auto
-__has_allocate_hint_test(_Alloc&& __a, _SizeType&& __sz, _ConstVoidPtr&& __p)
- -> decltype((void)__a.allocate(__sz, __p), true_type());
-
-template <class _Alloc, class _SizeType, class _ConstVoidPtr>
-auto
-__has_allocate_hint_test(const _Alloc& __a, _SizeType&& __sz, _ConstVoidPtr&& __p)
- -> false_type;
-
-template <class _Alloc, class _SizeType, class _ConstVoidPtr>
-struct __has_allocate_hint
- : integral_constant<bool,
- is_same<
- decltype(_VSTD::__has_allocate_hint_test(declval<_Alloc>(),
- declval<_SizeType>(),
- declval<_ConstVoidPtr>())),
- true_type>::value>
-{
-};
-
-#else // _LIBCPP_CXX03_LANG
-
-template <class _Alloc, class _SizeType, class _ConstVoidPtr>
-struct __has_allocate_hint
- : true_type
-{
-};
-
-#endif // _LIBCPP_CXX03_LANG
-
-#if !defined(_LIBCPP_CXX03_LANG)
-
-template <class _Alloc, class _Tp, class ..._Args>
-decltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Tp*>(),
- _VSTD::declval<_Args>()...),
- true_type())
-__has_construct_test(_Alloc&& __a, _Tp* __p, _Args&& ...__args);
-
-template <class _Alloc, class _Pointer, class ..._Args>
-false_type
-__has_construct_test(const _Alloc& __a, _Pointer&& __p, _Args&& ...__args);
-
-template <class _Alloc, class _Pointer, class ..._Args>
-struct __has_construct
- : integral_constant<bool,
- is_same<
- decltype(_VSTD::__has_construct_test(declval<_Alloc>(),
- declval<_Pointer>(),
- declval<_Args>()...)),
- true_type>::value>
-{
-};
-
-template <class _Alloc, class _Pointer>
-auto
-__has_destroy_test(_Alloc&& __a, _Pointer&& __p)
- -> decltype(__a.destroy(__p), true_type());
-
-template <class _Alloc, class _Pointer>
-auto
-__has_destroy_test(const _Alloc& __a, _Pointer&& __p)
- -> false_type;
-
-template <class _Alloc, class _Pointer>
-struct __has_destroy
- : integral_constant<bool,
- is_same<
- decltype(_VSTD::__has_destroy_test(declval<_Alloc>(),
- declval<_Pointer>())),
- true_type>::value>
-{
-};
-
-template <class _Alloc>
-auto
-__has_max_size_test(_Alloc&& __a)
- -> decltype(__a.max_size(), true_type());
-
-template <class _Alloc>
-auto
-__has_max_size_test(const volatile _Alloc& __a)
- -> false_type;
-
-template <class _Alloc>
-struct __has_max_size
- : integral_constant<bool,
- is_same<
- decltype(_VSTD::__has_max_size_test(declval<_Alloc&>())),
- true_type>::value>
-{
-};
-
-template <class _Alloc>
-auto
-__has_select_on_container_copy_construction_test(_Alloc&& __a)
- -> decltype(__a.select_on_container_copy_construction(), true_type());
-
-template <class _Alloc>
-auto
-__has_select_on_container_copy_construction_test(const volatile _Alloc& __a)
- -> false_type;
-
-template <class _Alloc>
-struct __has_select_on_container_copy_construction
- : integral_constant<bool,
- is_same<
- decltype(_VSTD::__has_select_on_container_copy_construction_test(declval<_Alloc&>())),
- true_type>::value>
-{
-};
-
-#else // _LIBCPP_CXX03_LANG
-
-template <class _Alloc, class _Pointer, class _Tp, class = void>
-struct __has_construct : std::false_type {};
-
-template <class _Alloc, class _Pointer, class _Tp>
-struct __has_construct<_Alloc, _Pointer, _Tp, typename __void_t<
- decltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Pointer>(), _VSTD::declval<_Tp>()))
->::type> : std::true_type {};
-
-template <class _Alloc, class _Pointer, class = void>
-struct __has_destroy : false_type {};
-
-template <class _Alloc, class _Pointer>
-struct __has_destroy<_Alloc, _Pointer, typename __void_t<
- decltype(_VSTD::declval<_Alloc>().destroy(_VSTD::declval<_Pointer>()))
->::type> : std::true_type {};
-
-template <class _Alloc>
-struct __has_max_size
- : true_type
-{
-};
-
-template <class _Alloc>
-struct __has_select_on_container_copy_construction
- : false_type
-{
-};
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Alloc, class _Ptr, bool = __has_difference_type<_Alloc>::value>
-struct __alloc_traits_difference_type
-{
- typedef typename pointer_traits<_Ptr>::difference_type type;
-};
-
-template <class _Alloc, class _Ptr>
-struct __alloc_traits_difference_type<_Alloc, _Ptr, true>
-{
- typedef typename _Alloc::difference_type type;
-};
-
-template <class _Tp>
-struct __is_default_allocator : false_type {};
-
-template <class _Tp>
-struct __is_default_allocator<_VSTD::allocator<_Tp> > : true_type {};
-
-template <class _Alloc>
-struct _LIBCPP_TEMPLATE_VIS allocator_traits
-{
- typedef _Alloc allocator_type;
- typedef typename allocator_type::value_type value_type;
-
- typedef typename __pointer_type<value_type, allocator_type>::type pointer;
- typedef typename __const_pointer<value_type, pointer, allocator_type>::type const_pointer;
- typedef typename __void_pointer<pointer, allocator_type>::type void_pointer;
- typedef typename __const_void_pointer<pointer, allocator_type>::type const_void_pointer;
-
- typedef typename __alloc_traits_difference_type<allocator_type, pointer>::type difference_type;
- typedef typename __size_type<allocator_type, difference_type>::type size_type;
-
- typedef typename __propagate_on_container_copy_assignment<allocator_type>::type
- propagate_on_container_copy_assignment;
- typedef typename __propagate_on_container_move_assignment<allocator_type>::type
- propagate_on_container_move_assignment;
- typedef typename __propagate_on_container_swap<allocator_type>::type
- propagate_on_container_swap;
- typedef typename __is_always_equal<allocator_type>::type
- is_always_equal;
-
-#ifndef _LIBCPP_CXX03_LANG
- template <class _Tp> using rebind_alloc =
- typename __allocator_traits_rebind<allocator_type, _Tp>::type;
- template <class _Tp> using rebind_traits = allocator_traits<rebind_alloc<_Tp>>;
-#else // _LIBCPP_CXX03_LANG
- template <class _Tp> struct rebind_alloc
- {typedef typename __allocator_traits_rebind<allocator_type, _Tp>::type other;};
- template <class _Tp> struct rebind_traits
- {typedef allocator_traits<typename rebind_alloc<_Tp>::other> other;};
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- static pointer allocate(allocator_type& __a, size_type __n)
- {return __a.allocate(__n);}
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer __hint)
- {return __allocate(__a, __n, __hint,
- __has_allocate_hint<allocator_type, size_type, const_void_pointer>());}
-
- _LIBCPP_INLINE_VISIBILITY
- static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT
- {__a.deallocate(__p, __n);}
-
-#ifndef _LIBCPP_HAS_NO_VARIADICS
- template <class _Tp, class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args)
- {__construct(__has_construct<allocator_type, _Tp*, _Args...>(),
- __a, __p, _VSTD::forward<_Args>(__args)...);}
-#else // _LIBCPP_HAS_NO_VARIADICS
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY
- static void construct(allocator_type&, _Tp* __p)
- {
- ::new ((void*)__p) _Tp();
- }
- template <class _Tp, class _A0>
- _LIBCPP_INLINE_VISIBILITY
- static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0)
- {
- __construct(__has_construct<allocator_type, _Tp*, const _A0&>(),
- __a, __p, __a0);
- }
- template <class _Tp, class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- static void construct(allocator_type&, _Tp* __p, const _A0& __a0,
- const _A1& __a1)
- {
- ::new ((void*)__p) _Tp(__a0, __a1);
- }
- template <class _Tp, class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- static void construct(allocator_type&, _Tp* __p, const _A0& __a0,
- const _A1& __a1, const _A2& __a2)
- {
- ::new ((void*)__p) _Tp(__a0, __a1, __a2);
- }
-#endif // _LIBCPP_HAS_NO_VARIADICS
-
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY
- static void destroy(allocator_type& __a, _Tp* __p)
- {__destroy(__has_destroy<allocator_type, _Tp*>(), __a, __p);}
-
- _LIBCPP_INLINE_VISIBILITY
- static size_type max_size(const allocator_type& __a) _NOEXCEPT
- {return __max_size(__has_max_size<const allocator_type>(), __a);}
-
- _LIBCPP_INLINE_VISIBILITY
- static allocator_type
- select_on_container_copy_construction(const allocator_type& __a)
- {return __select_on_container_copy_construction(
- __has_select_on_container_copy_construction<const allocator_type>(),
- __a);}
-
- template <class _Ptr>
- _LIBCPP_INLINE_VISIBILITY
- static
- void
- __construct_forward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __begin2)
- {
- for (; __begin1 != __end1; ++__begin1, (void) ++__begin2)
- construct(__a, _VSTD::__to_raw_pointer(__begin2), _VSTD::move_if_noexcept(*__begin1));
- }
-
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY
- static
- typename enable_if
- <
- (__is_default_allocator<allocator_type>::value
- || !__has_construct<allocator_type, _Tp*, _Tp>::value) &&
- is_trivially_move_constructible<_Tp>::value,
- void
- >::type
- __construct_forward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2)
- {
- ptrdiff_t _Np = __end1 - __begin1;
- if (_Np > 0)
- {
- _VSTD::memcpy(__begin2, __begin1, _Np * sizeof(_Tp));
- __begin2 += _Np;
- }
- }
-
- template <class _Iter, class _Ptr>
- _LIBCPP_INLINE_VISIBILITY
- static
- void
- __construct_range_forward(allocator_type& __a, _Iter __begin1, _Iter __end1, _Ptr& __begin2)
- {
- for (; __begin1 != __end1; ++__begin1, (void) ++__begin2)
- construct(__a, _VSTD::__to_raw_pointer(__begin2), *__begin1);
- }
-
- template <class _SourceTp, class _DestTp,
- class _RawSourceTp = typename remove_const<_SourceTp>::type,
- class _RawDestTp = typename remove_const<_DestTp>::type>
- _LIBCPP_INLINE_VISIBILITY
- static
- typename enable_if
- <
- is_trivially_move_constructible<_DestTp>::value &&
- is_same<_RawSourceTp, _RawDestTp>::value &&
- (__is_default_allocator<allocator_type>::value ||
- !__has_construct<allocator_type, _DestTp*, _SourceTp&>::value),
- void
- >::type
- __construct_range_forward(allocator_type&, _SourceTp* __begin1, _SourceTp* __end1, _DestTp*& __begin2)
- {
- ptrdiff_t _Np = __end1 - __begin1;
- if (_Np > 0)
- {
- _VSTD::memcpy(const_cast<_RawDestTp*>(__begin2), __begin1, _Np * sizeof(_DestTp));
- __begin2 += _Np;
- }
- }
-
- template <class _Ptr>
- _LIBCPP_INLINE_VISIBILITY
- static
- void
- __construct_backward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __end2)
- {
- while (__end1 != __begin1)
- {
- construct(__a, _VSTD::__to_raw_pointer(__end2-1), _VSTD::move_if_noexcept(*--__end1));
- --__end2;
- }
- }
-
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY
- static
- typename enable_if
- <
- (__is_default_allocator<allocator_type>::value
- || !__has_construct<allocator_type, _Tp*, _Tp>::value) &&
- is_trivially_move_constructible<_Tp>::value,
- void
- >::type
- __construct_backward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __end2)
- {
- ptrdiff_t _Np = __end1 - __begin1;
- __end2 -= _Np;
- if (_Np > 0)
- _VSTD::memcpy(__end2, __begin1, _Np * sizeof(_Tp));
- }
-
-private:
-
- _LIBCPP_INLINE_VISIBILITY
- static pointer __allocate(allocator_type& __a, size_type __n,
- const_void_pointer __hint, true_type)
- {return __a.allocate(__n, __hint);}
- _LIBCPP_INLINE_VISIBILITY
- static pointer __allocate(allocator_type& __a, size_type __n,
- const_void_pointer, false_type)
- {return __a.allocate(__n);}
-
-#ifndef _LIBCPP_HAS_NO_VARIADICS
- template <class _Tp, class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- static void __construct(true_type, allocator_type& __a, _Tp* __p, _Args&&... __args)
- {__a.construct(__p, _VSTD::forward<_Args>(__args)...);}
- template <class _Tp, class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- static void __construct(false_type, allocator_type&, _Tp* __p, _Args&&... __args)
- {
- ::new ((void*)__p) _Tp(_VSTD::forward<_Args>(__args)...);
- }
-#else // _LIBCPP_HAS_NO_VARIADICS
- template <class _Tp, class _A0>
- _LIBCPP_INLINE_VISIBILITY
- static void __construct(true_type, allocator_type& __a, _Tp* __p,
- const _A0& __a0)
- {__a.construct(__p, __a0);}
- template <class _Tp, class _A0>
- _LIBCPP_INLINE_VISIBILITY
- static void __construct(false_type, allocator_type&, _Tp* __p,
- const _A0& __a0)
- {
- ::new ((void*)__p) _Tp(__a0);
- }
-#endif // _LIBCPP_HAS_NO_VARIADICS
-
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY
- static void __destroy(true_type, allocator_type& __a, _Tp* __p)
- {__a.destroy(__p);}
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY
- static void __destroy(false_type, allocator_type&, _Tp* __p)
- {
- __p->~_Tp();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- static size_type __max_size(true_type, const allocator_type& __a) _NOEXCEPT
- {return __a.max_size();}
- _LIBCPP_INLINE_VISIBILITY
- static size_type __max_size(false_type, const allocator_type&) _NOEXCEPT
- {return numeric_limits<size_type>::max() / sizeof(value_type);}
-
- _LIBCPP_INLINE_VISIBILITY
- static allocator_type
- __select_on_container_copy_construction(true_type, const allocator_type& __a)
- {return __a.select_on_container_copy_construction();}
- _LIBCPP_INLINE_VISIBILITY
- static allocator_type
- __select_on_container_copy_construction(false_type, const allocator_type& __a)
- {return __a;}
-};
-
-template <class _Traits, class _Tp>
-struct __rebind_alloc_helper
-{
-#ifndef _LIBCPP_CXX03_LANG
- typedef typename _Traits::template rebind_alloc<_Tp> type;
-#else
- typedef typename _Traits::template rebind_alloc<_Tp>::other type;
-#endif
-};
-
-// allocator
-
-template <class _Tp>
-class _LIBCPP_TEMPLATE_VIS allocator
-{
-public:
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- typedef _Tp* pointer;
- typedef const _Tp* const_pointer;
- typedef _Tp& reference;
- typedef const _Tp& const_reference;
- typedef _Tp value_type;
-
- typedef true_type propagate_on_container_move_assignment;
- typedef true_type is_always_equal;
-
- template <class _Up> struct rebind {typedef allocator<_Up> other;};
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
- allocator() _NOEXCEPT {}
-
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
- allocator(const allocator<_Up>&) _NOEXCEPT {}
-
- _LIBCPP_INLINE_VISIBILITY pointer address(reference __x) const _NOEXCEPT
- {return _VSTD::addressof(__x);}
- _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT
- {return _VSTD::addressof(__x);}
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- pointer allocate(size_type __n, allocator<void>::const_pointer = 0)
- {
- if (__n > max_size())
- __throw_length_error("allocator<T>::allocate(size_t n)"
- " 'n' exceeds maximum supported size");
- return static_cast<pointer>(_VSTD::__libcpp_allocate(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)));
- }
- _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type __n) _NOEXCEPT
- {_VSTD::__libcpp_deallocate((void*)__p, __n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));}
- _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT
- {return size_type(~0) / sizeof(_Tp);}
-#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
- template <class _Up, class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- void
- construct(_Up* __p, _Args&&... __args)
- {
- ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
- }
-#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
- _LIBCPP_INLINE_VISIBILITY
- void
- construct(pointer __p)
- {
- ::new((void*)__p) _Tp();
- }
-# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
-
- template <class _A0>
- _LIBCPP_INLINE_VISIBILITY
- void
- construct(pointer __p, _A0& __a0)
- {
- ::new((void*)__p) _Tp(__a0);
- }
- template <class _A0>
- _LIBCPP_INLINE_VISIBILITY
- void
- construct(pointer __p, const _A0& __a0)
- {
- ::new((void*)__p) _Tp(__a0);
- }
-# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- void
- construct(pointer __p, _A0& __a0, _A1& __a1)
- {
- ::new((void*)__p) _Tp(__a0, __a1);
- }
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- void
- construct(pointer __p, const _A0& __a0, _A1& __a1)
- {
- ::new((void*)__p) _Tp(__a0, __a1);
- }
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- void
- construct(pointer __p, _A0& __a0, const _A1& __a1)
- {
- ::new((void*)__p) _Tp(__a0, __a1);
- }
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- void
- construct(pointer __p, const _A0& __a0, const _A1& __a1)
- {
- ::new((void*)__p) _Tp(__a0, __a1);
- }
-#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
- _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();}
-};
-
-template <class _Tp>
-class _LIBCPP_TEMPLATE_VIS allocator<const _Tp>
-{
-public:
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- typedef const _Tp* pointer;
- typedef const _Tp* const_pointer;
- typedef const _Tp& reference;
- typedef const _Tp& const_reference;
- typedef const _Tp value_type;
-
- typedef true_type propagate_on_container_move_assignment;
- typedef true_type is_always_equal;
-
- template <class _Up> struct rebind {typedef allocator<_Up> other;};
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
- allocator() _NOEXCEPT {}
-
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
- allocator(const allocator<_Up>&) _NOEXCEPT {}
-
- _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT
- {return _VSTD::addressof(__x);}
- _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0)
- {
- if (__n > max_size())
- __throw_length_error("allocator<const T>::allocate(size_t n)"
- " 'n' exceeds maximum supported size");
- return static_cast<pointer>(_VSTD::__libcpp_allocate(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)));
- }
- _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type __n) _NOEXCEPT
- {_VSTD::__libcpp_deallocate((void*) const_cast<_Tp *>(__p), __n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));}
- _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT
- {return size_type(~0) / sizeof(_Tp);}
-#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
- template <class _Up, class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- void
- construct(_Up* __p, _Args&&... __args)
- {
- ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
- }
-#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
- _LIBCPP_INLINE_VISIBILITY
- void
- construct(pointer __p)
- {
- ::new((void*) const_cast<_Tp *>(__p)) _Tp();
- }
-# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
-
- template <class _A0>
- _LIBCPP_INLINE_VISIBILITY
- void
- construct(pointer __p, _A0& __a0)
- {
- ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0);
- }
- template <class _A0>
- _LIBCPP_INLINE_VISIBILITY
- void
- construct(pointer __p, const _A0& __a0)
- {
- ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0);
- }
-# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- void
- construct(pointer __p, _A0& __a0, _A1& __a1)
- {
- ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1);
- }
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- void
- construct(pointer __p, const _A0& __a0, _A1& __a1)
- {
- ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1);
- }
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- void
- construct(pointer __p, _A0& __a0, const _A1& __a1)
- {
- ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1);
- }
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- void
- construct(pointer __p, const _A0& __a0, const _A1& __a1)
- {
- ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1);
- }
-#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
- _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();}
-};
-
-template <class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator==(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return true;}
-
-template <class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator!=(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return false;}
-
-template <class _OutputIterator, class _Tp>
-class _LIBCPP_TEMPLATE_VIS raw_storage_iterator
- : public iterator<output_iterator_tag,
- _Tp, // purposefully not C++03
- ptrdiff_t, // purposefully not C++03
- _Tp*, // purposefully not C++03
- raw_storage_iterator<_OutputIterator, _Tp>&> // purposefully not C++03
-{
-private:
- _OutputIterator __x_;
-public:
- _LIBCPP_INLINE_VISIBILITY explicit raw_storage_iterator(_OutputIterator __x) : __x_(__x) {}
- _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() {return *this;}
- _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element)
- {::new(_VSTD::addressof(*__x_)) _Tp(__element); return *this;}
-#if _LIBCPP_STD_VER >= 14
- _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(_Tp&& __element)
- {::new(_VSTD::addressof(*__x_)) _Tp(_VSTD::move(__element)); return *this;}
-#endif
- _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator++() {++__x_; return *this;}
- _LIBCPP_INLINE_VISIBILITY raw_storage_iterator operator++(int)
- {raw_storage_iterator __t(*this); ++__x_; return __t;}
-#if _LIBCPP_STD_VER >= 14
- _LIBCPP_INLINE_VISIBILITY _OutputIterator base() const { return __x_; }
-#endif
-};
-
-template <class _Tp>
-_LIBCPP_NODISCARD_EXT _LIBCPP_NO_CFI
-pair<_Tp*, ptrdiff_t>
-get_temporary_buffer(ptrdiff_t __n) _NOEXCEPT
-{
- pair<_Tp*, ptrdiff_t> __r(0, 0);
- const ptrdiff_t __m = (~ptrdiff_t(0) ^
- ptrdiff_t(ptrdiff_t(1) << (sizeof(ptrdiff_t) * __CHAR_BIT__ - 1)))
- / sizeof(_Tp);
- if (__n > __m)
- __n = __m;
- while (__n > 0)
- {
-#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION)
- if (__is_overaligned_for_new(_LIBCPP_ALIGNOF(_Tp)))
- {
- std::align_val_t __al =
- std::align_val_t(std::alignment_of<_Tp>::value);
- __r.first = static_cast<_Tp*>(::operator new(
- __n * sizeof(_Tp), __al, nothrow));
- } else {
- __r.first = static_cast<_Tp*>(::operator new(
- __n * sizeof(_Tp), nothrow));
- }
-#else
- if (__is_overaligned_for_new(_LIBCPP_ALIGNOF(_Tp)))
- {
- // Since aligned operator new is unavailable, return an empty
- // buffer rather than one with invalid alignment.
- return __r;
- }
-
- __r.first = static_cast<_Tp*>(::operator new(__n * sizeof(_Tp), nothrow));
-#endif
-
- if (__r.first)
- {
- __r.second = __n;
- break;
- }
- __n /= 2;
- }
- return __r;
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-void return_temporary_buffer(_Tp* __p) _NOEXCEPT
-{
- _VSTD::__libcpp_deallocate_unsized((void*)__p, _LIBCPP_ALIGNOF(_Tp));
-}
-
-#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
-template <class _Tp>
-struct _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr_ref
-{
- _Tp* __ptr_;
-};
-
-template<class _Tp>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr
-{
-private:
- _Tp* __ptr_;
-public:
- typedef _Tp element_type;
-
- _LIBCPP_INLINE_VISIBILITY explicit auto_ptr(_Tp* __p = 0) throw() : __ptr_(__p) {}
- _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr& __p) throw() : __ptr_(__p.release()) {}
- template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr<_Up>& __p) throw()
- : __ptr_(__p.release()) {}
- _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr& __p) throw()
- {reset(__p.release()); return *this;}
- template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr<_Up>& __p) throw()
- {reset(__p.release()); return *this;}
- _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr_ref<_Tp> __p) throw()
- {reset(__p.__ptr_); return *this;}
- _LIBCPP_INLINE_VISIBILITY ~auto_ptr() throw() {delete __ptr_;}
-
- _LIBCPP_INLINE_VISIBILITY _Tp& operator*() const throw()
- {return *__ptr_;}
- _LIBCPP_INLINE_VISIBILITY _Tp* operator->() const throw() {return __ptr_;}
- _LIBCPP_INLINE_VISIBILITY _Tp* get() const throw() {return __ptr_;}
- _LIBCPP_INLINE_VISIBILITY _Tp* release() throw()
- {
- _Tp* __t = __ptr_;
- __ptr_ = 0;
- return __t;
- }
- _LIBCPP_INLINE_VISIBILITY void reset(_Tp* __p = 0) throw()
- {
- if (__ptr_ != __p)
- delete __ptr_;
- __ptr_ = __p;
- }
-
- _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr_ref<_Tp> __p) throw() : __ptr_(__p.__ptr_) {}
- template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr_ref<_Up>() throw()
- {auto_ptr_ref<_Up> __t; __t.__ptr_ = release(); return __t;}
- template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr<_Up>() throw()
- {return auto_ptr<_Up>(release());}
-};
-
-template <>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr<void>
-{
-public:
- typedef void element_type;
-};
-#endif
-
-template <class _Tp, int _Idx,
- bool _CanBeEmptyBase =
- is_empty<_Tp>::value && !__libcpp_is_final<_Tp>::value>
-struct __compressed_pair_elem {
- typedef _Tp _ParamT;
- typedef _Tp& reference;
- typedef const _Tp& const_reference;
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY constexpr __compressed_pair_elem() : __value_() {}
-
- template <class _Up, class = typename enable_if<
- !is_same<__compressed_pair_elem, typename decay<_Up>::type>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- constexpr explicit
- __compressed_pair_elem(_Up&& __u)
- : __value_(_VSTD::forward<_Up>(__u))
- {
- }
-
- template <class... _Args, size_t... _Indexes>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- __compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args,
- __tuple_indices<_Indexes...>)
- : __value_(_VSTD::forward<_Args>(_VSTD::get<_Indexes>(__args))...) {}
-#else
- _LIBCPP_INLINE_VISIBILITY __compressed_pair_elem() : __value_() {}
- _LIBCPP_INLINE_VISIBILITY
- __compressed_pair_elem(_ParamT __p) : __value_(std::forward<_ParamT>(__p)) {}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY reference __get() _NOEXCEPT { return __value_; }
- _LIBCPP_INLINE_VISIBILITY
- const_reference __get() const _NOEXCEPT { return __value_; }
-
-private:
- _Tp __value_;
-};
-
-template <class _Tp, int _Idx>
-struct __compressed_pair_elem<_Tp, _Idx, true> : private _Tp {
- typedef _Tp _ParamT;
- typedef _Tp& reference;
- typedef const _Tp& const_reference;
- typedef _Tp __value_type;
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY constexpr __compressed_pair_elem() = default;
-
- template <class _Up, class = typename enable_if<
- !is_same<__compressed_pair_elem, typename decay<_Up>::type>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- constexpr explicit
- __compressed_pair_elem(_Up&& __u)
- : __value_type(_VSTD::forward<_Up>(__u))
- {}
-
- template <class... _Args, size_t... _Indexes>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- __compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args,
- __tuple_indices<_Indexes...>)
- : __value_type(_VSTD::forward<_Args>(_VSTD::get<_Indexes>(__args))...) {}
-#else
- _LIBCPP_INLINE_VISIBILITY __compressed_pair_elem() : __value_type() {}
- _LIBCPP_INLINE_VISIBILITY
- __compressed_pair_elem(_ParamT __p)
- : __value_type(std::forward<_ParamT>(__p)) {}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY reference __get() _NOEXCEPT { return *this; }
- _LIBCPP_INLINE_VISIBILITY
- const_reference __get() const _NOEXCEPT { return *this; }
-};
-
-// Tag used to construct the second element of the compressed pair.
-struct __second_tag {};
-
-template <class _T1, class _T2>
-class __compressed_pair : private __compressed_pair_elem<_T1, 0>,
- private __compressed_pair_elem<_T2, 1> {
- typedef __compressed_pair_elem<_T1, 0> _Base1;
- typedef __compressed_pair_elem<_T2, 1> _Base2;
-
- // NOTE: This static assert should never fire because __compressed_pair
- // is *almost never* used in a scenario where it's possible for T1 == T2.
- // (The exception is std::function where it is possible that the function
- // object and the allocator have the same type).
- static_assert((!is_same<_T1, _T2>::value),
- "__compressed_pair cannot be instantated when T1 and T2 are the same type; "
- "The current implementation is NOT ABI-compatible with the previous "
- "implementation for this configuration");
-
-public:
-#ifndef _LIBCPP_CXX03_LANG
- template <bool _Dummy = true,
- class = typename enable_if<
- __dependent_type<is_default_constructible<_T1>, _Dummy>::value &&
- __dependent_type<is_default_constructible<_T2>, _Dummy>::value
- >::type
- >
- _LIBCPP_INLINE_VISIBILITY
- constexpr __compressed_pair() {}
-
- template <class _Tp, typename enable_if<!is_same<typename decay<_Tp>::type,
- __compressed_pair>::value,
- bool>::type = true>
- _LIBCPP_INLINE_VISIBILITY constexpr explicit
- __compressed_pair(_Tp&& __t)
- : _Base1(std::forward<_Tp>(__t)), _Base2() {}
-
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY constexpr
- __compressed_pair(__second_tag, _Tp&& __t)
- : _Base1(), _Base2(std::forward<_Tp>(__t)) {}
-
- template <class _U1, class _U2>
- _LIBCPP_INLINE_VISIBILITY constexpr
- __compressed_pair(_U1&& __t1, _U2&& __t2)
- : _Base1(std::forward<_U1>(__t1)), _Base2(std::forward<_U2>(__t2)) {}
-
- template <class... _Args1, class... _Args2>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
- __compressed_pair(piecewise_construct_t __pc, tuple<_Args1...> __first_args,
- tuple<_Args2...> __second_args)
- : _Base1(__pc, _VSTD::move(__first_args),
- typename __make_tuple_indices<sizeof...(_Args1)>::type()),
- _Base2(__pc, _VSTD::move(__second_args),
- typename __make_tuple_indices<sizeof...(_Args2)>::type()) {}
-
-#else
- _LIBCPP_INLINE_VISIBILITY
- __compressed_pair() {}
-
- _LIBCPP_INLINE_VISIBILITY explicit
- __compressed_pair(_T1 __t1) : _Base1(_VSTD::forward<_T1>(__t1)) {}
-
- _LIBCPP_INLINE_VISIBILITY
- __compressed_pair(__second_tag, _T2 __t2)
- : _Base1(), _Base2(_VSTD::forward<_T2>(__t2)) {}
-
- _LIBCPP_INLINE_VISIBILITY
- __compressed_pair(_T1 __t1, _T2 __t2)
- : _Base1(_VSTD::forward<_T1>(__t1)), _Base2(_VSTD::forward<_T2>(__t2)) {}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- typename _Base1::reference first() _NOEXCEPT {
- return static_cast<_Base1&>(*this).__get();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- typename _Base1::const_reference first() const _NOEXCEPT {
- return static_cast<_Base1 const&>(*this).__get();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- typename _Base2::reference second() _NOEXCEPT {
- return static_cast<_Base2&>(*this).__get();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- typename _Base2::const_reference second() const _NOEXCEPT {
- return static_cast<_Base2 const&>(*this).__get();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(__compressed_pair& __x)
- _NOEXCEPT_(__is_nothrow_swappable<_T1>::value &&
- __is_nothrow_swappable<_T2>::value)
- {
- using std::swap;
- swap(first(), __x.first());
- swap(second(), __x.second());
- }
-};
-
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY
-void swap(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y)
- _NOEXCEPT_(__is_nothrow_swappable<_T1>::value &&
- __is_nothrow_swappable<_T2>::value) {
- __x.swap(__y);
-}
-
-// default_delete
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS default_delete {
- static_assert(!is_function<_Tp>::value,
- "default_delete cannot be instantiated for function types");
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY constexpr default_delete() noexcept = default;
-#else
- _LIBCPP_INLINE_VISIBILITY default_delete() {}
-#endif
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- default_delete(const default_delete<_Up>&,
- typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* =
- 0) _NOEXCEPT {}
-
- _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __ptr) const _NOEXCEPT {
- static_assert(sizeof(_Tp) > 0,
- "default_delete can not delete incomplete type");
- static_assert(!is_void<_Tp>::value,
- "default_delete can not delete incomplete type");
- delete __ptr;
- }
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS default_delete<_Tp[]> {
-private:
- template <class _Up>
- struct _EnableIfConvertible
- : enable_if<is_convertible<_Up(*)[], _Tp(*)[]>::value> {};
-
-public:
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY constexpr default_delete() noexcept = default;
-#else
- _LIBCPP_INLINE_VISIBILITY default_delete() {}
-#endif
-
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- default_delete(const default_delete<_Up[]>&,
- typename _EnableIfConvertible<_Up>::type* = 0) _NOEXCEPT {}
-
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- typename _EnableIfConvertible<_Up>::type
- operator()(_Up* __ptr) const _NOEXCEPT {
- static_assert(sizeof(_Tp) > 0,
- "default_delete can not delete incomplete type");
- static_assert(!is_void<_Tp>::value,
- "default_delete can not delete void type");
- delete[] __ptr;
- }
-};
-
-
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Deleter>
-struct __unique_ptr_deleter_sfinae {
- static_assert(!is_reference<_Deleter>::value, "incorrect specialization");
- typedef const _Deleter& __lval_ref_type;
- typedef _Deleter&& __good_rval_ref_type;
- typedef true_type __enable_rval_overload;
-};
-
-template <class _Deleter>
-struct __unique_ptr_deleter_sfinae<_Deleter const&> {
- typedef const _Deleter& __lval_ref_type;
- typedef const _Deleter&& __bad_rval_ref_type;
- typedef false_type __enable_rval_overload;
-};
-
-template <class _Deleter>
-struct __unique_ptr_deleter_sfinae<_Deleter&> {
- typedef _Deleter& __lval_ref_type;
- typedef _Deleter&& __bad_rval_ref_type;
- typedef false_type __enable_rval_overload;
-};
-#endif // !defined(_LIBCPP_CXX03_LANG)
-
-template <class _Tp, class _Dp = default_delete<_Tp> >
-class _LIBCPP_TEMPLATE_VIS unique_ptr {
-public:
- typedef _Tp element_type;
- typedef _Dp deleter_type;
- typedef typename __pointer_type<_Tp, deleter_type>::type pointer;
-
- static_assert(!is_rvalue_reference<deleter_type>::value,
- "the specified deleter type cannot be an rvalue reference");
-
-private:
- __compressed_pair<pointer, deleter_type> __ptr_;
-
- struct __nat { int __for_bool_; };
-
-#ifndef _LIBCPP_CXX03_LANG
- typedef __unique_ptr_deleter_sfinae<_Dp> _DeleterSFINAE;
-
- template <bool _Dummy>
- using _LValRefType =
- typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type;
-
- template <bool _Dummy>
- using _GoodRValRefType =
- typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type;
-
- template <bool _Dummy>
- using _BadRValRefType =
- typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type;
-
- template <bool _Dummy, class _Deleter = typename __dependent_type<
- __identity<deleter_type>, _Dummy>::type>
- using _EnableIfDeleterDefaultConstructible =
- typename enable_if<is_default_constructible<_Deleter>::value &&
- !is_pointer<_Deleter>::value>::type;
-
- template <class _ArgType>
- using _EnableIfDeleterConstructible =
- typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type;
-
- template <class _UPtr, class _Up>
- using _EnableIfMoveConvertible = typename enable_if<
- is_convertible<typename _UPtr::pointer, pointer>::value &&
- !is_array<_Up>::value
- >::type;
-
- template <class _UDel>
- using _EnableIfDeleterConvertible = typename enable_if<
- (is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) ||
- (!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value)
- >::type;
-
- template <class _UDel>
- using _EnableIfDeleterAssignable = typename enable_if<
- is_assignable<_Dp&, _UDel&&>::value
- >::type;
-
-public:
- template <bool _Dummy = true,
- class = _EnableIfDeleterDefaultConstructible<_Dummy>>
- _LIBCPP_INLINE_VISIBILITY
- constexpr unique_ptr() noexcept : __ptr_(pointer()) {}
-
- template <bool _Dummy = true,
- class = _EnableIfDeleterDefaultConstructible<_Dummy>>
- _LIBCPP_INLINE_VISIBILITY
- constexpr unique_ptr(nullptr_t) noexcept : __ptr_(pointer()) {}
-
- template <bool _Dummy = true,
- class = _EnableIfDeleterDefaultConstructible<_Dummy>>
- _LIBCPP_INLINE_VISIBILITY
- explicit unique_ptr(pointer __p) noexcept : __ptr_(__p) {}
-
- template <bool _Dummy = true,
- class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>>
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(pointer __p, _LValRefType<_Dummy> __d) noexcept
- : __ptr_(__p, __d) {}
-
- template <bool _Dummy = true,
- class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>>
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(pointer __p, _GoodRValRefType<_Dummy> __d) noexcept
- : __ptr_(__p, _VSTD::move(__d)) {
- static_assert(!is_reference<deleter_type>::value,
- "rvalue deleter bound to reference");
- }
-
- template <bool _Dummy = true,
- class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy>>>
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(pointer __p, _BadRValRefType<_Dummy> __d) = delete;
-
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(unique_ptr&& __u) noexcept
- : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {
- }
-
- template <class _Up, class _Ep,
- class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>,
- class = _EnableIfDeleterConvertible<_Ep>
- >
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT
- : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) {}
-
-#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(auto_ptr<_Up>&& __p,
- typename enable_if<is_convertible<_Up*, _Tp*>::value &&
- is_same<_Dp, default_delete<_Tp>>::value,
- __nat>::type = __nat()) _NOEXCEPT
- : __ptr_(__p.release()) {}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT {
- reset(__u.release());
- __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter());
- return *this;
- }
-
- template <class _Up, class _Ep,
- class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>,
- class = _EnableIfDeleterAssignable<_Ep>
- >
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr& operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT {
- reset(__u.release());
- __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter());
- return *this;
- }
-
-#else // _LIBCPP_CXX03_LANG
-private:
- unique_ptr(unique_ptr&);
- template <class _Up, class _Ep> unique_ptr(unique_ptr<_Up, _Ep>&);
-
- unique_ptr& operator=(unique_ptr&);
- template <class _Up, class _Ep> unique_ptr& operator=(unique_ptr<_Up, _Ep>&);
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr() : __ptr_(pointer())
- {
- static_assert(!is_pointer<deleter_type>::value,
- "unique_ptr constructed with null function pointer deleter");
- static_assert(is_default_constructible<deleter_type>::value,
- "unique_ptr::deleter_type is not default constructible");
- }
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(nullptr_t) : __ptr_(pointer())
- {
- static_assert(!is_pointer<deleter_type>::value,
- "unique_ptr constructed with null function pointer deleter");
- }
- _LIBCPP_INLINE_VISIBILITY
- explicit unique_ptr(pointer __p)
- : __ptr_(_VSTD::move(__p)) {
- static_assert(!is_pointer<deleter_type>::value,
- "unique_ptr constructed with null function pointer deleter");
- }
-
- _LIBCPP_INLINE_VISIBILITY
- operator __rv<unique_ptr>() {
- return __rv<unique_ptr>(*this);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(__rv<unique_ptr> __u)
- : __ptr_(__u->release(),
- _VSTD::forward<deleter_type>(__u->get_deleter())) {}
-
- template <class _Up, class _Ep>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<
- !is_array<_Up>::value &&
- is_convertible<typename unique_ptr<_Up, _Ep>::pointer,
- pointer>::value &&
- is_assignable<deleter_type&, _Ep&>::value,
- unique_ptr&>::type
- operator=(unique_ptr<_Up, _Ep> __u) {
- reset(__u.release());
- __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter());
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(pointer __p, deleter_type __d)
- : __ptr_(_VSTD::move(__p), _VSTD::move(__d)) {}
-#endif // _LIBCPP_CXX03_LANG
-
-#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<is_convertible<_Up*, _Tp*>::value &&
- is_same<_Dp, default_delete<_Tp> >::value,
- unique_ptr&>::type
- operator=(auto_ptr<_Up> __p) {
- reset(__p.release());
- return *this;
- }
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- ~unique_ptr() { reset(); }
-
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr& operator=(nullptr_t) _NOEXCEPT {
- reset();
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- typename add_lvalue_reference<_Tp>::type
- operator*() const {
- return *__ptr_.first();
- }
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const _NOEXCEPT {
- return __ptr_.first();
- }
- _LIBCPP_INLINE_VISIBILITY
- pointer get() const _NOEXCEPT {
- return __ptr_.first();
- }
- _LIBCPP_INLINE_VISIBILITY
- deleter_type& get_deleter() _NOEXCEPT {
- return __ptr_.second();
- }
- _LIBCPP_INLINE_VISIBILITY
- const deleter_type& get_deleter() const _NOEXCEPT {
- return __ptr_.second();
- }
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {
- return __ptr_.first() != nullptr;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- pointer release() _NOEXCEPT {
- pointer __t = __ptr_.first();
- __ptr_.first() = pointer();
- return __t;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void reset(pointer __p = pointer()) _NOEXCEPT {
- pointer __tmp = __ptr_.first();
- __ptr_.first() = __p;
- if (__tmp)
- __ptr_.second()(__tmp);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(unique_ptr& __u) _NOEXCEPT {
- __ptr_.swap(__u.__ptr_);
- }
-};
-
-
-template <class _Tp, class _Dp>
-class _LIBCPP_TEMPLATE_VIS unique_ptr<_Tp[], _Dp> {
-public:
- typedef _Tp element_type;
- typedef _Dp deleter_type;
- typedef typename __pointer_type<_Tp, deleter_type>::type pointer;
-
-private:
- __compressed_pair<pointer, deleter_type> __ptr_;
-
- template <class _From>
- struct _CheckArrayPointerConversion : is_same<_From, pointer> {};
-
- template <class _FromElem>
- struct _CheckArrayPointerConversion<_FromElem*>
- : integral_constant<bool,
- is_same<_FromElem*, pointer>::value ||
- (is_same<pointer, element_type*>::value &&
- is_convertible<_FromElem(*)[], element_type(*)[]>::value)
- >
- {};
-
-#ifndef _LIBCPP_CXX03_LANG
- typedef __unique_ptr_deleter_sfinae<_Dp> _DeleterSFINAE;
-
- template <bool _Dummy>
- using _LValRefType =
- typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type;
-
- template <bool _Dummy>
- using _GoodRValRefType =
- typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type;
-
- template <bool _Dummy>
- using _BadRValRefType =
- typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type;
-
- template <bool _Dummy, class _Deleter = typename __dependent_type<
- __identity<deleter_type>, _Dummy>::type>
- using _EnableIfDeleterDefaultConstructible =
- typename enable_if<is_default_constructible<_Deleter>::value &&
- !is_pointer<_Deleter>::value>::type;
-
- template <class _ArgType>
- using _EnableIfDeleterConstructible =
- typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type;
-
- template <class _Pp>
- using _EnableIfPointerConvertible = typename enable_if<
- _CheckArrayPointerConversion<_Pp>::value
- >::type;
-
- template <class _UPtr, class _Up,
- class _ElemT = typename _UPtr::element_type>
- using _EnableIfMoveConvertible = typename enable_if<
- is_array<_Up>::value &&
- is_same<pointer, element_type*>::value &&
- is_same<typename _UPtr::pointer, _ElemT*>::value &&
- is_convertible<_ElemT(*)[], element_type(*)[]>::value
- >::type;
-
- template <class _UDel>
- using _EnableIfDeleterConvertible = typename enable_if<
- (is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) ||
- (!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value)
- >::type;
-
- template <class _UDel>
- using _EnableIfDeleterAssignable = typename enable_if<
- is_assignable<_Dp&, _UDel&&>::value
- >::type;
-
-public:
- template <bool _Dummy = true,
- class = _EnableIfDeleterDefaultConstructible<_Dummy>>
- _LIBCPP_INLINE_VISIBILITY
- constexpr unique_ptr() noexcept : __ptr_(pointer()) {}
-
- template <bool _Dummy = true,
- class = _EnableIfDeleterDefaultConstructible<_Dummy>>
- _LIBCPP_INLINE_VISIBILITY
- constexpr unique_ptr(nullptr_t) noexcept : __ptr_(pointer()) {}
-
- template <class _Pp, bool _Dummy = true,
- class = _EnableIfDeleterDefaultConstructible<_Dummy>,
- class = _EnableIfPointerConvertible<_Pp>>
- _LIBCPP_INLINE_VISIBILITY
- explicit unique_ptr(_Pp __p) noexcept
- : __ptr_(__p) {}
-
- template <class _Pp, bool _Dummy = true,
- class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>,
- class = _EnableIfPointerConvertible<_Pp>>
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(_Pp __p, _LValRefType<_Dummy> __d) noexcept
- : __ptr_(__p, __d) {}
-
- template <bool _Dummy = true,
- class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>>
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(nullptr_t, _LValRefType<_Dummy> __d) noexcept
- : __ptr_(nullptr, __d) {}
-
- template <class _Pp, bool _Dummy = true,
- class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>,
- class = _EnableIfPointerConvertible<_Pp>>
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(_Pp __p, _GoodRValRefType<_Dummy> __d) noexcept
- : __ptr_(__p, _VSTD::move(__d)) {
- static_assert(!is_reference<deleter_type>::value,
- "rvalue deleter bound to reference");
- }
-
- template <bool _Dummy = true,
- class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>>
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(nullptr_t, _GoodRValRefType<_Dummy> __d) noexcept
- : __ptr_(nullptr, _VSTD::move(__d)) {
- static_assert(!is_reference<deleter_type>::value,
- "rvalue deleter bound to reference");
- }
-
- template <class _Pp, bool _Dummy = true,
- class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy>>,
- class = _EnableIfPointerConvertible<_Pp>>
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(_Pp __p, _BadRValRefType<_Dummy> __d) = delete;
-
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(unique_ptr&& __u) noexcept
- : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {
- }
-
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr& operator=(unique_ptr&& __u) noexcept {
- reset(__u.release());
- __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter());
- return *this;
- }
-
- template <class _Up, class _Ep,
- class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>,
- class = _EnableIfDeleterConvertible<_Ep>
- >
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept
- : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) {
- }
-
- template <class _Up, class _Ep,
- class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>,
- class = _EnableIfDeleterAssignable<_Ep>
- >
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr&
- operator=(unique_ptr<_Up, _Ep>&& __u) noexcept {
- reset(__u.release());
- __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter());
- return *this;
- }
-
-#else // _LIBCPP_CXX03_LANG
-private:
- template <class _Up> explicit unique_ptr(_Up);
-
- unique_ptr(unique_ptr&);
- template <class _Up> unique_ptr(unique_ptr<_Up>&);
-
- unique_ptr& operator=(unique_ptr&);
- template <class _Up> unique_ptr& operator=(unique_ptr<_Up>&);
-
- template <class _Up>
- unique_ptr(_Up __u,
- typename conditional<
- is_reference<deleter_type>::value, deleter_type,
- typename add_lvalue_reference<const deleter_type>::type>::type,
- typename enable_if<is_convertible<_Up, pointer>::value,
- __nat>::type = __nat());
-public:
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr() : __ptr_(pointer()) {
- static_assert(!is_pointer<deleter_type>::value,
- "unique_ptr constructed with null function pointer deleter");
- }
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(nullptr_t) : __ptr_(pointer()) {
- static_assert(!is_pointer<deleter_type>::value,
- "unique_ptr constructed with null function pointer deleter");
- }
-
- _LIBCPP_INLINE_VISIBILITY
- explicit unique_ptr(pointer __p) : __ptr_(__p) {
- static_assert(!is_pointer<deleter_type>::value,
- "unique_ptr constructed with null function pointer deleter");
- }
-
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(pointer __p, deleter_type __d)
- : __ptr_(__p, _VSTD::forward<deleter_type>(__d)) {}
-
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(nullptr_t, deleter_type __d)
- : __ptr_(pointer(), _VSTD::forward<deleter_type>(__d)) {}
-
- _LIBCPP_INLINE_VISIBILITY
- operator __rv<unique_ptr>() {
- return __rv<unique_ptr>(*this);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr(__rv<unique_ptr> __u)
- : __ptr_(__u->release(),
- _VSTD::forward<deleter_type>(__u->get_deleter())) {}
-
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr& operator=(__rv<unique_ptr> __u) {
- reset(__u->release());
- __ptr_.second() = _VSTD::forward<deleter_type>(__u->get_deleter());
- return *this;
- }
-
-#endif // _LIBCPP_CXX03_LANG
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- ~unique_ptr() { reset(); }
-
- _LIBCPP_INLINE_VISIBILITY
- unique_ptr& operator=(nullptr_t) _NOEXCEPT {
- reset();
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- typename add_lvalue_reference<_Tp>::type
- operator[](size_t __i) const {
- return __ptr_.first()[__i];
- }
- _LIBCPP_INLINE_VISIBILITY
- pointer get() const _NOEXCEPT {
- return __ptr_.first();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- deleter_type& get_deleter() _NOEXCEPT {
- return __ptr_.second();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const deleter_type& get_deleter() const _NOEXCEPT {
- return __ptr_.second();
- }
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {
- return __ptr_.first() != nullptr;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- pointer release() _NOEXCEPT {
- pointer __t = __ptr_.first();
- __ptr_.first() = pointer();
- return __t;
- }
-
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<
- _CheckArrayPointerConversion<_Pp>::value
- >::type
- reset(_Pp __p) _NOEXCEPT {
- pointer __tmp = __ptr_.first();
- __ptr_.first() = __p;
- if (__tmp)
- __ptr_.second()(__tmp);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void reset(nullptr_t = nullptr) _NOEXCEPT {
- pointer __tmp = __ptr_.first();
- __ptr_.first() = nullptr;
- if (__tmp)
- __ptr_.second()(__tmp);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(unique_ptr& __u) _NOEXCEPT {
- __ptr_.swap(__u.__ptr_);
- }
-
-};
-
-template <class _Tp, class _Dp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if<
- __is_swappable<_Dp>::value,
- void
->::type
-swap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) _NOEXCEPT {__x.swap(__y);}
-
-template <class _T1, class _D1, class _T2, class _D2>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __x.get() == __y.get();}
-
-template <class _T1, class _D1, class _T2, class _D2>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x == __y);}
-
-template <class _T1, class _D1, class _T2, class _D2>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator< (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y)
-{
- typedef typename unique_ptr<_T1, _D1>::pointer _P1;
- typedef typename unique_ptr<_T2, _D2>::pointer _P2;
- typedef typename common_type<_P1, _P2>::type _Vp;
- return less<_Vp>()(__x.get(), __y.get());
-}
-
-template <class _T1, class _D1, class _T2, class _D2>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator> (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __y < __x;}
-
-template <class _T1, class _D1, class _T2, class _D2>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__y < __x);}
-
-template <class _T1, class _D1, class _T2, class _D2>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x < __y);}
-
-template <class _T1, class _D1>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT
-{
- return !__x;
-}
-
-template <class _T1, class _D1>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT
-{
- return !__x;
-}
-
-template <class _T1, class _D1>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT
-{
- return static_cast<bool>(__x);
-}
-
-template <class _T1, class _D1>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT
-{
- return static_cast<bool>(__x);
-}
-
-template <class _T1, class _D1>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<(const unique_ptr<_T1, _D1>& __x, nullptr_t)
-{
- typedef typename unique_ptr<_T1, _D1>::pointer _P1;
- return less<_P1>()(__x.get(), nullptr);
-}
-
-template <class _T1, class _D1>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<(nullptr_t, const unique_ptr<_T1, _D1>& __x)
-{
- typedef typename unique_ptr<_T1, _D1>::pointer _P1;
- return less<_P1>()(nullptr, __x.get());
-}
-
-template <class _T1, class _D1>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>(const unique_ptr<_T1, _D1>& __x, nullptr_t)
-{
- return nullptr < __x;
-}
-
-template <class _T1, class _D1>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>(nullptr_t, const unique_ptr<_T1, _D1>& __x)
-{
- return __x < nullptr;
-}
-
-template <class _T1, class _D1>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const unique_ptr<_T1, _D1>& __x, nullptr_t)
-{
- return !(nullptr < __x);
-}
-
-template <class _T1, class _D1>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(nullptr_t, const unique_ptr<_T1, _D1>& __x)
-{
- return !(__x < nullptr);
-}
-
-template <class _T1, class _D1>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const unique_ptr<_T1, _D1>& __x, nullptr_t)
-{
- return !(__x < nullptr);
-}
-
-template <class _T1, class _D1>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(nullptr_t, const unique_ptr<_T1, _D1>& __x)
-{
- return !(nullptr < __x);
-}
-
-#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Tp, class _Dp>
-inline _LIBCPP_INLINE_VISIBILITY
-unique_ptr<_Tp, _Dp>
-move(unique_ptr<_Tp, _Dp>& __t)
-{
- return unique_ptr<_Tp, _Dp>(__rv<unique_ptr<_Tp, _Dp> >(__t));
-}
-
-#endif
-
-#if _LIBCPP_STD_VER > 11
-
-template<class _Tp>
-struct __unique_if
-{
- typedef unique_ptr<_Tp> __unique_single;
-};
-
-template<class _Tp>
-struct __unique_if<_Tp[]>
-{
- typedef unique_ptr<_Tp[]> __unique_array_unknown_bound;
-};
-
-template<class _Tp, size_t _Np>
-struct __unique_if<_Tp[_Np]>
-{
- typedef void __unique_array_known_bound;
-};
-
-template<class _Tp, class... _Args>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __unique_if<_Tp>::__unique_single
-make_unique(_Args&&... __args)
-{
- return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...));
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __unique_if<_Tp>::__unique_array_unknown_bound
-make_unique(size_t __n)
-{
- typedef typename remove_extent<_Tp>::type _Up;
- return unique_ptr<_Tp>(new _Up[__n]());
-}
-
-template<class _Tp, class... _Args>
- typename __unique_if<_Tp>::__unique_array_known_bound
- make_unique(_Args&&...) = delete;
-
-#endif // _LIBCPP_STD_VER > 11
-
-template <class _Tp, class _Dp>
-#ifdef _LIBCPP_CXX03_LANG
-struct _LIBCPP_TEMPLATE_VIS hash<unique_ptr<_Tp, _Dp> >
-#else
-struct _LIBCPP_TEMPLATE_VIS hash<__enable_hash_helper<
- unique_ptr<_Tp, _Dp>, typename unique_ptr<_Tp, _Dp>::pointer>>
-#endif
-{
- typedef unique_ptr<_Tp, _Dp> argument_type;
- typedef size_t result_type;
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(const argument_type& __ptr) const
- {
- typedef typename argument_type::pointer pointer;
- return hash<pointer>()(__ptr.get());
- }
-};
-
-struct __destruct_n
-{
-private:
- size_t __size_;
-
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT
- {for (size_t __i = 0; __i < __size_; ++__i, ++__p) __p->~_Tp();}
-
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT
- {}
-
- _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT
- {++__size_;}
- _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT
- {}
-
- _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT
- {__size_ = __s;}
- _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT
- {}
-public:
- _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT
- : __size_(__s) {}
-
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY void __incr(_Tp*) _NOEXCEPT
- {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
-
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT
- {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
-
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT
- {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
-};
-
-template <class _Alloc>
-class __allocator_destructor
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
-public:
- typedef typename __alloc_traits::pointer pointer;
- typedef typename __alloc_traits::size_type size_type;
-private:
- _Alloc& __alloc_;
- size_type __s_;
-public:
- _LIBCPP_INLINE_VISIBILITY __allocator_destructor(_Alloc& __a, size_type __s)
- _NOEXCEPT
- : __alloc_(__a), __s_(__s) {}
- _LIBCPP_INLINE_VISIBILITY
- void operator()(pointer __p) _NOEXCEPT
- {__alloc_traits::deallocate(__alloc_, __p, __s_);}
-};
-
-template <class _InputIterator, class _ForwardIterator>
-_ForwardIterator
-uninitialized_copy(_InputIterator __f, _InputIterator __l, _ForwardIterator __r)
-{
- typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- _ForwardIterator __s = __r;
- try
- {
-#endif
- for (; __f != __l; ++__f, (void) ++__r)
- ::new (static_cast<void*>(_VSTD::addressof(*__r))) value_type(*__f);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- for (; __s != __r; ++__s)
- __s->~value_type();
- throw;
- }
-#endif
- return __r;
-}
-
-template <class _InputIterator, class _Size, class _ForwardIterator>
-_ForwardIterator
-uninitialized_copy_n(_InputIterator __f, _Size __n, _ForwardIterator __r)
-{
- typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- _ForwardIterator __s = __r;
- try
- {
-#endif
- for (; __n > 0; ++__f, (void) ++__r, (void) --__n)
- ::new (static_cast<void*>(_VSTD::addressof(*__r))) value_type(*__f);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- for (; __s != __r; ++__s)
- __s->~value_type();
- throw;
- }
-#endif
- return __r;
-}
-
-template <class _ForwardIterator, class _Tp>
-void
-uninitialized_fill(_ForwardIterator __f, _ForwardIterator __l, const _Tp& __x)
-{
- typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- _ForwardIterator __s = __f;
- try
- {
-#endif
- for (; __f != __l; ++__f)
- ::new (static_cast<void*>(_VSTD::addressof(*__f))) value_type(__x);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- for (; __s != __f; ++__s)
- __s->~value_type();
- throw;
- }
-#endif
-}
-
-template <class _ForwardIterator, class _Size, class _Tp>
-_ForwardIterator
-uninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x)
-{
- typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- _ForwardIterator __s = __f;
- try
- {
-#endif
- for (; __n > 0; ++__f, (void) --__n)
- ::new (static_cast<void*>(_VSTD::addressof(*__f))) value_type(__x);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- for (; __s != __f; ++__s)
- __s->~value_type();
- throw;
- }
-#endif
- return __f;
-}
-
-#if _LIBCPP_STD_VER > 14
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-void destroy_at(_Tp* __loc) {
- _LIBCPP_ASSERT(__loc, "null pointer given to destroy_at");
- __loc->~_Tp();
-}
-
-template <class _ForwardIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-void destroy(_ForwardIterator __first, _ForwardIterator __last) {
- for (; __first != __last; ++__first)
- _VSTD::destroy_at(_VSTD::addressof(*__first));
-}
-
-template <class _ForwardIterator, class _Size>
-inline _LIBCPP_INLINE_VISIBILITY
-_ForwardIterator destroy_n(_ForwardIterator __first, _Size __n) {
- for (; __n > 0; (void)++__first, --__n)
- _VSTD::destroy_at(_VSTD::addressof(*__first));
- return __first;
-}
-
-template <class _ForwardIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-void uninitialized_default_construct(_ForwardIterator __first, _ForwardIterator __last) {
- using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
- auto __idx = __first;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try {
-#endif
- for (; __idx != __last; ++__idx)
- ::new((void*)_VSTD::addressof(*__idx)) _Vt;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- } catch (...) {
- _VSTD::destroy(__first, __idx);
- throw;
- }
-#endif
-}
-
-template <class _ForwardIterator, class _Size>
-inline _LIBCPP_INLINE_VISIBILITY
-_ForwardIterator uninitialized_default_construct_n(_ForwardIterator __first, _Size __n) {
- using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
- auto __idx = __first;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try {
-#endif
- for (; __n > 0; (void)++__idx, --__n)
- ::new((void*)_VSTD::addressof(*__idx)) _Vt;
- return __idx;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- } catch (...) {
- _VSTD::destroy(__first, __idx);
- throw;
- }
-#endif
-}
-
-
-template <class _ForwardIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-void uninitialized_value_construct(_ForwardIterator __first, _ForwardIterator __last) {
- using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
- auto __idx = __first;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try {
-#endif
- for (; __idx != __last; ++__idx)
- ::new((void*)_VSTD::addressof(*__idx)) _Vt();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- } catch (...) {
- _VSTD::destroy(__first, __idx);
- throw;
- }
-#endif
-}
-
-template <class _ForwardIterator, class _Size>
-inline _LIBCPP_INLINE_VISIBILITY
-_ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __n) {
- using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
- auto __idx = __first;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try {
-#endif
- for (; __n > 0; (void)++__idx, --__n)
- ::new((void*)_VSTD::addressof(*__idx)) _Vt();
- return __idx;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- } catch (...) {
- _VSTD::destroy(__first, __idx);
- throw;
- }
-#endif
-}
-
-
-template <class _InputIt, class _ForwardIt>
-inline _LIBCPP_INLINE_VISIBILITY
-_ForwardIt uninitialized_move(_InputIt __first, _InputIt __last, _ForwardIt __first_res) {
- using _Vt = typename iterator_traits<_ForwardIt>::value_type;
- auto __idx = __first_res;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try {
-#endif
- for (; __first != __last; (void)++__idx, ++__first)
- ::new((void*)_VSTD::addressof(*__idx)) _Vt(std::move(*__first));
- return __idx;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- } catch (...) {
- _VSTD::destroy(__first_res, __idx);
- throw;
- }
-#endif
-}
-
-template <class _InputIt, class _Size, class _ForwardIt>
-inline _LIBCPP_INLINE_VISIBILITY
-pair<_InputIt, _ForwardIt>
-uninitialized_move_n(_InputIt __first, _Size __n, _ForwardIt __first_res) {
- using _Vt = typename iterator_traits<_ForwardIt>::value_type;
- auto __idx = __first_res;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try {
-#endif
- for (; __n > 0; ++__idx, (void)++__first, --__n)
- ::new((void*)_VSTD::addressof(*__idx)) _Vt(std::move(*__first));
- return {__first, __idx};
-#ifndef _LIBCPP_NO_EXCEPTIONS
- } catch (...) {
- _VSTD::destroy(__first_res, __idx);
- throw;
- }
-#endif
-}
-
-
-#endif // _LIBCPP_STD_VER > 14
-
-// NOTE: Relaxed and acq/rel atomics (for increment and decrement respectively)
-// should be sufficient for thread safety.
-// See https://bugs.llvm.org/show_bug.cgi?id=22803
-#if defined(__clang__) && __has_builtin(__atomic_add_fetch) \
- && defined(__ATOMIC_RELAXED) \
- && defined(__ATOMIC_ACQ_REL)
-# define _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT
-#elif !defined(__clang__) && defined(_GNUC_VER) && _GNUC_VER >= 407
-# define _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT
-#endif
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _Tp
-__libcpp_atomic_refcount_increment(_Tp& __t) _NOEXCEPT
-{
-#if defined(_LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT) && !defined(_LIBCPP_HAS_NO_THREADS)
- return __atomic_add_fetch(&__t, 1, __ATOMIC_RELAXED);
-#else
- return __t += 1;
-#endif
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _Tp
-__libcpp_atomic_refcount_decrement(_Tp& __t) _NOEXCEPT
-{
-#if defined(_LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT) && !defined(_LIBCPP_HAS_NO_THREADS)
- return __atomic_add_fetch(&__t, -1, __ATOMIC_ACQ_REL);
-#else
- return __t -= 1;
-#endif
-}
-
-class _LIBCPP_EXCEPTION_ABI bad_weak_ptr
- : public std::exception
-{
-public:
- virtual ~bad_weak_ptr() _NOEXCEPT;
- virtual const char* what() const _NOEXCEPT;
-};
-
-_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
-void __throw_bad_weak_ptr()
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- throw bad_weak_ptr();
-#else
- _VSTD::abort();
-#endif
-}
-
-template<class _Tp> class _LIBCPP_TEMPLATE_VIS weak_ptr;
-
-class _LIBCPP_TYPE_VIS __shared_count
-{
- __shared_count(const __shared_count&);
- __shared_count& operator=(const __shared_count&);
-
-protected:
- long __shared_owners_;
- virtual ~__shared_count();
-private:
- virtual void __on_zero_shared() _NOEXCEPT = 0;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __shared_count(long __refs = 0) _NOEXCEPT
- : __shared_owners_(__refs) {}
-
-#if defined(_LIBCPP_BUILDING_LIBRARY) && \
- defined(_LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS)
- void __add_shared() _NOEXCEPT;
- bool __release_shared() _NOEXCEPT;
-#else
- _LIBCPP_INLINE_VISIBILITY
- void __add_shared() _NOEXCEPT {
- __libcpp_atomic_refcount_increment(__shared_owners_);
- }
- _LIBCPP_INLINE_VISIBILITY
- bool __release_shared() _NOEXCEPT {
- if (__libcpp_atomic_refcount_decrement(__shared_owners_) == -1) {
- __on_zero_shared();
- return true;
- }
- return false;
- }
-#endif
- _LIBCPP_INLINE_VISIBILITY
- long use_count() const _NOEXCEPT {
- return __libcpp_relaxed_load(&__shared_owners_) + 1;
- }
-};
-
-class _LIBCPP_TYPE_VIS __shared_weak_count
- : private __shared_count
-{
- long __shared_weak_owners_;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __shared_weak_count(long __refs = 0) _NOEXCEPT
- : __shared_count(__refs),
- __shared_weak_owners_(__refs) {}
-protected:
- virtual ~__shared_weak_count();
-
-public:
-#if defined(_LIBCPP_BUILDING_LIBRARY) && \
- defined(_LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS)
- void __add_shared() _NOEXCEPT;
- void __add_weak() _NOEXCEPT;
- void __release_shared() _NOEXCEPT;
-#else
- _LIBCPP_INLINE_VISIBILITY
- void __add_shared() _NOEXCEPT {
- __shared_count::__add_shared();
- }
- _LIBCPP_INLINE_VISIBILITY
- void __add_weak() _NOEXCEPT {
- __libcpp_atomic_refcount_increment(__shared_weak_owners_);
- }
- _LIBCPP_INLINE_VISIBILITY
- void __release_shared() _NOEXCEPT {
- if (__shared_count::__release_shared())
- __release_weak();
- }
-#endif
- void __release_weak() _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- long use_count() const _NOEXCEPT {return __shared_count::use_count();}
- __shared_weak_count* lock() _NOEXCEPT;
-
- // Define the function out only if we build static libc++ without RTTI.
- // Otherwise we may break clients who need to compile their projects with
- // -fno-rtti and yet link against a libc++.dylib compiled
- // without -fno-rtti.
-#if !defined(_LIBCPP_NO_RTTI) || !defined(_LIBCPP_BUILD_STATIC)
- virtual const void* __get_deleter(const type_info&) const _NOEXCEPT;
-#endif
-private:
- virtual void __on_zero_shared_weak() _NOEXCEPT = 0;
-};
-
-template <class _Tp, class _Dp, class _Alloc>
-class __shared_ptr_pointer
- : public __shared_weak_count
-{
- __compressed_pair<__compressed_pair<_Tp, _Dp>, _Alloc> __data_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- __shared_ptr_pointer(_Tp __p, _Dp __d, _Alloc __a)
- : __data_(__compressed_pair<_Tp, _Dp>(__p, _VSTD::move(__d)), _VSTD::move(__a)) {}
-
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* __get_deleter(const type_info&) const _NOEXCEPT;
-#endif
-
-private:
- virtual void __on_zero_shared() _NOEXCEPT;
- virtual void __on_zero_shared_weak() _NOEXCEPT;
-};
-
-#ifndef _LIBCPP_NO_RTTI
-
-template <class _Tp, class _Dp, class _Alloc>
-const void*
-__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__get_deleter(const type_info& __t) const _NOEXCEPT
-{
- return __t == typeid(_Dp) ? _VSTD::addressof(__data_.first().second()) : nullptr;
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-template <class _Tp, class _Dp, class _Alloc>
-void
-__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared() _NOEXCEPT
-{
- __data_.first().second()(__data_.first().first());
- __data_.first().second().~_Dp();
-}
-
-template <class _Tp, class _Dp, class _Alloc>
-void
-__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT
-{
- typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_pointer>::type _Al;
- typedef allocator_traits<_Al> _ATraits;
- typedef pointer_traits<typename _ATraits::pointer> _PTraits;
-
- _Al __a(__data_.second());
- __data_.second().~_Alloc();
- __a.deallocate(_PTraits::pointer_to(*this), 1);
-}
-
-template <class _Tp, class _Alloc>
-class __shared_ptr_emplace
- : public __shared_weak_count
-{
- __compressed_pair<_Alloc, _Tp> __data_;
-public:
-#ifndef _LIBCPP_HAS_NO_VARIADICS
-
- _LIBCPP_INLINE_VISIBILITY
- __shared_ptr_emplace(_Alloc __a)
- : __data_(_VSTD::move(__a)) {}
-
- template <class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- __shared_ptr_emplace(_Alloc __a, _Args&& ...__args)
- : __data_(piecewise_construct, _VSTD::forward_as_tuple(__a),
- _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)) {}
-
-#else // _LIBCPP_HAS_NO_VARIADICS
-
- _LIBCPP_INLINE_VISIBILITY
- __shared_ptr_emplace(_Alloc __a)
- : __data_(__a) {}
-
- template <class _A0>
- _LIBCPP_INLINE_VISIBILITY
- __shared_ptr_emplace(_Alloc __a, _A0& __a0)
- : __data_(__a, _Tp(__a0)) {}
-
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1)
- : __data_(__a, _Tp(__a0, __a1)) {}
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1, _A2& __a2)
- : __data_(__a, _Tp(__a0, __a1, __a2)) {}
-
-#endif // _LIBCPP_HAS_NO_VARIADICS
-
-private:
- virtual void __on_zero_shared() _NOEXCEPT;
- virtual void __on_zero_shared_weak() _NOEXCEPT;
-public:
- _LIBCPP_INLINE_VISIBILITY
- _Tp* get() _NOEXCEPT {return _VSTD::addressof(__data_.second());}
-};
-
-template <class _Tp, class _Alloc>
-void
-__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared() _NOEXCEPT
-{
- __data_.second().~_Tp();
-}
-
-template <class _Tp, class _Alloc>
-void
-__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT
-{
- typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_emplace>::type _Al;
- typedef allocator_traits<_Al> _ATraits;
- typedef pointer_traits<typename _ATraits::pointer> _PTraits;
- _Al __a(__data_.first());
- __data_.first().~_Alloc();
- __a.deallocate(_PTraits::pointer_to(*this), 1);
-}
-
-struct __shared_ptr_dummy_rebind_allocator_type;
-template <>
-class _LIBCPP_TEMPLATE_VIS allocator<__shared_ptr_dummy_rebind_allocator_type>
-{
-public:
- template <class _Other>
- struct rebind
- {
- typedef allocator<_Other> other;
- };
-};
-
-template<class _Tp> class _LIBCPP_TEMPLATE_VIS enable_shared_from_this;
-
-template<class _Tp>
-class _LIBCPP_TEMPLATE_VIS shared_ptr
-{
-public:
- typedef _Tp element_type;
-
-#if _LIBCPP_STD_VER > 14
- typedef weak_ptr<_Tp> weak_type;
-#endif
-private:
- element_type* __ptr_;
- __shared_weak_count* __cntrl_;
-
- struct __nat {int __for_bool_;};
-public:
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR shared_ptr() _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR shared_ptr(nullptr_t) _NOEXCEPT;
- template<class _Yp>
- explicit shared_ptr(_Yp* __p,
- typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat());
- template<class _Yp, class _Dp>
- shared_ptr(_Yp* __p, _Dp __d,
- typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat());
- template<class _Yp, class _Dp, class _Alloc>
- shared_ptr(_Yp* __p, _Dp __d, _Alloc __a,
- typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat());
- template <class _Dp> shared_ptr(nullptr_t __p, _Dp __d);
- template <class _Dp, class _Alloc> shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a);
- template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- shared_ptr(const shared_ptr& __r) _NOEXCEPT;
- template<class _Yp>
- _LIBCPP_INLINE_VISIBILITY
- shared_ptr(const shared_ptr<_Yp>& __r,
- typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat())
- _NOEXCEPT;
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- shared_ptr(shared_ptr&& __r) _NOEXCEPT;
- template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(shared_ptr<_Yp>&& __r,
- typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat())
- _NOEXCEPT;
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- template<class _Yp> explicit shared_ptr(const weak_ptr<_Yp>& __r,
- typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type= __nat());
-#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- template<class _Yp>
- shared_ptr(auto_ptr<_Yp>&& __r,
- typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat());
-#else
- template<class _Yp>
- shared_ptr(auto_ptr<_Yp> __r,
- typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat());
-#endif
-#endif
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- template <class _Yp, class _Dp>
- shared_ptr(unique_ptr<_Yp, _Dp>&&,
- typename enable_if
- <
- !is_lvalue_reference<_Dp>::value &&
- !is_array<_Yp>::value &&
- is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value,
- __nat
- >::type = __nat());
- template <class _Yp, class _Dp>
- shared_ptr(unique_ptr<_Yp, _Dp>&&,
- typename enable_if
- <
- is_lvalue_reference<_Dp>::value &&
- !is_array<_Yp>::value &&
- is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value,
- __nat
- >::type = __nat());
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- template <class _Yp, class _Dp>
- shared_ptr(unique_ptr<_Yp, _Dp>,
- typename enable_if
- <
- !is_lvalue_reference<_Dp>::value &&
- !is_array<_Yp>::value &&
- is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value,
- __nat
- >::type = __nat());
- template <class _Yp, class _Dp>
- shared_ptr(unique_ptr<_Yp, _Dp>,
- typename enable_if
- <
- is_lvalue_reference<_Dp>::value &&
- !is_array<_Yp>::value &&
- is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value,
- __nat
- >::type = __nat());
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
- ~shared_ptr();
-
- _LIBCPP_INLINE_VISIBILITY
- shared_ptr& operator=(const shared_ptr& __r) _NOEXCEPT;
- template<class _Yp>
- typename enable_if
- <
- is_convertible<_Yp*, element_type*>::value,
- shared_ptr&
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT;
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- shared_ptr& operator=(shared_ptr&& __r) _NOEXCEPT;
- template<class _Yp>
- typename enable_if
- <
- is_convertible<_Yp*, element_type*>::value,
- shared_ptr<_Tp>&
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator=(shared_ptr<_Yp>&& __r);
-#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
- template<class _Yp>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- !is_array<_Yp>::value &&
- is_convertible<_Yp*, element_type*>::value,
- shared_ptr
- >::type&
- operator=(auto_ptr<_Yp>&& __r);
-#endif
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
- template<class _Yp>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- !is_array<_Yp>::value &&
- is_convertible<_Yp*, element_type*>::value,
- shared_ptr&
- >::type
- operator=(auto_ptr<_Yp> __r);
-#endif
-#endif
- template <class _Yp, class _Dp>
- typename enable_if
- <
- !is_array<_Yp>::value &&
- is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value,
- shared_ptr&
- >::type
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- operator=(unique_ptr<_Yp, _Dp>&& __r);
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- operator=(unique_ptr<_Yp, _Dp> __r);
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(shared_ptr& __r) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- void reset() _NOEXCEPT;
- template<class _Yp>
- typename enable_if
- <
- is_convertible<_Yp*, element_type*>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- reset(_Yp* __p);
- template<class _Yp, class _Dp>
- typename enable_if
- <
- is_convertible<_Yp*, element_type*>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- reset(_Yp* __p, _Dp __d);
- template<class _Yp, class _Dp, class _Alloc>
- typename enable_if
- <
- is_convertible<_Yp*, element_type*>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- reset(_Yp* __p, _Dp __d, _Alloc __a);
-
- _LIBCPP_INLINE_VISIBILITY
- element_type* get() const _NOEXCEPT {return __ptr_;}
- _LIBCPP_INLINE_VISIBILITY
- typename add_lvalue_reference<element_type>::type operator*() const _NOEXCEPT
- {return *__ptr_;}
- _LIBCPP_INLINE_VISIBILITY
- element_type* operator->() const _NOEXCEPT {return __ptr_;}
- _LIBCPP_INLINE_VISIBILITY
- long use_count() const _NOEXCEPT {return __cntrl_ ? __cntrl_->use_count() : 0;}
- _LIBCPP_INLINE_VISIBILITY
- bool unique() const _NOEXCEPT {return use_count() == 1;}
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {return get() != 0;}
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- bool owner_before(shared_ptr<_Up> const& __p) const _NOEXCEPT
- {return __cntrl_ < __p.__cntrl_;}
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- bool owner_before(weak_ptr<_Up> const& __p) const _NOEXCEPT
- {return __cntrl_ < __p.__cntrl_;}
- _LIBCPP_INLINE_VISIBILITY
- bool
- __owner_equivalent(const shared_ptr& __p) const
- {return __cntrl_ == __p.__cntrl_;}
-
-#ifndef _LIBCPP_NO_RTTI
- template <class _Dp>
- _LIBCPP_INLINE_VISIBILITY
- _Dp* __get_deleter() const _NOEXCEPT
- {return static_cast<_Dp*>(__cntrl_
- ? const_cast<void *>(__cntrl_->__get_deleter(typeid(_Dp)))
- : nullptr);}
-#endif // _LIBCPP_NO_RTTI
-
-#ifndef _LIBCPP_HAS_NO_VARIADICS
-
- template<class ..._Args>
- static
- shared_ptr<_Tp>
- make_shared(_Args&& ...__args);
-
- template<class _Alloc, class ..._Args>
- static
- shared_ptr<_Tp>
- allocate_shared(const _Alloc& __a, _Args&& ...__args);
-
-#else // _LIBCPP_HAS_NO_VARIADICS
-
- static shared_ptr<_Tp> make_shared();
-
- template<class _A0>
- static shared_ptr<_Tp> make_shared(_A0&);
-
- template<class _A0, class _A1>
- static shared_ptr<_Tp> make_shared(_A0&, _A1&);
-
- template<class _A0, class _A1, class _A2>
- static shared_ptr<_Tp> make_shared(_A0&, _A1&, _A2&);
-
- template<class _Alloc>
- static shared_ptr<_Tp>
- allocate_shared(const _Alloc& __a);
-
- template<class _Alloc, class _A0>
- static shared_ptr<_Tp>
- allocate_shared(const _Alloc& __a, _A0& __a0);
-
- template<class _Alloc, class _A0, class _A1>
- static shared_ptr<_Tp>
- allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1);
-
- template<class _Alloc, class _A0, class _A1, class _A2>
- static shared_ptr<_Tp>
- allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2);
-
-#endif // _LIBCPP_HAS_NO_VARIADICS
-
-private:
- template <class _Yp, bool = is_function<_Yp>::value>
- struct __shared_ptr_default_allocator
- {
- typedef allocator<_Yp> type;
- };
-
- template <class _Yp>
- struct __shared_ptr_default_allocator<_Yp, true>
- {
- typedef allocator<__shared_ptr_dummy_rebind_allocator_type> type;
- };
-
- template <class _Yp, class _OrigPtr>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<is_convertible<_OrigPtr*,
- const enable_shared_from_this<_Yp>*
- >::value,
- void>::type
- __enable_weak_this(const enable_shared_from_this<_Yp>* __e,
- _OrigPtr* __ptr) _NOEXCEPT
- {
- typedef typename remove_cv<_Yp>::type _RawYp;
- if (__e && __e->__weak_this_.expired())
- {
- __e->__weak_this_ = shared_ptr<_RawYp>(*this,
- const_cast<_RawYp*>(static_cast<const _Yp*>(__ptr)));
- }
- }
-
- _LIBCPP_INLINE_VISIBILITY void __enable_weak_this(...) _NOEXCEPT {}
-
- template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr;
- template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr;
-};
-
-
-template<class _Tp>
-inline
-_LIBCPP_CONSTEXPR
-shared_ptr<_Tp>::shared_ptr() _NOEXCEPT
- : __ptr_(0),
- __cntrl_(0)
-{
-}
-
-template<class _Tp>
-inline
-_LIBCPP_CONSTEXPR
-shared_ptr<_Tp>::shared_ptr(nullptr_t) _NOEXCEPT
- : __ptr_(0),
- __cntrl_(0)
-{
-}
-
-template<class _Tp>
-template<class _Yp>
-shared_ptr<_Tp>::shared_ptr(_Yp* __p,
- typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type)
- : __ptr_(__p)
-{
- unique_ptr<_Yp> __hold(__p);
- typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT;
- typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, _AllocT > _CntrlBlk;
- __cntrl_ = new _CntrlBlk(__p, default_delete<_Yp>(), _AllocT());
- __hold.release();
- __enable_weak_this(__p, __p);
-}
-
-template<class _Tp>
-template<class _Yp, class _Dp>
-shared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d,
- typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type)
- : __ptr_(__p)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT;
- typedef __shared_ptr_pointer<_Yp*, _Dp, _AllocT > _CntrlBlk;
- __cntrl_ = new _CntrlBlk(__p, __d, _AllocT());
- __enable_weak_this(__p, __p);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __d(__p);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
-}
-
-template<class _Tp>
-template<class _Dp>
-shared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d)
- : __ptr_(0)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typedef typename __shared_ptr_default_allocator<_Tp>::type _AllocT;
- typedef __shared_ptr_pointer<nullptr_t, _Dp, _AllocT > _CntrlBlk;
- __cntrl_ = new _CntrlBlk(__p, __d, _AllocT());
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __d(__p);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
-}
-
-template<class _Tp>
-template<class _Yp, class _Dp, class _Alloc>
-shared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, _Alloc __a,
- typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type)
- : __ptr_(__p)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typedef __shared_ptr_pointer<_Yp*, _Dp, _Alloc> _CntrlBlk;
- typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2;
- typedef __allocator_destructor<_A2> _D2;
- _A2 __a2(__a);
- unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1));
- ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get())))
- _CntrlBlk(__p, __d, __a);
- __cntrl_ = _VSTD::addressof(*__hold2.release());
- __enable_weak_this(__p, __p);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __d(__p);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
-}
-
-template<class _Tp>
-template<class _Dp, class _Alloc>
-shared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a)
- : __ptr_(0)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typedef __shared_ptr_pointer<nullptr_t, _Dp, _Alloc> _CntrlBlk;
- typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2;
- typedef __allocator_destructor<_A2> _D2;
- _A2 __a2(__a);
- unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1));
- ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get())))
- _CntrlBlk(__p, __d, __a);
- __cntrl_ = _VSTD::addressof(*__hold2.release());
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __d(__p);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
-}
-
-template<class _Tp>
-template<class _Yp>
-inline
-shared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p) _NOEXCEPT
- : __ptr_(__p),
- __cntrl_(__r.__cntrl_)
-{
- if (__cntrl_)
- __cntrl_->__add_shared();
-}
-
-template<class _Tp>
-inline
-shared_ptr<_Tp>::shared_ptr(const shared_ptr& __r) _NOEXCEPT
- : __ptr_(__r.__ptr_),
- __cntrl_(__r.__cntrl_)
-{
- if (__cntrl_)
- __cntrl_->__add_shared();
-}
-
-template<class _Tp>
-template<class _Yp>
-inline
-shared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r,
- typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type)
- _NOEXCEPT
- : __ptr_(__r.__ptr_),
- __cntrl_(__r.__cntrl_)
-{
- if (__cntrl_)
- __cntrl_->__add_shared();
-}
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template<class _Tp>
-inline
-shared_ptr<_Tp>::shared_ptr(shared_ptr&& __r) _NOEXCEPT
- : __ptr_(__r.__ptr_),
- __cntrl_(__r.__cntrl_)
-{
- __r.__ptr_ = 0;
- __r.__cntrl_ = 0;
-}
-
-template<class _Tp>
-template<class _Yp>
-inline
-shared_ptr<_Tp>::shared_ptr(shared_ptr<_Yp>&& __r,
- typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type)
- _NOEXCEPT
- : __ptr_(__r.__ptr_),
- __cntrl_(__r.__cntrl_)
-{
- __r.__ptr_ = 0;
- __r.__cntrl_ = 0;
-}
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
-template<class _Tp>
-template<class _Yp>
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-shared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp>&& __r,
-#else
-shared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp> __r,
-#endif
- typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type)
- : __ptr_(__r.get())
-{
- typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk;
- __cntrl_ = new _CntrlBlk(__r.get(), default_delete<_Yp>(), allocator<_Yp>());
- __enable_weak_this(__r.get(), __r.get());
- __r.release();
-}
-#endif
-
-template<class _Tp>
-template <class _Yp, class _Dp>
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-shared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r,
-#else
-shared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r,
-#endif
- typename enable_if
- <
- !is_lvalue_reference<_Dp>::value &&
- !is_array<_Yp>::value &&
- is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value,
- __nat
- >::type)
- : __ptr_(__r.get())
-{
-#if _LIBCPP_STD_VER > 11
- if (__ptr_ == nullptr)
- __cntrl_ = nullptr;
- else
-#endif
- {
- typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT;
- typedef __shared_ptr_pointer<_Yp*, _Dp, _AllocT > _CntrlBlk;
- __cntrl_ = new _CntrlBlk(__r.get(), __r.get_deleter(), _AllocT());
- __enable_weak_this(__r.get(), __r.get());
- }
- __r.release();
-}
-
-template<class _Tp>
-template <class _Yp, class _Dp>
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-shared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r,
-#else
-shared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r,
-#endif
- typename enable_if
- <
- is_lvalue_reference<_Dp>::value &&
- !is_array<_Yp>::value &&
- is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value,
- __nat
- >::type)
- : __ptr_(__r.get())
-{
-#if _LIBCPP_STD_VER > 11
- if (__ptr_ == nullptr)
- __cntrl_ = nullptr;
- else
-#endif
- {
- typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT;
- typedef __shared_ptr_pointer<_Yp*,
- reference_wrapper<typename remove_reference<_Dp>::type>,
- _AllocT > _CntrlBlk;
- __cntrl_ = new _CntrlBlk(__r.get(), ref(__r.get_deleter()), _AllocT());
- __enable_weak_this(__r.get(), __r.get());
- }
- __r.release();
-}
-
-#ifndef _LIBCPP_HAS_NO_VARIADICS
-
-template<class _Tp>
-template<class ..._Args>
-shared_ptr<_Tp>
-shared_ptr<_Tp>::make_shared(_Args&& ...__args)
-{
- static_assert( is_constructible<_Tp, _Args...>::value, "Can't construct object in make_shared" );
- typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk;
- typedef allocator<_CntrlBlk> _A2;
- typedef __allocator_destructor<_A2> _D2;
- _A2 __a2;
- unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1));
- ::new(__hold2.get()) _CntrlBlk(__a2, _VSTD::forward<_Args>(__args)...);
- shared_ptr<_Tp> __r;
- __r.__ptr_ = __hold2.get()->get();
- __r.__cntrl_ = __hold2.release();
- __r.__enable_weak_this(__r.__ptr_, __r.__ptr_);
- return __r;
-}
-
-template<class _Tp>
-template<class _Alloc, class ..._Args>
-shared_ptr<_Tp>
-shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _Args&& ...__args)
-{
- static_assert( is_constructible<_Tp, _Args...>::value, "Can't construct object in allocate_shared" );
- typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk;
- typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2;
- typedef __allocator_destructor<_A2> _D2;
- _A2 __a2(__a);
- unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1));
- ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get())))
- _CntrlBlk(__a, _VSTD::forward<_Args>(__args)...);
- shared_ptr<_Tp> __r;
- __r.__ptr_ = __hold2.get()->get();
- __r.__cntrl_ = _VSTD::addressof(*__hold2.release());
- __r.__enable_weak_this(__r.__ptr_, __r.__ptr_);
- return __r;
-}
-
-#else // _LIBCPP_HAS_NO_VARIADICS
-
-template<class _Tp>
-shared_ptr<_Tp>
-shared_ptr<_Tp>::make_shared()
-{
- static_assert((is_constructible<_Tp>::value), "Can't construct object in make_shared" );
- typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk;
- typedef allocator<_CntrlBlk> _Alloc2;
- typedef __allocator_destructor<_Alloc2> _D2;
- _Alloc2 __alloc2;
- unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1));
- ::new(__hold2.get()) _CntrlBlk(__alloc2);
- shared_ptr<_Tp> __r;
- __r.__ptr_ = __hold2.get()->get();
- __r.__cntrl_ = __hold2.release();
- __r.__enable_weak_this(__r.__ptr_, __r.__ptr_);
- return __r;
-}
-
-template<class _Tp>
-template<class _A0>
-shared_ptr<_Tp>
-shared_ptr<_Tp>::make_shared(_A0& __a0)
-{
- static_assert((is_constructible<_Tp, _A0>::value), "Can't construct object in make_shared" );
- typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk;
- typedef allocator<_CntrlBlk> _Alloc2;
- typedef __allocator_destructor<_Alloc2> _D2;
- _Alloc2 __alloc2;
- unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1));
- ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0);
- shared_ptr<_Tp> __r;
- __r.__ptr_ = __hold2.get()->get();
- __r.__cntrl_ = __hold2.release();
- __r.__enable_weak_this(__r.__ptr_, __r.__ptr_);
- return __r;
-}
-
-template<class _Tp>
-template<class _A0, class _A1>
-shared_ptr<_Tp>
-shared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1)
-{
- static_assert((is_constructible<_Tp, _A0, _A1>::value), "Can't construct object in make_shared" );
- typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk;
- typedef allocator<_CntrlBlk> _Alloc2;
- typedef __allocator_destructor<_Alloc2> _D2;
- _Alloc2 __alloc2;
- unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1));
- ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1);
- shared_ptr<_Tp> __r;
- __r.__ptr_ = __hold2.get()->get();
- __r.__cntrl_ = __hold2.release();
- __r.__enable_weak_this(__r.__ptr_, __r.__ptr_);
- return __r;
-}
-
-template<class _Tp>
-template<class _A0, class _A1, class _A2>
-shared_ptr<_Tp>
-shared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1, _A2& __a2)
-{
- static_assert((is_constructible<_Tp, _A0, _A1, _A2>::value), "Can't construct object in make_shared" );
- typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk;
- typedef allocator<_CntrlBlk> _Alloc2;
- typedef __allocator_destructor<_Alloc2> _D2;
- _Alloc2 __alloc2;
- unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1));
- ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1, __a2);
- shared_ptr<_Tp> __r;
- __r.__ptr_ = __hold2.get()->get();
- __r.__cntrl_ = __hold2.release();
- __r.__enable_weak_this(__r.__ptr_, __r.__ptr_);
- return __r;
-}
-
-template<class _Tp>
-template<class _Alloc>
-shared_ptr<_Tp>
-shared_ptr<_Tp>::allocate_shared(const _Alloc& __a)
-{
- static_assert((is_constructible<_Tp>::value), "Can't construct object in allocate_shared" );
- typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk;
- typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2;
- typedef __allocator_destructor<_Alloc2> _D2;
- _Alloc2 __alloc2(__a);
- unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1));
- ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get())))
- _CntrlBlk(__a);
- shared_ptr<_Tp> __r;
- __r.__ptr_ = __hold2.get()->get();
- __r.__cntrl_ = _VSTD::addressof(*__hold2.release());
- __r.__enable_weak_this(__r.__ptr_, __r.__ptr_);
- return __r;
-}
-
-template<class _Tp>
-template<class _Alloc, class _A0>
-shared_ptr<_Tp>
-shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0)
-{
- static_assert((is_constructible<_Tp, _A0>::value), "Can't construct object in allocate_shared" );
- typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk;
- typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2;
- typedef __allocator_destructor<_Alloc2> _D2;
- _Alloc2 __alloc2(__a);
- unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1));
- ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get())))
- _CntrlBlk(__a, __a0);
- shared_ptr<_Tp> __r;
- __r.__ptr_ = __hold2.get()->get();
- __r.__cntrl_ = _VSTD::addressof(*__hold2.release());
- __r.__enable_weak_this(__r.__ptr_, __r.__ptr_);
- return __r;
-}
-
-template<class _Tp>
-template<class _Alloc, class _A0, class _A1>
-shared_ptr<_Tp>
-shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1)
-{
- static_assert((is_constructible<_Tp, _A0, _A1>::value), "Can't construct object in allocate_shared" );
- typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk;
- typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2;
- typedef __allocator_destructor<_Alloc2> _D2;
- _Alloc2 __alloc2(__a);
- unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1));
- ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get())))
- _CntrlBlk(__a, __a0, __a1);
- shared_ptr<_Tp> __r;
- __r.__ptr_ = __hold2.get()->get();
- __r.__cntrl_ = _VSTD::addressof(*__hold2.release());
- __r.__enable_weak_this(__r.__ptr_, __r.__ptr_);
- return __r;
-}
-
-template<class _Tp>
-template<class _Alloc, class _A0, class _A1, class _A2>
-shared_ptr<_Tp>
-shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2)
-{
- static_assert((is_constructible<_Tp, _A0, _A1, _A2>::value), "Can't construct object in allocate_shared" );
- typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk;
- typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2;
- typedef __allocator_destructor<_Alloc2> _D2;
- _Alloc2 __alloc2(__a);
- unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1));
- ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get())))
- _CntrlBlk(__a, __a0, __a1, __a2);
- shared_ptr<_Tp> __r;
- __r.__ptr_ = __hold2.get()->get();
- __r.__cntrl_ = _VSTD::addressof(*__hold2.release());
- __r.__enable_weak_this(__r.__ptr_, __r.__ptr_);
- return __r;
-}
-
-#endif // _LIBCPP_HAS_NO_VARIADICS
-
-template<class _Tp>
-shared_ptr<_Tp>::~shared_ptr()
-{
- if (__cntrl_)
- __cntrl_->__release_shared();
-}
-
-template<class _Tp>
-inline
-shared_ptr<_Tp>&
-shared_ptr<_Tp>::operator=(const shared_ptr& __r) _NOEXCEPT
-{
- shared_ptr(__r).swap(*this);
- return *this;
-}
-
-template<class _Tp>
-template<class _Yp>
-inline
-typename enable_if
-<
- is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value,
- shared_ptr<_Tp>&
->::type
-shared_ptr<_Tp>::operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT
-{
- shared_ptr(__r).swap(*this);
- return *this;
-}
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template<class _Tp>
-inline
-shared_ptr<_Tp>&
-shared_ptr<_Tp>::operator=(shared_ptr&& __r) _NOEXCEPT
-{
- shared_ptr(_VSTD::move(__r)).swap(*this);
- return *this;
-}
-
-template<class _Tp>
-template<class _Yp>
-inline
-typename enable_if
-<
- is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value,
- shared_ptr<_Tp>&
->::type
-shared_ptr<_Tp>::operator=(shared_ptr<_Yp>&& __r)
-{
- shared_ptr(_VSTD::move(__r)).swap(*this);
- return *this;
-}
-
-#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
-template<class _Tp>
-template<class _Yp>
-inline
-typename enable_if
-<
- !is_array<_Yp>::value &&
- is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value,
- shared_ptr<_Tp>
->::type&
-shared_ptr<_Tp>::operator=(auto_ptr<_Yp>&& __r)
-{
- shared_ptr(_VSTD::move(__r)).swap(*this);
- return *this;
-}
-#endif
-
-template<class _Tp>
-template <class _Yp, class _Dp>
-inline
-typename enable_if
-<
- !is_array<_Yp>::value &&
- is_convertible<typename unique_ptr<_Yp, _Dp>::pointer,
- typename shared_ptr<_Tp>::element_type*>::value,
- shared_ptr<_Tp>&
->::type
-shared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp>&& __r)
-{
- shared_ptr(_VSTD::move(__r)).swap(*this);
- return *this;
-}
-
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
-template<class _Tp>
-template<class _Yp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- !is_array<_Yp>::value &&
- is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value,
- shared_ptr<_Tp>&
->::type
-shared_ptr<_Tp>::operator=(auto_ptr<_Yp> __r)
-{
- shared_ptr(__r).swap(*this);
- return *this;
-}
-#endif
-
-template<class _Tp>
-template <class _Yp, class _Dp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- !is_array<_Yp>::value &&
- is_convertible<typename unique_ptr<_Yp, _Dp>::pointer,
- typename shared_ptr<_Tp>::element_type*>::value,
- shared_ptr<_Tp>&
->::type
-shared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp> __r)
-{
- shared_ptr(_VSTD::move(__r)).swap(*this);
- return *this;
-}
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template<class _Tp>
-inline
-void
-shared_ptr<_Tp>::swap(shared_ptr& __r) _NOEXCEPT
-{
- _VSTD::swap(__ptr_, __r.__ptr_);
- _VSTD::swap(__cntrl_, __r.__cntrl_);
-}
-
-template<class _Tp>
-inline
-void
-shared_ptr<_Tp>::reset() _NOEXCEPT
-{
- shared_ptr().swap(*this);
-}
-
-template<class _Tp>
-template<class _Yp>
-inline
-typename enable_if
-<
- is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value,
- void
->::type
-shared_ptr<_Tp>::reset(_Yp* __p)
-{
- shared_ptr(__p).swap(*this);
-}
-
-template<class _Tp>
-template<class _Yp, class _Dp>
-inline
-typename enable_if
-<
- is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value,
- void
->::type
-shared_ptr<_Tp>::reset(_Yp* __p, _Dp __d)
-{
- shared_ptr(__p, __d).swap(*this);
-}
-
-template<class _Tp>
-template<class _Yp, class _Dp, class _Alloc>
-inline
-typename enable_if
-<
- is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value,
- void
->::type
-shared_ptr<_Tp>::reset(_Yp* __p, _Dp __d, _Alloc __a)
-{
- shared_ptr(__p, __d, __a).swap(*this);
-}
-
-#ifndef _LIBCPP_HAS_NO_VARIADICS
-
-template<class _Tp, class ..._Args>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- !is_array<_Tp>::value,
- shared_ptr<_Tp>
->::type
-make_shared(_Args&& ...__args)
-{
- return shared_ptr<_Tp>::make_shared(_VSTD::forward<_Args>(__args)...);
-}
-
-template<class _Tp, class _Alloc, class ..._Args>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- !is_array<_Tp>::value,
- shared_ptr<_Tp>
->::type
-allocate_shared(const _Alloc& __a, _Args&& ...__args)
-{
- return shared_ptr<_Tp>::allocate_shared(__a, _VSTD::forward<_Args>(__args)...);
-}
-
-#else // _LIBCPP_HAS_NO_VARIADICS
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-shared_ptr<_Tp>
-make_shared()
-{
- return shared_ptr<_Tp>::make_shared();
-}
-
-template<class _Tp, class _A0>
-inline _LIBCPP_INLINE_VISIBILITY
-shared_ptr<_Tp>
-make_shared(_A0& __a0)
-{
- return shared_ptr<_Tp>::make_shared(__a0);
-}
-
-template<class _Tp, class _A0, class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-shared_ptr<_Tp>
-make_shared(_A0& __a0, _A1& __a1)
-{
- return shared_ptr<_Tp>::make_shared(__a0, __a1);
-}
-
-template<class _Tp, class _A0, class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-shared_ptr<_Tp>
-make_shared(_A0& __a0, _A1& __a1, _A2& __a2)
-{
- return shared_ptr<_Tp>::make_shared(__a0, __a1, __a2);
-}
-
-template<class _Tp, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-shared_ptr<_Tp>
-allocate_shared(const _Alloc& __a)
-{
- return shared_ptr<_Tp>::allocate_shared(__a);
-}
-
-template<class _Tp, class _Alloc, class _A0>
-inline _LIBCPP_INLINE_VISIBILITY
-shared_ptr<_Tp>
-allocate_shared(const _Alloc& __a, _A0& __a0)
-{
- return shared_ptr<_Tp>::allocate_shared(__a, __a0);
-}
-
-template<class _Tp, class _Alloc, class _A0, class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-shared_ptr<_Tp>
-allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1)
-{
- return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1);
-}
-
-template<class _Tp, class _Alloc, class _A0, class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-shared_ptr<_Tp>
-allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2)
-{
- return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1, __a2);
-}
-
-#endif // _LIBCPP_HAS_NO_VARIADICS
-
-template<class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
-{
- return __x.get() == __y.get();
-}
-
-template<class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
-{
- return !(__x == __y);
-}
-
-template<class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
-{
-#if _LIBCPP_STD_VER <= 11
- typedef typename common_type<_Tp*, _Up*>::type _Vp;
- return less<_Vp>()(__x.get(), __y.get());
-#else
- return less<>()(__x.get(), __y.get());
-#endif
-
-}
-
-template<class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
-{
- return __y < __x;
-}
-
-template<class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
-{
- return !(__y < __x);
-}
-
-template<class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
-{
- return !(__x < __y);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
-{
- return !__x;
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
-{
- return !__x;
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
-{
- return static_cast<bool>(__x);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
-{
- return static_cast<bool>(__x);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
-{
- return less<_Tp*>()(__x.get(), nullptr);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
-{
- return less<_Tp*>()(nullptr, __x.get());
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
-{
- return nullptr < __x;
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
-{
- return __x < nullptr;
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
-{
- return !(nullptr < __x);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
-{
- return !(__x < nullptr);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
-{
- return !(__x < nullptr);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
-{
- return !(nullptr < __x);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(shared_ptr<_Tp>& __x, shared_ptr<_Tp>& __y) _NOEXCEPT
-{
- __x.swap(__y);
-}
-
-template<class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- !is_array<_Tp>::value && !is_array<_Up>::value,
- shared_ptr<_Tp>
->::type
-static_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT
-{
- return shared_ptr<_Tp>(__r, static_cast<_Tp*>(__r.get()));
-}
-
-template<class _Tp, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- !is_array<_Tp>::value && !is_array<_Up>::value,
- shared_ptr<_Tp>
->::type
-dynamic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT
-{
- _Tp* __p = dynamic_cast<_Tp*>(__r.get());
- return __p ? shared_ptr<_Tp>(__r, __p) : shared_ptr<_Tp>();
-}
-
-template<class _Tp, class _Up>
-typename enable_if
-<
- is_array<_Tp>::value == is_array<_Up>::value,
- shared_ptr<_Tp>
->::type
-const_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT
-{
- typedef typename remove_extent<_Tp>::type _RTp;
- return shared_ptr<_Tp>(__r, const_cast<_RTp*>(__r.get()));
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Dp, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Dp*
-get_deleter(const shared_ptr<_Tp>& __p) _NOEXCEPT
-{
- return __p.template __get_deleter<_Dp>();
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-template<class _Tp>
-class _LIBCPP_TEMPLATE_VIS weak_ptr
-{
-public:
- typedef _Tp element_type;
-private:
- element_type* __ptr_;
- __shared_weak_count* __cntrl_;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR weak_ptr() _NOEXCEPT;
- template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(shared_ptr<_Yp> const& __r,
- typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0)
- _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- weak_ptr(weak_ptr const& __r) _NOEXCEPT;
- template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp> const& __r,
- typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0)
- _NOEXCEPT;
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- weak_ptr(weak_ptr&& __r) _NOEXCEPT;
- template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp>&& __r,
- typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0)
- _NOEXCEPT;
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- ~weak_ptr();
-
- _LIBCPP_INLINE_VISIBILITY
- weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT;
- template<class _Yp>
- typename enable_if
- <
- is_convertible<_Yp*, element_type*>::value,
- weak_ptr&
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT;
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
- _LIBCPP_INLINE_VISIBILITY
- weak_ptr& operator=(weak_ptr&& __r) _NOEXCEPT;
- template<class _Yp>
- typename enable_if
- <
- is_convertible<_Yp*, element_type*>::value,
- weak_ptr&
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT;
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
- template<class _Yp>
- typename enable_if
- <
- is_convertible<_Yp*, element_type*>::value,
- weak_ptr&
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(weak_ptr& __r) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- void reset() _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- long use_count() const _NOEXCEPT
- {return __cntrl_ ? __cntrl_->use_count() : 0;}
- _LIBCPP_INLINE_VISIBILITY
- bool expired() const _NOEXCEPT
- {return __cntrl_ == 0 || __cntrl_->use_count() == 0;}
- shared_ptr<_Tp> lock() const _NOEXCEPT;
- template<class _Up>
- _LIBCPP_INLINE_VISIBILITY
- bool owner_before(const shared_ptr<_Up>& __r) const _NOEXCEPT
- {return __cntrl_ < __r.__cntrl_;}
- template<class _Up>
- _LIBCPP_INLINE_VISIBILITY
- bool owner_before(const weak_ptr<_Up>& __r) const _NOEXCEPT
- {return __cntrl_ < __r.__cntrl_;}
-
- template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr;
- template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr;
-};
-
-template<class _Tp>
-inline
-_LIBCPP_CONSTEXPR
-weak_ptr<_Tp>::weak_ptr() _NOEXCEPT
- : __ptr_(0),
- __cntrl_(0)
-{
-}
-
-template<class _Tp>
-inline
-weak_ptr<_Tp>::weak_ptr(weak_ptr const& __r) _NOEXCEPT
- : __ptr_(__r.__ptr_),
- __cntrl_(__r.__cntrl_)
-{
- if (__cntrl_)
- __cntrl_->__add_weak();
-}
-
-template<class _Tp>
-template<class _Yp>
-inline
-weak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r,
- typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type)
- _NOEXCEPT
- : __ptr_(__r.__ptr_),
- __cntrl_(__r.__cntrl_)
-{
- if (__cntrl_)
- __cntrl_->__add_weak();
-}
-
-template<class _Tp>
-template<class _Yp>
-inline
-weak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r,
- typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type)
- _NOEXCEPT
- : __ptr_(__r.__ptr_),
- __cntrl_(__r.__cntrl_)
-{
- if (__cntrl_)
- __cntrl_->__add_weak();
-}
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template<class _Tp>
-inline
-weak_ptr<_Tp>::weak_ptr(weak_ptr&& __r) _NOEXCEPT
- : __ptr_(__r.__ptr_),
- __cntrl_(__r.__cntrl_)
-{
- __r.__ptr_ = 0;
- __r.__cntrl_ = 0;
-}
-
-template<class _Tp>
-template<class _Yp>
-inline
-weak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp>&& __r,
- typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type)
- _NOEXCEPT
- : __ptr_(__r.__ptr_),
- __cntrl_(__r.__cntrl_)
-{
- __r.__ptr_ = 0;
- __r.__cntrl_ = 0;
-}
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template<class _Tp>
-weak_ptr<_Tp>::~weak_ptr()
-{
- if (__cntrl_)
- __cntrl_->__release_weak();
-}
-
-template<class _Tp>
-inline
-weak_ptr<_Tp>&
-weak_ptr<_Tp>::operator=(weak_ptr const& __r) _NOEXCEPT
-{
- weak_ptr(__r).swap(*this);
- return *this;
-}
-
-template<class _Tp>
-template<class _Yp>
-inline
-typename enable_if
-<
- is_convertible<_Yp*, _Tp*>::value,
- weak_ptr<_Tp>&
->::type
-weak_ptr<_Tp>::operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT
-{
- weak_ptr(__r).swap(*this);
- return *this;
-}
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template<class _Tp>
-inline
-weak_ptr<_Tp>&
-weak_ptr<_Tp>::operator=(weak_ptr&& __r) _NOEXCEPT
-{
- weak_ptr(_VSTD::move(__r)).swap(*this);
- return *this;
-}
-
-template<class _Tp>
-template<class _Yp>
-inline
-typename enable_if
-<
- is_convertible<_Yp*, _Tp*>::value,
- weak_ptr<_Tp>&
->::type
-weak_ptr<_Tp>::operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT
-{
- weak_ptr(_VSTD::move(__r)).swap(*this);
- return *this;
-}
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template<class _Tp>
-template<class _Yp>
-inline
-typename enable_if
-<
- is_convertible<_Yp*, _Tp*>::value,
- weak_ptr<_Tp>&
->::type
-weak_ptr<_Tp>::operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT
-{
- weak_ptr(__r).swap(*this);
- return *this;
-}
-
-template<class _Tp>
-inline
-void
-weak_ptr<_Tp>::swap(weak_ptr& __r) _NOEXCEPT
-{
- _VSTD::swap(__ptr_, __r.__ptr_);
- _VSTD::swap(__cntrl_, __r.__cntrl_);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(weak_ptr<_Tp>& __x, weak_ptr<_Tp>& __y) _NOEXCEPT
-{
- __x.swap(__y);
-}
-
-template<class _Tp>
-inline
-void
-weak_ptr<_Tp>::reset() _NOEXCEPT
-{
- weak_ptr().swap(*this);
-}
-
-template<class _Tp>
-template<class _Yp>
-shared_ptr<_Tp>::shared_ptr(const weak_ptr<_Yp>& __r,
- typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type)
- : __ptr_(__r.__ptr_),
- __cntrl_(__r.__cntrl_ ? __r.__cntrl_->lock() : __r.__cntrl_)
-{
- if (__cntrl_ == 0)
- __throw_bad_weak_ptr();
-}
-
-template<class _Tp>
-shared_ptr<_Tp>
-weak_ptr<_Tp>::lock() const _NOEXCEPT
-{
- shared_ptr<_Tp> __r;
- __r.__cntrl_ = __cntrl_ ? __cntrl_->lock() : __cntrl_;
- if (__r.__cntrl_)
- __r.__ptr_ = __ptr_;
- return __r;
-}
-
-#if _LIBCPP_STD_VER > 14
-template <class _Tp = void> struct owner_less;
-#else
-template <class _Tp> struct owner_less;
-#endif
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS owner_less<shared_ptr<_Tp> >
- : binary_function<shared_ptr<_Tp>, shared_ptr<_Tp>, bool>
-{
- typedef bool result_type;
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(shared_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT
- {return __x.owner_before(__y);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const _NOEXCEPT
- {return __x.owner_before(__y);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT
- {return __x.owner_before(__y);}
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS owner_less<weak_ptr<_Tp> >
- : binary_function<weak_ptr<_Tp>, weak_ptr<_Tp>, bool>
-{
- typedef bool result_type;
- _LIBCPP_INLINE_VISIBILITY
- bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const _NOEXCEPT
- {return __x.owner_before(__y);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const _NOEXCEPT
- {return __x.owner_before(__y);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT
- {return __x.owner_before(__y);}
-};
-
-#if _LIBCPP_STD_VER > 14
-template <>
-struct _LIBCPP_TEMPLATE_VIS owner_less<void>
-{
- template <class _Tp, class _Up>
- _LIBCPP_INLINE_VISIBILITY
- bool operator()( shared_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const _NOEXCEPT
- {return __x.owner_before(__y);}
- template <class _Tp, class _Up>
- _LIBCPP_INLINE_VISIBILITY
- bool operator()( shared_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const _NOEXCEPT
- {return __x.owner_before(__y);}
- template <class _Tp, class _Up>
- _LIBCPP_INLINE_VISIBILITY
- bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const _NOEXCEPT
- {return __x.owner_before(__y);}
- template <class _Tp, class _Up>
- _LIBCPP_INLINE_VISIBILITY
- bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const _NOEXCEPT
- {return __x.owner_before(__y);}
- typedef void is_transparent;
-};
-#endif
-
-template<class _Tp>
-class _LIBCPP_TEMPLATE_VIS enable_shared_from_this
-{
- mutable weak_ptr<_Tp> __weak_this_;
-protected:
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- enable_shared_from_this() _NOEXCEPT {}
- _LIBCPP_INLINE_VISIBILITY
- enable_shared_from_this(enable_shared_from_this const&) _NOEXCEPT {}
- _LIBCPP_INLINE_VISIBILITY
- enable_shared_from_this& operator=(enable_shared_from_this const&) _NOEXCEPT
- {return *this;}
- _LIBCPP_INLINE_VISIBILITY
- ~enable_shared_from_this() {}
-public:
- _LIBCPP_INLINE_VISIBILITY
- shared_ptr<_Tp> shared_from_this()
- {return shared_ptr<_Tp>(__weak_this_);}
- _LIBCPP_INLINE_VISIBILITY
- shared_ptr<_Tp const> shared_from_this() const
- {return shared_ptr<const _Tp>(__weak_this_);}
-
-#if _LIBCPP_STD_VER > 14
- _LIBCPP_INLINE_VISIBILITY
- weak_ptr<_Tp> weak_from_this() _NOEXCEPT
- { return __weak_this_; }
-
- _LIBCPP_INLINE_VISIBILITY
- weak_ptr<const _Tp> weak_from_this() const _NOEXCEPT
- { return __weak_this_; }
-#endif // _LIBCPP_STD_VER > 14
-
- template <class _Up> friend class shared_ptr;
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS hash<shared_ptr<_Tp> >
-{
- typedef shared_ptr<_Tp> argument_type;
- typedef size_t result_type;
-
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(const argument_type& __ptr) const _NOEXCEPT
- {
- return hash<_Tp*>()(__ptr.get());
- }
-};
-
-template<class _CharT, class _Traits, class _Yp>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p);
-
-
-#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
-
-class _LIBCPP_TYPE_VIS __sp_mut
-{
- void* __lx;
-public:
- void lock() _NOEXCEPT;
- void unlock() _NOEXCEPT;
-
-private:
- _LIBCPP_CONSTEXPR __sp_mut(void*) _NOEXCEPT;
- __sp_mut(const __sp_mut&);
- __sp_mut& operator=(const __sp_mut&);
-
- friend _LIBCPP_FUNC_VIS __sp_mut& __get_sp_mut(const void*);
-};
-
-_LIBCPP_FUNC_VIS _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
-__sp_mut& __get_sp_mut(const void*);
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-atomic_is_lock_free(const shared_ptr<_Tp>*)
-{
- return false;
-}
-
-template <class _Tp>
-_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
-shared_ptr<_Tp>
-atomic_load(const shared_ptr<_Tp>* __p)
-{
- __sp_mut& __m = __get_sp_mut(__p);
- __m.lock();
- shared_ptr<_Tp> __q = *__p;
- __m.unlock();
- return __q;
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
-shared_ptr<_Tp>
-atomic_load_explicit(const shared_ptr<_Tp>* __p, memory_order)
-{
- return atomic_load(__p);
-}
-
-template <class _Tp>
-_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
-void
-atomic_store(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r)
-{
- __sp_mut& __m = __get_sp_mut(__p);
- __m.lock();
- __p->swap(__r);
- __m.unlock();
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
-void
-atomic_store_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order)
-{
- atomic_store(__p, __r);
-}
-
-template <class _Tp>
-_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
-shared_ptr<_Tp>
-atomic_exchange(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r)
-{
- __sp_mut& __m = __get_sp_mut(__p);
- __m.lock();
- __p->swap(__r);
- __m.unlock();
- return __r;
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
-shared_ptr<_Tp>
-atomic_exchange_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order)
-{
- return atomic_exchange(__p, __r);
-}
-
-template <class _Tp>
-_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
-bool
-atomic_compare_exchange_strong(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w)
-{
- shared_ptr<_Tp> __temp;
- __sp_mut& __m = __get_sp_mut(__p);
- __m.lock();
- if (__p->__owner_equivalent(*__v))
- {
- _VSTD::swap(__temp, *__p);
- *__p = __w;
- __m.unlock();
- return true;
- }
- _VSTD::swap(__temp, *__v);
- *__v = *__p;
- __m.unlock();
- return false;
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
-bool
-atomic_compare_exchange_weak(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w)
-{
- return atomic_compare_exchange_strong(__p, __v, __w);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
-bool
-atomic_compare_exchange_strong_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v,
- shared_ptr<_Tp> __w, memory_order, memory_order)
-{
- return atomic_compare_exchange_strong(__p, __v, __w);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
-bool
-atomic_compare_exchange_weak_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v,
- shared_ptr<_Tp> __w, memory_order, memory_order)
-{
- return atomic_compare_exchange_weak(__p, __v, __w);
-}
-
-#endif // !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
-
-//enum class
-#if defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE)
-# ifndef _LIBCPP_CXX03_LANG
-enum class pointer_safety : unsigned char {
- relaxed,
- preferred,
- strict
-};
-# endif
-#else
-struct _LIBCPP_TYPE_VIS pointer_safety
-{
- enum __lx
- {
- relaxed,
- preferred,
- strict
- };
-
- __lx __v_;
-
- _LIBCPP_INLINE_VISIBILITY
- pointer_safety() : __v_() {}
-
- _LIBCPP_INLINE_VISIBILITY
- pointer_safety(__lx __v) : __v_(__v) {}
- _LIBCPP_INLINE_VISIBILITY
- operator int() const {return __v_;}
-};
-#endif
-
-#if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) && \
- defined(_LIBCPP_BUILDING_LIBRARY)
-_LIBCPP_FUNC_VIS pointer_safety get_pointer_safety() _NOEXCEPT;
-#else
-// This function is only offered in C++03 under ABI v1.
-# if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) || !defined(_LIBCPP_CXX03_LANG)
-inline _LIBCPP_INLINE_VISIBILITY
-pointer_safety get_pointer_safety() _NOEXCEPT {
- return pointer_safety::relaxed;
-}
-# endif
-#endif
-
-
-_LIBCPP_FUNC_VIS void declare_reachable(void* __p);
-_LIBCPP_FUNC_VIS void declare_no_pointers(char* __p, size_t __n);
-_LIBCPP_FUNC_VIS void undeclare_no_pointers(char* __p, size_t __n);
-_LIBCPP_FUNC_VIS void* __undeclare_reachable(void* __p);
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp*
-undeclare_reachable(_Tp* __p)
-{
- return static_cast<_Tp*>(__undeclare_reachable(__p));
-}
-
-_LIBCPP_FUNC_VIS void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space);
-
-// --- Helper for container swap --
-template <typename _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-void __swap_allocator(_Alloc & __a1, _Alloc & __a2)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT
-#else
- _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value)
-#endif
-{
- __swap_allocator(__a1, __a2,
- integral_constant<bool, _VSTD::allocator_traits<_Alloc>::propagate_on_container_swap::value>());
-}
-
-template <typename _Alloc>
-_LIBCPP_INLINE_VISIBILITY
-void __swap_allocator(_Alloc & __a1, _Alloc & __a2, true_type)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT
-#else
- _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value)
-#endif
-{
- using _VSTD::swap;
- swap(__a1, __a2);
-}
-
-template <typename _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-void __swap_allocator(_Alloc &, _Alloc &, false_type) _NOEXCEPT {}
-
-template <typename _Alloc, typename _Traits=allocator_traits<_Alloc> >
-struct __noexcept_move_assign_container : public integral_constant<bool,
- _Traits::propagate_on_container_move_assignment::value
-#if _LIBCPP_STD_VER > 14
- || _Traits::is_always_equal::value
-#else
- && is_nothrow_move_assignable<_Alloc>::value
-#endif
- > {};
-
-
-#ifndef _LIBCPP_HAS_NO_VARIADICS
-template <class _Tp, class _Alloc>
-struct __temp_value {
- typedef allocator_traits<_Alloc> _Traits;
-
- typename aligned_storage<sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)>::type __v;
- _Alloc &__a;
-
- _Tp *__addr() { return reinterpret_cast<_Tp *>(addressof(__v)); }
- _Tp & get() { return *__addr(); }
-
- template<class... _Args>
- _LIBCPP_NO_CFI
- __temp_value(_Alloc &__alloc, _Args&& ... __args) : __a(__alloc) {
- _Traits::construct(__a, reinterpret_cast<_Tp*>(addressof(__v)),
- _VSTD::forward<_Args>(__args)...);
- }
-
- ~__temp_value() { _Traits::destroy(__a, __addr()); }
- };
-#endif
-
-template<typename _Alloc, typename = void, typename = void>
-struct __is_allocator : false_type {};
-
-template<typename _Alloc>
-struct __is_allocator<_Alloc,
- typename __void_t<typename _Alloc::value_type>::type,
- typename __void_t<decltype(_VSTD::declval<_Alloc&>().allocate(size_t(0)))>::type
- >
- : true_type {};
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_MEMORY
diff --git a/lib/libcxx/include/module.modulemap b/lib/libcxx/include/module.modulemap
deleted file mode 100644
index 6d88f52113c..00000000000
--- a/lib/libcxx/include/module.modulemap
+++ /dev/null
@@ -1,605 +0,0 @@
-// define the module for __config outside of the top level 'std' module
-// since __config may be included from C headers which may create an
-// include cycle.
-module std_config [system] [extern_c] {
- header "__config"
-}
-
-module std [system] {
- export std_config
- // FIXME: The standard does not require that each of these submodules
- // re-exports its imported modules. We should provide an alternative form of
- // export that issues a warning if a name from the submodule is used, and
- // use that to provide a 'strict mode' for libc++.
-
- // Deprecated C-compatibility headers. These can all be included from within
- // an 'extern "C"' context.
- module depr [extern_c] {
- // <assert.h> provided by C library.
- module ctype_h {
- header "ctype.h"
- export *
- }
- module errno_h {
- header "errno.h"
- export *
- }
- // <fenv.h> provided by C library.
- // <float.h> provided by compiler or C library.
- module inttypes_h {
- header "inttypes.h"
- export stdint_h
- export *
- }
- // <iso646.h> provided by compiler.
- // <limits.h> provided by compiler or C library.
- module locale_h {
- header "locale.h"
- export *
- }
- module math_h {
- header "math.h"
- export *
- }
- module setjmp_h {
- header "setjmp.h"
- export *
- }
- // FIXME: <stdalign.h> is missing.
- // <signal.h> provided by C library.
- // <stdarg.h> provided by compiler.
- // <stdbool.h> provided by compiler.
- module stddef_h {
- // <stddef.h>'s __need_* macros require textual inclusion.
- textual header "stddef.h"
- }
- module stdint_h {
- header "stdint.h"
- export *
- // FIXME: This module only exists on OS X and for some reason the
- // wildcard above doesn't export it.
- export Darwin.C.stdint
- }
- module stdio_h {
- // <stdio.h>'s __need_* macros require textual inclusion.
- textual header "stdio.h"
- export *
- export Darwin.C.stdio
- }
- module stdlib_h {
- // <stdlib.h>'s __need_* macros require textual inclusion.
- textual header "stdlib.h"
- export *
- }
- module string_h {
- header "string.h"
- export *
- }
- // FIXME: <uchar.h> is missing.
- // <time.h> provided by C library.
- module wchar_h {
- // <wchar.h>'s __need_* macros require textual inclusion.
- textual header "wchar.h"
- export *
- }
- module wctype_h {
- header "wctype.h"
- export *
- }
- }
-
- // <complex.h> and <tgmath.h> are not C headers in any real sense, do not
- // allow their use in extern "C" contexts.
- module complex_h {
- header "complex.h"
- export ccomplex
- export *
- }
- module tgmath_h {
- header "tgmath.h"
- export ccomplex
- export cmath
- export *
- }
-
- // C compatibility headers.
- module compat {
- module cassert {
- // <cassert>'s use of NDEBUG requires textual inclusion.
- textual header "cassert"
- }
- module ccomplex {
- header "ccomplex"
- export complex
- export *
- }
- module cctype {
- header "cctype"
- export *
- }
- module cerrno {
- header "cerrno"
- export *
- }
- module cfenv {
- header "cfenv"
- export *
- }
- module cfloat {
- header "cfloat"
- export *
- }
- module cinttypes {
- header "cinttypes"
- export cstdint
- export *
- }
- module ciso646 {
- header "ciso646"
- export *
- }
- module climits {
- header "climits"
- export *
- }
- module clocale {
- header "clocale"
- export *
- }
- module cmath {
- header "cmath"
- export *
- }
- module csetjmp {
- header "csetjmp"
- export *
- }
- module csignal {
- header "csignal"
- export *
- }
- // FIXME: <cstdalign> is missing.
- module cstdarg {
- header "cstdarg"
- export *
- }
- module cstdbool {
- header "cstdbool"
- export *
- }
- module cstddef {
- header "cstddef"
- export *
- }
- module cstdint {
- header "cstdint"
- export depr.stdint_h
- export *
- }
- module cstdio {
- header "cstdio"
- export *
- }
- module cstdlib {
- header "cstdlib"
- export *
- }
- module cstring {
- header "cstring"
- export *
- }
- module ctgmath {
- header "ctgmath"
- export ccomplex
- export cmath
- export *
- }
- module ctime {
- header "ctime"
- export *
- }
- // FIXME: <cuchar> is missing.
- module cwchar {
- header "cwchar"
- export depr.stdio_h
- export *
- }
- module cwctype {
- header "cwctype"
- export *
- }
- }
-
- module algorithm {
- header "algorithm"
- export initializer_list
- export *
- }
- module any {
- header "any"
- export *
- }
- module array {
- header "array"
- export initializer_list
- export *
- }
- module atomic {
- header "atomic"
- export *
- }
- module bit {
- header "bit"
- export *
- }
- module bitset {
- header "bitset"
- export string
- export iosfwd
- export *
- }
- // No submodule for cassert. It fundamentally needs repeated, textual inclusion.
- module charconv {
- header "charconv"
- export *
- }
- module chrono {
- header "chrono"
- export *
- }
- module codecvt {
- header "codecvt"
- export *
- }
- module compare {
- header "compare"
- export *
- }
- module complex {
- header "complex"
- export *
- }
- module condition_variable {
- header "condition_variable"
- export *
- }
- module deque {
- header "deque"
- export initializer_list
- export *
- }
- module exception {
- header "exception"
- export *
- }
- module filesystem {
- header "filesystem"
- export *
- }
- module forward_list {
- header "forward_list"
- export initializer_list
- export *
- }
- module fstream {
- header "fstream"
- export *
- }
- module functional {
- header "functional"
- export *
- }
- module future {
- header "future"
- export *
- }
- module initializer_list {
- header "initializer_list"
- export *
- }
- module iomanip {
- header "iomanip"
- export *
- }
- module ios {
- header "ios"
- export iosfwd
- export *
- }
- module iosfwd {
- header "iosfwd"
- export *
- }
- module iostream {
- header "iostream"
- export ios
- export streambuf
- export istream
- export ostream
- export *
- }
- module istream {
- header "istream"
- // FIXME: should re-export ios, streambuf?
- export *
- }
- module iterator {
- header "iterator"
- export *
- }
- module limits {
- header "limits"
- export *
- }
- module list {
- header "list"
- export initializer_list
- export *
- }
- module locale {
- header "locale"
- export *
- }
- module map {
- header "map"
- export initializer_list
- export *
- }
- module memory {
- header "memory"
- export *
- }
- module mutex {
- header "mutex"
- export *
- }
- module new {
- header "new"
- export *
- }
- module numeric {
- header "numeric"
- export *
- }
- module optional {
- header "optional"
- export *
- }
- module ostream {
- header "ostream"
- // FIXME: should re-export ios, streambuf?
- export *
- }
- module queue {
- header "queue"
- export initializer_list
- export *
- }
- module random {
- header "random"
- export initializer_list
- export *
- }
- module ratio {
- header "ratio"
- export *
- }
- module regex {
- header "regex"
- export initializer_list
- export *
- }
- module scoped_allocator {
- header "scoped_allocator"
- export *
- }
- module set {
- header "set"
- export initializer_list
- export *
- }
- module sstream {
- header "sstream"
- // FIXME: should re-export istream, ostream, ios, streambuf, string?
- export *
- }
- module stack {
- header "stack"
- export initializer_list
- export *
- }
- module stdexcept {
- header "stdexcept"
- export *
- }
- module streambuf {
- header "streambuf"
- export *
- }
- module string {
- header "string"
- export initializer_list
- export string_view
- export __string
- export *
- }
- module string_view {
- header "string_view"
- export initializer_list
- export __string
- export *
- }
- module strstream {
- header "strstream"
- export *
- }
- module system_error {
- header "system_error"
- export *
- }
- module thread {
- header "thread"
- export *
- }
- module tuple {
- header "tuple"
- export *
- }
- module type_traits {
- header "type_traits"
- export *
- }
- module typeindex {
- header "typeindex"
- export *
- }
- module typeinfo {
- header "typeinfo"
- export *
- }
- module unordered_map {
- header "unordered_map"
- export initializer_list
- export *
- }
- module unordered_set {
- header "unordered_set"
- export initializer_list
- export *
- }
- module utility {
- header "utility"
- export initializer_list
- export *
- }
- module valarray {
- header "valarray"
- export initializer_list
- export *
- }
- module variant {
- header "variant"
- export *
- }
- module vector {
- header "vector"
- export initializer_list
- export *
- }
- module version {
- header "version"
- export *
- }
-
- // FIXME: These should be private.
- module __bit_reference { header "__bit_reference" export * }
- module __debug { header "__debug" export * }
- module __errc { header "__errc" export * }
- module __functional_base { header "__functional_base" export * }
- module __hash_table { header "__hash_table" export * }
- module __locale { header "__locale" export * }
- module __mutex_base { header "__mutex_base" export * }
- module __split_buffer { header "__split_buffer" export * }
- module __sso_allocator { header "__sso_allocator" export * }
- module __std_stream { header "__std_stream" export * }
- module __string { header "__string" export * }
- module __tree { header "__tree" export * }
- module __tuple { header "__tuple" export * }
- module __undef_macros { header "__undef_macros" export * }
- module __node_handle { header "__node_handle" export * }
-
- module experimental {
- requires cplusplus11
-
- module algorithm {
- header "experimental/algorithm"
- export *
- }
- module coroutine {
- requires coroutines
- header "experimental/coroutine"
- export *
- }
- module deque {
- header "experimental/deque"
- export *
- }
- module filesystem {
- header "experimental/filesystem"
- export *
- }
- module forward_list {
- header "experimental/forward_list"
- export *
- }
- module functional {
- header "experimental/functional"
- export *
- }
- module iterator {
- header "experimental/iterator"
- export *
- }
- module list {
- header "experimental/list"
- export *
- }
- module map {
- header "experimental/map"
- export *
- }
- module memory_resource {
- header "experimental/memory_resource"
- export *
- }
- module propagate_const {
- header "experimental/propagate_const"
- export *
- }
- module regex {
- header "experimental/regex"
- export *
- }
- module simd {
- header "experimental/simd"
- export *
- }
- module set {
- header "experimental/set"
- export *
- }
- module span {
- header "span"
- export *
- }
- module string {
- header "experimental/string"
- export *
- }
- module type_traits {
- header "experimental/type_traits"
- export *
- }
- module unordered_map {
- header "experimental/unordered_map"
- export *
- }
- module unordered_set {
- header "experimental/unordered_set"
- export *
- }
- module utility {
- header "experimental/utility"
- export *
- }
- module vector {
- header "experimental/vector"
- export *
- }
- // FIXME these should be private
- module __memory {
- header "experimental/__memory"
- export *
- }
- } // end experimental
-}
diff --git a/lib/libcxx/include/mutex b/lib/libcxx/include/mutex
deleted file mode 100644
index 6d2de2b460e..00000000000
--- a/lib/libcxx/include/mutex
+++ /dev/null
@@ -1,703 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- mutex ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_MUTEX
-#define _LIBCPP_MUTEX
-
-/*
- mutex synopsis
-
-namespace std
-{
-
-class mutex
-{
-public:
- constexpr mutex() noexcept;
- ~mutex();
-
- mutex(const mutex&) = delete;
- mutex& operator=(const mutex&) = delete;
-
- void lock();
- bool try_lock();
- void unlock();
-
- typedef pthread_mutex_t* native_handle_type;
- native_handle_type native_handle();
-};
-
-class recursive_mutex
-{
-public:
- recursive_mutex();
- ~recursive_mutex();
-
- recursive_mutex(const recursive_mutex&) = delete;
- recursive_mutex& operator=(const recursive_mutex&) = delete;
-
- void lock();
- bool try_lock() noexcept;
- void unlock();
-
- typedef pthread_mutex_t* native_handle_type;
- native_handle_type native_handle();
-};
-
-class timed_mutex
-{
-public:
- timed_mutex();
- ~timed_mutex();
-
- timed_mutex(const timed_mutex&) = delete;
- timed_mutex& operator=(const timed_mutex&) = delete;
-
- void lock();
- bool try_lock();
- template <class Rep, class Period>
- bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
- template <class Clock, class Duration>
- bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
- void unlock();
-};
-
-class recursive_timed_mutex
-{
-public:
- recursive_timed_mutex();
- ~recursive_timed_mutex();
-
- recursive_timed_mutex(const recursive_timed_mutex&) = delete;
- recursive_timed_mutex& operator=(const recursive_timed_mutex&) = delete;
-
- void lock();
- bool try_lock() noexcept;
- template <class Rep, class Period>
- bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
- template <class Clock, class Duration>
- bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
- void unlock();
-};
-
-struct defer_lock_t {};
-struct try_to_lock_t {};
-struct adopt_lock_t {};
-
-inline constexpr defer_lock_t defer_lock{};
-inline constexpr try_to_lock_t try_to_lock{};
-inline constexpr adopt_lock_t adopt_lock{};
-
-template <class Mutex>
-class lock_guard
-{
-public:
- typedef Mutex mutex_type;
-
- explicit lock_guard(mutex_type& m);
- lock_guard(mutex_type& m, adopt_lock_t);
- ~lock_guard();
-
- lock_guard(lock_guard const&) = delete;
- lock_guard& operator=(lock_guard const&) = delete;
-};
-
-template <class... MutexTypes>
-class scoped_lock // C++17
-{
-public:
- using mutex_type = Mutex; // If MutexTypes... consists of the single type Mutex
-
- explicit scoped_lock(MutexTypes&... m);
- scoped_lock(adopt_lock_t, MutexTypes&... m);
- ~scoped_lock();
- scoped_lock(scoped_lock const&) = delete;
- scoped_lock& operator=(scoped_lock const&) = delete;
-private:
- tuple<MutexTypes&...> pm; // exposition only
-};
-
-template <class Mutex>
-class unique_lock
-{
-public:
- typedef Mutex mutex_type;
- unique_lock() noexcept;
- explicit unique_lock(mutex_type& m);
- unique_lock(mutex_type& m, defer_lock_t) noexcept;
- unique_lock(mutex_type& m, try_to_lock_t);
- unique_lock(mutex_type& m, adopt_lock_t);
- template <class Clock, class Duration>
- unique_lock(mutex_type& m, const chrono::time_point<Clock, Duration>& abs_time);
- template <class Rep, class Period>
- unique_lock(mutex_type& m, const chrono::duration<Rep, Period>& rel_time);
- ~unique_lock();
-
- unique_lock(unique_lock const&) = delete;
- unique_lock& operator=(unique_lock const&) = delete;
-
- unique_lock(unique_lock&& u) noexcept;
- unique_lock& operator=(unique_lock&& u) noexcept;
-
- void lock();
- bool try_lock();
-
- template <class Rep, class Period>
- bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
- template <class Clock, class Duration>
- bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
-
- void unlock();
-
- void swap(unique_lock& u) noexcept;
- mutex_type* release() noexcept;
-
- bool owns_lock() const noexcept;
- explicit operator bool () const noexcept;
- mutex_type* mutex() const noexcept;
-};
-
-template <class Mutex>
- void swap(unique_lock<Mutex>& x, unique_lock<Mutex>& y) noexcept;
-
-template <class L1, class L2, class... L3>
- int try_lock(L1&, L2&, L3&...);
-template <class L1, class L2, class... L3>
- void lock(L1&, L2&, L3&...);
-
-struct once_flag
-{
- constexpr once_flag() noexcept;
-
- once_flag(const once_flag&) = delete;
- once_flag& operator=(const once_flag&) = delete;
-};
-
-template<class Callable, class ...Args>
- void call_once(once_flag& flag, Callable&& func, Args&&... args);
-
-} // std
-
-*/
-
-#include <__config>
-#include <__mutex_base>
-#include <functional>
-#include <memory>
-#ifndef _LIBCPP_CXX03_LANG
-#include <tuple>
-#endif
-#include <version>
-#include <__threading_support>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-#ifndef _LIBCPP_HAS_NO_THREADS
-
-class _LIBCPP_TYPE_VIS recursive_mutex
-{
- __libcpp_recursive_mutex_t __m_;
-
-public:
- recursive_mutex();
- ~recursive_mutex();
-
-private:
- recursive_mutex(const recursive_mutex&); // = delete;
- recursive_mutex& operator=(const recursive_mutex&); // = delete;
-
-public:
- void lock();
- bool try_lock() _NOEXCEPT;
- void unlock() _NOEXCEPT;
-
- typedef __libcpp_recursive_mutex_t* native_handle_type;
-
- _LIBCPP_INLINE_VISIBILITY
- native_handle_type native_handle() {return &__m_;}
-};
-
-class _LIBCPP_TYPE_VIS timed_mutex
-{
- mutex __m_;
- condition_variable __cv_;
- bool __locked_;
-public:
- timed_mutex();
- ~timed_mutex();
-
-private:
- timed_mutex(const timed_mutex&); // = delete;
- timed_mutex& operator=(const timed_mutex&); // = delete;
-
-public:
- void lock();
- bool try_lock() _NOEXCEPT;
- template <class _Rep, class _Period>
- _LIBCPP_INLINE_VISIBILITY
- bool try_lock_for(const chrono::duration<_Rep, _Period>& __d)
- {return try_lock_until(chrono::steady_clock::now() + __d);}
- template <class _Clock, class _Duration>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __t);
- void unlock() _NOEXCEPT;
-};
-
-template <class _Clock, class _Duration>
-bool
-timed_mutex::try_lock_until(const chrono::time_point<_Clock, _Duration>& __t)
-{
- using namespace chrono;
- unique_lock<mutex> __lk(__m_);
- bool no_timeout = _Clock::now() < __t;
- while (no_timeout && __locked_)
- no_timeout = __cv_.wait_until(__lk, __t) == cv_status::no_timeout;
- if (!__locked_)
- {
- __locked_ = true;
- return true;
- }
- return false;
-}
-
-class _LIBCPP_TYPE_VIS recursive_timed_mutex
-{
- mutex __m_;
- condition_variable __cv_;
- size_t __count_;
- __libcpp_thread_id __id_;
-public:
- recursive_timed_mutex();
- ~recursive_timed_mutex();
-
-private:
- recursive_timed_mutex(const recursive_timed_mutex&); // = delete;
- recursive_timed_mutex& operator=(const recursive_timed_mutex&); // = delete;
-
-public:
- void lock();
- bool try_lock() _NOEXCEPT;
- template <class _Rep, class _Period>
- _LIBCPP_INLINE_VISIBILITY
- bool try_lock_for(const chrono::duration<_Rep, _Period>& __d)
- {return try_lock_until(chrono::steady_clock::now() + __d);}
- template <class _Clock, class _Duration>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __t);
- void unlock() _NOEXCEPT;
-};
-
-template <class _Clock, class _Duration>
-bool
-recursive_timed_mutex::try_lock_until(const chrono::time_point<_Clock, _Duration>& __t)
-{
- using namespace chrono;
- __libcpp_thread_id __id = __libcpp_thread_get_current_id();
- unique_lock<mutex> lk(__m_);
- if (__libcpp_thread_id_equal(__id, __id_))
- {
- if (__count_ == numeric_limits<size_t>::max())
- return false;
- ++__count_;
- return true;
- }
- bool no_timeout = _Clock::now() < __t;
- while (no_timeout && __count_ != 0)
- no_timeout = __cv_.wait_until(lk, __t) == cv_status::no_timeout;
- if (__count_ == 0)
- {
- __count_ = 1;
- __id_ = __id;
- return true;
- }
- return false;
-}
-
-template <class _L0, class _L1>
-int
-try_lock(_L0& __l0, _L1& __l1)
-{
- unique_lock<_L0> __u0(__l0, try_to_lock);
- if (__u0.owns_lock())
- {
- if (__l1.try_lock())
- {
- __u0.release();
- return -1;
- }
- else
- return 1;
- }
- return 0;
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _L0, class _L1, class _L2, class... _L3>
-int
-try_lock(_L0& __l0, _L1& __l1, _L2& __l2, _L3&... __l3)
-{
- int __r = 0;
- unique_lock<_L0> __u0(__l0, try_to_lock);
- if (__u0.owns_lock())
- {
- __r = try_lock(__l1, __l2, __l3...);
- if (__r == -1)
- __u0.release();
- else
- ++__r;
- }
- return __r;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _L0, class _L1>
-void
-lock(_L0& __l0, _L1& __l1)
-{
- while (true)
- {
- {
- unique_lock<_L0> __u0(__l0);
- if (__l1.try_lock())
- {
- __u0.release();
- break;
- }
- }
- __libcpp_thread_yield();
- {
- unique_lock<_L1> __u1(__l1);
- if (__l0.try_lock())
- {
- __u1.release();
- break;
- }
- }
- __libcpp_thread_yield();
- }
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _L0, class _L1, class _L2, class ..._L3>
-void
-__lock_first(int __i, _L0& __l0, _L1& __l1, _L2& __l2, _L3& ...__l3)
-{
- while (true)
- {
- switch (__i)
- {
- case 0:
- {
- unique_lock<_L0> __u0(__l0);
- __i = try_lock(__l1, __l2, __l3...);
- if (__i == -1)
- {
- __u0.release();
- return;
- }
- }
- ++__i;
- __libcpp_thread_yield();
- break;
- case 1:
- {
- unique_lock<_L1> __u1(__l1);
- __i = try_lock(__l2, __l3..., __l0);
- if (__i == -1)
- {
- __u1.release();
- return;
- }
- }
- if (__i == sizeof...(_L3) + 1)
- __i = 0;
- else
- __i += 2;
- __libcpp_thread_yield();
- break;
- default:
- __lock_first(__i - 2, __l2, __l3..., __l0, __l1);
- return;
- }
- }
-}
-
-template <class _L0, class _L1, class _L2, class ..._L3>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-lock(_L0& __l0, _L1& __l1, _L2& __l2, _L3& ...__l3)
-{
- __lock_first(0, __l0, __l1, __l2, __l3...);
-}
-
-template <class _L0>
-inline _LIBCPP_INLINE_VISIBILITY
-void __unlock(_L0& __l0) {
- __l0.unlock();
-}
-
-template <class _L0, class _L1>
-inline _LIBCPP_INLINE_VISIBILITY
-void __unlock(_L0& __l0, _L1& __l1) {
- __l0.unlock();
- __l1.unlock();
-}
-
-template <class _L0, class _L1, class _L2, class ..._L3>
-inline _LIBCPP_INLINE_VISIBILITY
-void __unlock(_L0& __l0, _L1& __l1, _L2& __l2, _L3&... __l3) {
- __l0.unlock();
- __l1.unlock();
- _VSTD::__unlock(__l2, __l3...);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-#if _LIBCPP_STD_VER > 14
-template <class ..._Mutexes>
-class _LIBCPP_TEMPLATE_VIS scoped_lock;
-
-template <>
-class _LIBCPP_TEMPLATE_VIS scoped_lock<> {
-public:
- explicit scoped_lock() {}
- ~scoped_lock() = default;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit scoped_lock(adopt_lock_t) {}
-
- scoped_lock(scoped_lock const&) = delete;
- scoped_lock& operator=(scoped_lock const&) = delete;
-};
-
-template <class _Mutex>
-class _LIBCPP_TEMPLATE_VIS _LIBCPP_THREAD_SAFETY_ANNOTATION(scoped_lockable) scoped_lock<_Mutex> {
-public:
- typedef _Mutex mutex_type;
-private:
- mutex_type& __m_;
-public:
- explicit scoped_lock(mutex_type & __m) _LIBCPP_THREAD_SAFETY_ANNOTATION(acquire_capability(__m))
- : __m_(__m) {__m_.lock();}
-
- ~scoped_lock() _LIBCPP_THREAD_SAFETY_ANNOTATION(release_capability()) {__m_.unlock();}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit scoped_lock(adopt_lock_t, mutex_type& __m) _LIBCPP_THREAD_SAFETY_ANNOTATION(requires_capability(__m))
- : __m_(__m) {}
-
- scoped_lock(scoped_lock const&) = delete;
- scoped_lock& operator=(scoped_lock const&) = delete;
-};
-
-template <class ..._MArgs>
-class _LIBCPP_TEMPLATE_VIS scoped_lock
-{
- static_assert(sizeof...(_MArgs) > 1, "At least 2 lock types required");
- typedef tuple<_MArgs&...> _MutexTuple;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit scoped_lock(_MArgs&... __margs)
- : __t_(__margs...)
- {
- _VSTD::lock(__margs...);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- scoped_lock(adopt_lock_t, _MArgs&... __margs)
- : __t_(__margs...)
- {
- }
-
- _LIBCPP_INLINE_VISIBILITY
- ~scoped_lock() {
- typedef typename __make_tuple_indices<sizeof...(_MArgs)>::type _Indices;
- __unlock_unpack(_Indices{}, __t_);
- }
-
- scoped_lock(scoped_lock const&) = delete;
- scoped_lock& operator=(scoped_lock const&) = delete;
-
-private:
- template <size_t ..._Indx>
- _LIBCPP_INLINE_VISIBILITY
- static void __unlock_unpack(__tuple_indices<_Indx...>, _MutexTuple& __mt) {
- _VSTD::__unlock(_VSTD::get<_Indx>(__mt)...);
- }
-
- _MutexTuple __t_;
-};
-
-#endif // _LIBCPP_STD_VER > 14
-#endif // !_LIBCPP_HAS_NO_THREADS
-
-struct _LIBCPP_TEMPLATE_VIS once_flag;
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template<class _Callable, class... _Args>
-_LIBCPP_INLINE_VISIBILITY
-void call_once(once_flag&, _Callable&&, _Args&&...);
-
-#else // _LIBCPP_CXX03_LANG
-
-template<class _Callable>
-_LIBCPP_INLINE_VISIBILITY
-void call_once(once_flag&, _Callable&);
-
-template<class _Callable>
-_LIBCPP_INLINE_VISIBILITY
-void call_once(once_flag&, const _Callable&);
-
-#endif // _LIBCPP_CXX03_LANG
-
-struct _LIBCPP_TEMPLATE_VIS once_flag
-{
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR
- once_flag() _NOEXCEPT : __state_(0) {}
-
-private:
- once_flag(const once_flag&); // = delete;
- once_flag& operator=(const once_flag&); // = delete;
-
- unsigned long __state_;
-
-#ifndef _LIBCPP_CXX03_LANG
- template<class _Callable, class... _Args>
- friend
- void call_once(once_flag&, _Callable&&, _Args&&...);
-#else // _LIBCPP_CXX03_LANG
- template<class _Callable>
- friend
- void call_once(once_flag&, _Callable&);
-
- template<class _Callable>
- friend
- void call_once(once_flag&, const _Callable&);
-#endif // _LIBCPP_CXX03_LANG
-};
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Fp>
-class __call_once_param
-{
- _Fp& __f_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __call_once_param(_Fp& __f) : __f_(__f) {}
-
- _LIBCPP_INLINE_VISIBILITY
- void operator()()
- {
- typedef typename __make_tuple_indices<tuple_size<_Fp>::value, 1>::type _Index;
- __execute(_Index());
- }
-
-private:
- template <size_t ..._Indices>
- _LIBCPP_INLINE_VISIBILITY
- void __execute(__tuple_indices<_Indices...>)
- {
- __invoke(_VSTD::get<0>(_VSTD::move(__f_)), _VSTD::get<_Indices>(_VSTD::move(__f_))...);
- }
-};
-
-#else
-
-template <class _Fp>
-class __call_once_param
-{
- _Fp& __f_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __call_once_param(_Fp& __f) : __f_(__f) {}
-
- _LIBCPP_INLINE_VISIBILITY
- void operator()()
- {
- __f_();
- }
-};
-
-#endif
-
-template <class _Fp>
-void
-__call_once_proxy(void* __vp)
-{
- __call_once_param<_Fp>* __p = static_cast<__call_once_param<_Fp>*>(__vp);
- (*__p)();
-}
-
-_LIBCPP_FUNC_VIS void __call_once(volatile unsigned long&, void*, void(*)(void*));
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template<class _Callable, class... _Args>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-call_once(once_flag& __flag, _Callable&& __func, _Args&&... __args)
-{
- if (__libcpp_acquire_load(&__flag.__state_) != ~0ul)
- {
- typedef tuple<_Callable&&, _Args&&...> _Gp;
- _Gp __f(_VSTD::forward<_Callable>(__func), _VSTD::forward<_Args>(__args)...);
- __call_once_param<_Gp> __p(__f);
- __call_once(__flag.__state_, &__p, &__call_once_proxy<_Gp>);
- }
-}
-
-#else // _LIBCPP_CXX03_LANG
-
-template<class _Callable>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-call_once(once_flag& __flag, _Callable& __func)
-{
- if (__libcpp_acquire_load(&__flag.__state_) != ~0ul)
- {
- __call_once_param<_Callable> __p(__func);
- __call_once(__flag.__state_, &__p, &__call_once_proxy<_Callable>);
- }
-}
-
-template<class _Callable>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-call_once(once_flag& __flag, const _Callable& __func)
-{
- if (__libcpp_acquire_load(&__flag.__state_) != ~0ul)
- {
- __call_once_param<const _Callable> __p(__func);
- __call_once(__flag.__state_, &__p, &__call_once_proxy<const _Callable>);
- }
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_MUTEX
diff --git a/lib/libcxx/include/new b/lib/libcxx/include/new
deleted file mode 100644
index 24ffcad5a6b..00000000000
--- a/lib/libcxx/include/new
+++ /dev/null
@@ -1,358 +0,0 @@
-// -*- C++ -*-
-//===----------------------------- new ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_NEW
-#define _LIBCPP_NEW
-
-/*
- new synopsis
-
-namespace std
-{
-
-class bad_alloc
- : public exception
-{
-public:
- bad_alloc() noexcept;
- bad_alloc(const bad_alloc&) noexcept;
- bad_alloc& operator=(const bad_alloc&) noexcept;
- virtual const char* what() const noexcept;
-};
-
-class bad_array_new_length : public bad_alloc // C++14
-{
-public:
- bad_array_new_length() noexcept;
-};
-
-enum class align_val_t : size_t {}; // C++17
-struct nothrow_t {};
-extern const nothrow_t nothrow;
-typedef void (*new_handler)();
-new_handler set_new_handler(new_handler new_p) noexcept;
-new_handler get_new_handler() noexcept;
-
-// 21.6.4, pointer optimization barrier
-template <class T> constexpr T* launder(T* p) noexcept; // C++17
-} // std
-
-void* operator new(std::size_t size); // replaceable, nodiscard in C++2a
-void* operator new(std::size_t size, std::align_val_t alignment); // replaceable, C++17, nodiscard in C++2a
-void* operator new(std::size_t size, const std::nothrow_t&) noexcept; // replaceable, nodiscard in C++2a
-void* operator new(std::size_t size, std::align_val_t alignment,
- const std::nothrow_t&) noexcept; // replaceable, C++17, nodiscard in C++2a
-void operator delete(void* ptr) noexcept; // replaceable
-void operator delete(void* ptr, std::size_t size) noexcept; // replaceable, C++14
-void operator delete(void* ptr, std::align_val_t alignment) noexcept; // replaceable, C++17
-void operator delete(void* ptr, std::size_t size,
- std::align_val_t alignment) noexcept; // replaceable, C++17
-void operator delete(void* ptr, const std::nothrow_t&) noexcept; // replaceable
-void operator delete(void* ptr, std:align_val_t alignment,
- const std::nothrow_t&) noexcept; // replaceable, C++17
-
-void* operator new[](std::size_t size); // replaceable, nodiscard in C++2a
-void* operator new[](std::size_t size,
- std::align_val_t alignment) noexcept; // replaceable, C++17, nodiscard in C++2a
-void* operator new[](std::size_t size, const std::nothrow_t&) noexcept; // replaceable, nodiscard in C++2a
-void* operator new[](std::size_t size, std::align_val_t alignment,
- const std::nothrow_t&) noexcept; // replaceable, C++17, nodiscard in C++2a
-void operator delete[](void* ptr) noexcept; // replaceable
-void operator delete[](void* ptr, std::size_t size) noexcept; // replaceable, C++14
-void operator delete[](void* ptr,
- std::align_val_t alignment) noexcept; // replaceable, C++17
-void operator delete[](void* ptr, std::size_t size,
- std::align_val_t alignment) noexcept; // replaceable, C++17
-void operator delete[](void* ptr, const std::nothrow_t&) noexcept; // replaceable
-void operator delete[](void* ptr, std::align_val_t alignment,
- const std::nothrow_t&) noexcept; // replaceable, C++17
-
-void* operator new (std::size_t size, void* ptr) noexcept; // nodiscard in C++2a
-void* operator new[](std::size_t size, void* ptr) noexcept; // nodiscard in C++2a
-void operator delete (void* ptr, void*) noexcept;
-void operator delete[](void* ptr, void*) noexcept;
-
-*/
-
-#include <__config>
-#include <exception>
-#include <type_traits>
-#include <cstddef>
-#include <version>
-#ifdef _LIBCPP_NO_EXCEPTIONS
-#include <cstdlib>
-#endif
-
-#if defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_NO_VCRUNTIME)
-#include <new.h>
-#endif
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#if !defined(__cpp_sized_deallocation) || __cpp_sized_deallocation < 201309L
-#define _LIBCPP_HAS_NO_LANGUAGE_SIZED_DEALLOCATION
-#endif
-
-#if !defined(_LIBCPP_BUILDING_LIBRARY) && _LIBCPP_STD_VER < 14 && \
- defined(_LIBCPP_HAS_NO_LANGUAGE_SIZED_DEALLOCATION)
-# define _LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION
-#endif
-
-#if defined(_LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION) || \
- defined(_LIBCPP_HAS_NO_LANGUAGE_SIZED_DEALLOCATION)
-# define _LIBCPP_HAS_NO_SIZED_DEALLOCATION
-#endif
-
-#if !__has_builtin(__builtin_operator_new) || \
- __has_builtin(__builtin_operator_new) < 201802L
-#define _LIBCPP_HAS_NO_BUILTIN_OVERLOADED_OPERATOR_NEW_DELETE
-#endif
-
-namespace std // purposefully not using versioning namespace
-{
-
-#if !defined(_LIBCPP_ABI_MICROSOFT) || defined(_LIBCPP_NO_VCRUNTIME)
-struct _LIBCPP_TYPE_VIS nothrow_t {};
-extern _LIBCPP_FUNC_VIS const nothrow_t nothrow;
-
-class _LIBCPP_EXCEPTION_ABI bad_alloc
- : public exception
-{
-public:
- bad_alloc() _NOEXCEPT;
- virtual ~bad_alloc() _NOEXCEPT;
- virtual const char* what() const _NOEXCEPT;
-};
-
-class _LIBCPP_EXCEPTION_ABI bad_array_new_length
- : public bad_alloc
-{
-public:
- bad_array_new_length() _NOEXCEPT;
- virtual ~bad_array_new_length() _NOEXCEPT;
- virtual const char* what() const _NOEXCEPT;
-};
-
-typedef void (*new_handler)();
-_LIBCPP_FUNC_VIS new_handler set_new_handler(new_handler) _NOEXCEPT;
-_LIBCPP_FUNC_VIS new_handler get_new_handler() _NOEXCEPT;
-
-#endif // !_LIBCPP_ABI_MICROSOFT || _LIBCPP_NO_VCRUNTIME
-
-_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_bad_alloc(); // not in C++ spec
-
-#if !defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) && \
- !defined(_LIBCPP_DEFER_NEW_TO_VCRUNTIME)
-#ifndef _LIBCPP_CXX03_LANG
-enum class _LIBCPP_ENUM_VIS align_val_t : size_t { };
-#else
-enum align_val_t { __zero = 0, __max = (size_t)-1 };
-#endif
-#endif
-
-} // std
-
-#if defined(_LIBCPP_CXX03_LANG)
-#define _THROW_BAD_ALLOC throw(std::bad_alloc)
-#else
-#define _THROW_BAD_ALLOC
-#endif
-
-#if !defined(_LIBCPP_DEFER_NEW_TO_VCRUNTIME)
-
-_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz) _THROW_BAD_ALLOC;
-_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
-_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p) _NOEXCEPT;
-_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p, const std::nothrow_t&) _NOEXCEPT;
-#ifndef _LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION
-_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE void operator delete(void* __p, std::size_t __sz) _NOEXCEPT;
-#endif
-
-_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz) _THROW_BAD_ALLOC;
-_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
-_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p) _NOEXCEPT;
-_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p, const std::nothrow_t&) _NOEXCEPT;
-#ifndef _LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION
-_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE void operator delete[](void* __p, std::size_t __sz) _NOEXCEPT;
-#endif
-
-#ifndef _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
-_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, std::align_val_t) _THROW_BAD_ALLOC;
-_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, std::align_val_t, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
-_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p, std::align_val_t) _NOEXCEPT;
-_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p, std::align_val_t, const std::nothrow_t&) _NOEXCEPT;
-#ifndef _LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION
-_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE void operator delete(void* __p, std::size_t __sz, std::align_val_t) _NOEXCEPT;
-#endif
-
-_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz, std::align_val_t) _THROW_BAD_ALLOC;
-_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz, std::align_val_t, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
-_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p, std::align_val_t) _NOEXCEPT;
-_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p, std::align_val_t, const std::nothrow_t&) _NOEXCEPT;
-#ifndef _LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION
-_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE void operator delete[](void* __p, std::size_t __sz, std::align_val_t) _NOEXCEPT;
-#endif
-#endif
-
-_LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY void* operator new (std::size_t, void* __p) _NOEXCEPT {return __p;}
-_LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY void* operator new[](std::size_t, void* __p) _NOEXCEPT {return __p;}
-inline _LIBCPP_INLINE_VISIBILITY void operator delete (void*, void*) _NOEXCEPT {}
-inline _LIBCPP_INLINE_VISIBILITY void operator delete[](void*, void*) _NOEXCEPT {}
-
-#endif // !_LIBCPP_DEFER_NEW_TO_VCRUNTIME
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-_LIBCPP_CONSTEXPR inline _LIBCPP_INLINE_VISIBILITY bool __is_overaligned_for_new(size_t __align) _NOEXCEPT {
-#ifdef __STDCPP_DEFAULT_NEW_ALIGNMENT__
- return __align > __STDCPP_DEFAULT_NEW_ALIGNMENT__;
-#else
- return __align > alignment_of<max_align_t>::value;
-#endif
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void *__libcpp_allocate(size_t __size, size_t __align) {
-#ifndef _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
- if (__is_overaligned_for_new(__align)) {
- const align_val_t __align_val = static_cast<align_val_t>(__align);
-# ifdef _LIBCPP_HAS_NO_BUILTIN_OVERLOADED_OPERATOR_NEW_DELETE
- return ::operator new(__size, __align_val);
-# else
- return __builtin_operator_new(__size, __align_val);
-# endif
- }
-#else
- ((void)__align);
-#endif
-#ifdef _LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE
- return ::operator new(__size);
-#else
- return __builtin_operator_new(__size);
-#endif
-}
-
-struct _DeallocateCaller {
- static inline _LIBCPP_INLINE_VISIBILITY
- void __do_deallocate_handle_size_align(void *__ptr, size_t __size, size_t __align) {
-#if defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION)
- ((void)__align);
- return __do_deallocate_handle_size(__ptr, __size);
-#else
- if (__is_overaligned_for_new(__align)) {
- const align_val_t __align_val = static_cast<align_val_t>(__align);
- return __do_deallocate_handle_size(__ptr, __size, __align_val);
- } else {
- return __do_deallocate_handle_size(__ptr, __size);
- }
-#endif
- }
-
- static inline _LIBCPP_INLINE_VISIBILITY
- void __do_deallocate_handle_align(void *__ptr, size_t __align) {
-#if defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION)
- ((void)__align);
- return __do_call(__ptr);
-#else
- if (__is_overaligned_for_new(__align)) {
- const align_val_t __align_val = static_cast<align_val_t>(__align);
- return __do_call(__ptr, __align_val);
- } else {
- return __do_call(__ptr);
- }
-#endif
- }
-
- private:
- static inline void __do_deallocate_handle_size(void *__ptr, size_t __size) {
-#ifdef _LIBCPP_HAS_NO_SIZED_DEALLOCATION
- ((void)__size);
- return __do_call(__ptr);
-#else
- return __do_call(__ptr, __size);
-#endif
- }
-
-#ifndef _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
- static inline void __do_deallocate_handle_size(void *__ptr, size_t __size, align_val_t __align) {
-#ifdef _LIBCPP_HAS_NO_SIZED_DEALLOCATION
- ((void)__size);
- return __do_call(__ptr, __align);
-#else
- return __do_call(__ptr, __size, __align);
-#endif
- }
-#endif
-
-private:
- template <class _A1, class _A2>
- static inline void __do_call(void *__ptr, _A1 __a1, _A2 __a2) {
-#if defined(_LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE) || \
- defined(_LIBCPP_HAS_NO_BUILTIN_OVERLOADED_OPERATOR_NEW_DELETE)
- return ::operator delete(__ptr, __a1, __a2);
-#else
- return __builtin_operator_delete(__ptr, __a1, __a2);
-#endif
- }
-
- template <class _A1>
- static inline void __do_call(void *__ptr, _A1 __a1) {
-#if defined(_LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE) || \
- defined(_LIBCPP_HAS_NO_BUILTIN_OVERLOADED_OPERATOR_NEW_DELETE)
- return ::operator delete(__ptr, __a1);
-#else
- return __builtin_operator_delete(__ptr, __a1);
-#endif
- }
-
- static inline void __do_call(void *__ptr) {
-#ifdef _LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE
- return ::operator delete(__ptr);
-#else
- return __builtin_operator_delete(__ptr);
-#endif
- }
-};
-
-inline _LIBCPP_INLINE_VISIBILITY void __libcpp_deallocate(void* __ptr, size_t __size, size_t __align) {
- _DeallocateCaller::__do_deallocate_handle_size_align(__ptr, __size, __align);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY void __libcpp_deallocate_unsized(void* __ptr, size_t __align) {
- _DeallocateCaller::__do_deallocate_handle_align(__ptr, __align);
-}
-
-template <class _Tp>
-_LIBCPP_NODISCARD_AFTER_CXX17 inline
-_LIBCPP_CONSTEXPR _Tp* __launder(_Tp* __p) _NOEXCEPT
-{
- static_assert (!(is_function<_Tp>::value), "can't launder functions" );
- static_assert (!(is_same<void, typename remove_cv<_Tp>::type>::value), "can't launder cv-void" );
-#ifdef _LIBCPP_COMPILER_HAS_BUILTIN_LAUNDER
- return __builtin_launder(__p);
-#else
- return __p;
-#endif
-}
-
-
-#if _LIBCPP_STD_VER > 14
-template <class _Tp>
-_LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY
-constexpr _Tp* launder(_Tp* __p) noexcept
-{
- return _VSTD::__launder(__p);
-}
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_NEW
diff --git a/lib/libcxx/include/numeric b/lib/libcxx/include/numeric
deleted file mode 100644
index 4e68239d059..00000000000
--- a/lib/libcxx/include/numeric
+++ /dev/null
@@ -1,527 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- numeric ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_NUMERIC
-#define _LIBCPP_NUMERIC
-
-/*
- numeric synopsis
-
-namespace std
-{
-
-template <class InputIterator, class T>
- T
- accumulate(InputIterator first, InputIterator last, T init);
-
-template <class InputIterator, class T, class BinaryOperation>
- T
- accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op);
-
-template<class InputIterator>
- typename iterator_traits<InputIterator>::value_type
- reduce(InputIterator first, InputIterator last); // C++17
-
-template<class InputIterator, class T>
- T
- reduce(InputIterator first, InputIterator last, T init); // C++17
-
-template<class InputIterator, class T, class BinaryOperation>
- T
- reduce(InputIterator first, InputIterator last, T init, BinaryOperation binary_op); // C++17
-
-template <class InputIterator1, class InputIterator2, class T>
- T
- inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init);
-
-template <class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2>
- T
- inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
- T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2);
-
-
-template<class InputIterator1, class InputIterator2, class T>
- T
- transform_reduce(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, T init); // C++17
-
-template<class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2>
- T
- transform_reduce(InputIterator1 first1, InputIterator1 last1,
- InputIterator2 first2, T init,
- BinaryOperation1 binary_op1, BinaryOperation2 binary_op2); // C++17
-
-template<class InputIterator, class T, class BinaryOperation, class UnaryOperation>
- T
- transform_reduce(InputIterator first, InputIterator last, T init,
- BinaryOperation binary_op, UnaryOperation unary_op); // C++17
-
-template <class InputIterator, class OutputIterator>
- OutputIterator
- partial_sum(InputIterator first, InputIterator last, OutputIterator result);
-
-template <class InputIterator, class OutputIterator, class BinaryOperation>
- OutputIterator
- partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op);
-
-template<class InputIterator, class OutputIterator, class T>
- OutputIterator
- exclusive_scan(InputIterator first, InputIterator last,
- OutputIterator result, T init); // C++17
-
-template<class InputIterator, class OutputIterator, class T, class BinaryOperation>
- OutputIterator
- exclusive_scan(InputIterator first, InputIterator last,
- OutputIterator result, T init, BinaryOperation binary_op); // C++17
-
-template<class InputIterator, class OutputIterator>
- OutputIterator
- inclusive_scan(InputIterator first, InputIterator last, OutputIterator result); // C++17
-
-template<class InputIterator, class OutputIterator, class BinaryOperation>
- OutputIterator
- inclusive_scan(InputIterator first, InputIterator last,
- OutputIterator result, BinaryOperation binary_op); // C++17
-
-template<class InputIterator, class OutputIterator, class BinaryOperation, class T>
- OutputIterator
- inclusive_scan(InputIterator first, InputIterator last,
- OutputIterator result, BinaryOperation binary_op, T init); // C++17
-
-template<class InputIterator, class OutputIterator, class T,
- class BinaryOperation, class UnaryOperation>
- OutputIterator
- transform_exclusive_scan(InputIterator first, InputIterator last,
- OutputIterator result, T init,
- BinaryOperation binary_op, UnaryOperation unary_op); // C++17
-
-template<class InputIterator, class OutputIterator,
- class BinaryOperation, class UnaryOperation>
- OutputIterator
- transform_inclusive_scan(InputIterator first, InputIterator last,
- OutputIterator result,
- BinaryOperation binary_op, UnaryOperation unary_op); // C++17
-
-template<class InputIterator, class OutputIterator,
- class BinaryOperation, class UnaryOperation, class T>
- OutputIterator
- transform_inclusive_scan(InputIterator first, InputIterator last,
- OutputIterator result,
- BinaryOperation binary_op, UnaryOperation unary_op,
- T init); // C++17
-
-template <class InputIterator, class OutputIterator>
- OutputIterator
- adjacent_difference(InputIterator first, InputIterator last, OutputIterator result);
-
-template <class InputIterator, class OutputIterator, class BinaryOperation>
- OutputIterator
- adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op);
-
-template <class ForwardIterator, class T>
- void iota(ForwardIterator first, ForwardIterator last, T value);
-
-template <class M, class N>
- constexpr common_type_t<M,N> gcd(M m, N n); // C++17
-
-template <class M, class N>
- constexpr common_type_t<M,N> lcm(M m, N n); // C++17
-
-} // std
-
-*/
-
-#include <__config>
-#include <iterator>
-#include <limits> // for numeric_limits
-#include <functional>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _InputIterator, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-accumulate(_InputIterator __first, _InputIterator __last, _Tp __init)
-{
- for (; __first != __last; ++__first)
- __init = __init + *__first;
- return __init;
-}
-
-template <class _InputIterator, class _Tp, class _BinaryOperation>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-accumulate(_InputIterator __first, _InputIterator __last, _Tp __init, _BinaryOperation __binary_op)
-{
- for (; __first != __last; ++__first)
- __init = __binary_op(__init, *__first);
- return __init;
-}
-
-#if _LIBCPP_STD_VER > 14
-template <class _InputIterator, class _Tp, class _BinaryOp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-reduce(_InputIterator __first, _InputIterator __last, _Tp __init, _BinaryOp __b)
-{
- for (; __first != __last; ++__first)
- __init = __b(__init, *__first);
- return __init;
-}
-
-template <class _InputIterator, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-reduce(_InputIterator __first, _InputIterator __last, _Tp __init)
-{
- return _VSTD::reduce(__first, __last, __init, _VSTD::plus<>());
-}
-
-template <class _InputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-typename iterator_traits<_InputIterator>::value_type
-reduce(_InputIterator __first, _InputIterator __last)
-{
- return _VSTD::reduce(__first, __last,
- typename iterator_traits<_InputIterator>::value_type{});
-}
-#endif
-
-template <class _InputIterator1, class _InputIterator2, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _Tp __init)
-{
- for (; __first1 != __last1; ++__first1, (void) ++__first2)
- __init = __init + *__first1 * *__first2;
- return __init;
-}
-
-template <class _InputIterator1, class _InputIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
- _Tp __init, _BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2)
-{
- for (; __first1 != __last1; ++__first1, (void) ++__first2)
- __init = __binary_op1(__init, __binary_op2(*__first1, *__first2));
- return __init;
-}
-
-#if _LIBCPP_STD_VER > 14
-template <class _InputIterator, class _Tp, class _BinaryOp, class _UnaryOp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-transform_reduce(_InputIterator __first, _InputIterator __last,
- _Tp __init, _BinaryOp __b, _UnaryOp __u)
-{
- for (; __first != __last; ++__first)
- __init = __b(__init, __u(*__first));
- return __init;
-}
-
-template <class _InputIterator1, class _InputIterator2,
- class _Tp, class _BinaryOp1, class _BinaryOp2>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-transform_reduce(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _Tp __init, _BinaryOp1 __b1, _BinaryOp2 __b2)
-{
- for (; __first1 != __last1; ++__first1, (void) ++__first2)
- __init = __b1(__init, __b2(*__first1, *__first2));
- return __init;
-}
-
-template <class _InputIterator1, class _InputIterator2, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp
-transform_reduce(_InputIterator1 __first1, _InputIterator1 __last1,
- _InputIterator2 __first2, _Tp __init)
-{
- return _VSTD::transform_reduce(__first1, __last1, __first2, _VSTD::move(__init),
- _VSTD::plus<>(), _VSTD::multiplies<>());
-}
-#endif
-
-template <class _InputIterator, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
-{
- if (__first != __last)
- {
- typename iterator_traits<_InputIterator>::value_type __t(*__first);
- *__result = __t;
- for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
- {
- __t = __t + *__first;
- *__result = __t;
- }
- }
- return __result;
-}
-
-template <class _InputIterator, class _OutputIterator, class _BinaryOperation>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
- _BinaryOperation __binary_op)
-{
- if (__first != __last)
- {
- typename iterator_traits<_InputIterator>::value_type __t(*__first);
- *__result = __t;
- for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
- {
- __t = __binary_op(__t, *__first);
- *__result = __t;
- }
- }
- return __result;
-}
-
-#if _LIBCPP_STD_VER > 14
-template <class _InputIterator, class _OutputIterator, class _Tp, class _BinaryOp>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-exclusive_scan(_InputIterator __first, _InputIterator __last,
- _OutputIterator __result, _Tp __init, _BinaryOp __b)
-{
- if (__first != __last)
- {
- _Tp __saved = __init;
- do
- {
- __init = __b(__init, *__first);
- *__result = __saved;
- __saved = __init;
- ++__result;
- } while (++__first != __last);
- }
- return __result;
-}
-
-template <class _InputIterator, class _OutputIterator, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-exclusive_scan(_InputIterator __first, _InputIterator __last,
- _OutputIterator __result, _Tp __init)
-{
- return _VSTD::exclusive_scan(__first, __last, __result, __init, _VSTD::plus<>());
-}
-
-template <class _InputIterator, class _OutputIterator, class _Tp, class _BinaryOp>
-_OutputIterator inclusive_scan(_InputIterator __first, _InputIterator __last,
- _OutputIterator __result, _BinaryOp __b, _Tp __init)
-{
- for (; __first != __last; ++__first, (void) ++__result) {
- __init = __b(__init, *__first);
- *__result = __init;
- }
- return __result;
-}
-
-template <class _InputIterator, class _OutputIterator, class _BinaryOp>
-_OutputIterator inclusive_scan(_InputIterator __first, _InputIterator __last,
- _OutputIterator __result, _BinaryOp __b)
-{
- if (__first != __last) {
- typename std::iterator_traits<_InputIterator>::value_type __init = *__first;
- *__result++ = __init;
- if (++__first != __last)
- return _VSTD::inclusive_scan(__first, __last, __result, __b, __init);
- }
-
- return __result;
-}
-
-template <class _InputIterator, class _OutputIterator>
-_OutputIterator inclusive_scan(_InputIterator __first, _InputIterator __last,
- _OutputIterator __result)
-{
- return _VSTD::inclusive_scan(__first, __last, __result, std::plus<>());
-}
-
-template <class _InputIterator, class _OutputIterator, class _Tp,
- class _BinaryOp, class _UnaryOp>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-transform_exclusive_scan(_InputIterator __first, _InputIterator __last,
- _OutputIterator __result, _Tp __init,
- _BinaryOp __b, _UnaryOp __u)
-{
- if (__first != __last)
- {
- _Tp __saved = __init;
- do
- {
- __init = __b(__init, __u(*__first));
- *__result = __saved;
- __saved = __init;
- ++__result;
- } while (++__first != __last);
- }
- return __result;
-}
-
-template <class _InputIterator, class _OutputIterator, class _Tp, class _BinaryOp, class _UnaryOp>
-_OutputIterator transform_inclusive_scan(_InputIterator __first, _InputIterator __last,
- _OutputIterator __result, _BinaryOp __b, _UnaryOp __u, _Tp __init)
-{
- for (; __first != __last; ++__first, (void) ++__result) {
- __init = __b(__init, __u(*__first));
- *__result = __init;
- }
-
- return __result;
-}
-
-template <class _InputIterator, class _OutputIterator, class _BinaryOp, class _UnaryOp>
-_OutputIterator transform_inclusive_scan(_InputIterator __first, _InputIterator __last,
- _OutputIterator __result, _BinaryOp __b, _UnaryOp __u)
-{
- if (__first != __last) {
- typename std::iterator_traits<_InputIterator>::value_type __init = __u(*__first);
- *__result++ = __init;
- if (++__first != __last)
- return _VSTD::transform_inclusive_scan(__first, __last, __result, __b, __u, __init);
- }
-
- return __result;
-}
-#endif
-
-template <class _InputIterator, class _OutputIterator>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
-{
- if (__first != __last)
- {
- typename iterator_traits<_InputIterator>::value_type __t1(*__first);
- *__result = __t1;
- for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
- {
- typename iterator_traits<_InputIterator>::value_type __t2(*__first);
- *__result = __t2 - __t1;
- __t1 = _VSTD::move(__t2);
- }
- }
- return __result;
-}
-
-template <class _InputIterator, class _OutputIterator, class _BinaryOperation>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
- _BinaryOperation __binary_op)
-{
- if (__first != __last)
- {
- typename iterator_traits<_InputIterator>::value_type __t1(*__first);
- *__result = __t1;
- for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
- {
- typename iterator_traits<_InputIterator>::value_type __t2(*__first);
- *__result = __binary_op(__t2, __t1);
- __t1 = _VSTD::move(__t2);
- }
- }
- return __result;
-}
-
-template <class _ForwardIterator, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value_)
-{
- for (; __first != __last; ++__first, (void) ++__value_)
- *__first = __value_;
-}
-
-
-#if _LIBCPP_STD_VER > 14
-template <typename _Result, typename _Source, bool _IsSigned = is_signed<_Source>::value> struct __abs;
-
-template <typename _Result, typename _Source>
-struct __abs<_Result, _Source, true> {
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- _Result operator()(_Source __t) const noexcept
- {
- if (__t >= 0) return __t;
- if (__t == numeric_limits<_Source>::min()) return -static_cast<_Result>(__t);
- return -__t;
- }
-};
-
-template <typename _Result, typename _Source>
-struct __abs<_Result, _Source, false> {
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- _Result operator()(_Source __t) const noexcept { return __t; }
-};
-
-
-template<class _Tp>
-_LIBCPP_CONSTEXPR _LIBCPP_HIDDEN
-_Tp __gcd(_Tp __m, _Tp __n)
-{
- static_assert((!is_signed<_Tp>::value), "");
- return __n == 0 ? __m : _VSTD::__gcd<_Tp>(__n, __m % __n);
-}
-
-
-template<class _Tp, class _Up>
-_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-common_type_t<_Tp,_Up>
-gcd(_Tp __m, _Up __n)
-{
- static_assert((is_integral<_Tp>::value && is_integral<_Up>::value), "Arguments to gcd must be integer types");
- static_assert((!is_same<typename remove_cv<_Tp>::type, bool>::value), "First argument to gcd cannot be bool" );
- static_assert((!is_same<typename remove_cv<_Up>::type, bool>::value), "Second argument to gcd cannot be bool" );
- using _Rp = common_type_t<_Tp,_Up>;
- using _Wp = make_unsigned_t<_Rp>;
- return static_cast<_Rp>(_VSTD::__gcd(
- static_cast<_Wp>(__abs<_Rp, _Tp>()(__m)),
- static_cast<_Wp>(__abs<_Rp, _Up>()(__n))));
-}
-
-template<class _Tp, class _Up>
-_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-common_type_t<_Tp,_Up>
-lcm(_Tp __m, _Up __n)
-{
- static_assert((is_integral<_Tp>::value && is_integral<_Up>::value), "Arguments to lcm must be integer types");
- static_assert((!is_same<typename remove_cv<_Tp>::type, bool>::value), "First argument to lcm cannot be bool" );
- static_assert((!is_same<typename remove_cv<_Up>::type, bool>::value), "Second argument to lcm cannot be bool" );
- if (__m == 0 || __n == 0)
- return 0;
-
- using _Rp = common_type_t<_Tp,_Up>;
- _Rp __val1 = __abs<_Rp, _Tp>()(__m) / _VSTD::gcd(__m, __n);
- _Rp __val2 = __abs<_Rp, _Up>()(__n);
- _LIBCPP_ASSERT((numeric_limits<_Rp>::max() / __val1 > __val2), "Overflow in lcm");
- return __val1 * __val2;
-}
-
-#endif /* _LIBCPP_STD_VER > 14 */
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_NUMERIC
diff --git a/lib/libcxx/include/optional b/lib/libcxx/include/optional
deleted file mode 100644
index 70422068e28..00000000000
--- a/lib/libcxx/include/optional
+++ /dev/null
@@ -1,1414 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- optional ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_OPTIONAL
-#define _LIBCPP_OPTIONAL
-
-/*
- optional synopsis
-
-// C++1z
-
-namespace std {
- // 23.6.3, optional for object types
- template <class T> class optional;
-
- // 23.6.4, no-value state indicator
- struct nullopt_t{see below };
- inline constexpr nullopt_t nullopt(unspecified );
-
- // 23.6.5, class bad_optional_access
- class bad_optional_access;
-
- // 23.6.6, relational operators
- template <class T, class U>
- constexpr bool operator==(const optional<T>&, const optional<U>&);
- template <class T, class U>
- constexpr bool operator!=(const optional<T>&, const optional<U>&);
- template <class T, class U>
- constexpr bool operator<(const optional<T>&, const optional<U>&);
- template <class T, class U>
- constexpr bool operator>(const optional<T>&, const optional<U>&);
- template <class T, class U>
- constexpr bool operator<=(const optional<T>&, const optional<U>&);
- template <class T, class U>
- constexpr bool operator>=(const optional<T>&, const optional<U>&);
-
- // 23.6.7 comparison with nullopt
- template <class T> constexpr bool operator==(const optional<T>&, nullopt_t) noexcept;
- template <class T> constexpr bool operator==(nullopt_t, const optional<T>&) noexcept;
- template <class T> constexpr bool operator!=(const optional<T>&, nullopt_t) noexcept;
- template <class T> constexpr bool operator!=(nullopt_t, const optional<T>&) noexcept;
- template <class T> constexpr bool operator<(const optional<T>&, nullopt_t) noexcept;
- template <class T> constexpr bool operator<(nullopt_t, const optional<T>&) noexcept;
- template <class T> constexpr bool operator<=(const optional<T>&, nullopt_t) noexcept;
- template <class T> constexpr bool operator<=(nullopt_t, const optional<T>&) noexcept;
- template <class T> constexpr bool operator>(const optional<T>&, nullopt_t) noexcept;
- template <class T> constexpr bool operator>(nullopt_t, const optional<T>&) noexcept;
- template <class T> constexpr bool operator>=(const optional<T>&, nullopt_t) noexcept;
- template <class T> constexpr bool operator>=(nullopt_t, const optional<T>&) noexcept;
-
- // 23.6.8, comparison with T
- template <class T, class U> constexpr bool operator==(const optional<T>&, const U&);
- template <class T, class U> constexpr bool operator==(const T&, const optional<U>&);
- template <class T, class U> constexpr bool operator!=(const optional<T>&, const U&);
- template <class T, class U> constexpr bool operator!=(const T&, const optional<U>&);
- template <class T, class U> constexpr bool operator<(const optional<T>&, const U&);
- template <class T, class U> constexpr bool operator<(const T&, const optional<U>&);
- template <class T, class U> constexpr bool operator<=(const optional<T>&, const U&);
- template <class T, class U> constexpr bool operator<=(const T&, const optional<U>&);
- template <class T, class U> constexpr bool operator>(const optional<T>&, const U&);
- template <class T, class U> constexpr bool operator>(const T&, const optional<U>&);
- template <class T, class U> constexpr bool operator>=(const optional<T>&, const U&);
- template <class T, class U> constexpr bool operator>=(const T&, const optional<U>&);
-
- // 23.6.9, specialized algorithms
- template <class T> void swap(optional<T>&, optional<T>&) noexcept(see below );
- template <class T> constexpr optional<see below > make_optional(T&&);
- template <class T, class... Args>
- constexpr optional<T> make_optional(Args&&... args);
- template <class T, class U, class... Args>
- constexpr optional<T> make_optional(initializer_list<U> il, Args&&... args);
-
- // 23.6.10, hash support
- template <class T> struct hash;
- template <class T> struct hash<optional<T>>;
-
- template <class T> class optional {
- public:
- using value_type = T;
-
- // 23.6.3.1, constructors
- constexpr optional() noexcept;
- constexpr optional(nullopt_t) noexcept;
- optional(const optional &);
- optional(optional &&) noexcept(see below);
- template <class... Args> constexpr explicit optional(in_place_t, Args &&...);
- template <class U, class... Args>
- constexpr explicit optional(in_place_t, initializer_list<U>, Args &&...);
- template <class U = T>
- constexpr EXPLICIT optional(U &&);
- template <class U>
- constexpr EXPLICIT optional(const optional<U> &);
- template <class U>
- constexpr EXPLICIT optional(optional<U> &&);
-
- // 23.6.3.2, destructor
- ~optional();
-
- // 23.6.3.3, assignment
- optional &operator=(nullopt_t) noexcept;
- optional &operator=(const optional &); // constexpr in C++20
- optional &operator=(optional &&) noexcept(see below); // constexpr in C++20
- template <class U = T> optional &operator=(U &&);
- template <class U> optional &operator=(const optional<U> &);
- template <class U> optional &operator=(optional<U> &&);
- template <class... Args> T& emplace(Args &&...);
- template <class U, class... Args>
- T& emplace(initializer_list<U>, Args &&...);
-
- // 23.6.3.4, swap
- void swap(optional &) noexcept(see below );
-
- // 23.6.3.5, observers
- constexpr T const *operator->() const;
- constexpr T *operator->();
- constexpr T const &operator*() const &;
- constexpr T &operator*() &;
- constexpr T &&operator*() &&;
- constexpr const T &&operator*() const &&;
- constexpr explicit operator bool() const noexcept;
- constexpr bool has_value() const noexcept;
- constexpr T const &value() const &;
- constexpr T &value() &;
- constexpr T &&value() &&;
- constexpr const T &&value() const &&;
- template <class U> constexpr T value_or(U &&) const &;
- template <class U> constexpr T value_or(U &&) &&;
-
- // 23.6.3.6, modifiers
- void reset() noexcept;
-
- private:
- T *val; // exposition only
- };
-
-template<class T>
- optional(T) -> optional<T>;
-
-} // namespace std
-
-*/
-
-#include <__config>
-#include <__debug>
-#include <__functional_base>
-#include <functional>
-#include <initializer_list>
-#include <new>
-#include <stdexcept>
-#include <type_traits>
-#include <utility>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-namespace std // purposefully not using versioning namespace
-{
-
-class _LIBCPP_EXCEPTION_ABI _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS bad_optional_access
- : public exception
-{
-public:
- // Get the key function ~bad_optional_access() into the dylib
- virtual ~bad_optional_access() _NOEXCEPT;
- virtual const char* what() const _NOEXCEPT;
-};
-
-} // std
-
-#if _LIBCPP_STD_VER > 14
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-_LIBCPP_NORETURN
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
-void __throw_bad_optional_access() {
-#ifndef _LIBCPP_NO_EXCEPTIONS
- throw bad_optional_access();
-#else
- _VSTD::abort();
-#endif
-}
-
-struct nullopt_t
-{
- struct __secret_tag { _LIBCPP_INLINE_VISIBILITY explicit __secret_tag() = default; };
- _LIBCPP_INLINE_VISIBILITY constexpr explicit nullopt_t(__secret_tag, __secret_tag) noexcept {}
-};
-
-_LIBCPP_INLINE_VAR constexpr nullopt_t nullopt{nullopt_t::__secret_tag{}, nullopt_t::__secret_tag{}};
-
-template <class _Tp, bool = is_trivially_destructible<_Tp>::value>
-struct __optional_destruct_base;
-
-template <class _Tp>
-struct __optional_destruct_base<_Tp, false>
-{
- typedef _Tp value_type;
- static_assert(is_object_v<value_type>,
- "instantiation of optional with a non-object type is undefined behavior");
- union
- {
- char __null_state_;
- value_type __val_;
- };
- bool __engaged_;
-
- _LIBCPP_INLINE_VISIBILITY
- ~__optional_destruct_base()
- {
- if (__engaged_)
- __val_.~value_type();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr __optional_destruct_base() noexcept
- : __null_state_(),
- __engaged_(false) {}
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- constexpr explicit __optional_destruct_base(in_place_t, _Args&&... __args)
- : __val_(_VSTD::forward<_Args>(__args)...),
- __engaged_(true) {}
-
- _LIBCPP_INLINE_VISIBILITY
- void reset() noexcept
- {
- if (__engaged_)
- {
- __val_.~value_type();
- __engaged_ = false;
- }
- }
-};
-
-template <class _Tp>
-struct __optional_destruct_base<_Tp, true>
-{
- typedef _Tp value_type;
- static_assert(is_object_v<value_type>,
- "instantiation of optional with a non-object type is undefined behavior");
- union
- {
- char __null_state_;
- value_type __val_;
- };
- bool __engaged_;
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr __optional_destruct_base() noexcept
- : __null_state_(),
- __engaged_(false) {}
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- constexpr explicit __optional_destruct_base(in_place_t, _Args&&... __args)
- : __val_(_VSTD::forward<_Args>(__args)...),
- __engaged_(true) {}
-
- _LIBCPP_INLINE_VISIBILITY
- void reset() noexcept
- {
- if (__engaged_)
- {
- __engaged_ = false;
- }
- }
-};
-
-template <class _Tp, bool = is_reference<_Tp>::value>
-struct __optional_storage_base : __optional_destruct_base<_Tp>
-{
- using __base = __optional_destruct_base<_Tp>;
- using value_type = _Tp;
- using __base::__base;
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr bool has_value() const noexcept
- {
- return this->__engaged_;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr value_type& __get() & noexcept
- {
- return this->__val_;
- }
- _LIBCPP_INLINE_VISIBILITY
- constexpr const value_type& __get() const& noexcept
- {
- return this->__val_;
- }
- _LIBCPP_INLINE_VISIBILITY
- constexpr value_type&& __get() && noexcept
- {
- return _VSTD::move(this->__val_);
- }
- _LIBCPP_INLINE_VISIBILITY
- constexpr const value_type&& __get() const&& noexcept
- {
- return _VSTD::move(this->__val_);
- }
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- void __construct(_Args&&... __args)
- {
- _LIBCPP_ASSERT(!has_value(), "__construct called for engaged __optional_storage");
- ::new((void*)_VSTD::addressof(this->__val_)) value_type(_VSTD::forward<_Args>(__args)...);
- this->__engaged_ = true;
- }
-
- template <class _That>
- _LIBCPP_INLINE_VISIBILITY
- void __construct_from(_That&& __opt)
- {
- if (__opt.has_value())
- __construct(_VSTD::forward<_That>(__opt).__get());
- }
-
- template <class _That>
- _LIBCPP_INLINE_VISIBILITY
- void __assign_from(_That&& __opt)
- {
- if (this->__engaged_ == __opt.has_value())
- {
- if (this->__engaged_)
- this->__val_ = _VSTD::forward<_That>(__opt).__get();
- }
- else
- {
- if (this->__engaged_)
- this->reset();
- else
- __construct(_VSTD::forward<_That>(__opt).__get());
- }
- }
-};
-
-// optional<T&> is currently required ill-formed, however it may to be in the
-// future. For this reason it has already been implemented to ensure we can
-// make the change in an ABI compatible manner.
-template <class _Tp>
-struct __optional_storage_base<_Tp, true>
-{
- using value_type = _Tp;
- using __raw_type = remove_reference_t<_Tp>;
- __raw_type* __value_;
-
- template <class _Up>
- static constexpr bool __can_bind_reference() {
- using _RawUp = typename remove_reference<_Up>::type;
- using _UpPtr = _RawUp*;
- using _RawTp = typename remove_reference<_Tp>::type;
- using _TpPtr = _RawTp*;
- using _CheckLValueArg = integral_constant<bool,
- (is_lvalue_reference<_Up>::value && is_convertible<_UpPtr, _TpPtr>::value)
- || is_same<_RawUp, reference_wrapper<_RawTp>>::value
- || is_same<_RawUp, reference_wrapper<typename remove_const<_RawTp>::type>>::value
- >;
- return (is_lvalue_reference<_Tp>::value && _CheckLValueArg::value)
- || (is_rvalue_reference<_Tp>::value && !is_lvalue_reference<_Up>::value &&
- is_convertible<_UpPtr, _TpPtr>::value);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr __optional_storage_base() noexcept
- : __value_(nullptr) {}
-
- template <class _UArg>
- _LIBCPP_INLINE_VISIBILITY
- constexpr explicit __optional_storage_base(in_place_t, _UArg&& __uarg)
- : __value_(_VSTD::addressof(__uarg))
- {
- static_assert(__can_bind_reference<_UArg>(),
- "Attempted to construct a reference element in tuple from a "
- "possible temporary");
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void reset() noexcept { __value_ = nullptr; }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr bool has_value() const noexcept
- { return __value_ != nullptr; }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr value_type& __get() const& noexcept
- { return *__value_; }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr value_type&& __get() const&& noexcept
- { return _VSTD::forward<value_type>(*__value_); }
-
- template <class _UArg>
- _LIBCPP_INLINE_VISIBILITY
- void __construct(_UArg&& __val)
- {
- _LIBCPP_ASSERT(!has_value(), "__construct called for engaged __optional_storage");
- static_assert(__can_bind_reference<_UArg>(),
- "Attempted to construct a reference element in tuple from a "
- "possible temporary");
- __value_ = _VSTD::addressof(__val);
- }
-
- template <class _That>
- _LIBCPP_INLINE_VISIBILITY
- void __construct_from(_That&& __opt)
- {
- if (__opt.has_value())
- __construct(_VSTD::forward<_That>(__opt).__get());
- }
-
- template <class _That>
- _LIBCPP_INLINE_VISIBILITY
- void __assign_from(_That&& __opt)
- {
- if (has_value() == __opt.has_value())
- {
- if (has_value())
- *__value_ = _VSTD::forward<_That>(__opt).__get();
- }
- else
- {
- if (has_value())
- reset();
- else
- __construct(_VSTD::forward<_That>(__opt).__get());
- }
- }
-};
-
-template <class _Tp, bool = is_trivially_copy_constructible<_Tp>::value>
-struct __optional_copy_base : __optional_storage_base<_Tp>
-{
- using __optional_storage_base<_Tp>::__optional_storage_base;
-};
-
-template <class _Tp>
-struct __optional_copy_base<_Tp, false> : __optional_storage_base<_Tp>
-{
- using __optional_storage_base<_Tp>::__optional_storage_base;
-
- _LIBCPP_INLINE_VISIBILITY
- __optional_copy_base() = default;
-
- _LIBCPP_INLINE_VISIBILITY
- __optional_copy_base(const __optional_copy_base& __opt)
- {
- this->__construct_from(__opt);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __optional_copy_base(__optional_copy_base&&) = default;
- _LIBCPP_INLINE_VISIBILITY
- __optional_copy_base& operator=(const __optional_copy_base&) = default;
- _LIBCPP_INLINE_VISIBILITY
- __optional_copy_base& operator=(__optional_copy_base&&) = default;
-};
-
-template <class _Tp, bool = is_trivially_move_constructible<_Tp>::value>
-struct __optional_move_base : __optional_copy_base<_Tp>
-{
- using __optional_copy_base<_Tp>::__optional_copy_base;
-};
-
-template <class _Tp>
-struct __optional_move_base<_Tp, false> : __optional_copy_base<_Tp>
-{
- using value_type = _Tp;
- using __optional_copy_base<_Tp>::__optional_copy_base;
-
- _LIBCPP_INLINE_VISIBILITY
- __optional_move_base() = default;
- _LIBCPP_INLINE_VISIBILITY
- __optional_move_base(const __optional_move_base&) = default;
-
- _LIBCPP_INLINE_VISIBILITY
- __optional_move_base(__optional_move_base&& __opt)
- noexcept(is_nothrow_move_constructible_v<value_type>)
- {
- this->__construct_from(_VSTD::move(__opt));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __optional_move_base& operator=(const __optional_move_base&) = default;
- _LIBCPP_INLINE_VISIBILITY
- __optional_move_base& operator=(__optional_move_base&&) = default;
-};
-
-template <class _Tp, bool =
- is_trivially_destructible<_Tp>::value &&
- is_trivially_copy_constructible<_Tp>::value &&
- is_trivially_copy_assignable<_Tp>::value>
-struct __optional_copy_assign_base : __optional_move_base<_Tp>
-{
- using __optional_move_base<_Tp>::__optional_move_base;
-};
-
-template <class _Tp>
-struct __optional_copy_assign_base<_Tp, false> : __optional_move_base<_Tp>
-{
- using __optional_move_base<_Tp>::__optional_move_base;
-
- _LIBCPP_INLINE_VISIBILITY
- __optional_copy_assign_base() = default;
- _LIBCPP_INLINE_VISIBILITY
- __optional_copy_assign_base(const __optional_copy_assign_base&) = default;
- _LIBCPP_INLINE_VISIBILITY
- __optional_copy_assign_base(__optional_copy_assign_base&&) = default;
-
- _LIBCPP_INLINE_VISIBILITY
- __optional_copy_assign_base& operator=(const __optional_copy_assign_base& __opt)
- {
- this->__assign_from(__opt);
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __optional_copy_assign_base& operator=(__optional_copy_assign_base&&) = default;
-};
-
-template <class _Tp, bool =
- is_trivially_destructible<_Tp>::value &&
- is_trivially_move_constructible<_Tp>::value &&
- is_trivially_move_assignable<_Tp>::value>
-struct __optional_move_assign_base : __optional_copy_assign_base<_Tp>
-{
- using __optional_copy_assign_base<_Tp>::__optional_copy_assign_base;
-};
-
-template <class _Tp>
-struct __optional_move_assign_base<_Tp, false> : __optional_copy_assign_base<_Tp>
-{
- using value_type = _Tp;
- using __optional_copy_assign_base<_Tp>::__optional_copy_assign_base;
-
- _LIBCPP_INLINE_VISIBILITY
- __optional_move_assign_base() = default;
- _LIBCPP_INLINE_VISIBILITY
- __optional_move_assign_base(const __optional_move_assign_base& __opt) = default;
- _LIBCPP_INLINE_VISIBILITY
- __optional_move_assign_base(__optional_move_assign_base&&) = default;
- _LIBCPP_INLINE_VISIBILITY
- __optional_move_assign_base& operator=(const __optional_move_assign_base&) = default;
-
- _LIBCPP_INLINE_VISIBILITY
- __optional_move_assign_base& operator=(__optional_move_assign_base&& __opt)
- noexcept(is_nothrow_move_assignable_v<value_type> &&
- is_nothrow_move_constructible_v<value_type>)
- {
- this->__assign_from(_VSTD::move(__opt));
- return *this;
- }
-};
-
-template <class _Tp>
-using __optional_sfinae_ctor_base_t = __sfinae_ctor_base<
- is_copy_constructible<_Tp>::value,
- is_move_constructible<_Tp>::value
->;
-
-template <class _Tp>
-using __optional_sfinae_assign_base_t = __sfinae_assign_base<
- (is_copy_constructible<_Tp>::value && is_copy_assignable<_Tp>::value),
- (is_move_constructible<_Tp>::value && is_move_assignable<_Tp>::value)
->;
-
-template <class _Tp>
-class optional
- : private __optional_move_assign_base<_Tp>
- , private __optional_sfinae_ctor_base_t<_Tp>
- , private __optional_sfinae_assign_base_t<_Tp>
-{
- using __base = __optional_move_assign_base<_Tp>;
-public:
- using value_type = _Tp;
-
-private:
- // Disable the reference extension using this static assert.
- static_assert(!is_same_v<value_type, in_place_t>,
- "instantiation of optional with in_place_t is ill-formed");
- static_assert(!is_same_v<__uncvref_t<value_type>, nullopt_t>,
- "instantiation of optional with nullopt_t is ill-formed");
- static_assert(!is_reference_v<value_type>,
- "instantiation of optional with a reference type is ill-formed");
- static_assert(is_destructible_v<value_type>,
- "instantiation of optional with a non-destructible type is ill-formed");
-
- // LWG2756: conditionally explicit conversion from _Up
- struct _CheckOptionalArgsConstructor {
- template <class _Up>
- static constexpr bool __enable_implicit() {
- return is_constructible_v<_Tp, _Up&&> &&
- is_convertible_v<_Up&&, _Tp>;
- }
-
- template <class _Up>
- static constexpr bool __enable_explicit() {
- return is_constructible_v<_Tp, _Up&&> &&
- !is_convertible_v<_Up&&, _Tp>;
- }
- };
- template <class _Up>
- using _CheckOptionalArgsCtor = conditional_t<
- !is_same_v<__uncvref_t<_Up>, in_place_t> &&
- !is_same_v<__uncvref_t<_Up>, optional>,
- _CheckOptionalArgsConstructor,
- __check_tuple_constructor_fail
- >;
- template <class _QualUp>
- struct _CheckOptionalLikeConstructor {
- template <class _Up, class _Opt = optional<_Up>>
- using __check_constructible_from_opt = __lazy_or<
- is_constructible<_Tp, _Opt&>,
- is_constructible<_Tp, _Opt const&>,
- is_constructible<_Tp, _Opt&&>,
- is_constructible<_Tp, _Opt const&&>,
- is_convertible<_Opt&, _Tp>,
- is_convertible<_Opt const&, _Tp>,
- is_convertible<_Opt&&, _Tp>,
- is_convertible<_Opt const&&, _Tp>
- >;
- template <class _Up, class _Opt = optional<_Up>>
- using __check_assignable_from_opt = __lazy_or<
- is_assignable<_Tp&, _Opt&>,
- is_assignable<_Tp&, _Opt const&>,
- is_assignable<_Tp&, _Opt&&>,
- is_assignable<_Tp&, _Opt const&&>
- >;
- template <class _Up, class _QUp = _QualUp>
- static constexpr bool __enable_implicit() {
- return is_convertible<_QUp, _Tp>::value &&
- !__check_constructible_from_opt<_Up>::value;
- }
- template <class _Up, class _QUp = _QualUp>
- static constexpr bool __enable_explicit() {
- return !is_convertible<_QUp, _Tp>::value &&
- !__check_constructible_from_opt<_Up>::value;
- }
- template <class _Up, class _QUp = _QualUp>
- static constexpr bool __enable_assign() {
- // Construction and assignability of _Qup to _Tp has already been
- // checked.
- return !__check_constructible_from_opt<_Up>::value &&
- !__check_assignable_from_opt<_Up>::value;
- }
- };
-
- template <class _Up, class _QualUp>
- using _CheckOptionalLikeCtor = conditional_t<
- __lazy_and<
- __lazy_not<is_same<_Up, _Tp>>,
- is_constructible<_Tp, _QualUp>
- >::value,
- _CheckOptionalLikeConstructor<_QualUp>,
- __check_tuple_constructor_fail
- >;
- template <class _Up, class _QualUp>
- using _CheckOptionalLikeAssign = conditional_t<
- __lazy_and<
- __lazy_not<is_same<_Up, _Tp>>,
- is_constructible<_Tp, _QualUp>,
- is_assignable<_Tp&, _QualUp>
- >::value,
- _CheckOptionalLikeConstructor<_QualUp>,
- __check_tuple_constructor_fail
- >;
-public:
-
- _LIBCPP_INLINE_VISIBILITY constexpr optional() noexcept {}
- _LIBCPP_INLINE_VISIBILITY constexpr optional(const optional&) = default;
- _LIBCPP_INLINE_VISIBILITY constexpr optional(optional&&) = default;
- _LIBCPP_INLINE_VISIBILITY constexpr optional(nullopt_t) noexcept {}
-
- template <class... _Args, class = enable_if_t<
- is_constructible_v<value_type, _Args...>>
- >
- _LIBCPP_INLINE_VISIBILITY
- constexpr explicit optional(in_place_t, _Args&&... __args)
- : __base(in_place, _VSTD::forward<_Args>(__args)...) {}
-
- template <class _Up, class... _Args, class = enable_if_t<
- is_constructible_v<value_type, initializer_list<_Up>&, _Args...>>
- >
- _LIBCPP_INLINE_VISIBILITY
- constexpr explicit optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args)
- : __base(in_place, __il, _VSTD::forward<_Args>(__args)...) {}
-
- template <class _Up = value_type, enable_if_t<
- _CheckOptionalArgsCtor<_Up>::template __enable_implicit<_Up>()
- , int> = 0>
- _LIBCPP_INLINE_VISIBILITY
- constexpr optional(_Up&& __v)
- : __base(in_place, _VSTD::forward<_Up>(__v)) {}
-
- template <class _Up, enable_if_t<
- _CheckOptionalArgsCtor<_Up>::template __enable_explicit<_Up>()
- , int> = 0>
- _LIBCPP_INLINE_VISIBILITY
- constexpr explicit optional(_Up&& __v)
- : __base(in_place, _VSTD::forward<_Up>(__v)) {}
-
- // LWG2756: conditionally explicit conversion from const optional<_Up>&
- template <class _Up, enable_if_t<
- _CheckOptionalLikeCtor<_Up, _Up const&>::template __enable_implicit<_Up>()
- , int> = 0>
- _LIBCPP_INLINE_VISIBILITY
- optional(const optional<_Up>& __v)
- {
- this->__construct_from(__v);
- }
- template <class _Up, enable_if_t<
- _CheckOptionalLikeCtor<_Up, _Up const&>::template __enable_explicit<_Up>()
- , int> = 0>
- _LIBCPP_INLINE_VISIBILITY
- explicit optional(const optional<_Up>& __v)
- {
- this->__construct_from(__v);
- }
-
- // LWG2756: conditionally explicit conversion from optional<_Up>&&
- template <class _Up, enable_if_t<
- _CheckOptionalLikeCtor<_Up, _Up &&>::template __enable_implicit<_Up>()
- , int> = 0>
- _LIBCPP_INLINE_VISIBILITY
- optional(optional<_Up>&& __v)
- {
- this->__construct_from(_VSTD::move(__v));
- }
- template <class _Up, enable_if_t<
- _CheckOptionalLikeCtor<_Up, _Up &&>::template __enable_explicit<_Up>()
- , int> = 0>
- _LIBCPP_INLINE_VISIBILITY
- explicit optional(optional<_Up>&& __v)
- {
- this->__construct_from(_VSTD::move(__v));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- optional& operator=(nullopt_t) noexcept
- {
- reset();
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY optional& operator=(const optional&) = default;
- _LIBCPP_INLINE_VISIBILITY optional& operator=(optional&&) = default;
-
- // LWG2756
- template <class _Up = value_type,
- class = enable_if_t
- <__lazy_and<
- integral_constant<bool,
- !is_same_v<__uncvref_t<_Up>, optional> &&
- !(is_same_v<_Up, value_type> && is_scalar_v<value_type>)
- >,
- is_constructible<value_type, _Up>,
- is_assignable<value_type&, _Up>
- >::value>
- >
- _LIBCPP_INLINE_VISIBILITY
- optional&
- operator=(_Up&& __v)
- {
- if (this->has_value())
- this->__get() = _VSTD::forward<_Up>(__v);
- else
- this->__construct(_VSTD::forward<_Up>(__v));
- return *this;
- }
-
- // LWG2756
- template <class _Up, enable_if_t<
- _CheckOptionalLikeAssign<_Up, _Up const&>::template __enable_assign<_Up>()
- , int> = 0>
- _LIBCPP_INLINE_VISIBILITY
- optional&
- operator=(const optional<_Up>& __v)
- {
- this->__assign_from(__v);
- return *this;
- }
-
- // LWG2756
- template <class _Up, enable_if_t<
- _CheckOptionalLikeCtor<_Up, _Up &&>::template __enable_assign<_Up>()
- , int> = 0>
- _LIBCPP_INLINE_VISIBILITY
- optional&
- operator=(optional<_Up>&& __v)
- {
- this->__assign_from(_VSTD::move(__v));
- return *this;
- }
-
- template <class... _Args,
- class = enable_if_t
- <
- is_constructible_v<value_type, _Args...>
- >
- >
- _LIBCPP_INLINE_VISIBILITY
- _Tp &
- emplace(_Args&&... __args)
- {
- reset();
- this->__construct(_VSTD::forward<_Args>(__args)...);
- return this->__get();
- }
-
- template <class _Up, class... _Args,
- class = enable_if_t
- <
- is_constructible_v<value_type, initializer_list<_Up>&, _Args...>
- >
- >
- _LIBCPP_INLINE_VISIBILITY
- _Tp &
- emplace(initializer_list<_Up> __il, _Args&&... __args)
- {
- reset();
- this->__construct(__il, _VSTD::forward<_Args>(__args)...);
- return this->__get();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(optional& __opt)
- noexcept(is_nothrow_move_constructible_v<value_type> &&
- is_nothrow_swappable_v<value_type>)
- {
- if (this->has_value() == __opt.has_value())
- {
- using _VSTD::swap;
- if (this->has_value())
- swap(this->__get(), __opt.__get());
- }
- else
- {
- if (this->has_value())
- {
- __opt.__construct(_VSTD::move(this->__get()));
- reset();
- }
- else
- {
- this->__construct(_VSTD::move(__opt.__get()));
- __opt.reset();
- }
- }
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr
- add_pointer_t<value_type const>
- operator->() const
- {
- _LIBCPP_ASSERT(this->has_value(), "optional operator-> called for disengaged value");
-#ifndef _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF
- return _VSTD::addressof(this->__get());
-#else
- return __operator_arrow(__has_operator_addressof<value_type>{}, this->__get());
-#endif
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr
- add_pointer_t<value_type>
- operator->()
- {
- _LIBCPP_ASSERT(this->has_value(), "optional operator-> called for disengaged value");
-#ifndef _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF
- return _VSTD::addressof(this->__get());
-#else
- return __operator_arrow(__has_operator_addressof<value_type>{}, this->__get());
-#endif
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr
- const value_type&
- operator*() const&
- {
- _LIBCPP_ASSERT(this->has_value(), "optional operator* called for disengaged value");
- return this->__get();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr
- value_type&
- operator*() &
- {
- _LIBCPP_ASSERT(this->has_value(), "optional operator* called for disengaged value");
- return this->__get();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr
- value_type&&
- operator*() &&
- {
- _LIBCPP_ASSERT(this->has_value(), "optional operator* called for disengaged value");
- return _VSTD::move(this->__get());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr
- const value_type&&
- operator*() const&&
- {
- _LIBCPP_ASSERT(this->has_value(), "optional operator* called for disengaged value");
- return _VSTD::move(this->__get());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr explicit operator bool() const noexcept { return has_value(); }
-
- using __base::has_value;
- using __base::__get;
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
- constexpr value_type const& value() const&
- {
- if (!this->has_value())
- __throw_bad_optional_access();
- return this->__get();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
- constexpr value_type& value() &
- {
- if (!this->has_value())
- __throw_bad_optional_access();
- return this->__get();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
- constexpr value_type&& value() &&
- {
- if (!this->has_value())
- __throw_bad_optional_access();
- return _VSTD::move(this->__get());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
- constexpr value_type const&& value() const&&
- {
- if (!this->has_value())
- __throw_bad_optional_access();
- return _VSTD::move(this->__get());
- }
-
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- constexpr value_type value_or(_Up&& __v) const&
- {
- static_assert(is_copy_constructible_v<value_type>,
- "optional<T>::value_or: T must be copy constructible");
- static_assert(is_convertible_v<_Up, value_type>,
- "optional<T>::value_or: U must be convertible to T");
- return this->has_value() ? this->__get() :
- static_cast<value_type>(_VSTD::forward<_Up>(__v));
- }
-
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- constexpr value_type value_or(_Up&& __v) &&
- {
- static_assert(is_move_constructible_v<value_type>,
- "optional<T>::value_or: T must be move constructible");
- static_assert(is_convertible_v<_Up, value_type>,
- "optional<T>::value_or: U must be convertible to T");
- return this->has_value() ? _VSTD::move(this->__get()) :
- static_cast<value_type>(_VSTD::forward<_Up>(__v));
- }
-
- using __base::reset;
-
-private:
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- static _Up*
- __operator_arrow(true_type, _Up& __x)
- {
- return _VSTD::addressof(__x);
- }
-
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- static constexpr _Up*
- __operator_arrow(false_type, _Up& __x)
- {
- return &__x;
- }
-};
-
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-template<class T>
- optional(T) -> optional<T>;
-#endif
-
-// Comparisons between optionals
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() ==
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator==(const optional<_Tp>& __x, const optional<_Up>& __y)
-{
- if (static_cast<bool>(__x) != static_cast<bool>(__y))
- return false;
- if (!static_cast<bool>(__x))
- return true;
- return *__x == *__y;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() !=
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator!=(const optional<_Tp>& __x, const optional<_Up>& __y)
-{
- if (static_cast<bool>(__x) != static_cast<bool>(__y))
- return true;
- if (!static_cast<bool>(__x))
- return false;
- return *__x != *__y;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator<(const optional<_Tp>& __x, const optional<_Up>& __y)
-{
- if (!static_cast<bool>(__y))
- return false;
- if (!static_cast<bool>(__x))
- return true;
- return *__x < *__y;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator>(const optional<_Tp>& __x, const optional<_Up>& __y)
-{
- if (!static_cast<bool>(__x))
- return false;
- if (!static_cast<bool>(__y))
- return true;
- return *__x > *__y;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <=
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator<=(const optional<_Tp>& __x, const optional<_Up>& __y)
-{
- if (!static_cast<bool>(__x))
- return true;
- if (!static_cast<bool>(__y))
- return false;
- return *__x <= *__y;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >=
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator>=(const optional<_Tp>& __x, const optional<_Up>& __y)
-{
- if (!static_cast<bool>(__y))
- return true;
- if (!static_cast<bool>(__x))
- return false;
- return *__x >= *__y;
-}
-
-// Comparisons with nullopt
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY constexpr
-bool
-operator==(const optional<_Tp>& __x, nullopt_t) noexcept
-{
- return !static_cast<bool>(__x);
-}
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY constexpr
-bool
-operator==(nullopt_t, const optional<_Tp>& __x) noexcept
-{
- return !static_cast<bool>(__x);
-}
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY constexpr
-bool
-operator!=(const optional<_Tp>& __x, nullopt_t) noexcept
-{
- return static_cast<bool>(__x);
-}
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY constexpr
-bool
-operator!=(nullopt_t, const optional<_Tp>& __x) noexcept
-{
- return static_cast<bool>(__x);
-}
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY constexpr
-bool
-operator<(const optional<_Tp>&, nullopt_t) noexcept
-{
- return false;
-}
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY constexpr
-bool
-operator<(nullopt_t, const optional<_Tp>& __x) noexcept
-{
- return static_cast<bool>(__x);
-}
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY constexpr
-bool
-operator<=(const optional<_Tp>& __x, nullopt_t) noexcept
-{
- return !static_cast<bool>(__x);
-}
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY constexpr
-bool
-operator<=(nullopt_t, const optional<_Tp>&) noexcept
-{
- return true;
-}
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY constexpr
-bool
-operator>(const optional<_Tp>& __x, nullopt_t) noexcept
-{
- return static_cast<bool>(__x);
-}
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY constexpr
-bool
-operator>(nullopt_t, const optional<_Tp>&) noexcept
-{
- return false;
-}
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY constexpr
-bool
-operator>=(const optional<_Tp>&, nullopt_t) noexcept
-{
- return true;
-}
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY constexpr
-bool
-operator>=(nullopt_t, const optional<_Tp>& __x) noexcept
-{
- return !static_cast<bool>(__x);
-}
-
-// Comparisons with T
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() ==
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator==(const optional<_Tp>& __x, const _Up& __v)
-{
- return static_cast<bool>(__x) ? *__x == __v : false;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() ==
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator==(const _Tp& __v, const optional<_Up>& __x)
-{
- return static_cast<bool>(__x) ? __v == *__x : false;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() !=
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator!=(const optional<_Tp>& __x, const _Up& __v)
-{
- return static_cast<bool>(__x) ? *__x != __v : true;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() !=
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator!=(const _Tp& __v, const optional<_Up>& __x)
-{
- return static_cast<bool>(__x) ? __v != *__x : true;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator<(const optional<_Tp>& __x, const _Up& __v)
-{
- return static_cast<bool>(__x) ? *__x < __v : true;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator<(const _Tp& __v, const optional<_Up>& __x)
-{
- return static_cast<bool>(__x) ? __v < *__x : false;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <=
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator<=(const optional<_Tp>& __x, const _Up& __v)
-{
- return static_cast<bool>(__x) ? *__x <= __v : true;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <=
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator<=(const _Tp& __v, const optional<_Up>& __x)
-{
- return static_cast<bool>(__x) ? __v <= *__x : false;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator>(const optional<_Tp>& __x, const _Up& __v)
-{
- return static_cast<bool>(__x) ? *__x > __v : false;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator>(const _Tp& __v, const optional<_Up>& __x)
-{
- return static_cast<bool>(__x) ? __v > *__x : true;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >=
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator>=(const optional<_Tp>& __x, const _Up& __v)
-{
- return static_cast<bool>(__x) ? *__x >= __v : false;
-}
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VISIBILITY constexpr
-enable_if_t<
- is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >=
- _VSTD::declval<const _Up&>()), bool>,
- bool
->
-operator>=(const _Tp& __v, const optional<_Up>& __x)
-{
- return static_cast<bool>(__x) ? __v >= *__x : true;
-}
-
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-enable_if_t<
- is_move_constructible_v<_Tp> && is_swappable_v<_Tp>,
- void
->
-swap(optional<_Tp>& __x, optional<_Tp>& __y) noexcept(noexcept(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY constexpr
-optional<decay_t<_Tp>> make_optional(_Tp&& __v)
-{
- return optional<decay_t<_Tp>>(_VSTD::forward<_Tp>(__v));
-}
-
-template <class _Tp, class... _Args>
-_LIBCPP_INLINE_VISIBILITY constexpr
-optional<_Tp> make_optional(_Args&&... __args)
-{
- return optional<_Tp>(in_place, _VSTD::forward<_Args>(__args)...);
-}
-
-template <class _Tp, class _Up, class... _Args>
-_LIBCPP_INLINE_VISIBILITY constexpr
-optional<_Tp> make_optional(initializer_list<_Up> __il, _Args&&... __args)
-{
- return optional<_Tp>(in_place, __il, _VSTD::forward<_Args>(__args)...);
-}
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS hash<
- __enable_hash_helper<optional<_Tp>, remove_const_t<_Tp>>
->
-{
- typedef optional<_Tp> argument_type;
- typedef size_t result_type;
-
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(const argument_type& __opt) const
- {
- return static_cast<bool>(__opt) ? hash<remove_const_t<_Tp>>()(*__opt) : 0;
- }
-};
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_STD_VER > 14
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_OPTIONAL
diff --git a/lib/libcxx/include/ostream b/lib/libcxx/include/ostream
deleted file mode 100644
index d700a369b34..00000000000
--- a/lib/libcxx/include/ostream
+++ /dev/null
@@ -1,1103 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- ostream -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_OSTREAM
-#define _LIBCPP_OSTREAM
-
-/*
- ostream synopsis
-
-template <class charT, class traits = char_traits<charT> >
-class basic_ostream
- : virtual public basic_ios<charT,traits>
-{
-public:
- // types (inherited from basic_ios (27.5.4)):
- typedef charT char_type;
- typedef traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- // 27.7.2.2 Constructor/destructor:
- explicit basic_ostream(basic_streambuf<char_type,traits>* sb);
- basic_ostream(basic_ostream&& rhs);
- virtual ~basic_ostream();
-
- // 27.7.2.3 Assign/swap
- basic_ostream& operator=(const basic_ostream& rhs) = delete; // C++14
- basic_ostream& operator=(basic_ostream&& rhs);
- void swap(basic_ostream& rhs);
-
- // 27.7.2.4 Prefix/suffix:
- class sentry;
-
- // 27.7.2.6 Formatted output:
- basic_ostream& operator<<(basic_ostream& (*pf)(basic_ostream&));
- basic_ostream& operator<<(basic_ios<charT, traits>& (*pf)(basic_ios<charT,traits>&));
- basic_ostream& operator<<(ios_base& (*pf)(ios_base&));
- basic_ostream& operator<<(bool n);
- basic_ostream& operator<<(short n);
- basic_ostream& operator<<(unsigned short n);
- basic_ostream& operator<<(int n);
- basic_ostream& operator<<(unsigned int n);
- basic_ostream& operator<<(long n);
- basic_ostream& operator<<(unsigned long n);
- basic_ostream& operator<<(long long n);
- basic_ostream& operator<<(unsigned long long n);
- basic_ostream& operator<<(float f);
- basic_ostream& operator<<(double f);
- basic_ostream& operator<<(long double f);
- basic_ostream& operator<<(const void* p);
- basic_ostream& operator<<(basic_streambuf<char_type,traits>* sb);
-
- // 27.7.2.7 Unformatted output:
- basic_ostream& put(char_type c);
- basic_ostream& write(const char_type* s, streamsize n);
- basic_ostream& flush();
-
- // 27.7.2.5 seeks:
- pos_type tellp();
- basic_ostream& seekp(pos_type);
- basic_ostream& seekp(off_type, ios_base::seekdir);
-protected:
- basic_ostream(const basic_ostream& rhs) = delete;
- basic_ostream(basic_ostream&& rhs);
- // 27.7.3.3 Assign/swap
- basic_ostream& operator=(basic_ostream& rhs) = delete;
- basic_ostream& operator=(const basic_ostream&& rhs);
- void swap(basic_ostream& rhs);
-};
-
-// 27.7.2.6.4 character inserters
-
-template<class charT, class traits>
- basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, charT);
-
-template<class charT, class traits>
- basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, char);
-
-template<class traits>
- basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, char);
-
-// signed and unsigned
-
-template<class traits>
- basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, signed char);
-
-template<class traits>
- basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, unsigned char);
-
-// NTBS
-template<class charT, class traits>
- basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const charT*);
-
-template<class charT, class traits>
- basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const char*);
-
-template<class traits>
- basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const char*);
-
-// signed and unsigned
-template<class traits>
-basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const signed char*);
-
-template<class traits>
- basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const unsigned char*);
-
-// swap:
-template <class charT, class traits>
- void swap(basic_ostream<charT, traits>& x, basic_ostream<charT, traits>& y);
-
-template <class charT, class traits>
- basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
-
-template <class charT, class traits>
- basic_ostream<charT,traits>& ends(basic_ostream<charT,traits>& os);
-
-template <class charT, class traits>
- basic_ostream<charT,traits>& flush(basic_ostream<charT,traits>& os);
-
-// rvalue stream insertion
-template <class charT, class traits, class T>
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>&& os, const T& x);
-
-} // std
-
-*/
-
-#include <__config>
-#include <ios>
-#include <streambuf>
-#include <locale>
-#include <iterator>
-#include <bitset>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _CharT, class _Traits>
-class _LIBCPP_TEMPLATE_VIS basic_ostream
- : virtual public basic_ios<_CharT, _Traits>
-{
-public:
- // types (inherited from basic_ios (27.5.4)):
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- // 27.7.2.2 Constructor/destructor:
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- explicit basic_ostream(basic_streambuf<char_type, traits_type>* __sb)
- { this->init(__sb); }
- virtual ~basic_ostream();
-protected:
-#ifndef _LIBCPP_CXX03_LANG
- inline _LIBCPP_INLINE_VISIBILITY
- basic_ostream(basic_ostream&& __rhs);
-
- // 27.7.2.3 Assign/swap
- inline _LIBCPP_INLINE_VISIBILITY
- basic_ostream& operator=(basic_ostream&& __rhs);
-#endif
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- void swap(basic_ostream& __rhs)
- { basic_ios<char_type, traits_type>::swap(__rhs); }
-
-#ifndef _LIBCPP_CXX03_LANG
- basic_ostream (const basic_ostream& __rhs) = delete;
- basic_ostream& operator=(const basic_ostream& __rhs) = delete;
-#else
- basic_ostream (const basic_ostream& __rhs); // not defined
- basic_ostream& operator=(const basic_ostream& __rhs); // not defined
-#endif
-public:
-
- // 27.7.2.4 Prefix/suffix:
- class _LIBCPP_TEMPLATE_VIS sentry;
-
- // 27.7.2.6 Formatted output:
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- basic_ostream& operator<<(basic_ostream& (*__pf)(basic_ostream&))
- { return __pf(*this); }
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- basic_ostream& operator<<(basic_ios<char_type, traits_type>&
- (*__pf)(basic_ios<char_type,traits_type>&))
- { __pf(*this); return *this; }
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- basic_ostream& operator<<(ios_base& (*__pf)(ios_base&))
- { __pf(*this); return *this; }
-
- basic_ostream& operator<<(bool __n);
- basic_ostream& operator<<(short __n);
- basic_ostream& operator<<(unsigned short __n);
- basic_ostream& operator<<(int __n);
- basic_ostream& operator<<(unsigned int __n);
- basic_ostream& operator<<(long __n);
- basic_ostream& operator<<(unsigned long __n);
- basic_ostream& operator<<(long long __n);
- basic_ostream& operator<<(unsigned long long __n);
- basic_ostream& operator<<(float __f);
- basic_ostream& operator<<(double __f);
- basic_ostream& operator<<(long double __f);
- basic_ostream& operator<<(const void* __p);
- basic_ostream& operator<<(basic_streambuf<char_type, traits_type>* __sb);
-
- // 27.7.2.7 Unformatted output:
- basic_ostream& put(char_type __c);
- basic_ostream& write(const char_type* __s, streamsize __n);
- basic_ostream& flush();
-
- // 27.7.2.5 seeks:
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- pos_type tellp();
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- basic_ostream& seekp(pos_type __pos);
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- basic_ostream& seekp(off_type __off, ios_base::seekdir __dir);
-
-protected:
- _LIBCPP_INLINE_VISIBILITY
- basic_ostream() {} // extension, intentially does not initialize
-};
-
-template <class _CharT, class _Traits>
-class _LIBCPP_TEMPLATE_VIS basic_ostream<_CharT, _Traits>::sentry
-{
- bool __ok_;
- basic_ostream<_CharT, _Traits>& __os_;
-
- sentry(const sentry&); // = delete;
- sentry& operator=(const sentry&); // = delete;
-
-public:
- explicit sentry(basic_ostream<_CharT, _Traits>& __os);
- ~sentry();
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_EXPLICIT
- operator bool() const {return __ok_;}
-};
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>::sentry::sentry(basic_ostream<_CharT, _Traits>& __os)
- : __ok_(false),
- __os_(__os)
-{
- if (__os.good())
- {
- if (__os.tie())
- __os.tie()->flush();
- __ok_ = true;
- }
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>::sentry::~sentry()
-{
- if (__os_.rdbuf() && __os_.good() && (__os_.flags() & ios_base::unitbuf)
- && !uncaught_exception())
- {
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (__os_.rdbuf()->pubsync() == -1)
- __os_.setstate(ios_base::badbit);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>::basic_ostream(basic_ostream&& __rhs)
-{
- this->move(__rhs);
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::operator=(basic_ostream&& __rhs)
-{
- swap(__rhs);
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>::~basic_ostream()
-{
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::operator<<(basic_streambuf<char_type, traits_type>* __sb)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __s(*this);
- if (__s)
- {
- if (__sb)
- {
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typedef istreambuf_iterator<_CharT, _Traits> _Ip;
- typedef ostreambuf_iterator<_CharT, _Traits> _Op;
- _Ip __i(__sb);
- _Ip __eof;
- _Op __o(*this);
- size_t __c = 0;
- for (; __i != __eof; ++__i, ++__o, ++__c)
- {
- *__o = *__i;
- if (__o.failed())
- break;
- }
- if (__c == 0)
- this->setstate(ios_base::failbit);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_failbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
- else
- this->setstate(ios_base::badbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::operator<<(bool __n)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __s(*this);
- if (__s)
- {
- typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
- const _Fp& __f = use_facet<_Fp>(this->getloc());
- if (__f.put(*this, *this, this->fill(), __n).failed())
- this->setstate(ios_base::badbit | ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::operator<<(short __n)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __s(*this);
- if (__s)
- {
- ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield;
- typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
- const _Fp& __f = use_facet<_Fp>(this->getloc());
- if (__f.put(*this, *this, this->fill(),
- __flags == ios_base::oct || __flags == ios_base::hex ?
- static_cast<long>(static_cast<unsigned short>(__n)) :
- static_cast<long>(__n)).failed())
- this->setstate(ios_base::badbit | ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::operator<<(unsigned short __n)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __s(*this);
- if (__s)
- {
- typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
- const _Fp& __f = use_facet<_Fp>(this->getloc());
- if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed())
- this->setstate(ios_base::badbit | ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::operator<<(int __n)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __s(*this);
- if (__s)
- {
- ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield;
- typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
- const _Fp& __f = use_facet<_Fp>(this->getloc());
- if (__f.put(*this, *this, this->fill(),
- __flags == ios_base::oct || __flags == ios_base::hex ?
- static_cast<long>(static_cast<unsigned int>(__n)) :
- static_cast<long>(__n)).failed())
- this->setstate(ios_base::badbit | ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::operator<<(unsigned int __n)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __s(*this);
- if (__s)
- {
- typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
- const _Fp& __f = use_facet<_Fp>(this->getloc());
- if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed())
- this->setstate(ios_base::badbit | ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::operator<<(long __n)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __s(*this);
- if (__s)
- {
- typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
- const _Fp& __f = use_facet<_Fp>(this->getloc());
- if (__f.put(*this, *this, this->fill(), __n).failed())
- this->setstate(ios_base::badbit | ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::operator<<(unsigned long __n)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __s(*this);
- if (__s)
- {
- typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
- const _Fp& __f = use_facet<_Fp>(this->getloc());
- if (__f.put(*this, *this, this->fill(), __n).failed())
- this->setstate(ios_base::badbit | ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::operator<<(long long __n)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __s(*this);
- if (__s)
- {
- typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
- const _Fp& __f = use_facet<_Fp>(this->getloc());
- if (__f.put(*this, *this, this->fill(), __n).failed())
- this->setstate(ios_base::badbit | ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::operator<<(unsigned long long __n)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __s(*this);
- if (__s)
- {
- typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
- const _Fp& __f = use_facet<_Fp>(this->getloc());
- if (__f.put(*this, *this, this->fill(), __n).failed())
- this->setstate(ios_base::badbit | ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::operator<<(float __n)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __s(*this);
- if (__s)
- {
- typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
- const _Fp& __f = use_facet<_Fp>(this->getloc());
- if (__f.put(*this, *this, this->fill(), static_cast<double>(__n)).failed())
- this->setstate(ios_base::badbit | ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::operator<<(double __n)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __s(*this);
- if (__s)
- {
- typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
- const _Fp& __f = use_facet<_Fp>(this->getloc());
- if (__f.put(*this, *this, this->fill(), __n).failed())
- this->setstate(ios_base::badbit | ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::operator<<(long double __n)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __s(*this);
- if (__s)
- {
- typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
- const _Fp& __f = use_facet<_Fp>(this->getloc());
- if (__f.put(*this, *this, this->fill(), __n).failed())
- this->setstate(ios_base::badbit | ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::operator<<(const void* __n)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __s(*this);
- if (__s)
- {
- typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp;
- const _Fp& __f = use_facet<_Fp>(this->getloc());
- if (__f.put(*this, *this, this->fill(), __n).failed())
- this->setstate(ios_base::badbit | ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template<class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-__put_character_sequence(basic_ostream<_CharT, _Traits>& __os,
- const _CharT* __str, size_t __len)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
- if (__s)
- {
- typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
- if (__pad_and_output(_Ip(__os),
- __str,
- (__os.flags() & ios_base::adjustfield) == ios_base::left ?
- __str + __len :
- __str,
- __str + __len,
- __os,
- __os.fill()).failed())
- __os.setstate(ios_base::badbit | ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __os.__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __os;
-}
-
-
-template<class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c)
-{
- return _VSTD::__put_character_sequence(__os, &__c, 1);
-}
-
-template<class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os, char __cn)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
- if (__s)
- {
- _CharT __c = __os.widen(__cn);
- typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
- if (__pad_and_output(_Ip(__os),
- &__c,
- (__os.flags() & ios_base::adjustfield) == ios_base::left ?
- &__c + 1 :
- &__c,
- &__c + 1,
- __os,
- __os.fill()).failed())
- __os.setstate(ios_base::badbit | ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __os.__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __os;
-}
-
-template<class _Traits>
-basic_ostream<char, _Traits>&
-operator<<(basic_ostream<char, _Traits>& __os, char __c)
-{
- return _VSTD::__put_character_sequence(__os, &__c, 1);
-}
-
-template<class _Traits>
-basic_ostream<char, _Traits>&
-operator<<(basic_ostream<char, _Traits>& __os, signed char __c)
-{
- return _VSTD::__put_character_sequence(__os, (char *) &__c, 1);
-}
-
-template<class _Traits>
-basic_ostream<char, _Traits>&
-operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c)
-{
- return _VSTD::__put_character_sequence(__os, (char *) &__c, 1);
-}
-
-template<class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str)
-{
- return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str));
-}
-
-template<class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os, const char* __strn)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
- if (__s)
- {
- typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
- size_t __len = char_traits<char>::length(__strn);
- const int __bs = 100;
- _CharT __wbb[__bs];
- _CharT* __wb = __wbb;
- unique_ptr<_CharT, void(*)(void*)> __h(0, free);
- if (__len > __bs)
- {
- __wb = (_CharT*)malloc(__len*sizeof(_CharT));
- if (__wb == 0)
- __throw_bad_alloc();
- __h.reset(__wb);
- }
- for (_CharT* __p = __wb; *__strn != '\0'; ++__strn, ++__p)
- *__p = __os.widen(*__strn);
- if (__pad_and_output(_Ip(__os),
- __wb,
- (__os.flags() & ios_base::adjustfield) == ios_base::left ?
- __wb + __len :
- __wb,
- __wb + __len,
- __os,
- __os.fill()).failed())
- __os.setstate(ios_base::badbit | ios_base::failbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __os.__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __os;
-}
-
-template<class _Traits>
-basic_ostream<char, _Traits>&
-operator<<(basic_ostream<char, _Traits>& __os, const char* __str)
-{
- return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str));
-}
-
-template<class _Traits>
-basic_ostream<char, _Traits>&
-operator<<(basic_ostream<char, _Traits>& __os, const signed char* __str)
-{
- const char *__s = (const char *) __str;
- return _VSTD::__put_character_sequence(__os, __s, _Traits::length(__s));
-}
-
-template<class _Traits>
-basic_ostream<char, _Traits>&
-operator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __str)
-{
- const char *__s = (const char *) __str;
- return _VSTD::__put_character_sequence(__os, __s, _Traits::length(__s));
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::put(char_type __c)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __s(*this);
- if (__s)
- {
- typedef ostreambuf_iterator<_CharT, _Traits> _Op;
- _Op __o(*this);
- *__o = __c;
- if (__o.failed())
- this->setstate(ios_base::badbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::write(const char_type* __s, streamsize __n)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- sentry __sen(*this);
- if (__sen && __n)
- {
- if (this->rdbuf()->sputn(__s, __n) != __n)
- this->setstate(ios_base::badbit);
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::flush()
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- if (this->rdbuf())
- {
- sentry __s(*this);
- if (__s)
- {
- if (this->rdbuf()->pubsync() == -1)
- this->setstate(ios_base::badbit);
- }
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->__set_badbit_and_consider_rethrow();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- return *this;
-}
-
-template <class _CharT, class _Traits>
-typename basic_ostream<_CharT, _Traits>::pos_type
-basic_ostream<_CharT, _Traits>::tellp()
-{
- if (this->fail())
- return pos_type(-1);
- return this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out);
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::seekp(pos_type __pos)
-{
- sentry __s(*this);
- if (!this->fail())
- {
- if (this->rdbuf()->pubseekpos(__pos, ios_base::out) == pos_type(-1))
- this->setstate(ios_base::failbit);
- }
- return *this;
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-basic_ostream<_CharT, _Traits>::seekp(off_type __off, ios_base::seekdir __dir)
-{
- sentry __s(*this);
- if (!this->fail())
- {
- if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::out) == pos_type(-1))
- this->setstate(ios_base::failbit);
- }
- return *this;
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_ostream<_CharT, _Traits>&
-endl(basic_ostream<_CharT, _Traits>& __os)
-{
- __os.put(__os.widen('\n'));
- __os.flush();
- return __os;
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_ostream<_CharT, _Traits>&
-ends(basic_ostream<_CharT, _Traits>& __os)
-{
- __os.put(_CharT());
- return __os;
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_ostream<_CharT, _Traits>&
-flush(basic_ostream<_CharT, _Traits>& __os)
-{
- __os.flush();
- return __os;
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Stream, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- !is_lvalue_reference<_Stream>::value &&
- is_base_of<ios_base, _Stream>::value,
- _Stream&&
->::type
-operator<<(_Stream&& __os, const _Tp& __x)
-{
- __os << __x;
- return _VSTD::move(__os);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template<class _CharT, class _Traits, class _Allocator>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const basic_string<_CharT, _Traits, _Allocator>& __str)
-{
- return _VSTD::__put_character_sequence(__os, __str.data(), __str.size());
-}
-
-template<class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const basic_string_view<_CharT, _Traits> __sv)
-{
- return _VSTD::__put_character_sequence(__os, __sv.data(), __sv.size());
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __ec)
-{
- return __os << __ec.category().name() << ':' << __ec.value();
-}
-
-template<class _CharT, class _Traits, class _Yp>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p)
-{
- return __os << __p.get();
-}
-
-template<class _CharT, class _Traits, class _Yp, class _Dp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_same<void, typename __void_t<decltype((declval<basic_ostream<_CharT, _Traits>&>() << declval<typename unique_ptr<_Yp, _Dp>::pointer>()))>::type>::value,
- basic_ostream<_CharT, _Traits>&
->::type
-operator<<(basic_ostream<_CharT, _Traits>& __os, unique_ptr<_Yp, _Dp> const& __p)
-{
- return __os << __p.get();
-}
-
-template <class _CharT, class _Traits, size_t _Size>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x)
-{
- return __os << __x.template to_string<_CharT, _Traits>
- (use_facet<ctype<_CharT> >(__os.getloc()).widen('0'),
- use_facet<ctype<_CharT> >(__os.getloc()).widen('1'));
-}
-
-#ifndef _LIBCPP_DO_NOT_ASSUME_STREAMS_EXPLICIT_INSTANTIATION_IN_DYLIB
-_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<char>)
-_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<wchar_t>)
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_OSTREAM
diff --git a/lib/libcxx/include/queue b/lib/libcxx/include/queue
deleted file mode 100644
index 4677e52ae3a..00000000000
--- a/lib/libcxx/include/queue
+++ /dev/null
@@ -1,804 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- queue ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_QUEUE
-#define _LIBCPP_QUEUE
-
-/*
- queue synopsis
-
-namespace std
-{
-
-template <class T, class Container = deque<T>>
-class queue
-{
-public:
- typedef Container container_type;
- typedef typename container_type::value_type value_type;
- typedef typename container_type::reference reference;
- typedef typename container_type::const_reference const_reference;
- typedef typename container_type::size_type size_type;
-
-protected:
- container_type c;
-
-public:
- queue() = default;
- ~queue() = default;
-
- queue(const queue& q) = default;
- queue(queue&& q) = default;
-
- queue& operator=(const queue& q) = default;
- queue& operator=(queue&& q) = default;
-
- explicit queue(const container_type& c);
- explicit queue(container_type&& c)
- template <class Alloc>
- explicit queue(const Alloc& a);
- template <class Alloc>
- queue(const container_type& c, const Alloc& a);
- template <class Alloc>
- queue(container_type&& c, const Alloc& a);
- template <class Alloc>
- queue(const queue& q, const Alloc& a);
- template <class Alloc>
- queue(queue&& q, const Alloc& a);
-
- bool empty() const;
- size_type size() const;
-
- reference front();
- const_reference front() const;
- reference back();
- const_reference back() const;
-
- void push(const value_type& v);
- void push(value_type&& v);
- template <class... Args> reference emplace(Args&&... args); // reference in C++17
- void pop();
-
- void swap(queue& q) noexcept(is_nothrow_swappable_v<Container>)
-};
-
-template<class Container>
- queue(Container) -> queue<typename Container::value_type, Container>; // C++17
-
-template<class Container, class Allocator>
- queue(Container, Allocator) -> queue<typename Container::value_type, Container>; // C++17
-
-template <class T, class Container>
- bool operator==(const queue<T, Container>& x,const queue<T, Container>& y);
-
-template <class T, class Container>
- bool operator< (const queue<T, Container>& x,const queue<T, Container>& y);
-
-template <class T, class Container>
- bool operator!=(const queue<T, Container>& x,const queue<T, Container>& y);
-
-template <class T, class Container>
- bool operator> (const queue<T, Container>& x,const queue<T, Container>& y);
-
-template <class T, class Container>
- bool operator>=(const queue<T, Container>& x,const queue<T, Container>& y);
-
-template <class T, class Container>
- bool operator<=(const queue<T, Container>& x,const queue<T, Container>& y);
-
-template <class T, class Container>
- void swap(queue<T, Container>& x, queue<T, Container>& y)
- noexcept(noexcept(x.swap(y)));
-
-template <class T, class Container = vector<T>,
- class Compare = less<typename Container::value_type>>
-class priority_queue
-{
-public:
- typedef Container container_type;
- typedef typename container_type::value_type value_type;
- typedef typename container_type::reference reference;
- typedef typename container_type::const_reference const_reference;
- typedef typename container_type::size_type size_type;
-
-protected:
- container_type c;
- Compare comp;
-
-public:
- priority_queue() = default;
- ~priority_queue() = default;
-
- priority_queue(const priority_queue& q) = default;
- priority_queue(priority_queue&& q) = default;
-
- priority_queue& operator=(const priority_queue& q) = default;
- priority_queue& operator=(priority_queue&& q) = default;
-
- explicit priority_queue(const Compare& comp);
- priority_queue(const Compare& comp, const container_type& c);
- explicit priority_queue(const Compare& comp, container_type&& c);
- template <class InputIterator>
- priority_queue(InputIterator first, InputIterator last,
- const Compare& comp = Compare());
- template <class InputIterator>
- priority_queue(InputIterator first, InputIterator last,
- const Compare& comp, const container_type& c);
- template <class InputIterator>
- priority_queue(InputIterator first, InputIterator last,
- const Compare& comp, container_type&& c);
- template <class Alloc>
- explicit priority_queue(const Alloc& a);
- template <class Alloc>
- priority_queue(const Compare& comp, const Alloc& a);
- template <class Alloc>
- priority_queue(const Compare& comp, const container_type& c,
- const Alloc& a);
- template <class Alloc>
- priority_queue(const Compare& comp, container_type&& c,
- const Alloc& a);
- template <class Alloc>
- priority_queue(const priority_queue& q, const Alloc& a);
- template <class Alloc>
- priority_queue(priority_queue&& q, const Alloc& a);
-
- bool empty() const;
- size_type size() const;
- const_reference top() const;
-
- void push(const value_type& v);
- void push(value_type&& v);
- template <class... Args> void emplace(Args&&... args);
- void pop();
-
- void swap(priority_queue& q)
- noexcept(is_nothrow_swappable_v<Container> &&
- is_nothrow_swappable_v<Comp>)
-};
-
-template <class Compare, class Container>
-priority_queue(Compare, Container)
- -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
-
-template<class InputIterator,
- class Compare = less<typename iterator_traits<InputIterator>::value_type>,
- class Container = vector<typename iterator_traits<InputIterator>::value_type>>
-priority_queue(InputIterator, InputIterator, Compare = Compare(), Container = Container())
- -> priority_queue<typename iterator_traits<InputIterator>::value_type, Container, Compare>; // C++17
-
-template<class Compare, class Container, class Allocator>
-priority_queue(Compare, Container, Allocator)
- -> priority_queue<typename Container::value_type, Container, Compare>; // C++17
-
-template <class T, class Container, class Compare>
- void swap(priority_queue<T, Container, Compare>& x,
- priority_queue<T, Container, Compare>& y)
- noexcept(noexcept(x.swap(y)));
-
-} // std
-
-*/
-
-#include <__config>
-#include <deque>
-#include <vector>
-#include <functional>
-#include <algorithm>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS queue;
-
-template <class _Tp, class _Container>
-_LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
-
-template <class _Tp, class _Container>
-_LIBCPP_INLINE_VISIBILITY
-bool
-operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
-
-template <class _Tp, class _Container /*= deque<_Tp>*/>
-class _LIBCPP_TEMPLATE_VIS queue
-{
-public:
- typedef _Container container_type;
- typedef typename container_type::value_type value_type;
- typedef typename container_type::reference reference;
- typedef typename container_type::const_reference const_reference;
- typedef typename container_type::size_type size_type;
- static_assert((is_same<_Tp, value_type>::value), "" );
-
-protected:
- container_type c;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- queue()
- _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
- : c() {}
-
- _LIBCPP_INLINE_VISIBILITY
- queue(const queue& __q) : c(__q.c) {}
-
- _LIBCPP_INLINE_VISIBILITY
- queue& operator=(const queue& __q) {c = __q.c; return *this;}
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- queue(queue&& __q)
- _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
- : c(_VSTD::move(__q.c)) {}
-
- _LIBCPP_INLINE_VISIBILITY
- queue& operator=(queue&& __q)
- _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
- {c = _VSTD::move(__q.c); return *this;}
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- explicit queue(const container_type& __c) : c(__c) {}
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- explicit queue(container_type&& __c) : c(_VSTD::move(__c)) {}
-#endif // _LIBCPP_CXX03_LANG
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- explicit queue(const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type* = 0)
- : c(__a) {}
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- queue(const queue& __q, const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type* = 0)
- : c(__q.c, __a) {}
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- queue(const container_type& __c, const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type* = 0)
- : c(__c, __a) {}
-#ifndef _LIBCPP_CXX03_LANG
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- queue(container_type&& __c, const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type* = 0)
- : c(_VSTD::move(__c), __a) {}
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- queue(queue&& __q, const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type* = 0)
- : c(_VSTD::move(__q.c), __a) {}
-
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const {return c.empty();}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const {return c.size();}
-
- _LIBCPP_INLINE_VISIBILITY
- reference front() {return c.front();}
- _LIBCPP_INLINE_VISIBILITY
- const_reference front() const {return c.front();}
- _LIBCPP_INLINE_VISIBILITY
- reference back() {return c.back();}
- _LIBCPP_INLINE_VISIBILITY
- const_reference back() const {return c.back();}
-
- _LIBCPP_INLINE_VISIBILITY
- void push(const value_type& __v) {c.push_back(__v);}
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- void push(value_type&& __v) {c.push_back(_VSTD::move(__v));}
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
-#if _LIBCPP_STD_VER > 14
- decltype(auto) emplace(_Args&&... __args)
- { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
-#else
- void emplace(_Args&&... __args)
- { c.emplace_back(_VSTD::forward<_Args>(__args)...);}
-#endif
-#endif // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- void pop() {c.pop_front();}
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(queue& __q)
- _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
- {
- using _VSTD::swap;
- swap(c, __q.c);
- }
-
- template <class _T1, class _C1>
- friend
- _LIBCPP_INLINE_VISIBILITY
- bool
- operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
-
- template <class _T1, class _C1>
- friend
- _LIBCPP_INLINE_VISIBILITY
- bool
- operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
-};
-
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-template<class _Container,
- class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type
->
-queue(_Container)
- -> queue<typename _Container::value_type, _Container>;
-
-template<class _Container,
- class _Alloc,
- class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type,
- class = typename enable_if< __is_allocator<_Alloc>::value, nullptr_t>::type
->
-queue(_Container, _Alloc)
- -> queue<typename _Container::value_type, _Container>;
-#endif
-
-template <class _Tp, class _Container>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
-{
- return __x.c == __y.c;
-}
-
-template <class _Tp, class _Container>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
-{
- return __x.c < __y.c;
-}
-
-template <class _Tp, class _Container>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _Tp, class _Container>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
-{
- return __y < __x;
-}
-
-template <class _Tp, class _Container>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
-{
- return !(__x < __y);
-}
-
-template <class _Tp, class _Container>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
-{
- return !(__y < __x);
-}
-
-template <class _Tp, class _Container>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if<
- __is_swappable<_Container>::value,
- void
->::type
-swap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-template <class _Tp, class _Container, class _Alloc>
-struct _LIBCPP_TEMPLATE_VIS uses_allocator<queue<_Tp, _Container>, _Alloc>
- : public uses_allocator<_Container, _Alloc>
-{
-};
-
-template <class _Tp, class _Container = vector<_Tp>,
- class _Compare = less<typename _Container::value_type> >
-class _LIBCPP_TEMPLATE_VIS priority_queue
-{
-public:
- typedef _Container container_type;
- typedef _Compare value_compare;
- typedef typename container_type::value_type value_type;
- typedef typename container_type::reference reference;
- typedef typename container_type::const_reference const_reference;
- typedef typename container_type::size_type size_type;
- static_assert((is_same<_Tp, value_type>::value), "" );
-
-protected:
- container_type c;
- value_compare comp;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- priority_queue()
- _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value &&
- is_nothrow_default_constructible<value_compare>::value)
- : c(), comp() {}
-
- _LIBCPP_INLINE_VISIBILITY
- priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {}
-
- _LIBCPP_INLINE_VISIBILITY
- priority_queue& operator=(const priority_queue& __q)
- {c = __q.c; comp = __q.comp; return *this;}
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- priority_queue(priority_queue&& __q)
- _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value &&
- is_nothrow_move_constructible<value_compare>::value)
- : c(_VSTD::move(__q.c)), comp(_VSTD::move(__q.comp)) {}
-
- _LIBCPP_INLINE_VISIBILITY
- priority_queue& operator=(priority_queue&& __q)
- _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value &&
- is_nothrow_move_assignable<value_compare>::value)
- {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;}
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- explicit priority_queue(const value_compare& __comp)
- : c(), comp(__comp) {}
- _LIBCPP_INLINE_VISIBILITY
- priority_queue(const value_compare& __comp, const container_type& __c);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- explicit priority_queue(const value_compare& __comp, container_type&& __c);
-#endif
- template <class _InputIter>
- _LIBCPP_INLINE_VISIBILITY
- priority_queue(_InputIter __f, _InputIter __l,
- const value_compare& __comp = value_compare());
- template <class _InputIter>
- _LIBCPP_INLINE_VISIBILITY
- priority_queue(_InputIter __f, _InputIter __l,
- const value_compare& __comp, const container_type& __c);
-#ifndef _LIBCPP_CXX03_LANG
- template <class _InputIter>
- _LIBCPP_INLINE_VISIBILITY
- priority_queue(_InputIter __f, _InputIter __l,
- const value_compare& __comp, container_type&& __c);
-#endif // _LIBCPP_CXX03_LANG
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- explicit priority_queue(const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type* = 0);
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- priority_queue(const value_compare& __comp, const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type* = 0);
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- priority_queue(const value_compare& __comp, const container_type& __c,
- const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type* = 0);
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- priority_queue(const priority_queue& __q, const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type* = 0);
-#ifndef _LIBCPP_CXX03_LANG
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- priority_queue(const value_compare& __comp, container_type&& __c,
- const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type* = 0);
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- priority_queue(priority_queue&& __q, const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type* = 0);
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const {return c.empty();}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const {return c.size();}
- _LIBCPP_INLINE_VISIBILITY
- const_reference top() const {return c.front();}
-
- _LIBCPP_INLINE_VISIBILITY
- void push(const value_type& __v);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- void push(value_type&& __v);
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- void emplace(_Args&&... __args);
-#endif // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- void pop();
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(priority_queue& __q)
- _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
- __is_nothrow_swappable<value_compare>::value);
-};
-
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-template <class _Compare,
- class _Container,
- class = typename enable_if<!__is_allocator<_Compare>::value, nullptr_t>::type,
- class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type
->
-priority_queue(_Compare, _Container)
- -> priority_queue<typename _Container::value_type, _Container, _Compare>;
-
-template<class _InputIterator,
- class _Compare = less<typename iterator_traits<_InputIterator>::value_type>,
- class _Container = vector<typename iterator_traits<_InputIterator>::value_type>,
- class = typename enable_if< __is_input_iterator<_InputIterator>::value, nullptr_t>::type,
- class = typename enable_if<!__is_allocator<_Compare>::value, nullptr_t>::type,
- class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type
->
-priority_queue(_InputIterator, _InputIterator, _Compare = _Compare(), _Container = _Container())
- -> priority_queue<typename iterator_traits<_InputIterator>::value_type, _Container, _Compare>;
-
-template<class _Compare,
- class _Container,
- class _Alloc,
- class = typename enable_if<!__is_allocator<_Compare>::value, nullptr_t>::type,
- class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type,
- class = typename enable_if< __is_allocator<_Alloc>::value, nullptr_t>::type
->
-priority_queue(_Compare, _Container, _Alloc)
- -> priority_queue<typename _Container::value_type, _Container, _Compare>;
-#endif
-
-template <class _Tp, class _Container, class _Compare>
-inline
-priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp,
- const container_type& __c)
- : c(__c),
- comp(__comp)
-{
- _VSTD::make_heap(c.begin(), c.end(), comp);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Container, class _Compare>
-inline
-priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
- container_type&& __c)
- : c(_VSTD::move(__c)),
- comp(__comp)
-{
- _VSTD::make_heap(c.begin(), c.end(), comp);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Container, class _Compare>
-template <class _InputIter>
-inline
-priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
- const value_compare& __comp)
- : c(__f, __l),
- comp(__comp)
-{
- _VSTD::make_heap(c.begin(), c.end(), comp);
-}
-
-template <class _Tp, class _Container, class _Compare>
-template <class _InputIter>
-inline
-priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
- const value_compare& __comp,
- const container_type& __c)
- : c(__c),
- comp(__comp)
-{
- c.insert(c.end(), __f, __l);
- _VSTD::make_heap(c.begin(), c.end(), comp);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Container, class _Compare>
-template <class _InputIter>
-inline
-priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
- const value_compare& __comp,
- container_type&& __c)
- : c(_VSTD::move(__c)),
- comp(__comp)
-{
- c.insert(c.end(), __f, __l);
- _VSTD::make_heap(c.begin(), c.end(), comp);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Container, class _Compare>
-template <class _Alloc>
-inline
-priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type*)
- : c(__a)
-{
-}
-
-template <class _Tp, class _Container, class _Compare>
-template <class _Alloc>
-inline
-priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
- const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type*)
- : c(__a),
- comp(__comp)
-{
-}
-
-template <class _Tp, class _Container, class _Compare>
-template <class _Alloc>
-inline
-priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
- const container_type& __c,
- const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type*)
- : c(__c, __a),
- comp(__comp)
-{
- _VSTD::make_heap(c.begin(), c.end(), comp);
-}
-
-template <class _Tp, class _Container, class _Compare>
-template <class _Alloc>
-inline
-priority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q,
- const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type*)
- : c(__q.c, __a),
- comp(__q.comp)
-{
- _VSTD::make_heap(c.begin(), c.end(), comp);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Container, class _Compare>
-template <class _Alloc>
-inline
-priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
- container_type&& __c,
- const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type*)
- : c(_VSTD::move(__c), __a),
- comp(__comp)
-{
- _VSTD::make_heap(c.begin(), c.end(), comp);
-}
-
-template <class _Tp, class _Container, class _Compare>
-template <class _Alloc>
-inline
-priority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q,
- const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type*)
- : c(_VSTD::move(__q.c), __a),
- comp(_VSTD::move(__q.comp))
-{
- _VSTD::make_heap(c.begin(), c.end(), comp);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Container, class _Compare>
-inline
-void
-priority_queue<_Tp, _Container, _Compare>::push(const value_type& __v)
-{
- c.push_back(__v);
- _VSTD::push_heap(c.begin(), c.end(), comp);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Container, class _Compare>
-inline
-void
-priority_queue<_Tp, _Container, _Compare>::push(value_type&& __v)
-{
- c.push_back(_VSTD::move(__v));
- _VSTD::push_heap(c.begin(), c.end(), comp);
-}
-
-template <class _Tp, class _Container, class _Compare>
-template <class... _Args>
-inline
-void
-priority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args)
-{
- c.emplace_back(_VSTD::forward<_Args>(__args)...);
- _VSTD::push_heap(c.begin(), c.end(), comp);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Container, class _Compare>
-inline
-void
-priority_queue<_Tp, _Container, _Compare>::pop()
-{
- _VSTD::pop_heap(c.begin(), c.end(), comp);
- c.pop_back();
-}
-
-template <class _Tp, class _Container, class _Compare>
-inline
-void
-priority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q)
- _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
- __is_nothrow_swappable<value_compare>::value)
-{
- using _VSTD::swap;
- swap(c, __q.c);
- swap(comp, __q.comp);
-}
-
-template <class _Tp, class _Container, class _Compare>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if<
- __is_swappable<_Container>::value
- && __is_swappable<_Compare>::value,
- void
->::type
-swap(priority_queue<_Tp, _Container, _Compare>& __x,
- priority_queue<_Tp, _Container, _Compare>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-template <class _Tp, class _Container, class _Compare, class _Alloc>
-struct _LIBCPP_TEMPLATE_VIS uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
- : public uses_allocator<_Container, _Alloc>
-{
-};
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_QUEUE
diff --git a/lib/libcxx/include/random b/lib/libcxx/include/random
deleted file mode 100644
index 724bd0fc215..00000000000
--- a/lib/libcxx/include/random
+++ /dev/null
@@ -1,6744 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- random -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_RANDOM
-#define _LIBCPP_RANDOM
-
-/*
- random synopsis
-
-#include <initializer_list>
-
-namespace std
-{
-
-// Engines
-
-template <class UIntType, UIntType a, UIntType c, UIntType m>
-class linear_congruential_engine
-{
-public:
- // types
- typedef UIntType result_type;
-
- // engine characteristics
- static constexpr result_type multiplier = a;
- static constexpr result_type increment = c;
- static constexpr result_type modulus = m;
- static constexpr result_type min() { return c == 0u ? 1u: 0u;}
- static constexpr result_type max() { return m - 1u;}
- static constexpr result_type default_seed = 1u;
-
- // constructors and seeding functions
- explicit linear_congruential_engine(result_type s = default_seed);
- template<class Sseq> explicit linear_congruential_engine(Sseq& q);
- void seed(result_type s = default_seed);
- template<class Sseq> void seed(Sseq& q);
-
- // generating functions
- result_type operator()();
- void discard(unsigned long long z);
-};
-
-template <class UIntType, UIntType a, UIntType c, UIntType m>
-bool
-operator==(const linear_congruential_engine<UIntType, a, c, m>& x,
- const linear_congruential_engine<UIntType, a, c, m>& y);
-
-template <class UIntType, UIntType a, UIntType c, UIntType m>
-bool
-operator!=(const linear_congruential_engine<UIntType, a, c, m>& x,
- const linear_congruential_engine<UIntType, a, c, m>& y);
-
-template <class charT, class traits,
- class UIntType, UIntType a, UIntType c, UIntType m>
-basic_ostream<charT, traits>&
-operator<<(basic_ostream<charT, traits>& os,
- const linear_congruential_engine<UIntType, a, c, m>& x);
-
-template <class charT, class traits,
- class UIntType, UIntType a, UIntType c, UIntType m>
-basic_istream<charT, traits>&
-operator>>(basic_istream<charT, traits>& is,
- linear_congruential_engine<UIntType, a, c, m>& x);
-
-template <class UIntType, size_t w, size_t n, size_t m, size_t r,
- UIntType a, size_t u, UIntType d, size_t s,
- UIntType b, size_t t, UIntType c, size_t l, UIntType f>
-class mersenne_twister_engine
-{
-public:
- // types
- typedef UIntType result_type;
-
- // engine characteristics
- static constexpr size_t word_size = w;
- static constexpr size_t state_size = n;
- static constexpr size_t shift_size = m;
- static constexpr size_t mask_bits = r;
- static constexpr result_type xor_mask = a;
- static constexpr size_t tempering_u = u;
- static constexpr result_type tempering_d = d;
- static constexpr size_t tempering_s = s;
- static constexpr result_type tempering_b = b;
- static constexpr size_t tempering_t = t;
- static constexpr result_type tempering_c = c;
- static constexpr size_t tempering_l = l;
- static constexpr result_type initialization_multiplier = f;
- static constexpr result_type min () { return 0; }
- static constexpr result_type max() { return 2^w - 1; }
- static constexpr result_type default_seed = 5489u;
-
- // constructors and seeding functions
- explicit mersenne_twister_engine(result_type value = default_seed);
- template<class Sseq> explicit mersenne_twister_engine(Sseq& q);
- void seed(result_type value = default_seed);
- template<class Sseq> void seed(Sseq& q);
-
- // generating functions
- result_type operator()();
- void discard(unsigned long long z);
-};
-
-template <class UIntType, size_t w, size_t n, size_t m, size_t r,
- UIntType a, size_t u, UIntType d, size_t s,
- UIntType b, size_t t, UIntType c, size_t l, UIntType f>
-bool
-operator==(
- const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x,
- const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& y);
-
-template <class UIntType, size_t w, size_t n, size_t m, size_t r,
- UIntType a, size_t u, UIntType d, size_t s,
- UIntType b, size_t t, UIntType c, size_t l, UIntType f>
-bool
-operator!=(
- const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x,
- const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& y);
-
-template <class charT, class traits,
- class UIntType, size_t w, size_t n, size_t m, size_t r,
- UIntType a, size_t u, UIntType d, size_t s,
- UIntType b, size_t t, UIntType c, size_t l, UIntType f>
-basic_ostream<charT, traits>&
-operator<<(basic_ostream<charT, traits>& os,
- const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x);
-
-template <class charT, class traits,
- class UIntType, size_t w, size_t n, size_t m, size_t r,
- UIntType a, size_t u, UIntType d, size_t s,
- UIntType b, size_t t, UIntType c, size_t l, UIntType f>
-basic_istream<charT, traits>&
-operator>>(basic_istream<charT, traits>& is,
- mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x);
-
-template<class UIntType, size_t w, size_t s, size_t r>
-class subtract_with_carry_engine
-{
-public:
- // types
- typedef UIntType result_type;
-
- // engine characteristics
- static constexpr size_t word_size = w;
- static constexpr size_t short_lag = s;
- static constexpr size_t long_lag = r;
- static constexpr result_type min() { return 0; }
- static constexpr result_type max() { return m-1; }
- static constexpr result_type default_seed = 19780503u;
-
- // constructors and seeding functions
- explicit subtract_with_carry_engine(result_type value = default_seed);
- template<class Sseq> explicit subtract_with_carry_engine(Sseq& q);
- void seed(result_type value = default_seed);
- template<class Sseq> void seed(Sseq& q);
-
- // generating functions
- result_type operator()();
- void discard(unsigned long long z);
-};
-
-template<class UIntType, size_t w, size_t s, size_t r>
-bool
-operator==(
- const subtract_with_carry_engine<UIntType, w, s, r>& x,
- const subtract_with_carry_engine<UIntType, w, s, r>& y);
-
-template<class UIntType, size_t w, size_t s, size_t r>
-bool
-operator!=(
- const subtract_with_carry_engine<UIntType, w, s, r>& x,
- const subtract_with_carry_engine<UIntType, w, s, r>& y);
-
-template <class charT, class traits,
- class UIntType, size_t w, size_t s, size_t r>
-basic_ostream<charT, traits>&
-operator<<(basic_ostream<charT, traits>& os,
- const subtract_with_carry_engine<UIntType, w, s, r>& x);
-
-template <class charT, class traits,
- class UIntType, size_t w, size_t s, size_t r>
-basic_istream<charT, traits>&
-operator>>(basic_istream<charT, traits>& is,
- subtract_with_carry_engine<UIntType, w, s, r>& x);
-
-template<class Engine, size_t p, size_t r>
-class discard_block_engine
-{
-public:
- // types
- typedef typename Engine::result_type result_type;
-
- // engine characteristics
- static constexpr size_t block_size = p;
- static constexpr size_t used_block = r;
- static constexpr result_type min() { return Engine::min(); }
- static constexpr result_type max() { return Engine::max(); }
-
- // constructors and seeding functions
- discard_block_engine();
- explicit discard_block_engine(const Engine& e);
- explicit discard_block_engine(Engine&& e);
- explicit discard_block_engine(result_type s);
- template<class Sseq> explicit discard_block_engine(Sseq& q);
- void seed();
- void seed(result_type s);
- template<class Sseq> void seed(Sseq& q);
-
- // generating functions
- result_type operator()();
- void discard(unsigned long long z);
-
- // property functions
- const Engine& base() const noexcept;
-};
-
-template<class Engine, size_t p, size_t r>
-bool
-operator==(
- const discard_block_engine<Engine, p, r>& x,
- const discard_block_engine<Engine, p, r>& y);
-
-template<class Engine, size_t p, size_t r>
-bool
-operator!=(
- const discard_block_engine<Engine, p, r>& x,
- const discard_block_engine<Engine, p, r>& y);
-
-template <class charT, class traits,
- class Engine, size_t p, size_t r>
-basic_ostream<charT, traits>&
-operator<<(basic_ostream<charT, traits>& os,
- const discard_block_engine<Engine, p, r>& x);
-
-template <class charT, class traits,
- class Engine, size_t p, size_t r>
-basic_istream<charT, traits>&
-operator>>(basic_istream<charT, traits>& is,
- discard_block_engine<Engine, p, r>& x);
-
-template<class Engine, size_t w, class UIntType>
-class independent_bits_engine
-{
-public:
- // types
- typedef UIntType result_type;
-
- // engine characteristics
- static constexpr result_type min() { return 0; }
- static constexpr result_type max() { return 2^w - 1; }
-
- // constructors and seeding functions
- independent_bits_engine();
- explicit independent_bits_engine(const Engine& e);
- explicit independent_bits_engine(Engine&& e);
- explicit independent_bits_engine(result_type s);
- template<class Sseq> explicit independent_bits_engine(Sseq& q);
- void seed();
- void seed(result_type s);
- template<class Sseq> void seed(Sseq& q);
-
- // generating functions
- result_type operator()(); void discard(unsigned long long z);
-
- // property functions
- const Engine& base() const noexcept;
-};
-
-template<class Engine, size_t w, class UIntType>
-bool
-operator==(
- const independent_bits_engine<Engine, w, UIntType>& x,
- const independent_bits_engine<Engine, w, UIntType>& y);
-
-template<class Engine, size_t w, class UIntType>
-bool
-operator!=(
- const independent_bits_engine<Engine, w, UIntType>& x,
- const independent_bits_engine<Engine, w, UIntType>& y);
-
-template <class charT, class traits,
- class Engine, size_t w, class UIntType>
-basic_ostream<charT, traits>&
-operator<<(basic_ostream<charT, traits>& os,
- const independent_bits_engine<Engine, w, UIntType>& x);
-
-template <class charT, class traits,
- class Engine, size_t w, class UIntType>
-basic_istream<charT, traits>&
-operator>>(basic_istream<charT, traits>& is,
- independent_bits_engine<Engine, w, UIntType>& x);
-
-template<class Engine, size_t k>
-class shuffle_order_engine
-{
-public:
- // types
- typedef typename Engine::result_type result_type;
-
- // engine characteristics
- static constexpr size_t table_size = k;
- static constexpr result_type min() { return Engine::min; }
- static constexpr result_type max() { return Engine::max; }
-
- // constructors and seeding functions
- shuffle_order_engine();
- explicit shuffle_order_engine(const Engine& e);
- explicit shuffle_order_engine(Engine&& e);
- explicit shuffle_order_engine(result_type s);
- template<class Sseq> explicit shuffle_order_engine(Sseq& q);
- void seed();
- void seed(result_type s);
- template<class Sseq> void seed(Sseq& q);
-
- // generating functions
- result_type operator()();
- void discard(unsigned long long z);
-
- // property functions
- const Engine& base() const noexcept;
-};
-
-template<class Engine, size_t k>
-bool
-operator==(
- const shuffle_order_engine<Engine, k>& x,
- const shuffle_order_engine<Engine, k>& y);
-
-template<class Engine, size_t k>
-bool
-operator!=(
- const shuffle_order_engine<Engine, k>& x,
- const shuffle_order_engine<Engine, k>& y);
-
-template <class charT, class traits,
- class Engine, size_t k>
-basic_ostream<charT, traits>&
-operator<<(basic_ostream<charT, traits>& os,
- const shuffle_order_engine<Engine, k>& x);
-
-template <class charT, class traits,
- class Engine, size_t k>
-basic_istream<charT, traits>&
-operator>>(basic_istream<charT, traits>& is,
- shuffle_order_engine<Engine, k>& x);
-
-typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647>
- minstd_rand0;
-typedef linear_congruential_engine<uint_fast32_t, 48271, 0, 2147483647>
- minstd_rand;
-typedef mersenne_twister_engine<uint_fast32_t, 32, 624, 397, 31,
- 0x9908b0df,
- 11, 0xffffffff,
- 7, 0x9d2c5680,
- 15, 0xefc60000,
- 18, 1812433253> mt19937;
-typedef mersenne_twister_engine<uint_fast64_t, 64, 312, 156, 31,
- 0xb5026f5aa96619e9,
- 29, 0x5555555555555555,
- 17, 0x71d67fffeda60000,
- 37, 0xfff7eee000000000,
- 43, 6364136223846793005> mt19937_64;
-typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24> ranlux24_base;
-typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12> ranlux48_base;
-typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24;
-typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48;
-typedef shuffle_order_engine<minstd_rand0, 256> knuth_b;
-typedef minstd_rand default_random_engine;
-
-// Generators
-
-class random_device
-{
-public:
- // types
- typedef unsigned int result_type;
-
- // generator characteristics
- static constexpr result_type min() { return numeric_limits<result_type>::min(); }
- static constexpr result_type max() { return numeric_limits<result_type>::max(); }
-
- // constructors
- explicit random_device(const string& token = "/dev/urandom");
-
- // generating functions
- result_type operator()();
-
- // property functions
- double entropy() const noexcept;
-
- // no copy functions
- random_device(const random_device& ) = delete;
- void operator=(const random_device& ) = delete;
-};
-
-// Utilities
-
-class seed_seq
-{
-public:
- // types
- typedef uint_least32_t result_type;
-
- // constructors
- seed_seq();
- template<class T>
- seed_seq(initializer_list<T> il);
- template<class InputIterator>
- seed_seq(InputIterator begin, InputIterator end);
-
- // generating functions
- template<class RandomAccessIterator>
- void generate(RandomAccessIterator begin, RandomAccessIterator end);
-
- // property functions
- size_t size() const;
- template<class OutputIterator>
- void param(OutputIterator dest) const;
-
- // no copy functions
- seed_seq(const seed_seq&) = delete;
- void operator=(const seed_seq& ) = delete;
-};
-
-template<class RealType, size_t bits, class URNG>
- RealType generate_canonical(URNG& g);
-
-// Distributions
-
-template<class IntType = int>
-class uniform_int_distribution
-{
-public:
- // types
- typedef IntType result_type;
-
- class param_type
- {
- public:
- typedef uniform_int_distribution distribution_type;
-
- explicit param_type(IntType a = 0,
- IntType b = numeric_limits<IntType>::max());
-
- result_type a() const;
- result_type b() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructors and reset functions
- explicit uniform_int_distribution(IntType a = 0,
- IntType b = numeric_limits<IntType>::max());
- explicit uniform_int_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- result_type a() const;
- result_type b() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const uniform_int_distribution& x,
- const uniform_int_distribution& y);
- friend bool operator!=(const uniform_int_distribution& x,
- const uniform_int_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const uniform_int_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- uniform_int_distribution& x);
-};
-
-template<class RealType = double>
-class uniform_real_distribution
-{
-public:
- // types
- typedef RealType result_type;
-
- class param_type
- {
- public:
- typedef uniform_real_distribution distribution_type;
-
- explicit param_type(RealType a = 0,
- RealType b = 1);
-
- result_type a() const;
- result_type b() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructors and reset functions
- explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0);
- explicit uniform_real_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- result_type a() const;
- result_type b() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const uniform_real_distribution& x,
- const uniform_real_distribution& y);
- friend bool operator!=(const uniform_real_distribution& x,
- const uniform_real_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const uniform_real_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- uniform_real_distribution& x);
-};
-
-class bernoulli_distribution
-{
-public:
- // types
- typedef bool result_type;
-
- class param_type
- {
- public:
- typedef bernoulli_distribution distribution_type;
-
- explicit param_type(double p = 0.5);
-
- double p() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructors and reset functions
- explicit bernoulli_distribution(double p = 0.5);
- explicit bernoulli_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- double p() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const bernoulli_distribution& x,
- const bernoulli_distribution& y);
- friend bool operator!=(const bernoulli_distribution& x,
- const bernoulli_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const bernoulli_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- bernoulli_distribution& x);
-};
-
-template<class IntType = int>
-class binomial_distribution
-{
-public:
- // types
- typedef IntType result_type;
-
- class param_type
- {
- public:
- typedef binomial_distribution distribution_type;
-
- explicit param_type(IntType t = 1, double p = 0.5);
-
- IntType t() const;
- double p() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructors and reset functions
- explicit binomial_distribution(IntType t = 1, double p = 0.5);
- explicit binomial_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- IntType t() const;
- double p() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const binomial_distribution& x,
- const binomial_distribution& y);
- friend bool operator!=(const binomial_distribution& x,
- const binomial_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const binomial_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- binomial_distribution& x);
-};
-
-template<class IntType = int>
-class geometric_distribution
-{
-public:
- // types
- typedef IntType result_type;
-
- class param_type
- {
- public:
- typedef geometric_distribution distribution_type;
-
- explicit param_type(double p = 0.5);
-
- double p() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructors and reset functions
- explicit geometric_distribution(double p = 0.5);
- explicit geometric_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- double p() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const geometric_distribution& x,
- const geometric_distribution& y);
- friend bool operator!=(const geometric_distribution& x,
- const geometric_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const geometric_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- geometric_distribution& x);
-};
-
-template<class IntType = int>
-class negative_binomial_distribution
-{
-public:
- // types
- typedef IntType result_type;
-
- class param_type
- {
- public:
- typedef negative_binomial_distribution distribution_type;
-
- explicit param_type(result_type k = 1, double p = 0.5);
-
- result_type k() const;
- double p() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructor and reset functions
- explicit negative_binomial_distribution(result_type k = 1, double p = 0.5);
- explicit negative_binomial_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- result_type k() const;
- double p() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const negative_binomial_distribution& x,
- const negative_binomial_distribution& y);
- friend bool operator!=(const negative_binomial_distribution& x,
- const negative_binomial_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const negative_binomial_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- negative_binomial_distribution& x);
-};
-
-template<class IntType = int>
-class poisson_distribution
-{
-public:
- // types
- typedef IntType result_type;
-
- class param_type
- {
- public:
- typedef poisson_distribution distribution_type;
-
- explicit param_type(double mean = 1.0);
-
- double mean() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructors and reset functions
- explicit poisson_distribution(double mean = 1.0);
- explicit poisson_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- double mean() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const poisson_distribution& x,
- const poisson_distribution& y);
- friend bool operator!=(const poisson_distribution& x,
- const poisson_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const poisson_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- poisson_distribution& x);
-};
-
-template<class RealType = double>
-class exponential_distribution
-{
-public:
- // types
- typedef RealType result_type;
-
- class param_type
- {
- public:
- typedef exponential_distribution distribution_type;
-
- explicit param_type(result_type lambda = 1.0);
-
- result_type lambda() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructors and reset functions
- explicit exponential_distribution(result_type lambda = 1.0);
- explicit exponential_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- result_type lambda() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const exponential_distribution& x,
- const exponential_distribution& y);
- friend bool operator!=(const exponential_distribution& x,
- const exponential_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const exponential_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- exponential_distribution& x);
-};
-
-template<class RealType = double>
-class gamma_distribution
-{
-public:
- // types
- typedef RealType result_type;
-
- class param_type
- {
- public:
- typedef gamma_distribution distribution_type;
-
- explicit param_type(result_type alpha = 1, result_type beta = 1);
-
- result_type alpha() const;
- result_type beta() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructors and reset functions
- explicit gamma_distribution(result_type alpha = 1, result_type beta = 1);
- explicit gamma_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- result_type alpha() const;
- result_type beta() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const gamma_distribution& x,
- const gamma_distribution& y);
- friend bool operator!=(const gamma_distribution& x,
- const gamma_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const gamma_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- gamma_distribution& x);
-};
-
-template<class RealType = double>
-class weibull_distribution
-{
-public:
- // types
- typedef RealType result_type;
-
- class param_type
- {
- public:
- typedef weibull_distribution distribution_type;
-
- explicit param_type(result_type alpha = 1, result_type beta = 1);
-
- result_type a() const;
- result_type b() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructor and reset functions
- explicit weibull_distribution(result_type a = 1, result_type b = 1);
- explicit weibull_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- result_type a() const;
- result_type b() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const weibull_distribution& x,
- const weibull_distribution& y);
- friend bool operator!=(const weibull_distribution& x,
- const weibull_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const weibull_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- weibull_distribution& x);
-};
-
-template<class RealType = double>
-class extreme_value_distribution
-{
-public:
- // types
- typedef RealType result_type;
-
- class param_type
- {
- public:
- typedef extreme_value_distribution distribution_type;
-
- explicit param_type(result_type a = 0, result_type b = 1);
-
- result_type a() const;
- result_type b() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructor and reset functions
- explicit extreme_value_distribution(result_type a = 0, result_type b = 1);
- explicit extreme_value_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- result_type a() const;
- result_type b() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const extreme_value_distribution& x,
- const extreme_value_distribution& y);
- friend bool operator!=(const extreme_value_distribution& x,
- const extreme_value_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const extreme_value_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- extreme_value_distribution& x);
-};
-
-template<class RealType = double>
-class normal_distribution
-{
-public:
- // types
- typedef RealType result_type;
-
- class param_type
- {
- public:
- typedef normal_distribution distribution_type;
-
- explicit param_type(result_type mean = 0, result_type stddev = 1);
-
- result_type mean() const;
- result_type stddev() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructors and reset functions
- explicit normal_distribution(result_type mean = 0, result_type stddev = 1);
- explicit normal_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- result_type mean() const;
- result_type stddev() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const normal_distribution& x,
- const normal_distribution& y);
- friend bool operator!=(const normal_distribution& x,
- const normal_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const normal_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- normal_distribution& x);
-};
-
-template<class RealType = double>
-class lognormal_distribution
-{
-public:
- // types
- typedef RealType result_type;
-
- class param_type
- {
- public:
- typedef lognormal_distribution distribution_type;
-
- explicit param_type(result_type m = 0, result_type s = 1);
-
- result_type m() const;
- result_type s() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructor and reset functions
- explicit lognormal_distribution(result_type m = 0, result_type s = 1);
- explicit lognormal_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- result_type m() const;
- result_type s() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const lognormal_distribution& x,
- const lognormal_distribution& y);
- friend bool operator!=(const lognormal_distribution& x,
- const lognormal_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const lognormal_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- lognormal_distribution& x);
-};
-
-template<class RealType = double>
-class chi_squared_distribution
-{
-public:
- // types
- typedef RealType result_type;
-
- class param_type
- {
- public:
- typedef chi_squared_distribution distribution_type;
-
- explicit param_type(result_type n = 1);
-
- result_type n() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructor and reset functions
- explicit chi_squared_distribution(result_type n = 1);
- explicit chi_squared_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- result_type n() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const chi_squared_distribution& x,
- const chi_squared_distribution& y);
- friend bool operator!=(const chi_squared_distribution& x,
- const chi_squared_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const chi_squared_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- chi_squared_distribution& x);
-};
-
-template<class RealType = double>
-class cauchy_distribution
-{
-public:
- // types
- typedef RealType result_type;
-
- class param_type
- {
- public:
- typedef cauchy_distribution distribution_type;
-
- explicit param_type(result_type a = 0, result_type b = 1);
-
- result_type a() const;
- result_type b() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructor and reset functions
- explicit cauchy_distribution(result_type a = 0, result_type b = 1);
- explicit cauchy_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- result_type a() const;
- result_type b() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const cauchy_distribution& x,
- const cauchy_distribution& y);
- friend bool operator!=(const cauchy_distribution& x,
- const cauchy_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const cauchy_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- cauchy_distribution& x);
-};
-
-template<class RealType = double>
-class fisher_f_distribution
-{
-public:
- // types
- typedef RealType result_type;
-
- class param_type
- {
- public:
- typedef fisher_f_distribution distribution_type;
-
- explicit param_type(result_type m = 1, result_type n = 1);
-
- result_type m() const;
- result_type n() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructor and reset functions
- explicit fisher_f_distribution(result_type m = 1, result_type n = 1);
- explicit fisher_f_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- result_type m() const;
- result_type n() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const fisher_f_distribution& x,
- const fisher_f_distribution& y);
- friend bool operator!=(const fisher_f_distribution& x,
- const fisher_f_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const fisher_f_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- fisher_f_distribution& x);
-};
-
-template<class RealType = double>
-class student_t_distribution
-{
-public:
- // types
- typedef RealType result_type;
-
- class param_type
- {
- public:
- typedef student_t_distribution distribution_type;
-
- explicit param_type(result_type n = 1);
-
- result_type n() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructor and reset functions
- explicit student_t_distribution(result_type n = 1);
- explicit student_t_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- result_type n() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const student_t_distribution& x,
- const student_t_distribution& y);
- friend bool operator!=(const student_t_distribution& x,
- const student_t_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const student_t_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- student_t_distribution& x);
-};
-
-template<class IntType = int>
-class discrete_distribution
-{
-public:
- // types
- typedef IntType result_type;
-
- class param_type
- {
- public:
- typedef discrete_distribution distribution_type;
-
- param_type();
- template<class InputIterator>
- param_type(InputIterator firstW, InputIterator lastW);
- param_type(initializer_list<double> wl);
- template<class UnaryOperation>
- param_type(size_t nw, double xmin, double xmax, UnaryOperation fw);
-
- vector<double> probabilities() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructor and reset functions
- discrete_distribution();
- template<class InputIterator>
- discrete_distribution(InputIterator firstW, InputIterator lastW);
- discrete_distribution(initializer_list<double> wl);
- template<class UnaryOperation>
- discrete_distribution(size_t nw, double xmin, double xmax,
- UnaryOperation fw);
- explicit discrete_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- vector<double> probabilities() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const discrete_distribution& x,
- const discrete_distribution& y);
- friend bool operator!=(const discrete_distribution& x,
- const discrete_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const discrete_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- discrete_distribution& x);
-};
-
-template<class RealType = double>
-class piecewise_constant_distribution
-{
- // types
- typedef RealType result_type;
-
- class param_type
- {
- public:
- typedef piecewise_constant_distribution distribution_type;
-
- param_type();
- template<class InputIteratorB, class InputIteratorW>
- param_type(InputIteratorB firstB, InputIteratorB lastB,
- InputIteratorW firstW);
- template<class UnaryOperation>
- param_type(initializer_list<result_type> bl, UnaryOperation fw);
- template<class UnaryOperation>
- param_type(size_t nw, result_type xmin, result_type xmax,
- UnaryOperation fw);
-
- vector<result_type> intervals() const;
- vector<result_type> densities() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructor and reset functions
- piecewise_constant_distribution();
- template<class InputIteratorB, class InputIteratorW>
- piecewise_constant_distribution(InputIteratorB firstB,
- InputIteratorB lastB,
- InputIteratorW firstW);
- template<class UnaryOperation>
- piecewise_constant_distribution(initializer_list<result_type> bl,
- UnaryOperation fw);
- template<class UnaryOperation>
- piecewise_constant_distribution(size_t nw, result_type xmin,
- result_type xmax, UnaryOperation fw);
- explicit piecewise_constant_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- vector<result_type> intervals() const;
- vector<result_type> densities() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const piecewise_constant_distribution& x,
- const piecewise_constant_distribution& y);
- friend bool operator!=(const piecewise_constant_distribution& x,
- const piecewise_constant_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const piecewise_constant_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- piecewise_constant_distribution& x);
-};
-
-template<class RealType = double>
-class piecewise_linear_distribution
-{
- // types
- typedef RealType result_type;
-
- class param_type
- {
- public:
- typedef piecewise_linear_distribution distribution_type;
-
- param_type();
- template<class InputIteratorB, class InputIteratorW>
- param_type(InputIteratorB firstB, InputIteratorB lastB,
- InputIteratorW firstW);
- template<class UnaryOperation>
- param_type(initializer_list<result_type> bl, UnaryOperation fw);
- template<class UnaryOperation>
- param_type(size_t nw, result_type xmin, result_type xmax,
- UnaryOperation fw);
-
- vector<result_type> intervals() const;
- vector<result_type> densities() const;
-
- friend bool operator==(const param_type& x, const param_type& y);
- friend bool operator!=(const param_type& x, const param_type& y);
- };
-
- // constructor and reset functions
- piecewise_linear_distribution();
- template<class InputIteratorB, class InputIteratorW>
- piecewise_linear_distribution(InputIteratorB firstB,
- InputIteratorB lastB,
- InputIteratorW firstW);
-
- template<class UnaryOperation>
- piecewise_linear_distribution(initializer_list<result_type> bl,
- UnaryOperation fw);
-
- template<class UnaryOperation>
- piecewise_linear_distribution(size_t nw, result_type xmin,
- result_type xmax, UnaryOperation fw);
-
- explicit piecewise_linear_distribution(const param_type& parm);
- void reset();
-
- // generating functions
- template<class URNG> result_type operator()(URNG& g);
- template<class URNG> result_type operator()(URNG& g, const param_type& parm);
-
- // property functions
- vector<result_type> intervals() const;
- vector<result_type> densities() const;
-
- param_type param() const;
- void param(const param_type& parm);
-
- result_type min() const;
- result_type max() const;
-
- friend bool operator==(const piecewise_linear_distribution& x,
- const piecewise_linear_distribution& y);
- friend bool operator!=(const piecewise_linear_distribution& x,
- const piecewise_linear_distribution& y);
-
- template <class charT, class traits>
- friend
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- const piecewise_linear_distribution& x);
-
- template <class charT, class traits>
- friend
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is,
- piecewise_linear_distribution& x);
-};
-
-} // std
-*/
-
-#include <__config>
-#include <cstddef>
-#include <cstdint>
-#include <cmath>
-#include <type_traits>
-#include <initializer_list>
-#include <limits>
-#include <algorithm>
-#include <numeric>
-#include <vector>
-#include <string>
-#include <istream>
-#include <ostream>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-// __is_seed_sequence
-
-template <class _Sseq, class _Engine>
-struct __is_seed_sequence
-{
- static _LIBCPP_CONSTEXPR const bool value =
- !is_convertible<_Sseq, typename _Engine::result_type>::value &&
- !is_same<typename remove_cv<_Sseq>::type, _Engine>::value;
-};
-
-// linear_congruential_engine
-
-template <unsigned long long __a, unsigned long long __c,
- unsigned long long __m, unsigned long long _Mp,
- bool _MightOverflow = (__a != 0 && __m != 0 && __m-1 > (_Mp-__c)/__a)>
-struct __lce_ta;
-
-// 64
-
-template <unsigned long long __a, unsigned long long __c, unsigned long long __m>
-struct __lce_ta<__a, __c, __m, (unsigned long long)(~0), true>
-{
- typedef unsigned long long result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- // Schrage's algorithm
- const result_type __q = __m / __a;
- const result_type __r = __m % __a;
- const result_type __t0 = __a * (__x % __q);
- const result_type __t1 = __r * (__x / __q);
- __x = __t0 + (__t0 < __t1) * __m - __t1;
- __x += __c - (__x >= __m - __c) * __m;
- return __x;
- }
-};
-
-template <unsigned long long __a, unsigned long long __m>
-struct __lce_ta<__a, 0, __m, (unsigned long long)(~0), true>
-{
- typedef unsigned long long result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- // Schrage's algorithm
- const result_type __q = __m / __a;
- const result_type __r = __m % __a;
- const result_type __t0 = __a * (__x % __q);
- const result_type __t1 = __r * (__x / __q);
- __x = __t0 + (__t0 < __t1) * __m - __t1;
- return __x;
- }
-};
-
-template <unsigned long long __a, unsigned long long __c, unsigned long long __m>
-struct __lce_ta<__a, __c, __m, (unsigned long long)(~0), false>
-{
- typedef unsigned long long result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- return (__a * __x + __c) % __m;
- }
-};
-
-template <unsigned long long __a, unsigned long long __c>
-struct __lce_ta<__a, __c, 0, (unsigned long long)(~0), false>
-{
- typedef unsigned long long result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- return __a * __x + __c;
- }
-};
-
-// 32
-
-template <unsigned long long _Ap, unsigned long long _Cp, unsigned long long _Mp>
-struct __lce_ta<_Ap, _Cp, _Mp, unsigned(~0), true>
-{
- typedef unsigned result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- const result_type __a = static_cast<result_type>(_Ap);
- const result_type __c = static_cast<result_type>(_Cp);
- const result_type __m = static_cast<result_type>(_Mp);
- // Schrage's algorithm
- const result_type __q = __m / __a;
- const result_type __r = __m % __a;
- const result_type __t0 = __a * (__x % __q);
- const result_type __t1 = __r * (__x / __q);
- __x = __t0 + (__t0 < __t1) * __m - __t1;
- __x += __c - (__x >= __m - __c) * __m;
- return __x;
- }
-};
-
-template <unsigned long long _Ap, unsigned long long _Mp>
-struct __lce_ta<_Ap, 0, _Mp, unsigned(~0), true>
-{
- typedef unsigned result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- const result_type __a = static_cast<result_type>(_Ap);
- const result_type __m = static_cast<result_type>(_Mp);
- // Schrage's algorithm
- const result_type __q = __m / __a;
- const result_type __r = __m % __a;
- const result_type __t0 = __a * (__x % __q);
- const result_type __t1 = __r * (__x / __q);
- __x = __t0 + (__t0 < __t1) * __m - __t1;
- return __x;
- }
-};
-
-template <unsigned long long _Ap, unsigned long long _Cp, unsigned long long _Mp>
-struct __lce_ta<_Ap, _Cp, _Mp, unsigned(~0), false>
-{
- typedef unsigned result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- const result_type __a = static_cast<result_type>(_Ap);
- const result_type __c = static_cast<result_type>(_Cp);
- const result_type __m = static_cast<result_type>(_Mp);
- return (__a * __x + __c) % __m;
- }
-};
-
-template <unsigned long long _Ap, unsigned long long _Cp>
-struct __lce_ta<_Ap, _Cp, 0, unsigned(~0), false>
-{
- typedef unsigned result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- const result_type __a = static_cast<result_type>(_Ap);
- const result_type __c = static_cast<result_type>(_Cp);
- return __a * __x + __c;
- }
-};
-
-// 16
-
-template <unsigned long long __a, unsigned long long __c, unsigned long long __m, bool __b>
-struct __lce_ta<__a, __c, __m, (unsigned short)(~0), __b>
-{
- typedef unsigned short result_type;
- _LIBCPP_INLINE_VISIBILITY
- static result_type next(result_type __x)
- {
- return static_cast<result_type>(__lce_ta<__a, __c, __m, unsigned(~0)>::next(__x));
- }
-};
-
-template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
-class _LIBCPP_TEMPLATE_VIS linear_congruential_engine;
-
-template <class _CharT, class _Traits,
- class _Up, _Up _Ap, _Up _Cp, _Up _Np>
-_LIBCPP_INLINE_VISIBILITY
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const linear_congruential_engine<_Up, _Ap, _Cp, _Np>&);
-
-template <class _CharT, class _Traits,
- class _Up, _Up _Ap, _Up _Cp, _Up _Np>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- linear_congruential_engine<_Up, _Ap, _Cp, _Np>& __x);
-
-template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
-class _LIBCPP_TEMPLATE_VIS linear_congruential_engine
-{
-public:
- // types
- typedef _UIntType result_type;
-
-private:
- result_type __x_;
-
- static _LIBCPP_CONSTEXPR const result_type _Mp = result_type(~0);
-
- static_assert(__m == 0 || __a < __m, "linear_congruential_engine invalid parameters");
- static_assert(__m == 0 || __c < __m, "linear_congruential_engine invalid parameters");
-public:
- static _LIBCPP_CONSTEXPR const result_type _Min = __c == 0u ? 1u: 0u;
- static _LIBCPP_CONSTEXPR const result_type _Max = __m - 1u;
- static_assert(_Min < _Max, "linear_congruential_engine invalid parameters");
-
- // engine characteristics
- static _LIBCPP_CONSTEXPR const result_type multiplier = __a;
- static _LIBCPP_CONSTEXPR const result_type increment = __c;
- static _LIBCPP_CONSTEXPR const result_type modulus = __m;
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type min() {return _Min;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type max() {return _Max;}
- static _LIBCPP_CONSTEXPR const result_type default_seed = 1u;
-
- // constructors and seeding functions
- _LIBCPP_INLINE_VISIBILITY
- explicit linear_congruential_engine(result_type __s = default_seed)
- {seed(__s);}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- explicit linear_congruential_engine(_Sseq& __q,
- typename enable_if<__is_seed_sequence<_Sseq, linear_congruential_engine>::value>::type* = 0)
- {seed(__q);}
- _LIBCPP_INLINE_VISIBILITY
- void seed(result_type __s = default_seed)
- {seed(integral_constant<bool, __m == 0>(),
- integral_constant<bool, __c == 0>(), __s);}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __is_seed_sequence<_Sseq, linear_congruential_engine>::value,
- void
- >::type
- seed(_Sseq& __q)
- {__seed(__q, integral_constant<unsigned,
- 1 + (__m == 0 ? (sizeof(result_type) * __CHAR_BIT__ - 1)/32
- : (__m > 0x100000000ull))>());}
-
- // generating functions
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()()
- {return __x_ = static_cast<result_type>(__lce_ta<__a, __c, __m, _Mp>::next(__x_));}
- _LIBCPP_INLINE_VISIBILITY
- void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const linear_congruential_engine& __x,
- const linear_congruential_engine& __y)
- {return __x.__x_ == __y.__x_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const linear_congruential_engine& __x,
- const linear_congruential_engine& __y)
- {return !(__x == __y);}
-
-private:
-
- _LIBCPP_INLINE_VISIBILITY
- void seed(true_type, true_type, result_type __s) {__x_ = __s == 0 ? 1 : __s;}
- _LIBCPP_INLINE_VISIBILITY
- void seed(true_type, false_type, result_type __s) {__x_ = __s;}
- _LIBCPP_INLINE_VISIBILITY
- void seed(false_type, true_type, result_type __s) {__x_ = __s % __m == 0 ?
- 1 : __s % __m;}
- _LIBCPP_INLINE_VISIBILITY
- void seed(false_type, false_type, result_type __s) {__x_ = __s % __m;}
-
- template<class _Sseq>
- void __seed(_Sseq& __q, integral_constant<unsigned, 1>);
- template<class _Sseq>
- void __seed(_Sseq& __q, integral_constant<unsigned, 2>);
-
- template <class _CharT, class _Traits,
- class _Up, _Up _Ap, _Up _Cp, _Up _Np>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const linear_congruential_engine<_Up, _Ap, _Cp, _Np>&);
-
- template <class _CharT, class _Traits,
- class _Up, _Up _Ap, _Up _Cp, _Up _Np>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- linear_congruential_engine<_Up, _Ap, _Cp, _Np>& __x);
-};
-
-template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
- _LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type
- linear_congruential_engine<_UIntType, __a, __c, __m>::multiplier;
-
-template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
- _LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type
- linear_congruential_engine<_UIntType, __a, __c, __m>::increment;
-
-template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
- _LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type
- linear_congruential_engine<_UIntType, __a, __c, __m>::modulus;
-
-template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
- _LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type
- linear_congruential_engine<_UIntType, __a, __c, __m>::default_seed;
-
-template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
-template<class _Sseq>
-void
-linear_congruential_engine<_UIntType, __a, __c, __m>::__seed(_Sseq& __q,
- integral_constant<unsigned, 1>)
-{
- const unsigned __k = 1;
- uint32_t __ar[__k+3];
- __q.generate(__ar, __ar + __k + 3);
- result_type __s = static_cast<result_type>(__ar[3] % __m);
- __x_ = __c == 0 && __s == 0 ? result_type(1) : __s;
-}
-
-template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
-template<class _Sseq>
-void
-linear_congruential_engine<_UIntType, __a, __c, __m>::__seed(_Sseq& __q,
- integral_constant<unsigned, 2>)
-{
- const unsigned __k = 2;
- uint32_t __ar[__k+3];
- __q.generate(__ar, __ar + __k + 3);
- result_type __s = static_cast<result_type>((__ar[3] +
- ((uint64_t)__ar[4] << 32)) % __m);
- __x_ = __c == 0 && __s == 0 ? result_type(1) : __s;
-}
-
-template <class _CharT, class _Traits,
- class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const linear_congruential_engine<_UIntType, __a, __c, __m>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left);
- __os.fill(__os.widen(' '));
- return __os << __x.__x_;
-}
-
-template <class _CharT, class _Traits,
- class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- linear_congruential_engine<_UIntType, __a, __c, __m>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- _UIntType __t;
- __is >> __t;
- if (!__is.fail())
- __x.__x_ = __t;
- return __is;
-}
-
-typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647>
- minstd_rand0;
-typedef linear_congruential_engine<uint_fast32_t, 48271, 0, 2147483647>
- minstd_rand;
-typedef minstd_rand default_random_engine;
-// mersenne_twister_engine
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
-class _LIBCPP_TEMPLATE_VIS mersenne_twister_engine;
-
-template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
-bool
-operator==(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
-
-template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
-_LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
-
-template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
-
-template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
-class _LIBCPP_TEMPLATE_VIS mersenne_twister_engine
-{
-public:
- // types
- typedef _UIntType result_type;
-
-private:
- result_type __x_[__n];
- size_t __i_;
-
- static_assert( 0 < __m, "mersenne_twister_engine invalid parameters");
- static_assert(__m <= __n, "mersenne_twister_engine invalid parameters");
- static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits;
- static_assert(__w <= _Dt, "mersenne_twister_engine invalid parameters");
- static_assert( 2 <= __w, "mersenne_twister_engine invalid parameters");
- static_assert(__r <= __w, "mersenne_twister_engine invalid parameters");
- static_assert(__u <= __w, "mersenne_twister_engine invalid parameters");
- static_assert(__s <= __w, "mersenne_twister_engine invalid parameters");
- static_assert(__t <= __w, "mersenne_twister_engine invalid parameters");
- static_assert(__l <= __w, "mersenne_twister_engine invalid parameters");
-public:
- static _LIBCPP_CONSTEXPR const result_type _Min = 0;
- static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) :
- (result_type(1) << __w) - result_type(1);
- static_assert(_Min < _Max, "mersenne_twister_engine invalid parameters");
- static_assert(__a <= _Max, "mersenne_twister_engine invalid parameters");
- static_assert(__b <= _Max, "mersenne_twister_engine invalid parameters");
- static_assert(__c <= _Max, "mersenne_twister_engine invalid parameters");
- static_assert(__d <= _Max, "mersenne_twister_engine invalid parameters");
- static_assert(__f <= _Max, "mersenne_twister_engine invalid parameters");
-
- // engine characteristics
- static _LIBCPP_CONSTEXPR const size_t word_size = __w;
- static _LIBCPP_CONSTEXPR const size_t state_size = __n;
- static _LIBCPP_CONSTEXPR const size_t shift_size = __m;
- static _LIBCPP_CONSTEXPR const size_t mask_bits = __r;
- static _LIBCPP_CONSTEXPR const result_type xor_mask = __a;
- static _LIBCPP_CONSTEXPR const size_t tempering_u = __u;
- static _LIBCPP_CONSTEXPR const result_type tempering_d = __d;
- static _LIBCPP_CONSTEXPR const size_t tempering_s = __s;
- static _LIBCPP_CONSTEXPR const result_type tempering_b = __b;
- static _LIBCPP_CONSTEXPR const size_t tempering_t = __t;
- static _LIBCPP_CONSTEXPR const result_type tempering_c = __c;
- static _LIBCPP_CONSTEXPR const size_t tempering_l = __l;
- static _LIBCPP_CONSTEXPR const result_type initialization_multiplier = __f;
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type min() { return _Min; }
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type max() { return _Max; }
- static _LIBCPP_CONSTEXPR const result_type default_seed = 5489u;
-
- // constructors and seeding functions
- _LIBCPP_INLINE_VISIBILITY
- explicit mersenne_twister_engine(result_type __sd = default_seed)
- {seed(__sd);}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- explicit mersenne_twister_engine(_Sseq& __q,
- typename enable_if<__is_seed_sequence<_Sseq, mersenne_twister_engine>::value>::type* = 0)
- {seed(__q);}
- void seed(result_type __sd = default_seed);
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __is_seed_sequence<_Sseq, mersenne_twister_engine>::value,
- void
- >::type
- seed(_Sseq& __q)
- {__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());}
-
- // generating functions
- result_type operator()();
- _LIBCPP_INLINE_VISIBILITY
- void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
-
- template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
- friend
- bool
- operator==(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
-
- template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
- friend
- bool
- operator!=(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
-
- template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
-
- template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
-private:
-
- template<class _Sseq>
- void __seed(_Sseq& __q, integral_constant<unsigned, 1>);
- template<class _Sseq>
- void __seed(_Sseq& __q, integral_constant<unsigned, 2>);
-
- template <size_t __count>
- _LIBCPP_INLINE_VISIBILITY
- static
- typename enable_if
- <
- __count < __w,
- result_type
- >::type
- __lshift(result_type __x) {return (__x << __count) & _Max;}
-
- template <size_t __count>
- _LIBCPP_INLINE_VISIBILITY
- static
- typename enable_if
- <
- (__count >= __w),
- result_type
- >::type
- __lshift(result_type) {return result_type(0);}
-
- template <size_t __count>
- _LIBCPP_INLINE_VISIBILITY
- static
- typename enable_if
- <
- __count < _Dt,
- result_type
- >::type
- __rshift(result_type __x) {return __x >> __count;}
-
- template <size_t __count>
- _LIBCPP_INLINE_VISIBILITY
- static
- typename enable_if
- <
- (__count >= _Dt),
- result_type
- >::type
- __rshift(result_type) {return result_type(0);}
-};
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const size_t
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::word_size;
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const size_t
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::state_size;
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const size_t
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::shift_size;
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const size_t
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::mask_bits;
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::xor_mask;
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const size_t
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_u;
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_d;
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const size_t
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_s;
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_b;
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const size_t
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_t;
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_c;
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const size_t
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_l;
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::initialization_multiplier;
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
- _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
- mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::default_seed;
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
-void
-mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b,
- __t, __c, __l, __f>::seed(result_type __sd)
- _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
-{ // __w >= 2
- __x_[0] = __sd & _Max;
- for (size_t __i = 1; __i < __n; ++__i)
- __x_[__i] = (__f * (__x_[__i-1] ^ __rshift<__w - 2>(__x_[__i-1])) + __i) & _Max;
- __i_ = 0;
-}
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
-template<class _Sseq>
-void
-mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b,
- __t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 1>)
-{
- const unsigned __k = 1;
- uint32_t __ar[__n * __k];
- __q.generate(__ar, __ar + __n * __k);
- for (size_t __i = 0; __i < __n; ++__i)
- __x_[__i] = static_cast<result_type>(__ar[__i] & _Max);
- const result_type __mask = __r == _Dt ? result_type(~0) :
- (result_type(1) << __r) - result_type(1);
- __i_ = 0;
- if ((__x_[0] & ~__mask) == 0)
- {
- for (size_t __i = 1; __i < __n; ++__i)
- if (__x_[__i] != 0)
- return;
- __x_[0] = result_type(1) << (__w - 1);
- }
-}
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
-template<class _Sseq>
-void
-mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b,
- __t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 2>)
-{
- const unsigned __k = 2;
- uint32_t __ar[__n * __k];
- __q.generate(__ar, __ar + __n * __k);
- for (size_t __i = 0; __i < __n; ++__i)
- __x_[__i] = static_cast<result_type>(
- (__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max);
- const result_type __mask = __r == _Dt ? result_type(~0) :
- (result_type(1) << __r) - result_type(1);
- __i_ = 0;
- if ((__x_[0] & ~__mask) == 0)
- {
- for (size_t __i = 1; __i < __n; ++__i)
- if (__x_[__i] != 0)
- return;
- __x_[0] = result_type(1) << (__w - 1);
- }
-}
-
-template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
- _UIntType __a, size_t __u, _UIntType __d, size_t __s,
- _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
-_UIntType
-mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b,
- __t, __c, __l, __f>::operator()()
-{
- const size_t __j = (__i_ + 1) % __n;
- const result_type __mask = __r == _Dt ? result_type(~0) :
- (result_type(1) << __r) - result_type(1);
- const result_type _Yp = (__x_[__i_] & ~__mask) | (__x_[__j] & __mask);
- const size_t __k = (__i_ + __m) % __n;
- __x_[__i_] = __x_[__k] ^ __rshift<1>(_Yp) ^ (__a * (_Yp & 1));
- result_type __z = __x_[__i_] ^ (__rshift<__u>(__x_[__i_]) & __d);
- __i_ = __j;
- __z ^= __lshift<__s>(__z) & __b;
- __z ^= __lshift<__t>(__z) & __c;
- return __z ^ __rshift<__l>(__z);
-}
-
-template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
-bool
-operator==(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __y)
-{
- if (__x.__i_ == __y.__i_)
- return _VSTD::equal(__x.__x_, __x.__x_ + _Np, __y.__x_);
- if (__x.__i_ == 0 || __y.__i_ == 0)
- {
- size_t __j = _VSTD::min(_Np - __x.__i_, _Np - __y.__i_);
- if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j,
- __y.__x_ + __y.__i_))
- return false;
- if (__x.__i_ == 0)
- return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Np, __y.__x_);
- return _VSTD::equal(__x.__x_, __x.__x_ + (_Np - __j), __y.__x_ + __j);
- }
- if (__x.__i_ < __y.__i_)
- {
- size_t __j = _Np - __y.__i_;
- if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j),
- __y.__x_ + __y.__i_))
- return false;
- if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Np,
- __y.__x_))
- return false;
- return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_,
- __y.__x_ + (_Np - (__x.__i_ + __j)));
- }
- size_t __j = _Np - __x.__i_;
- if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j),
- __x.__x_ + __x.__i_))
- return false;
- if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Np,
- __x.__x_))
- return false;
- return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_,
- __x.__x_ + (_Np - (__y.__i_ + __j)));
-}
-
-template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.__x_[__x.__i_];
- for (size_t __j = __x.__i_ + 1; __j < _Np; ++__j)
- __os << __sp << __x.__x_[__j];
- for (size_t __j = 0; __j < __x.__i_; ++__j)
- __os << __sp << __x.__x_[__j];
- return __os;
-}
-
-template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
- _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp,
- _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
- _Bp, _Tp, _Cp, _Lp, _Fp>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- _UInt __t[_Np];
- for (size_t __i = 0; __i < _Np; ++__i)
- __is >> __t[__i];
- if (!__is.fail())
- {
- for (size_t __i = 0; __i < _Np; ++__i)
- __x.__x_[__i] = __t[__i];
- __x.__i_ = 0;
- }
- return __is;
-}
-
-typedef mersenne_twister_engine<uint_fast32_t, 32, 624, 397, 31,
- 0x9908b0df, 11, 0xffffffff,
- 7, 0x9d2c5680,
- 15, 0xefc60000,
- 18, 1812433253> mt19937;
-typedef mersenne_twister_engine<uint_fast64_t, 64, 312, 156, 31,
- 0xb5026f5aa96619e9ULL, 29, 0x5555555555555555ULL,
- 17, 0x71d67fffeda60000ULL,
- 37, 0xfff7eee000000000ULL,
- 43, 6364136223846793005ULL> mt19937_64;
-
-// subtract_with_carry_engine
-
-template<class _UIntType, size_t __w, size_t __s, size_t __r>
-class _LIBCPP_TEMPLATE_VIS subtract_with_carry_engine;
-
-template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
-bool
-operator==(
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y);
-
-template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
-_LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y);
-
-template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x);
-
-template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x);
-
-template<class _UIntType, size_t __w, size_t __s, size_t __r>
-class _LIBCPP_TEMPLATE_VIS subtract_with_carry_engine
-{
-public:
- // types
- typedef _UIntType result_type;
-
-private:
- result_type __x_[__r];
- result_type __c_;
- size_t __i_;
-
- static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits;
- static_assert( 0 < __w, "subtract_with_carry_engine invalid parameters");
- static_assert(__w <= _Dt, "subtract_with_carry_engine invalid parameters");
- static_assert( 0 < __s, "subtract_with_carry_engine invalid parameters");
- static_assert(__s < __r, "subtract_with_carry_engine invalid parameters");
-public:
- static _LIBCPP_CONSTEXPR const result_type _Min = 0;
- static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) :
- (result_type(1) << __w) - result_type(1);
- static_assert(_Min < _Max, "subtract_with_carry_engine invalid parameters");
-
- // engine characteristics
- static _LIBCPP_CONSTEXPR const size_t word_size = __w;
- static _LIBCPP_CONSTEXPR const size_t short_lag = __s;
- static _LIBCPP_CONSTEXPR const size_t long_lag = __r;
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type min() { return _Min; }
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type max() { return _Max; }
- static _LIBCPP_CONSTEXPR const result_type default_seed = 19780503u;
-
- // constructors and seeding functions
- _LIBCPP_INLINE_VISIBILITY
- explicit subtract_with_carry_engine(result_type __sd = default_seed)
- {seed(__sd);}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- explicit subtract_with_carry_engine(_Sseq& __q,
- typename enable_if<__is_seed_sequence<_Sseq, subtract_with_carry_engine>::value>::type* = 0)
- {seed(__q);}
- _LIBCPP_INLINE_VISIBILITY
- void seed(result_type __sd = default_seed)
- {seed(__sd, integral_constant<unsigned, 1 + (__w - 1) / 32>());}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __is_seed_sequence<_Sseq, subtract_with_carry_engine>::value,
- void
- >::type
- seed(_Sseq& __q)
- {__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());}
-
- // generating functions
- result_type operator()();
- _LIBCPP_INLINE_VISIBILITY
- void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
-
- template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
- friend
- bool
- operator==(
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y);
-
- template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
- friend
- bool
- operator!=(
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y);
-
- template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x);
-
- template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x);
-
-private:
-
- void seed(result_type __sd, integral_constant<unsigned, 1>);
- void seed(result_type __sd, integral_constant<unsigned, 2>);
- template<class _Sseq>
- void __seed(_Sseq& __q, integral_constant<unsigned, 1>);
- template<class _Sseq>
- void __seed(_Sseq& __q, integral_constant<unsigned, 2>);
-};
-
-template<class _UIntType, size_t __w, size_t __s, size_t __r>
- _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::word_size;
-
-template<class _UIntType, size_t __w, size_t __s, size_t __r>
- _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::short_lag;
-
-template<class _UIntType, size_t __w, size_t __s, size_t __r>
- _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::long_lag;
-
-template<class _UIntType, size_t __w, size_t __s, size_t __r>
- _LIBCPP_CONSTEXPR const typename subtract_with_carry_engine<_UIntType, __w, __s, __r>::result_type
- subtract_with_carry_engine<_UIntType, __w, __s, __r>::default_seed;
-
-template<class _UIntType, size_t __w, size_t __s, size_t __r>
-void
-subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd,
- integral_constant<unsigned, 1>)
-{
- linear_congruential_engine<result_type, 40014u, 0u, 2147483563u>
- __e(__sd == 0u ? default_seed : __sd);
- for (size_t __i = 0; __i < __r; ++__i)
- __x_[__i] = static_cast<result_type>(__e() & _Max);
- __c_ = __x_[__r-1] == 0;
- __i_ = 0;
-}
-
-template<class _UIntType, size_t __w, size_t __s, size_t __r>
-void
-subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd,
- integral_constant<unsigned, 2>)
-{
- linear_congruential_engine<result_type, 40014u, 0u, 2147483563u>
- __e(__sd == 0u ? default_seed : __sd);
- for (size_t __i = 0; __i < __r; ++__i)
- {
- result_type __e0 = __e();
- __x_[__i] = static_cast<result_type>(
- (__e0 + ((uint64_t)__e() << 32)) & _Max);
- }
- __c_ = __x_[__r-1] == 0;
- __i_ = 0;
-}
-
-template<class _UIntType, size_t __w, size_t __s, size_t __r>
-template<class _Sseq>
-void
-subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q,
- integral_constant<unsigned, 1>)
-{
- const unsigned __k = 1;
- uint32_t __ar[__r * __k];
- __q.generate(__ar, __ar + __r * __k);
- for (size_t __i = 0; __i < __r; ++__i)
- __x_[__i] = static_cast<result_type>(__ar[__i] & _Max);
- __c_ = __x_[__r-1] == 0;
- __i_ = 0;
-}
-
-template<class _UIntType, size_t __w, size_t __s, size_t __r>
-template<class _Sseq>
-void
-subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q,
- integral_constant<unsigned, 2>)
-{
- const unsigned __k = 2;
- uint32_t __ar[__r * __k];
- __q.generate(__ar, __ar + __r * __k);
- for (size_t __i = 0; __i < __r; ++__i)
- __x_[__i] = static_cast<result_type>(
- (__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max);
- __c_ = __x_[__r-1] == 0;
- __i_ = 0;
-}
-
-template<class _UIntType, size_t __w, size_t __s, size_t __r>
-_UIntType
-subtract_with_carry_engine<_UIntType, __w, __s, __r>::operator()()
-{
- const result_type& __xs = __x_[(__i_ + (__r - __s)) % __r];
- result_type& __xr = __x_[__i_];
- result_type __new_c = __c_ == 0 ? __xs < __xr : __xs != 0 ? __xs <= __xr : 1;
- __xr = (__xs - __xr - __c_) & _Max;
- __c_ = __new_c;
- __i_ = (__i_ + 1) % __r;
- return __xr;
-}
-
-template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
-bool
-operator==(
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y)
-{
- if (__x.__c_ != __y.__c_)
- return false;
- if (__x.__i_ == __y.__i_)
- return _VSTD::equal(__x.__x_, __x.__x_ + _Rp, __y.__x_);
- if (__x.__i_ == 0 || __y.__i_ == 0)
- {
- size_t __j = _VSTD::min(_Rp - __x.__i_, _Rp - __y.__i_);
- if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j,
- __y.__x_ + __y.__i_))
- return false;
- if (__x.__i_ == 0)
- return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Rp, __y.__x_);
- return _VSTD::equal(__x.__x_, __x.__x_ + (_Rp - __j), __y.__x_ + __j);
- }
- if (__x.__i_ < __y.__i_)
- {
- size_t __j = _Rp - __y.__i_;
- if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j),
- __y.__x_ + __y.__i_))
- return false;
- if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Rp,
- __y.__x_))
- return false;
- return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_,
- __y.__x_ + (_Rp - (__x.__i_ + __j)));
- }
- size_t __j = _Rp - __x.__i_;
- if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j),
- __x.__x_ + __x.__i_))
- return false;
- if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Rp,
- __x.__x_))
- return false;
- return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_,
- __x.__x_ + (_Rp - (__y.__i_ + __j)));
-}
-
-template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.__x_[__x.__i_];
- for (size_t __j = __x.__i_ + 1; __j < _Rp; ++__j)
- __os << __sp << __x.__x_[__j];
- for (size_t __j = 0; __j < __x.__i_; ++__j)
- __os << __sp << __x.__x_[__j];
- __os << __sp << __x.__c_;
- return __os;
-}
-
-template <class _CharT, class _Traits,
- class _UInt, size_t _Wp, size_t _Sp, size_t _Rp>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- _UInt __t[_Rp+1];
- for (size_t __i = 0; __i < _Rp+1; ++__i)
- __is >> __t[__i];
- if (!__is.fail())
- {
- for (size_t __i = 0; __i < _Rp; ++__i)
- __x.__x_[__i] = __t[__i];
- __x.__c_ = __t[_Rp];
- __x.__i_ = 0;
- }
- return __is;
-}
-
-typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24> ranlux24_base;
-typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12> ranlux48_base;
-
-// discard_block_engine
-
-template<class _Engine, size_t __p, size_t __r>
-class _LIBCPP_TEMPLATE_VIS discard_block_engine
-{
- _Engine __e_;
- int __n_;
-
- static_assert( 0 < __r, "discard_block_engine invalid parameters");
- static_assert(__r <= __p, "discard_block_engine invalid parameters");
- static_assert(__r <= INT_MAX, "discard_block_engine invalid parameters");
-public:
- // types
- typedef typename _Engine::result_type result_type;
-
- // engine characteristics
- static _LIBCPP_CONSTEXPR const size_t block_size = __p;
- static _LIBCPP_CONSTEXPR const size_t used_block = __r;
-
-#ifdef _LIBCPP_CXX03_LANG
- static const result_type _Min = _Engine::_Min;
- static const result_type _Max = _Engine::_Max;
-#else
- static _LIBCPP_CONSTEXPR const result_type _Min = _Engine::min();
- static _LIBCPP_CONSTEXPR const result_type _Max = _Engine::max();
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type min() { return _Engine::min(); }
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type max() { return _Engine::max(); }
-
- // constructors and seeding functions
- _LIBCPP_INLINE_VISIBILITY
- discard_block_engine() : __n_(0) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit discard_block_engine(const _Engine& __e)
- : __e_(__e), __n_(0) {}
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- explicit discard_block_engine(_Engine&& __e)
- : __e_(_VSTD::move(__e)), __n_(0) {}
-#endif // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- explicit discard_block_engine(result_type __sd) : __e_(__sd), __n_(0) {}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- explicit discard_block_engine(_Sseq& __q,
- typename enable_if<__is_seed_sequence<_Sseq, discard_block_engine>::value &&
- !is_convertible<_Sseq, _Engine>::value>::type* = 0)
- : __e_(__q), __n_(0) {}
- _LIBCPP_INLINE_VISIBILITY
- void seed() {__e_.seed(); __n_ = 0;}
- _LIBCPP_INLINE_VISIBILITY
- void seed(result_type __sd) {__e_.seed(__sd); __n_ = 0;}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __is_seed_sequence<_Sseq, discard_block_engine>::value,
- void
- >::type
- seed(_Sseq& __q) {__e_.seed(__q); __n_ = 0;}
-
- // generating functions
- result_type operator()();
- _LIBCPP_INLINE_VISIBILITY
- void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- const _Engine& base() const _NOEXCEPT {return __e_;}
-
- template<class _Eng, size_t _Pp, size_t _Rp>
- friend
- bool
- operator==(
- const discard_block_engine<_Eng, _Pp, _Rp>& __x,
- const discard_block_engine<_Eng, _Pp, _Rp>& __y);
-
- template<class _Eng, size_t _Pp, size_t _Rp>
- friend
- bool
- operator!=(
- const discard_block_engine<_Eng, _Pp, _Rp>& __x,
- const discard_block_engine<_Eng, _Pp, _Rp>& __y);
-
- template <class _CharT, class _Traits,
- class _Eng, size_t _Pp, size_t _Rp>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const discard_block_engine<_Eng, _Pp, _Rp>& __x);
-
- template <class _CharT, class _Traits,
- class _Eng, size_t _Pp, size_t _Rp>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- discard_block_engine<_Eng, _Pp, _Rp>& __x);
-};
-
-template<class _Engine, size_t __p, size_t __r>
- _LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::block_size;
-
-template<class _Engine, size_t __p, size_t __r>
- _LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::used_block;
-
-template<class _Engine, size_t __p, size_t __r>
-typename discard_block_engine<_Engine, __p, __r>::result_type
-discard_block_engine<_Engine, __p, __r>::operator()()
-{
- if (__n_ >= static_cast<int>(__r))
- {
- __e_.discard(__p - __r);
- __n_ = 0;
- }
- ++__n_;
- return __e_();
-}
-
-template<class _Eng, size_t _Pp, size_t _Rp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const discard_block_engine<_Eng, _Pp, _Rp>& __x,
- const discard_block_engine<_Eng, _Pp, _Rp>& __y)
-{
- return __x.__n_ == __y.__n_ && __x.__e_ == __y.__e_;
-}
-
-template<class _Eng, size_t _Pp, size_t _Rp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const discard_block_engine<_Eng, _Pp, _Rp>& __x,
- const discard_block_engine<_Eng, _Pp, _Rp>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _CharT, class _Traits,
- class _Eng, size_t _Pp, size_t _Rp>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const discard_block_engine<_Eng, _Pp, _Rp>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- return __os << __x.__e_ << __sp << __x.__n_;
-}
-
-template <class _CharT, class _Traits,
- class _Eng, size_t _Pp, size_t _Rp>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- discard_block_engine<_Eng, _Pp, _Rp>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- _Eng __e;
- int __n;
- __is >> __e >> __n;
- if (!__is.fail())
- {
- __x.__e_ = __e;
- __x.__n_ = __n;
- }
- return __is;
-}
-
-typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24;
-typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48;
-
-// independent_bits_engine
-
-template<class _Engine, size_t __w, class _UIntType>
-class _LIBCPP_TEMPLATE_VIS independent_bits_engine
-{
- template <class _UInt, _UInt _R0, size_t _Wp, size_t _Mp>
- class __get_n
- {
- static _LIBCPP_CONSTEXPR const size_t _Dt = numeric_limits<_UInt>::digits;
- static _LIBCPP_CONSTEXPR const size_t _Np = _Wp / _Mp + (_Wp % _Mp != 0);
- static _LIBCPP_CONSTEXPR const size_t _W0 = _Wp / _Np;
- static _LIBCPP_CONSTEXPR const _UInt _Y0 = _W0 >= _Dt ? 0 : (_R0 >> _W0) << _W0;
- public:
- static _LIBCPP_CONSTEXPR const size_t value = _R0 - _Y0 > _Y0 / _Np ? _Np + 1 : _Np;
- };
-public:
- // types
- typedef _UIntType result_type;
-
-private:
- _Engine __e_;
-
- static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits;
- static_assert( 0 < __w, "independent_bits_engine invalid parameters");
- static_assert(__w <= _Dt, "independent_bits_engine invalid parameters");
-
- typedef typename _Engine::result_type _Engine_result_type;
- typedef typename conditional
- <
- sizeof(_Engine_result_type) <= sizeof(result_type),
- result_type,
- _Engine_result_type
- >::type _Working_result_type;
-#ifdef _LIBCPP_CXX03_LANG
- static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min
- + _Working_result_type(1);
-#else
- static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min()
- + _Working_result_type(1);
-#endif
- static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value;
- static _LIBCPP_CONSTEXPR const size_t __n = __get_n<_Working_result_type, _Rp, __w, __m>::value;
- static _LIBCPP_CONSTEXPR const size_t __w0 = __w / __n;
- static _LIBCPP_CONSTEXPR const size_t __n0 = __n - __w % __n;
- static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits;
- static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits;
- static _LIBCPP_CONSTEXPR const _Working_result_type __y0 = __w0 >= _WDt ? 0 :
- (_Rp >> __w0) << __w0;
- static _LIBCPP_CONSTEXPR const _Working_result_type __y1 = __w0 >= _WDt - 1 ? 0 :
- (_Rp >> (__w0+1)) << (__w0+1);
- static _LIBCPP_CONSTEXPR const _Engine_result_type __mask0 = __w0 > 0 ?
- _Engine_result_type(~0) >> (_EDt - __w0) :
- _Engine_result_type(0);
- static _LIBCPP_CONSTEXPR const _Engine_result_type __mask1 = __w0 < _EDt - 1 ?
- _Engine_result_type(~0) >> (_EDt - (__w0 + 1)) :
- _Engine_result_type(~0);
-public:
- static _LIBCPP_CONSTEXPR const result_type _Min = 0;
- static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) :
- (result_type(1) << __w) - result_type(1);
- static_assert(_Min < _Max, "independent_bits_engine invalid parameters");
-
- // engine characteristics
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type min() { return _Min; }
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type max() { return _Max; }
-
- // constructors and seeding functions
- _LIBCPP_INLINE_VISIBILITY
- independent_bits_engine() {}
- _LIBCPP_INLINE_VISIBILITY
- explicit independent_bits_engine(const _Engine& __e)
- : __e_(__e) {}
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- explicit independent_bits_engine(_Engine&& __e)
- : __e_(_VSTD::move(__e)) {}
-#endif // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- explicit independent_bits_engine(result_type __sd) : __e_(__sd) {}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- explicit independent_bits_engine(_Sseq& __q,
- typename enable_if<__is_seed_sequence<_Sseq, independent_bits_engine>::value &&
- !is_convertible<_Sseq, _Engine>::value>::type* = 0)
- : __e_(__q) {}
- _LIBCPP_INLINE_VISIBILITY
- void seed() {__e_.seed();}
- _LIBCPP_INLINE_VISIBILITY
- void seed(result_type __sd) {__e_.seed(__sd);}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __is_seed_sequence<_Sseq, independent_bits_engine>::value,
- void
- >::type
- seed(_Sseq& __q) {__e_.seed(__q);}
-
- // generating functions
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());}
- _LIBCPP_INLINE_VISIBILITY
- void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- const _Engine& base() const _NOEXCEPT {return __e_;}
-
- template<class _Eng, size_t _Wp, class _UInt>
- friend
- bool
- operator==(
- const independent_bits_engine<_Eng, _Wp, _UInt>& __x,
- const independent_bits_engine<_Eng, _Wp, _UInt>& __y);
-
- template<class _Eng, size_t _Wp, class _UInt>
- friend
- bool
- operator!=(
- const independent_bits_engine<_Eng, _Wp, _UInt>& __x,
- const independent_bits_engine<_Eng, _Wp, _UInt>& __y);
-
- template <class _CharT, class _Traits,
- class _Eng, size_t _Wp, class _UInt>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const independent_bits_engine<_Eng, _Wp, _UInt>& __x);
-
- template <class _CharT, class _Traits,
- class _Eng, size_t _Wp, class _UInt>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- independent_bits_engine<_Eng, _Wp, _UInt>& __x);
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- result_type __eval(false_type);
- result_type __eval(true_type);
-
- template <size_t __count>
- _LIBCPP_INLINE_VISIBILITY
- static
- typename enable_if
- <
- __count < _Dt,
- result_type
- >::type
- __lshift(result_type __x) {return __x << __count;}
-
- template <size_t __count>
- _LIBCPP_INLINE_VISIBILITY
- static
- typename enable_if
- <
- (__count >= _Dt),
- result_type
- >::type
- __lshift(result_type) {return result_type(0);}
-};
-
-template<class _Engine, size_t __w, class _UIntType>
-inline
-_UIntType
-independent_bits_engine<_Engine, __w, _UIntType>::__eval(false_type)
-{
- return static_cast<result_type>(__e_() & __mask0);
-}
-
-template<class _Engine, size_t __w, class _UIntType>
-_UIntType
-independent_bits_engine<_Engine, __w, _UIntType>::__eval(true_type)
-{
- result_type _Sp = 0;
- for (size_t __k = 0; __k < __n0; ++__k)
- {
- _Engine_result_type __u;
- do
- {
- __u = __e_() - _Engine::min();
- } while (__u >= __y0);
- _Sp = static_cast<result_type>(__lshift<__w0>(_Sp) + (__u & __mask0));
- }
- for (size_t __k = __n0; __k < __n; ++__k)
- {
- _Engine_result_type __u;
- do
- {
- __u = __e_() - _Engine::min();
- } while (__u >= __y1);
- _Sp = static_cast<result_type>(__lshift<__w0+1>(_Sp) + (__u & __mask1));
- }
- return _Sp;
-}
-
-template<class _Eng, size_t _Wp, class _UInt>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(
- const independent_bits_engine<_Eng, _Wp, _UInt>& __x,
- const independent_bits_engine<_Eng, _Wp, _UInt>& __y)
-{
- return __x.base() == __y.base();
-}
-
-template<class _Eng, size_t _Wp, class _UInt>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(
- const independent_bits_engine<_Eng, _Wp, _UInt>& __x,
- const independent_bits_engine<_Eng, _Wp, _UInt>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _CharT, class _Traits,
- class _Eng, size_t _Wp, class _UInt>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const independent_bits_engine<_Eng, _Wp, _UInt>& __x)
-{
- return __os << __x.base();
-}
-
-template <class _CharT, class _Traits,
- class _Eng, size_t _Wp, class _UInt>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- independent_bits_engine<_Eng, _Wp, _UInt>& __x)
-{
- _Eng __e;
- __is >> __e;
- if (!__is.fail())
- __x.__e_ = __e;
- return __is;
-}
-
-// shuffle_order_engine
-
-template <uint64_t _Xp, uint64_t _Yp>
-struct __ugcd
-{
- static _LIBCPP_CONSTEXPR const uint64_t value = __ugcd<_Yp, _Xp % _Yp>::value;
-};
-
-template <uint64_t _Xp>
-struct __ugcd<_Xp, 0>
-{
- static _LIBCPP_CONSTEXPR const uint64_t value = _Xp;
-};
-
-template <uint64_t _Np, uint64_t _Dp>
-class __uratio
-{
- static_assert(_Dp != 0, "__uratio divide by 0");
- static _LIBCPP_CONSTEXPR const uint64_t __gcd = __ugcd<_Np, _Dp>::value;
-public:
- static _LIBCPP_CONSTEXPR const uint64_t num = _Np / __gcd;
- static _LIBCPP_CONSTEXPR const uint64_t den = _Dp / __gcd;
-
- typedef __uratio<num, den> type;
-};
-
-template<class _Engine, size_t __k>
-class _LIBCPP_TEMPLATE_VIS shuffle_order_engine
-{
- static_assert(0 < __k, "shuffle_order_engine invalid parameters");
-public:
- // types
- typedef typename _Engine::result_type result_type;
-
-private:
- _Engine __e_;
- result_type _V_[__k];
- result_type _Y_;
-
-public:
- // engine characteristics
- static _LIBCPP_CONSTEXPR const size_t table_size = __k;
-
-#ifdef _LIBCPP_CXX03_LANG
- static const result_type _Min = _Engine::_Min;
- static const result_type _Max = _Engine::_Max;
-#else
- static _LIBCPP_CONSTEXPR const result_type _Min = _Engine::min();
- static _LIBCPP_CONSTEXPR const result_type _Max = _Engine::max();
-#endif
- static_assert(_Min < _Max, "shuffle_order_engine invalid parameters");
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type min() { return _Min; }
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type max() { return _Max; }
-
- static _LIBCPP_CONSTEXPR const unsigned long long _Rp = _Max - _Min + 1ull;
-
- // constructors and seeding functions
- _LIBCPP_INLINE_VISIBILITY
- shuffle_order_engine() {__init();}
- _LIBCPP_INLINE_VISIBILITY
- explicit shuffle_order_engine(const _Engine& __e)
- : __e_(__e) {__init();}
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- explicit shuffle_order_engine(_Engine&& __e)
- : __e_(_VSTD::move(__e)) {__init();}
-#endif // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- explicit shuffle_order_engine(result_type __sd) : __e_(__sd) {__init();}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- explicit shuffle_order_engine(_Sseq& __q,
- typename enable_if<__is_seed_sequence<_Sseq, shuffle_order_engine>::value &&
- !is_convertible<_Sseq, _Engine>::value>::type* = 0)
- : __e_(__q) {__init();}
- _LIBCPP_INLINE_VISIBILITY
- void seed() {__e_.seed(); __init();}
- _LIBCPP_INLINE_VISIBILITY
- void seed(result_type __sd) {__e_.seed(__sd); __init();}
- template<class _Sseq>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __is_seed_sequence<_Sseq, shuffle_order_engine>::value,
- void
- >::type
- seed(_Sseq& __q) {__e_.seed(__q); __init();}
-
- // generating functions
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());}
- _LIBCPP_INLINE_VISIBILITY
- void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- const _Engine& base() const _NOEXCEPT {return __e_;}
-
-private:
- template<class _Eng, size_t _Kp>
- friend
- bool
- operator==(
- const shuffle_order_engine<_Eng, _Kp>& __x,
- const shuffle_order_engine<_Eng, _Kp>& __y);
-
- template<class _Eng, size_t _Kp>
- friend
- bool
- operator!=(
- const shuffle_order_engine<_Eng, _Kp>& __x,
- const shuffle_order_engine<_Eng, _Kp>& __y);
-
- template <class _CharT, class _Traits,
- class _Eng, size_t _Kp>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const shuffle_order_engine<_Eng, _Kp>& __x);
-
- template <class _CharT, class _Traits,
- class _Eng, size_t _Kp>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- shuffle_order_engine<_Eng, _Kp>& __x);
-
- _LIBCPP_INLINE_VISIBILITY
- void __init()
- {
- for (size_t __i = 0; __i < __k; ++__i)
- _V_[__i] = __e_();
- _Y_ = __e_();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- result_type __eval(false_type) {return __eval2(integral_constant<bool, __k & 1>());}
- _LIBCPP_INLINE_VISIBILITY
- result_type __eval(true_type) {return __eval(__uratio<__k, _Rp>());}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type __eval2(false_type) {return __eval(__uratio<__k/2, 0x8000000000000000ull>());}
- _LIBCPP_INLINE_VISIBILITY
- result_type __eval2(true_type) {return __evalf<__k, 0>();}
-
- template <uint64_t _Np, uint64_t _Dp>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- (__uratio<_Np, _Dp>::num > 0xFFFFFFFFFFFFFFFFull / (_Max - _Min)),
- result_type
- >::type
- __eval(__uratio<_Np, _Dp>)
- {return __evalf<__uratio<_Np, _Dp>::num, __uratio<_Np, _Dp>::den>();}
-
- template <uint64_t _Np, uint64_t _Dp>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __uratio<_Np, _Dp>::num <= 0xFFFFFFFFFFFFFFFFull / (_Max - _Min),
- result_type
- >::type
- __eval(__uratio<_Np, _Dp>)
- {
- const size_t __j = static_cast<size_t>(__uratio<_Np, _Dp>::num * (_Y_ - _Min)
- / __uratio<_Np, _Dp>::den);
- _Y_ = _V_[__j];
- _V_[__j] = __e_();
- return _Y_;
- }
-
- template <uint64_t __n, uint64_t __d>
- _LIBCPP_INLINE_VISIBILITY
- result_type __evalf()
- {
- const double _Fp = __d == 0 ?
- __n / (2. * 0x8000000000000000ull) :
- __n / (double)__d;
- const size_t __j = static_cast<size_t>(_Fp * (_Y_ - _Min));
- _Y_ = _V_[__j];
- _V_[__j] = __e_();
- return _Y_;
- }
-};
-
-template<class _Engine, size_t __k>
- _LIBCPP_CONSTEXPR const size_t shuffle_order_engine<_Engine, __k>::table_size;
-
-template<class _Eng, size_t _Kp>
-bool
-operator==(
- const shuffle_order_engine<_Eng, _Kp>& __x,
- const shuffle_order_engine<_Eng, _Kp>& __y)
-{
- return __x._Y_ == __y._Y_ && _VSTD::equal(__x._V_, __x._V_ + _Kp, __y._V_) &&
- __x.__e_ == __y.__e_;
-}
-
-template<class _Eng, size_t _Kp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(
- const shuffle_order_engine<_Eng, _Kp>& __x,
- const shuffle_order_engine<_Eng, _Kp>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _CharT, class _Traits,
- class _Eng, size_t _Kp>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const shuffle_order_engine<_Eng, _Kp>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.__e_ << __sp << __x._V_[0];
- for (size_t __i = 1; __i < _Kp; ++__i)
- __os << __sp << __x._V_[__i];
- return __os << __sp << __x._Y_;
-}
-
-template <class _CharT, class _Traits,
- class _Eng, size_t _Kp>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- shuffle_order_engine<_Eng, _Kp>& __x)
-{
- typedef typename shuffle_order_engine<_Eng, _Kp>::result_type result_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- _Eng __e;
- result_type _Vp[_Kp+1];
- __is >> __e;
- for (size_t __i = 0; __i < _Kp+1; ++__i)
- __is >> _Vp[__i];
- if (!__is.fail())
- {
- __x.__e_ = __e;
- for (size_t __i = 0; __i < _Kp; ++__i)
- __x._V_[__i] = _Vp[__i];
- __x._Y_ = _Vp[_Kp];
- }
- return __is;
-}
-
-typedef shuffle_order_engine<minstd_rand0, 256> knuth_b;
-
-// random_device
-
-class _LIBCPP_TYPE_VIS random_device
-{
-#ifdef _LIBCPP_USING_DEV_RANDOM
- int __f_;
-#endif // defined(_LIBCPP_USING_DEV_RANDOM)
-public:
- // types
- typedef unsigned result_type;
-
- // generator characteristics
- static _LIBCPP_CONSTEXPR const result_type _Min = 0;
- static _LIBCPP_CONSTEXPR const result_type _Max = 0xFFFFFFFFu;
-
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type min() { return _Min;}
- _LIBCPP_INLINE_VISIBILITY
- static _LIBCPP_CONSTEXPR result_type max() { return _Max;}
-
- // constructors
- explicit random_device(const string& __token = "/dev/urandom");
- ~random_device();
-
- // generating functions
- result_type operator()();
-
- // property functions
- double entropy() const _NOEXCEPT;
-
-private:
- // no copy functions
- random_device(const random_device&); // = delete;
- random_device& operator=(const random_device&); // = delete;
-};
-
-// seed_seq
-
-class _LIBCPP_TEMPLATE_VIS seed_seq
-{
-public:
- // types
- typedef uint32_t result_type;
-
-private:
- vector<result_type> __v_;
-
- template<class _InputIterator>
- void init(_InputIterator __first, _InputIterator __last);
-public:
- // constructors
- _LIBCPP_INLINE_VISIBILITY
- seed_seq() _NOEXCEPT {}
-#ifndef _LIBCPP_CXX03_LANG
- template<class _Tp>
- _LIBCPP_INLINE_VISIBILITY
- seed_seq(initializer_list<_Tp> __il) {init(__il.begin(), __il.end());}
-#endif // _LIBCPP_CXX03_LANG
-
- template<class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- seed_seq(_InputIterator __first, _InputIterator __last)
- {init(__first, __last);}
-
- // generating functions
- template<class _RandomAccessIterator>
- void generate(_RandomAccessIterator __first, _RandomAccessIterator __last);
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- size_t size() const _NOEXCEPT {return __v_.size();}
- template<class _OutputIterator>
- _LIBCPP_INLINE_VISIBILITY
- void param(_OutputIterator __dest) const
- {_VSTD::copy(__v_.begin(), __v_.end(), __dest);}
-
-private:
- // no copy functions
- seed_seq(const seed_seq&); // = delete;
- void operator=(const seed_seq&); // = delete;
-
- _LIBCPP_INLINE_VISIBILITY
- static result_type _Tp(result_type __x) {return __x ^ (__x >> 27);}
-};
-
-template<class _InputIterator>
-void
-seed_seq::init(_InputIterator __first, _InputIterator __last)
-{
- for (_InputIterator __s = __first; __s != __last; ++__s)
- __v_.push_back(*__s & 0xFFFFFFFF);
-}
-
-template<class _RandomAccessIterator>
-void
-seed_seq::generate(_RandomAccessIterator __first, _RandomAccessIterator __last)
-{
- if (__first != __last)
- {
- _VSTD::fill(__first, __last, 0x8b8b8b8b);
- const size_t __n = static_cast<size_t>(__last - __first);
- const size_t __s = __v_.size();
- const size_t __t = (__n >= 623) ? 11
- : (__n >= 68) ? 7
- : (__n >= 39) ? 5
- : (__n >= 7) ? 3
- : (__n - 1) / 2;
- const size_t __p = (__n - __t) / 2;
- const size_t __q = __p + __t;
- const size_t __m = _VSTD::max(__s + 1, __n);
- // __k = 0;
- {
- result_type __r = 1664525 * _Tp(__first[0] ^ __first[__p]
- ^ __first[__n - 1]);
- __first[__p] += __r;
- __r += __s;
- __first[__q] += __r;
- __first[0] = __r;
- }
- for (size_t __k = 1; __k <= __s; ++__k)
- {
- const size_t __kmodn = __k % __n;
- const size_t __kpmodn = (__k + __p) % __n;
- result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn]
- ^ __first[(__k - 1) % __n]);
- __first[__kpmodn] += __r;
- __r += __kmodn + __v_[__k-1];
- __first[(__k + __q) % __n] += __r;
- __first[__kmodn] = __r;
- }
- for (size_t __k = __s + 1; __k < __m; ++__k)
- {
- const size_t __kmodn = __k % __n;
- const size_t __kpmodn = (__k + __p) % __n;
- result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn]
- ^ __first[(__k - 1) % __n]);
- __first[__kpmodn] += __r;
- __r += __kmodn;
- __first[(__k + __q) % __n] += __r;
- __first[__kmodn] = __r;
- }
- for (size_t __k = __m; __k < __m + __n; ++__k)
- {
- const size_t __kmodn = __k % __n;
- const size_t __kpmodn = (__k + __p) % __n;
- result_type __r = 1566083941 * _Tp(__first[__kmodn] +
- __first[__kpmodn] +
- __first[(__k - 1) % __n]);
- __first[__kpmodn] ^= __r;
- __r -= __kmodn;
- __first[(__k + __q) % __n] ^= __r;
- __first[__kmodn] = __r;
- }
- }
-}
-
-// generate_canonical
-
-template<class _RealType, size_t __bits, class _URNG>
-_RealType
-generate_canonical(_URNG& __g)
-{
- const size_t _Dt = numeric_limits<_RealType>::digits;
- const size_t __b = _Dt < __bits ? _Dt : __bits;
-#ifdef _LIBCPP_CXX03_LANG
- const size_t __logR = __log2<uint64_t, _URNG::_Max - _URNG::_Min + uint64_t(1)>::value;
-#else
- const size_t __logR = __log2<uint64_t, _URNG::max() - _URNG::min() + uint64_t(1)>::value;
-#endif
- const size_t __k = __b / __logR + (__b % __logR != 0) + (__b == 0);
- const _RealType _Rp = _URNG::max() - _URNG::min() + _RealType(1);
- _RealType __base = _Rp;
- _RealType _Sp = __g() - _URNG::min();
- for (size_t __i = 1; __i < __k; ++__i, __base *= _Rp)
- _Sp += (__g() - _URNG::min()) * __base;
- return _Sp / __base;
-}
-
-// uniform_int_distribution
-
-// in <algorithm>
-
-template <class _CharT, class _Traits, class _IT>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const uniform_int_distribution<_IT>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- return __os << __x.a() << __sp << __x.b();
-}
-
-template <class _CharT, class _Traits, class _IT>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- uniform_int_distribution<_IT>& __x)
-{
- typedef uniform_int_distribution<_IT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __a;
- result_type __b;
- __is >> __a >> __b;
- if (!__is.fail())
- __x.param(param_type(__a, __b));
- return __is;
-}
-
-// uniform_real_distribution
-
-template<class _RealType = double>
-class _LIBCPP_TEMPLATE_VIS uniform_real_distribution
-{
-public:
- // types
- typedef _RealType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __a_;
- result_type __b_;
- public:
- typedef uniform_real_distribution distribution_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __a = 0,
- result_type __b = 1)
- : __a_(__a), __b_(__b) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type a() const {return __a_;}
- _LIBCPP_INLINE_VISIBILITY
- result_type b() const {return __b_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
-
-private:
- param_type __p_;
-
-public:
- // constructors and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit uniform_real_distribution(result_type __a = 0, result_type __b = 1)
- : __p_(param_type(__a, __b)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit uniform_real_distribution(const param_type& __p) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p);
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type a() const {return __p_.a();}
- _LIBCPP_INLINE_VISIBILITY
- result_type b() const {return __p_.b();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return a();}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return b();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const uniform_real_distribution& __x,
- const uniform_real_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const uniform_real_distribution& __x,
- const uniform_real_distribution& __y)
- {return !(__x == __y);}
-};
-
-template<class _RealType>
-template<class _URNG>
-inline
-typename uniform_real_distribution<_RealType>::result_type
-uniform_real_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
-{
- return (__p.b() - __p.a())
- * _VSTD::generate_canonical<_RealType, numeric_limits<_RealType>::digits>(__g)
- + __p.a();
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const uniform_real_distribution<_RT>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- return __os << __x.a() << __sp << __x.b();
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- uniform_real_distribution<_RT>& __x)
-{
- typedef uniform_real_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __a;
- result_type __b;
- __is >> __a >> __b;
- if (!__is.fail())
- __x.param(param_type(__a, __b));
- return __is;
-}
-
-// bernoulli_distribution
-
-class _LIBCPP_TEMPLATE_VIS bernoulli_distribution
-{
-public:
- // types
- typedef bool result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- double __p_;
- public:
- typedef bernoulli_distribution distribution_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(double __p = 0.5) : __p_(__p) {}
-
- _LIBCPP_INLINE_VISIBILITY
- double p() const {return __p_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
-
-private:
- param_type __p_;
-
-public:
- // constructors and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit bernoulli_distribution(double __p = 0.5)
- : __p_(param_type(__p)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit bernoulli_distribution(const param_type& __p) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p);
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- double p() const {return __p_.p();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return false;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return true;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const bernoulli_distribution& __x,
- const bernoulli_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const bernoulli_distribution& __x,
- const bernoulli_distribution& __y)
- {return !(__x == __y);}
-};
-
-template<class _URNG>
-inline
-bernoulli_distribution::result_type
-bernoulli_distribution::operator()(_URNG& __g, const param_type& __p)
-{
- uniform_real_distribution<double> __gen;
- return __gen(__g) < __p.p();
-}
-
-template <class _CharT, class _Traits>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os, const bernoulli_distribution& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- return __os << __x.p();
-}
-
-template <class _CharT, class _Traits>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is, bernoulli_distribution& __x)
-{
- typedef bernoulli_distribution _Eng;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- double __p;
- __is >> __p;
- if (!__is.fail())
- __x.param(param_type(__p));
- return __is;
-}
-
-// binomial_distribution
-
-template<class _IntType = int>
-class _LIBCPP_TEMPLATE_VIS binomial_distribution
-{
-public:
- // types
- typedef _IntType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __t_;
- double __p_;
- double __pr_;
- double __odds_ratio_;
- result_type __r0_;
- public:
- typedef binomial_distribution distribution_type;
-
- explicit param_type(result_type __t = 1, double __p = 0.5);
-
- _LIBCPP_INLINE_VISIBILITY
- result_type t() const {return __t_;}
- _LIBCPP_INLINE_VISIBILITY
- double p() const {return __p_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__t_ == __y.__t_ && __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
-
- friend class binomial_distribution;
- };
-
-private:
- param_type __p_;
-
-public:
- // constructors and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit binomial_distribution(result_type __t = 1, double __p = 0.5)
- : __p_(param_type(__t, __p)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit binomial_distribution(const param_type& __p) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type t() const {return __p_.t();}
- _LIBCPP_INLINE_VISIBILITY
- double p() const {return __p_.p();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return t();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const binomial_distribution& __x,
- const binomial_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const binomial_distribution& __x,
- const binomial_distribution& __y)
- {return !(__x == __y);}
-};
-
-#ifndef _LIBCPP_MSVCRT
-extern "C" double lgamma_r(double, int *);
-#endif
-
-inline _LIBCPP_INLINE_VISIBILITY double __libcpp_lgamma(double __d) {
-#if defined(_LIBCPP_MSVCRT)
- return lgamma(__d);
-#else
- int __sign;
- return lgamma_r(__d, &__sign);
-#endif
-}
-
-template<class _IntType>
-binomial_distribution<_IntType>::param_type::param_type(const result_type __t, const double __p)
- : __t_(__t), __p_(__p)
-{
- if (0 < __p_ && __p_ < 1)
- {
- __r0_ = static_cast<result_type>((__t_ + 1) * __p_);
- __pr_ = _VSTD::exp(__libcpp_lgamma(__t_ + 1.) -
- __libcpp_lgamma(__r0_ + 1.) -
- __libcpp_lgamma(__t_ - __r0_ + 1.) + __r0_ * _VSTD::log(__p_) +
- (__t_ - __r0_) * _VSTD::log(1 - __p_));
- __odds_ratio_ = __p_ / (1 - __p_);
- }
-}
-
-// Reference: Kemp, C.D. (1986). `A modal method for generating binomial
-// variables', Commun. Statist. - Theor. Meth. 15(3), 805-813.
-template<class _IntType>
-template<class _URNG>
-_IntType
-binomial_distribution<_IntType>::operator()(_URNG& __g, const param_type& __pr)
-{
- if (__pr.__t_ == 0 || __pr.__p_ == 0)
- return 0;
- if (__pr.__p_ == 1)
- return __pr.__t_;
- uniform_real_distribution<double> __gen;
- double __u = __gen(__g) - __pr.__pr_;
- if (__u < 0)
- return __pr.__r0_;
- double __pu = __pr.__pr_;
- double __pd = __pu;
- result_type __ru = __pr.__r0_;
- result_type __rd = __ru;
- while (true)
- {
- if (__rd >= 1)
- {
- __pd *= __rd / (__pr.__odds_ratio_ * (__pr.__t_ - __rd + 1));
- __u -= __pd;
- if (__u < 0)
- return __rd - 1;
- }
- if ( __rd != 0 )
- --__rd;
- ++__ru;
- if (__ru <= __pr.__t_)
- {
- __pu *= (__pr.__t_ - __ru + 1) * __pr.__odds_ratio_ / __ru;
- __u -= __pu;
- if (__u < 0)
- return __ru;
- }
- }
-}
-
-template <class _CharT, class _Traits, class _IntType>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const binomial_distribution<_IntType>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- return __os << __x.t() << __sp << __x.p();
-}
-
-template <class _CharT, class _Traits, class _IntType>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- binomial_distribution<_IntType>& __x)
-{
- typedef binomial_distribution<_IntType> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __t;
- double __p;
- __is >> __t >> __p;
- if (!__is.fail())
- __x.param(param_type(__t, __p));
- return __is;
-}
-
-// exponential_distribution
-
-template<class _RealType = double>
-class _LIBCPP_TEMPLATE_VIS exponential_distribution
-{
-public:
- // types
- typedef _RealType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __lambda_;
- public:
- typedef exponential_distribution distribution_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __lambda = 1) : __lambda_(__lambda) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type lambda() const {return __lambda_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__lambda_ == __y.__lambda_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
-
-private:
- param_type __p_;
-
-public:
- // constructors and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit exponential_distribution(result_type __lambda = 1)
- : __p_(param_type(__lambda)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit exponential_distribution(const param_type& __p) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type lambda() const {return __p_.lambda();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const exponential_distribution& __x,
- const exponential_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const exponential_distribution& __x,
- const exponential_distribution& __y)
- {return !(__x == __y);}
-};
-
-template <class _RealType>
-template<class _URNG>
-_RealType
-exponential_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
-{
- return -_VSTD::log
- (
- result_type(1) -
- _VSTD::generate_canonical<result_type,
- numeric_limits<result_type>::digits>(__g)
- )
- / __p.lambda();
-}
-
-template <class _CharT, class _Traits, class _RealType>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const exponential_distribution<_RealType>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- return __os << __x.lambda();
-}
-
-template <class _CharT, class _Traits, class _RealType>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- exponential_distribution<_RealType>& __x)
-{
- typedef exponential_distribution<_RealType> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __lambda;
- __is >> __lambda;
- if (!__is.fail())
- __x.param(param_type(__lambda));
- return __is;
-}
-
-// normal_distribution
-
-template<class _RealType = double>
-class _LIBCPP_TEMPLATE_VIS normal_distribution
-{
-public:
- // types
- typedef _RealType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __mean_;
- result_type __stddev_;
- public:
- typedef normal_distribution distribution_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __mean = 0, result_type __stddev = 1)
- : __mean_(__mean), __stddev_(__stddev) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type mean() const {return __mean_;}
- _LIBCPP_INLINE_VISIBILITY
- result_type stddev() const {return __stddev_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__mean_ == __y.__mean_ && __x.__stddev_ == __y.__stddev_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
-
-private:
- param_type __p_;
- result_type _V_;
- bool _V_hot_;
-
-public:
- // constructors and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit normal_distribution(result_type __mean = 0, result_type __stddev = 1)
- : __p_(param_type(__mean, __stddev)), _V_hot_(false) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit normal_distribution(const param_type& __p)
- : __p_(__p), _V_hot_(false) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {_V_hot_ = false;}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type mean() const {return __p_.mean();}
- _LIBCPP_INLINE_VISIBILITY
- result_type stddev() const {return __p_.stddev();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return -numeric_limits<result_type>::infinity();}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const normal_distribution& __x,
- const normal_distribution& __y)
- {return __x.__p_ == __y.__p_ && __x._V_hot_ == __y._V_hot_ &&
- (!__x._V_hot_ || __x._V_ == __y._V_);}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const normal_distribution& __x,
- const normal_distribution& __y)
- {return !(__x == __y);}
-
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const normal_distribution<_RT>& __x);
-
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- normal_distribution<_RT>& __x);
-};
-
-template <class _RealType>
-template<class _URNG>
-_RealType
-normal_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
-{
- result_type _Up;
- if (_V_hot_)
- {
- _V_hot_ = false;
- _Up = _V_;
- }
- else
- {
- uniform_real_distribution<result_type> _Uni(-1, 1);
- result_type __u;
- result_type __v;
- result_type __s;
- do
- {
- __u = _Uni(__g);
- __v = _Uni(__g);
- __s = __u * __u + __v * __v;
- } while (__s > 1 || __s == 0);
- result_type _Fp = _VSTD::sqrt(-2 * _VSTD::log(__s) / __s);
- _V_ = __v * _Fp;
- _V_hot_ = true;
- _Up = __u * _Fp;
- }
- return _Up * __p.stddev() + __p.mean();
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const normal_distribution<_RT>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.mean() << __sp << __x.stddev() << __sp << __x._V_hot_;
- if (__x._V_hot_)
- __os << __sp << __x._V_;
- return __os;
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- normal_distribution<_RT>& __x)
-{
- typedef normal_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __mean;
- result_type __stddev;
- result_type _Vp = 0;
- bool _V_hot = false;
- __is >> __mean >> __stddev >> _V_hot;
- if (_V_hot)
- __is >> _Vp;
- if (!__is.fail())
- {
- __x.param(param_type(__mean, __stddev));
- __x._V_hot_ = _V_hot;
- __x._V_ = _Vp;
- }
- return __is;
-}
-
-// lognormal_distribution
-
-template<class _RealType = double>
-class _LIBCPP_TEMPLATE_VIS lognormal_distribution
-{
-public:
- // types
- typedef _RealType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- normal_distribution<result_type> __nd_;
- public:
- typedef lognormal_distribution distribution_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __m = 0, result_type __s = 1)
- : __nd_(__m, __s) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type m() const {return __nd_.mean();}
- _LIBCPP_INLINE_VISIBILITY
- result_type s() const {return __nd_.stddev();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__nd_ == __y.__nd_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- friend class lognormal_distribution;
-
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const lognormal_distribution<_RT>& __x);
-
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- lognormal_distribution<_RT>& __x);
- };
-
-private:
- param_type __p_;
-
-public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit lognormal_distribution(result_type __m = 0, result_type __s = 1)
- : __p_(param_type(__m, __s)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit lognormal_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {__p_.__nd_.reset();}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g, const param_type& __p)
- {return _VSTD::exp(const_cast<normal_distribution<result_type>&>(__p.__nd_)(__g));}
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type m() const {return __p_.m();}
- _LIBCPP_INLINE_VISIBILITY
- result_type s() const {return __p_.s();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const lognormal_distribution& __x,
- const lognormal_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const lognormal_distribution& __x,
- const lognormal_distribution& __y)
- {return !(__x == __y);}
-
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const lognormal_distribution<_RT>& __x);
-
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- lognormal_distribution<_RT>& __x);
-};
-
-template <class _CharT, class _Traits, class _RT>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const lognormal_distribution<_RT>& __x)
-{
- return __os << __x.__p_.__nd_;
-}
-
-template <class _CharT, class _Traits, class _RT>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- lognormal_distribution<_RT>& __x)
-{
- return __is >> __x.__p_.__nd_;
-}
-
-// poisson_distribution
-
-template<class _IntType = int>
-class _LIBCPP_TEMPLATE_VIS poisson_distribution
-{
-public:
- // types
- typedef _IntType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- double __mean_;
- double __s_;
- double __d_;
- double __l_;
- double __omega_;
- double __c0_;
- double __c1_;
- double __c2_;
- double __c3_;
- double __c_;
-
- public:
- typedef poisson_distribution distribution_type;
-
- explicit param_type(double __mean = 1.0);
-
- _LIBCPP_INLINE_VISIBILITY
- double mean() const {return __mean_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__mean_ == __y.__mean_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
-
- friend class poisson_distribution;
- };
-
-private:
- param_type __p_;
-
-public:
- // constructors and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit poisson_distribution(double __mean = 1.0) : __p_(__mean) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit poisson_distribution(const param_type& __p) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- double mean() const {return __p_.mean();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::max();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const poisson_distribution& __x,
- const poisson_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const poisson_distribution& __x,
- const poisson_distribution& __y)
- {return !(__x == __y);}
-};
-
-template<class _IntType>
-poisson_distribution<_IntType>::param_type::param_type(double __mean)
- : __mean_(__mean)
-{
- if (__mean_ < 10)
- {
- __s_ = 0;
- __d_ = 0;
- __l_ = _VSTD::exp(-__mean_);
- __omega_ = 0;
- __c3_ = 0;
- __c2_ = 0;
- __c1_ = 0;
- __c0_ = 0;
- __c_ = 0;
- }
- else
- {
- __s_ = _VSTD::sqrt(__mean_);
- __d_ = 6 * __mean_ * __mean_;
- __l_ = static_cast<result_type>(__mean_ - 1.1484);
- __omega_ = .3989423 / __s_;
- double __b1_ = .4166667E-1 / __mean_;
- double __b2_ = .3 * __b1_ * __b1_;
- __c3_ = .1428571 * __b1_ * __b2_;
- __c2_ = __b2_ - 15. * __c3_;
- __c1_ = __b1_ - 6. * __b2_ + 45. * __c3_;
- __c0_ = 1. - __b1_ + 3. * __b2_ - 15. * __c3_;
- __c_ = .1069 / __mean_;
- }
-}
-
-template <class _IntType>
-template<class _URNG>
-_IntType
-poisson_distribution<_IntType>::operator()(_URNG& __urng, const param_type& __pr)
-{
- result_type __x;
- uniform_real_distribution<double> __urd;
- if (__pr.__mean_ < 10)
- {
- __x = 0;
- for (double __p = __urd(__urng); __p > __pr.__l_; ++__x)
- __p *= __urd(__urng);
- }
- else
- {
- double __difmuk;
- double __g = __pr.__mean_ + __pr.__s_ * normal_distribution<double>()(__urng);
- double __u;
- if (__g > 0)
- {
- __x = static_cast<result_type>(__g);
- if (__x >= __pr.__l_)
- return __x;
- __difmuk = __pr.__mean_ - __x;
- __u = __urd(__urng);
- if (__pr.__d_ * __u >= __difmuk * __difmuk * __difmuk)
- return __x;
- }
- exponential_distribution<double> __edist;
- for (bool __using_exp_dist = false; true; __using_exp_dist = true)
- {
- double __e;
- if (__using_exp_dist || __g < 0)
- {
- double __t;
- do
- {
- __e = __edist(__urng);
- __u = __urd(__urng);
- __u += __u - 1;
- __t = 1.8 + (__u < 0 ? -__e : __e);
- } while (__t <= -.6744);
- __x = __pr.__mean_ + __pr.__s_ * __t;
- __difmuk = __pr.__mean_ - __x;
- __using_exp_dist = true;
- }
- double __px;
- double __py;
- if (__x < 10)
- {
- const double __fac[] = {1, 1, 2, 6, 24, 120, 720, 5040,
- 40320, 362880};
- __px = -__pr.__mean_;
- __py = _VSTD::pow(__pr.__mean_, (double)__x) / __fac[__x];
- }
- else
- {
- double __del = .8333333E-1 / __x;
- __del -= 4.8 * __del * __del * __del;
- double __v = __difmuk / __x;
- if (_VSTD::abs(__v) > 0.25)
- __px = __x * _VSTD::log(1 + __v) - __difmuk - __del;
- else
- __px = __x * __v * __v * (((((((.1250060 * __v + -.1384794) *
- __v + .1421878) * __v + -.1661269) * __v + .2000118) *
- __v + -.2500068) * __v + .3333333) * __v + -.5) - __del;
- __py = .3989423 / _VSTD::sqrt(__x);
- }
- double __r = (0.5 - __difmuk) / __pr.__s_;
- double __r2 = __r * __r;
- double __fx = -0.5 * __r2;
- double __fy = __pr.__omega_ * (((__pr.__c3_ * __r2 + __pr.__c2_) *
- __r2 + __pr.__c1_) * __r2 + __pr.__c0_);
- if (__using_exp_dist)
- {
- if (__pr.__c_ * _VSTD::abs(__u) <= __py * _VSTD::exp(__px + __e) -
- __fy * _VSTD::exp(__fx + __e))
- break;
- }
- else
- {
- if (__fy - __u * __fy <= __py * _VSTD::exp(__px - __fx))
- break;
- }
- }
- }
- return __x;
-}
-
-template <class _CharT, class _Traits, class _IntType>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const poisson_distribution<_IntType>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- return __os << __x.mean();
-}
-
-template <class _CharT, class _Traits, class _IntType>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- poisson_distribution<_IntType>& __x)
-{
- typedef poisson_distribution<_IntType> _Eng;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- double __mean;
- __is >> __mean;
- if (!__is.fail())
- __x.param(param_type(__mean));
- return __is;
-}
-
-// weibull_distribution
-
-template<class _RealType = double>
-class _LIBCPP_TEMPLATE_VIS weibull_distribution
-{
-public:
- // types
- typedef _RealType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __a_;
- result_type __b_;
- public:
- typedef weibull_distribution distribution_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __a = 1, result_type __b = 1)
- : __a_(__a), __b_(__b) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type a() const {return __a_;}
- _LIBCPP_INLINE_VISIBILITY
- result_type b() const {return __b_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
-
-private:
- param_type __p_;
-
-public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit weibull_distribution(result_type __a = 1, result_type __b = 1)
- : __p_(param_type(__a, __b)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit weibull_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g, const param_type& __p)
- {return __p.b() *
- _VSTD::pow(exponential_distribution<result_type>()(__g), 1/__p.a());}
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type a() const {return __p_.a();}
- _LIBCPP_INLINE_VISIBILITY
- result_type b() const {return __p_.b();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const weibull_distribution& __x,
- const weibull_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const weibull_distribution& __x,
- const weibull_distribution& __y)
- {return !(__x == __y);}
-};
-
-template <class _CharT, class _Traits, class _RT>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const weibull_distribution<_RT>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.a() << __sp << __x.b();
- return __os;
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- weibull_distribution<_RT>& __x)
-{
- typedef weibull_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __a;
- result_type __b;
- __is >> __a >> __b;
- if (!__is.fail())
- __x.param(param_type(__a, __b));
- return __is;
-}
-
-template<class _RealType = double>
-class _LIBCPP_TEMPLATE_VIS extreme_value_distribution
-{
-public:
- // types
- typedef _RealType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __a_;
- result_type __b_;
- public:
- typedef extreme_value_distribution distribution_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __a = 0, result_type __b = 1)
- : __a_(__a), __b_(__b) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type a() const {return __a_;}
- _LIBCPP_INLINE_VISIBILITY
- result_type b() const {return __b_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
-
-private:
- param_type __p_;
-
-public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit extreme_value_distribution(result_type __a = 0, result_type __b = 1)
- : __p_(param_type(__a, __b)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit extreme_value_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type a() const {return __p_.a();}
- _LIBCPP_INLINE_VISIBILITY
- result_type b() const {return __p_.b();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return -numeric_limits<result_type>::infinity();}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const extreme_value_distribution& __x,
- const extreme_value_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const extreme_value_distribution& __x,
- const extreme_value_distribution& __y)
- {return !(__x == __y);}
-};
-
-template<class _RealType>
-template<class _URNG>
-_RealType
-extreme_value_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
-{
- return __p.a() - __p.b() *
- _VSTD::log(-_VSTD::log(1-uniform_real_distribution<result_type>()(__g)));
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const extreme_value_distribution<_RT>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.a() << __sp << __x.b();
- return __os;
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- extreme_value_distribution<_RT>& __x)
-{
- typedef extreme_value_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __a;
- result_type __b;
- __is >> __a >> __b;
- if (!__is.fail())
- __x.param(param_type(__a, __b));
- return __is;
-}
-
-// gamma_distribution
-
-template<class _RealType = double>
-class _LIBCPP_TEMPLATE_VIS gamma_distribution
-{
-public:
- // types
- typedef _RealType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __alpha_;
- result_type __beta_;
- public:
- typedef gamma_distribution distribution_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __alpha = 1, result_type __beta = 1)
- : __alpha_(__alpha), __beta_(__beta) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type alpha() const {return __alpha_;}
- _LIBCPP_INLINE_VISIBILITY
- result_type beta() const {return __beta_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__alpha_ == __y.__alpha_ && __x.__beta_ == __y.__beta_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
-
-private:
- param_type __p_;
-
-public:
- // constructors and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit gamma_distribution(result_type __alpha = 1, result_type __beta = 1)
- : __p_(param_type(__alpha, __beta)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit gamma_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type alpha() const {return __p_.alpha();}
- _LIBCPP_INLINE_VISIBILITY
- result_type beta() const {return __p_.beta();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const gamma_distribution& __x,
- const gamma_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const gamma_distribution& __x,
- const gamma_distribution& __y)
- {return !(__x == __y);}
-};
-
-template <class _RealType>
-template<class _URNG>
-_RealType
-gamma_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
-{
- result_type __a = __p.alpha();
- uniform_real_distribution<result_type> __gen(0, 1);
- exponential_distribution<result_type> __egen;
- result_type __x;
- if (__a == 1)
- __x = __egen(__g);
- else if (__a > 1)
- {
- const result_type __b = __a - 1;
- const result_type __c = 3 * __a - result_type(0.75);
- while (true)
- {
- const result_type __u = __gen(__g);
- const result_type __v = __gen(__g);
- const result_type __w = __u * (1 - __u);
- if (__w != 0)
- {
- const result_type __y = _VSTD::sqrt(__c / __w) *
- (__u - result_type(0.5));
- __x = __b + __y;
- if (__x >= 0)
- {
- const result_type __z = 64 * __w * __w * __w * __v * __v;
- if (__z <= 1 - 2 * __y * __y / __x)
- break;
- if (_VSTD::log(__z) <= 2 * (__b * _VSTD::log(__x / __b) - __y))
- break;
- }
- }
- }
- }
- else // __a < 1
- {
- while (true)
- {
- const result_type __u = __gen(__g);
- const result_type __es = __egen(__g);
- if (__u <= 1 - __a)
- {
- __x = _VSTD::pow(__u, 1 / __a);
- if (__x <= __es)
- break;
- }
- else
- {
- const result_type __e = -_VSTD::log((1-__u)/__a);
- __x = _VSTD::pow(1 - __a + __a * __e, 1 / __a);
- if (__x <= __e + __es)
- break;
- }
- }
- }
- return __x * __p.beta();
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const gamma_distribution<_RT>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.alpha() << __sp << __x.beta();
- return __os;
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- gamma_distribution<_RT>& __x)
-{
- typedef gamma_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __alpha;
- result_type __beta;
- __is >> __alpha >> __beta;
- if (!__is.fail())
- __x.param(param_type(__alpha, __beta));
- return __is;
-}
-
-// negative_binomial_distribution
-
-template<class _IntType = int>
-class _LIBCPP_TEMPLATE_VIS negative_binomial_distribution
-{
-public:
- // types
- typedef _IntType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __k_;
- double __p_;
- public:
- typedef negative_binomial_distribution distribution_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __k = 1, double __p = 0.5)
- : __k_(__k), __p_(__p) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type k() const {return __k_;}
- _LIBCPP_INLINE_VISIBILITY
- double p() const {return __p_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__k_ == __y.__k_ && __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
-
-private:
- param_type __p_;
-
-public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit negative_binomial_distribution(result_type __k = 1, double __p = 0.5)
- : __p_(__k, __p) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit negative_binomial_distribution(const param_type& __p) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type k() const {return __p_.k();}
- _LIBCPP_INLINE_VISIBILITY
- double p() const {return __p_.p();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::max();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const negative_binomial_distribution& __x,
- const negative_binomial_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const negative_binomial_distribution& __x,
- const negative_binomial_distribution& __y)
- {return !(__x == __y);}
-};
-
-template <class _IntType>
-template<class _URNG>
-_IntType
-negative_binomial_distribution<_IntType>::operator()(_URNG& __urng, const param_type& __pr)
-{
- result_type __k = __pr.k();
- double __p = __pr.p();
- if (__k <= 21 * __p)
- {
- bernoulli_distribution __gen(__p);
- result_type __f = 0;
- result_type __s = 0;
- while (__s < __k)
- {
- if (__gen(__urng))
- ++__s;
- else
- ++__f;
- }
- return __f;
- }
- return poisson_distribution<result_type>(gamma_distribution<double>
- (__k, (1-__p)/__p)(__urng))(__urng);
-}
-
-template <class _CharT, class _Traits, class _IntType>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const negative_binomial_distribution<_IntType>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- return __os << __x.k() << __sp << __x.p();
-}
-
-template <class _CharT, class _Traits, class _IntType>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- negative_binomial_distribution<_IntType>& __x)
-{
- typedef negative_binomial_distribution<_IntType> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __k;
- double __p;
- __is >> __k >> __p;
- if (!__is.fail())
- __x.param(param_type(__k, __p));
- return __is;
-}
-
-// geometric_distribution
-
-template<class _IntType = int>
-class _LIBCPP_TEMPLATE_VIS geometric_distribution
-{
-public:
- // types
- typedef _IntType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- double __p_;
- public:
- typedef geometric_distribution distribution_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(double __p = 0.5) : __p_(__p) {}
-
- _LIBCPP_INLINE_VISIBILITY
- double p() const {return __p_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
-
-private:
- param_type __p_;
-
-public:
- // constructors and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit geometric_distribution(double __p = 0.5) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit geometric_distribution(const param_type& __p) : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g, const param_type& __p)
- {return negative_binomial_distribution<result_type>(1, __p.p())(__g);}
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- double p() const {return __p_.p();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::max();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const geometric_distribution& __x,
- const geometric_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const geometric_distribution& __x,
- const geometric_distribution& __y)
- {return !(__x == __y);}
-};
-
-template <class _CharT, class _Traits, class _IntType>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const geometric_distribution<_IntType>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- return __os << __x.p();
-}
-
-template <class _CharT, class _Traits, class _IntType>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- geometric_distribution<_IntType>& __x)
-{
- typedef geometric_distribution<_IntType> _Eng;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- double __p;
- __is >> __p;
- if (!__is.fail())
- __x.param(param_type(__p));
- return __is;
-}
-
-// chi_squared_distribution
-
-template<class _RealType = double>
-class _LIBCPP_TEMPLATE_VIS chi_squared_distribution
-{
-public:
- // types
- typedef _RealType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __n_;
- public:
- typedef chi_squared_distribution distribution_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __n = 1) : __n_(__n) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type n() const {return __n_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__n_ == __y.__n_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
-
-private:
- param_type __p_;
-
-public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit chi_squared_distribution(result_type __n = 1)
- : __p_(param_type(__n)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit chi_squared_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g, const param_type& __p)
- {return gamma_distribution<result_type>(__p.n() / 2, 2)(__g);}
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type n() const {return __p_.n();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const chi_squared_distribution& __x,
- const chi_squared_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const chi_squared_distribution& __x,
- const chi_squared_distribution& __y)
- {return !(__x == __y);}
-};
-
-template <class _CharT, class _Traits, class _RT>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const chi_squared_distribution<_RT>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- __os << __x.n();
- return __os;
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- chi_squared_distribution<_RT>& __x)
-{
- typedef chi_squared_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __n;
- __is >> __n;
- if (!__is.fail())
- __x.param(param_type(__n));
- return __is;
-}
-
-// cauchy_distribution
-
-template<class _RealType = double>
-class _LIBCPP_TEMPLATE_VIS cauchy_distribution
-{
-public:
- // types
- typedef _RealType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __a_;
- result_type __b_;
- public:
- typedef cauchy_distribution distribution_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __a = 0, result_type __b = 1)
- : __a_(__a), __b_(__b) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type a() const {return __a_;}
- _LIBCPP_INLINE_VISIBILITY
- result_type b() const {return __b_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
-
-private:
- param_type __p_;
-
-public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit cauchy_distribution(result_type __a = 0, result_type __b = 1)
- : __p_(param_type(__a, __b)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit cauchy_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p);
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type a() const {return __p_.a();}
- _LIBCPP_INLINE_VISIBILITY
- result_type b() const {return __p_.b();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return -numeric_limits<result_type>::infinity();}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const cauchy_distribution& __x,
- const cauchy_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const cauchy_distribution& __x,
- const cauchy_distribution& __y)
- {return !(__x == __y);}
-};
-
-template <class _RealType>
-template<class _URNG>
-inline
-_RealType
-cauchy_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
-{
- uniform_real_distribution<result_type> __gen;
- // purposefully let tan arg get as close to pi/2 as it wants, tan will return a finite
- return __p.a() + __p.b() * _VSTD::tan(3.1415926535897932384626433832795 * __gen(__g));
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const cauchy_distribution<_RT>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.a() << __sp << __x.b();
- return __os;
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- cauchy_distribution<_RT>& __x)
-{
- typedef cauchy_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __a;
- result_type __b;
- __is >> __a >> __b;
- if (!__is.fail())
- __x.param(param_type(__a, __b));
- return __is;
-}
-
-// fisher_f_distribution
-
-template<class _RealType = double>
-class _LIBCPP_TEMPLATE_VIS fisher_f_distribution
-{
-public:
- // types
- typedef _RealType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __m_;
- result_type __n_;
- public:
- typedef fisher_f_distribution distribution_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __m = 1, result_type __n = 1)
- : __m_(__m), __n_(__n) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type m() const {return __m_;}
- _LIBCPP_INLINE_VISIBILITY
- result_type n() const {return __n_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__m_ == __y.__m_ && __x.__n_ == __y.__n_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
-
-private:
- param_type __p_;
-
-public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit fisher_f_distribution(result_type __m = 1, result_type __n = 1)
- : __p_(param_type(__m, __n)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit fisher_f_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type m() const {return __p_.m();}
- _LIBCPP_INLINE_VISIBILITY
- result_type n() const {return __p_.n();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const fisher_f_distribution& __x,
- const fisher_f_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const fisher_f_distribution& __x,
- const fisher_f_distribution& __y)
- {return !(__x == __y);}
-};
-
-template <class _RealType>
-template<class _URNG>
-_RealType
-fisher_f_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
-{
- gamma_distribution<result_type> __gdm(__p.m() * result_type(.5));
- gamma_distribution<result_type> __gdn(__p.n() * result_type(.5));
- return __p.n() * __gdm(__g) / (__p.m() * __gdn(__g));
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const fisher_f_distribution<_RT>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- __os << __x.m() << __sp << __x.n();
- return __os;
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- fisher_f_distribution<_RT>& __x)
-{
- typedef fisher_f_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __m;
- result_type __n;
- __is >> __m >> __n;
- if (!__is.fail())
- __x.param(param_type(__m, __n));
- return __is;
-}
-
-// student_t_distribution
-
-template<class _RealType = double>
-class _LIBCPP_TEMPLATE_VIS student_t_distribution
-{
-public:
- // types
- typedef _RealType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- result_type __n_;
- public:
- typedef student_t_distribution distribution_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit param_type(result_type __n = 1) : __n_(__n) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type n() const {return __n_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__n_ == __y.__n_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
- };
-
-private:
- param_type __p_;
- normal_distribution<result_type> __nd_;
-
-public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- explicit student_t_distribution(result_type __n = 1)
- : __p_(param_type(__n)) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit student_t_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {__nd_.reset();}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- result_type n() const {return __p_.n();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return -numeric_limits<result_type>::infinity();}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return numeric_limits<result_type>::infinity();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const student_t_distribution& __x,
- const student_t_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const student_t_distribution& __x,
- const student_t_distribution& __y)
- {return !(__x == __y);}
-};
-
-template <class _RealType>
-template<class _URNG>
-_RealType
-student_t_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
-{
- gamma_distribution<result_type> __gd(__p.n() * .5, 2);
- return __nd_(__g) * _VSTD::sqrt(__p.n()/__gd(__g));
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const student_t_distribution<_RT>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- __os << __x.n();
- return __os;
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- student_t_distribution<_RT>& __x)
-{
- typedef student_t_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- typedef typename _Eng::param_type param_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- result_type __n;
- __is >> __n;
- if (!__is.fail())
- __x.param(param_type(__n));
- return __is;
-}
-
-// discrete_distribution
-
-template<class _IntType = int>
-class _LIBCPP_TEMPLATE_VIS discrete_distribution
-{
-public:
- // types
- typedef _IntType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- vector<double> __p_;
- public:
- typedef discrete_distribution distribution_type;
-
- _LIBCPP_INLINE_VISIBILITY
- param_type() {}
- template<class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- param_type(_InputIterator __f, _InputIterator __l)
- : __p_(__f, __l) {__init();}
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- param_type(initializer_list<double> __wl)
- : __p_(__wl.begin(), __wl.end()) {__init();}
-#endif // _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- param_type(size_t __nw, double __xmin, double __xmax,
- _UnaryOperation __fw);
-
- vector<double> probabilities() const;
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
-
- private:
- void __init();
-
- friend class discrete_distribution;
-
- template <class _CharT, class _Traits, class _IT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const discrete_distribution<_IT>& __x);
-
- template <class _CharT, class _Traits, class _IT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- discrete_distribution<_IT>& __x);
- };
-
-private:
- param_type __p_;
-
-public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- discrete_distribution() {}
- template<class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- discrete_distribution(_InputIterator __f, _InputIterator __l)
- : __p_(__f, __l) {}
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- discrete_distribution(initializer_list<double> __wl)
- : __p_(__wl) {}
-#endif // _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- _LIBCPP_INLINE_VISIBILITY
- discrete_distribution(size_t __nw, double __xmin, double __xmax,
- _UnaryOperation __fw)
- : __p_(__nw, __xmin, __xmax, __fw) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit discrete_distribution(const param_type& __p)
- : __p_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- vector<double> probabilities() const {return __p_.probabilities();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return 0;}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return __p_.__p_.size();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const discrete_distribution& __x,
- const discrete_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const discrete_distribution& __x,
- const discrete_distribution& __y)
- {return !(__x == __y);}
-
- template <class _CharT, class _Traits, class _IT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const discrete_distribution<_IT>& __x);
-
- template <class _CharT, class _Traits, class _IT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- discrete_distribution<_IT>& __x);
-};
-
-template<class _IntType>
-template<class _UnaryOperation>
-discrete_distribution<_IntType>::param_type::param_type(size_t __nw,
- double __xmin,
- double __xmax,
- _UnaryOperation __fw)
-{
- if (__nw > 1)
- {
- __p_.reserve(__nw - 1);
- double __d = (__xmax - __xmin) / __nw;
- double __d2 = __d / 2;
- for (size_t __k = 0; __k < __nw; ++__k)
- __p_.push_back(__fw(__xmin + __k * __d + __d2));
- __init();
- }
-}
-
-template<class _IntType>
-void
-discrete_distribution<_IntType>::param_type::__init()
-{
- if (!__p_.empty())
- {
- if (__p_.size() > 1)
- {
- double __s = _VSTD::accumulate(__p_.begin(), __p_.end(), 0.0);
- for (_VSTD::vector<double>::iterator __i = __p_.begin(), __e = __p_.end();
- __i < __e; ++__i)
- *__i /= __s;
- vector<double> __t(__p_.size() - 1);
- _VSTD::partial_sum(__p_.begin(), __p_.end() - 1, __t.begin());
- swap(__p_, __t);
- }
- else
- {
- __p_.clear();
- __p_.shrink_to_fit();
- }
- }
-}
-
-template<class _IntType>
-vector<double>
-discrete_distribution<_IntType>::param_type::probabilities() const
-{
- size_t __n = __p_.size();
- _VSTD::vector<double> __p(__n+1);
- _VSTD::adjacent_difference(__p_.begin(), __p_.end(), __p.begin());
- if (__n > 0)
- __p[__n] = 1 - __p_[__n-1];
- else
- __p[0] = 1;
- return __p;
-}
-
-template<class _IntType>
-template<class _URNG>
-_IntType
-discrete_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p)
-{
- uniform_real_distribution<double> __gen;
- return static_cast<_IntType>(
- _VSTD::upper_bound(__p.__p_.begin(), __p.__p_.end(), __gen(__g)) -
- __p.__p_.begin());
-}
-
-template <class _CharT, class _Traits, class _IT>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const discrete_distribution<_IT>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- size_t __n = __x.__p_.__p_.size();
- __os << __n;
- for (size_t __i = 0; __i < __n; ++__i)
- __os << __sp << __x.__p_.__p_[__i];
- return __os;
-}
-
-template <class _CharT, class _Traits, class _IT>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- discrete_distribution<_IT>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- size_t __n;
- __is >> __n;
- vector<double> __p(__n);
- for (size_t __i = 0; __i < __n; ++__i)
- __is >> __p[__i];
- if (!__is.fail())
- swap(__x.__p_.__p_, __p);
- return __is;
-}
-
-// piecewise_constant_distribution
-
-template<class _RealType = double>
-class _LIBCPP_TEMPLATE_VIS piecewise_constant_distribution
-{
-public:
- // types
- typedef _RealType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- vector<result_type> __b_;
- vector<result_type> __densities_;
- vector<result_type> __areas_;
- public:
- typedef piecewise_constant_distribution distribution_type;
-
- param_type();
- template<class _InputIteratorB, class _InputIteratorW>
- param_type(_InputIteratorB __fB, _InputIteratorB __lB,
- _InputIteratorW __fW);
-#ifndef _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- param_type(initializer_list<result_type> __bl, _UnaryOperation __fw);
-#endif // _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- param_type(size_t __nw, result_type __xmin, result_type __xmax,
- _UnaryOperation __fw);
- param_type & operator=(const param_type& __rhs);
-
- _LIBCPP_INLINE_VISIBILITY
- vector<result_type> intervals() const {return __b_;}
- _LIBCPP_INLINE_VISIBILITY
- vector<result_type> densities() const {return __densities_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__densities_ == __y.__densities_ && __x.__b_ == __y.__b_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
-
- private:
- void __init();
-
- friend class piecewise_constant_distribution;
-
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const piecewise_constant_distribution<_RT>& __x);
-
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- piecewise_constant_distribution<_RT>& __x);
- };
-
-private:
- param_type __p_;
-
-public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- piecewise_constant_distribution() {}
- template<class _InputIteratorB, class _InputIteratorW>
- _LIBCPP_INLINE_VISIBILITY
- piecewise_constant_distribution(_InputIteratorB __fB,
- _InputIteratorB __lB,
- _InputIteratorW __fW)
- : __p_(__fB, __lB, __fW) {}
-
-#ifndef _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- _LIBCPP_INLINE_VISIBILITY
- piecewise_constant_distribution(initializer_list<result_type> __bl,
- _UnaryOperation __fw)
- : __p_(__bl, __fw) {}
-#endif // _LIBCPP_CXX03_LANG
-
- template<class _UnaryOperation>
- _LIBCPP_INLINE_VISIBILITY
- piecewise_constant_distribution(size_t __nw, result_type __xmin,
- result_type __xmax, _UnaryOperation __fw)
- : __p_(__nw, __xmin, __xmax, __fw) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit piecewise_constant_distribution(const param_type& __p)
- : __p_(__p) {}
-
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- vector<result_type> intervals() const {return __p_.intervals();}
- _LIBCPP_INLINE_VISIBILITY
- vector<result_type> densities() const {return __p_.densities();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return __p_.__b_.front();}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return __p_.__b_.back();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const piecewise_constant_distribution& __x,
- const piecewise_constant_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const piecewise_constant_distribution& __x,
- const piecewise_constant_distribution& __y)
- {return !(__x == __y);}
-
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const piecewise_constant_distribution<_RT>& __x);
-
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- piecewise_constant_distribution<_RT>& __x);
-};
-
-template<class _RealType>
-typename piecewise_constant_distribution<_RealType>::param_type &
-piecewise_constant_distribution<_RealType>::param_type::operator=
- (const param_type& __rhs)
-{
-// These can throw
- __b_.reserve (__rhs.__b_.size ());
- __densities_.reserve(__rhs.__densities_.size());
- __areas_.reserve (__rhs.__areas_.size());
-
-// These can not throw
- __b_ = __rhs.__b_;
- __densities_ = __rhs.__densities_;
- __areas_ = __rhs.__areas_;
- return *this;
-}
-
-template<class _RealType>
-void
-piecewise_constant_distribution<_RealType>::param_type::__init()
-{
- // __densities_ contains non-normalized areas
- result_type __total_area = _VSTD::accumulate(__densities_.begin(),
- __densities_.end(),
- result_type());
- for (size_t __i = 0; __i < __densities_.size(); ++__i)
- __densities_[__i] /= __total_area;
- // __densities_ contains normalized areas
- __areas_.assign(__densities_.size(), result_type());
- _VSTD::partial_sum(__densities_.begin(), __densities_.end() - 1,
- __areas_.begin() + 1);
- // __areas_ contains partial sums of normalized areas: [0, __densities_ - 1]
- __densities_.back() = 1 - __areas_.back(); // correct round off error
- for (size_t __i = 0; __i < __densities_.size(); ++__i)
- __densities_[__i] /= (__b_[__i+1] - __b_[__i]);
- // __densities_ now contains __densities_
-}
-
-template<class _RealType>
-piecewise_constant_distribution<_RealType>::param_type::param_type()
- : __b_(2),
- __densities_(1, 1.0),
- __areas_(1, 0.0)
-{
- __b_[1] = 1;
-}
-
-template<class _RealType>
-template<class _InputIteratorB, class _InputIteratorW>
-piecewise_constant_distribution<_RealType>::param_type::param_type(
- _InputIteratorB __fB, _InputIteratorB __lB, _InputIteratorW __fW)
- : __b_(__fB, __lB)
-{
- if (__b_.size() < 2)
- {
- __b_.resize(2);
- __b_[0] = 0;
- __b_[1] = 1;
- __densities_.assign(1, 1.0);
- __areas_.assign(1, 0.0);
- }
- else
- {
- __densities_.reserve(__b_.size() - 1);
- for (size_t __i = 0; __i < __b_.size() - 1; ++__i, ++__fW)
- __densities_.push_back(*__fW);
- __init();
- }
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template<class _RealType>
-template<class _UnaryOperation>
-piecewise_constant_distribution<_RealType>::param_type::param_type(
- initializer_list<result_type> __bl, _UnaryOperation __fw)
- : __b_(__bl.begin(), __bl.end())
-{
- if (__b_.size() < 2)
- {
- __b_.resize(2);
- __b_[0] = 0;
- __b_[1] = 1;
- __densities_.assign(1, 1.0);
- __areas_.assign(1, 0.0);
- }
- else
- {
- __densities_.reserve(__b_.size() - 1);
- for (size_t __i = 0; __i < __b_.size() - 1; ++__i)
- __densities_.push_back(__fw((__b_[__i+1] + __b_[__i])*.5));
- __init();
- }
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template<class _RealType>
-template<class _UnaryOperation>
-piecewise_constant_distribution<_RealType>::param_type::param_type(
- size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw)
- : __b_(__nw == 0 ? 2 : __nw + 1)
-{
- size_t __n = __b_.size() - 1;
- result_type __d = (__xmax - __xmin) / __n;
- __densities_.reserve(__n);
- for (size_t __i = 0; __i < __n; ++__i)
- {
- __b_[__i] = __xmin + __i * __d;
- __densities_.push_back(__fw(__b_[__i] + __d*.5));
- }
- __b_[__n] = __xmax;
- __init();
-}
-
-template<class _RealType>
-template<class _URNG>
-_RealType
-piecewise_constant_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
-{
- typedef uniform_real_distribution<result_type> _Gen;
- result_type __u = _Gen()(__g);
- ptrdiff_t __k = _VSTD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(),
- __u) - __p.__areas_.begin() - 1;
- return (__u - __p.__areas_[__k]) / __p.__densities_[__k] + __p.__b_[__k];
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const piecewise_constant_distribution<_RT>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- size_t __n = __x.__p_.__b_.size();
- __os << __n;
- for (size_t __i = 0; __i < __n; ++__i)
- __os << __sp << __x.__p_.__b_[__i];
- __n = __x.__p_.__densities_.size();
- __os << __sp << __n;
- for (size_t __i = 0; __i < __n; ++__i)
- __os << __sp << __x.__p_.__densities_[__i];
- __n = __x.__p_.__areas_.size();
- __os << __sp << __n;
- for (size_t __i = 0; __i < __n; ++__i)
- __os << __sp << __x.__p_.__areas_[__i];
- return __os;
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- piecewise_constant_distribution<_RT>& __x)
-{
- typedef piecewise_constant_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- size_t __n;
- __is >> __n;
- vector<result_type> __b(__n);
- for (size_t __i = 0; __i < __n; ++__i)
- __is >> __b[__i];
- __is >> __n;
- vector<result_type> __densities(__n);
- for (size_t __i = 0; __i < __n; ++__i)
- __is >> __densities[__i];
- __is >> __n;
- vector<result_type> __areas(__n);
- for (size_t __i = 0; __i < __n; ++__i)
- __is >> __areas[__i];
- if (!__is.fail())
- {
- swap(__x.__p_.__b_, __b);
- swap(__x.__p_.__densities_, __densities);
- swap(__x.__p_.__areas_, __areas);
- }
- return __is;
-}
-
-// piecewise_linear_distribution
-
-template<class _RealType = double>
-class _LIBCPP_TEMPLATE_VIS piecewise_linear_distribution
-{
-public:
- // types
- typedef _RealType result_type;
-
- class _LIBCPP_TEMPLATE_VIS param_type
- {
- vector<result_type> __b_;
- vector<result_type> __densities_;
- vector<result_type> __areas_;
- public:
- typedef piecewise_linear_distribution distribution_type;
-
- param_type();
- template<class _InputIteratorB, class _InputIteratorW>
- param_type(_InputIteratorB __fB, _InputIteratorB __lB,
- _InputIteratorW __fW);
-#ifndef _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- param_type(initializer_list<result_type> __bl, _UnaryOperation __fw);
-#endif // _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- param_type(size_t __nw, result_type __xmin, result_type __xmax,
- _UnaryOperation __fw);
- param_type & operator=(const param_type& __rhs);
-
- _LIBCPP_INLINE_VISIBILITY
- vector<result_type> intervals() const {return __b_;}
- _LIBCPP_INLINE_VISIBILITY
- vector<result_type> densities() const {return __densities_;}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const param_type& __x, const param_type& __y)
- {return __x.__densities_ == __y.__densities_ && __x.__b_ == __y.__b_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const param_type& __x, const param_type& __y)
- {return !(__x == __y);}
-
- private:
- void __init();
-
- friend class piecewise_linear_distribution;
-
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const piecewise_linear_distribution<_RT>& __x);
-
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- piecewise_linear_distribution<_RT>& __x);
- };
-
-private:
- param_type __p_;
-
-public:
- // constructor and reset functions
- _LIBCPP_INLINE_VISIBILITY
- piecewise_linear_distribution() {}
- template<class _InputIteratorB, class _InputIteratorW>
- _LIBCPP_INLINE_VISIBILITY
- piecewise_linear_distribution(_InputIteratorB __fB,
- _InputIteratorB __lB,
- _InputIteratorW __fW)
- : __p_(__fB, __lB, __fW) {}
-
-#ifndef _LIBCPP_CXX03_LANG
- template<class _UnaryOperation>
- _LIBCPP_INLINE_VISIBILITY
- piecewise_linear_distribution(initializer_list<result_type> __bl,
- _UnaryOperation __fw)
- : __p_(__bl, __fw) {}
-#endif // _LIBCPP_CXX03_LANG
-
- template<class _UnaryOperation>
- _LIBCPP_INLINE_VISIBILITY
- piecewise_linear_distribution(size_t __nw, result_type __xmin,
- result_type __xmax, _UnaryOperation __fw)
- : __p_(__nw, __xmin, __xmax, __fw) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit piecewise_linear_distribution(const param_type& __p)
- : __p_(__p) {}
-
- _LIBCPP_INLINE_VISIBILITY
- void reset() {}
-
- // generating functions
- template<class _URNG>
- _LIBCPP_INLINE_VISIBILITY
- result_type operator()(_URNG& __g)
- {return (*this)(__g, __p_);}
- template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
-
- // property functions
- _LIBCPP_INLINE_VISIBILITY
- vector<result_type> intervals() const {return __p_.intervals();}
- _LIBCPP_INLINE_VISIBILITY
- vector<result_type> densities() const {return __p_.densities();}
-
- _LIBCPP_INLINE_VISIBILITY
- param_type param() const {return __p_;}
- _LIBCPP_INLINE_VISIBILITY
- void param(const param_type& __p) {__p_ = __p;}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const {return __p_.__b_.front();}
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const {return __p_.__b_.back();}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const piecewise_linear_distribution& __x,
- const piecewise_linear_distribution& __y)
- {return __x.__p_ == __y.__p_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const piecewise_linear_distribution& __x,
- const piecewise_linear_distribution& __y)
- {return !(__x == __y);}
-
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const piecewise_linear_distribution<_RT>& __x);
-
- template <class _CharT, class _Traits, class _RT>
- friend
- basic_istream<_CharT, _Traits>&
- operator>>(basic_istream<_CharT, _Traits>& __is,
- piecewise_linear_distribution<_RT>& __x);
-};
-
-template<class _RealType>
-typename piecewise_linear_distribution<_RealType>::param_type &
-piecewise_linear_distribution<_RealType>::param_type::operator=
- (const param_type& __rhs)
-{
-// These can throw
- __b_.reserve (__rhs.__b_.size ());
- __densities_.reserve(__rhs.__densities_.size());
- __areas_.reserve (__rhs.__areas_.size());
-
-// These can not throw
- __b_ = __rhs.__b_;
- __densities_ = __rhs.__densities_;
- __areas_ = __rhs.__areas_;
- return *this;
-}
-
-
-template<class _RealType>
-void
-piecewise_linear_distribution<_RealType>::param_type::__init()
-{
- __areas_.assign(__densities_.size() - 1, result_type());
- result_type _Sp = 0;
- for (size_t __i = 0; __i < __areas_.size(); ++__i)
- {
- __areas_[__i] = (__densities_[__i+1] + __densities_[__i]) *
- (__b_[__i+1] - __b_[__i]) * .5;
- _Sp += __areas_[__i];
- }
- for (size_t __i = __areas_.size(); __i > 1;)
- {
- --__i;
- __areas_[__i] = __areas_[__i-1] / _Sp;
- }
- __areas_[0] = 0;
- for (size_t __i = 1; __i < __areas_.size(); ++__i)
- __areas_[__i] += __areas_[__i-1];
- for (size_t __i = 0; __i < __densities_.size(); ++__i)
- __densities_[__i] /= _Sp;
-}
-
-template<class _RealType>
-piecewise_linear_distribution<_RealType>::param_type::param_type()
- : __b_(2),
- __densities_(2, 1.0),
- __areas_(1, 0.0)
-{
- __b_[1] = 1;
-}
-
-template<class _RealType>
-template<class _InputIteratorB, class _InputIteratorW>
-piecewise_linear_distribution<_RealType>::param_type::param_type(
- _InputIteratorB __fB, _InputIteratorB __lB, _InputIteratorW __fW)
- : __b_(__fB, __lB)
-{
- if (__b_.size() < 2)
- {
- __b_.resize(2);
- __b_[0] = 0;
- __b_[1] = 1;
- __densities_.assign(2, 1.0);
- __areas_.assign(1, 0.0);
- }
- else
- {
- __densities_.reserve(__b_.size());
- for (size_t __i = 0; __i < __b_.size(); ++__i, ++__fW)
- __densities_.push_back(*__fW);
- __init();
- }
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template<class _RealType>
-template<class _UnaryOperation>
-piecewise_linear_distribution<_RealType>::param_type::param_type(
- initializer_list<result_type> __bl, _UnaryOperation __fw)
- : __b_(__bl.begin(), __bl.end())
-{
- if (__b_.size() < 2)
- {
- __b_.resize(2);
- __b_[0] = 0;
- __b_[1] = 1;
- __densities_.assign(2, 1.0);
- __areas_.assign(1, 0.0);
- }
- else
- {
- __densities_.reserve(__b_.size());
- for (size_t __i = 0; __i < __b_.size(); ++__i)
- __densities_.push_back(__fw(__b_[__i]));
- __init();
- }
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template<class _RealType>
-template<class _UnaryOperation>
-piecewise_linear_distribution<_RealType>::param_type::param_type(
- size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw)
- : __b_(__nw == 0 ? 2 : __nw + 1)
-{
- size_t __n = __b_.size() - 1;
- result_type __d = (__xmax - __xmin) / __n;
- __densities_.reserve(__b_.size());
- for (size_t __i = 0; __i < __n; ++__i)
- {
- __b_[__i] = __xmin + __i * __d;
- __densities_.push_back(__fw(__b_[__i]));
- }
- __b_[__n] = __xmax;
- __densities_.push_back(__fw(__b_[__n]));
- __init();
-}
-
-template<class _RealType>
-template<class _URNG>
-_RealType
-piecewise_linear_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
-{
- typedef uniform_real_distribution<result_type> _Gen;
- result_type __u = _Gen()(__g);
- ptrdiff_t __k = _VSTD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(),
- __u) - __p.__areas_.begin() - 1;
- __u -= __p.__areas_[__k];
- const result_type __dk = __p.__densities_[__k];
- const result_type __dk1 = __p.__densities_[__k+1];
- const result_type __deltad = __dk1 - __dk;
- const result_type __bk = __p.__b_[__k];
- if (__deltad == 0)
- return __u / __dk + __bk;
- const result_type __bk1 = __p.__b_[__k+1];
- const result_type __deltab = __bk1 - __bk;
- return (__bk * __dk1 - __bk1 * __dk +
- _VSTD::sqrt(__deltab * (__deltab * __dk * __dk + 2 * __deltad * __u))) /
- __deltad;
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const piecewise_linear_distribution<_RT>& __x)
-{
- __save_flags<_CharT, _Traits> __lx(__os);
- __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
- ios_base::scientific);
- _CharT __sp = __os.widen(' ');
- __os.fill(__sp);
- size_t __n = __x.__p_.__b_.size();
- __os << __n;
- for (size_t __i = 0; __i < __n; ++__i)
- __os << __sp << __x.__p_.__b_[__i];
- __n = __x.__p_.__densities_.size();
- __os << __sp << __n;
- for (size_t __i = 0; __i < __n; ++__i)
- __os << __sp << __x.__p_.__densities_[__i];
- __n = __x.__p_.__areas_.size();
- __os << __sp << __n;
- for (size_t __i = 0; __i < __n; ++__i)
- __os << __sp << __x.__p_.__areas_[__i];
- return __os;
-}
-
-template <class _CharT, class _Traits, class _RT>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- piecewise_linear_distribution<_RT>& __x)
-{
- typedef piecewise_linear_distribution<_RT> _Eng;
- typedef typename _Eng::result_type result_type;
- __save_flags<_CharT, _Traits> __lx(__is);
- __is.flags(ios_base::dec | ios_base::skipws);
- size_t __n;
- __is >> __n;
- vector<result_type> __b(__n);
- for (size_t __i = 0; __i < __n; ++__i)
- __is >> __b[__i];
- __is >> __n;
- vector<result_type> __densities(__n);
- for (size_t __i = 0; __i < __n; ++__i)
- __is >> __densities[__i];
- __is >> __n;
- vector<result_type> __areas(__n);
- for (size_t __i = 0; __i < __n; ++__i)
- __is >> __areas[__i];
- if (!__is.fail())
- {
- swap(__x.__p_.__b_, __b);
- swap(__x.__p_.__densities_, __densities);
- swap(__x.__p_.__areas_, __areas);
- }
- return __is;
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_RANDOM
diff --git a/lib/libcxx/include/ratio b/lib/libcxx/include/ratio
deleted file mode 100644
index 7ee5ec24517..00000000000
--- a/lib/libcxx/include/ratio
+++ /dev/null
@@ -1,533 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- ratio -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_RATIO
-#define _LIBCPP_RATIO
-
-/*
- ratio synopsis
-
-namespace std
-{
-
-template <intmax_t N, intmax_t D = 1>
-class ratio
-{
-public:
- static constexpr intmax_t num;
- static constexpr intmax_t den;
- typedef ratio<num, den> type;
-};
-
-// ratio arithmetic
-template <class R1, class R2> using ratio_add = ...;
-template <class R1, class R2> using ratio_subtract = ...;
-template <class R1, class R2> using ratio_multiply = ...;
-template <class R1, class R2> using ratio_divide = ...;
-
-// ratio comparison
-template <class R1, class R2> struct ratio_equal;
-template <class R1, class R2> struct ratio_not_equal;
-template <class R1, class R2> struct ratio_less;
-template <class R1, class R2> struct ratio_less_equal;
-template <class R1, class R2> struct ratio_greater;
-template <class R1, class R2> struct ratio_greater_equal;
-
-// convenience SI typedefs
-typedef ratio<1, 1000000000000000000000000> yocto; // not supported
-typedef ratio<1, 1000000000000000000000> zepto; // not supported
-typedef ratio<1, 1000000000000000000> atto;
-typedef ratio<1, 1000000000000000> femto;
-typedef ratio<1, 1000000000000> pico;
-typedef ratio<1, 1000000000> nano;
-typedef ratio<1, 1000000> micro;
-typedef ratio<1, 1000> milli;
-typedef ratio<1, 100> centi;
-typedef ratio<1, 10> deci;
-typedef ratio< 10, 1> deca;
-typedef ratio< 100, 1> hecto;
-typedef ratio< 1000, 1> kilo;
-typedef ratio< 1000000, 1> mega;
-typedef ratio< 1000000000, 1> giga;
-typedef ratio< 1000000000000, 1> tera;
-typedef ratio< 1000000000000000, 1> peta;
-typedef ratio< 1000000000000000000, 1> exa;
-typedef ratio< 1000000000000000000000, 1> zetta; // not supported
-typedef ratio<1000000000000000000000000, 1> yotta; // not supported
-
- // 20.11.5, ratio comparison
- template <class R1, class R2> inline constexpr bool ratio_equal_v
- = ratio_equal<R1, R2>::value; // C++17
- template <class R1, class R2> inline constexpr bool ratio_not_equal_v
- = ratio_not_equal<R1, R2>::value; // C++17
- template <class R1, class R2> inline constexpr bool ratio_less_v
- = ratio_less<R1, R2>::value; // C++17
- template <class R1, class R2> inline constexpr bool ratio_less_equal_v
- = ratio_less_equal<R1, R2>::value; // C++17
- template <class R1, class R2> inline constexpr bool ratio_greater_v
- = ratio_greater<R1, R2>::value; // C++17
- template <class R1, class R2> inline constexpr bool ratio_greater_equal_v
- = ratio_greater_equal<R1, R2>::value; // C++17
-}
-*/
-
-#include <__config>
-#include <cstdint>
-#include <climits>
-#include <type_traits>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-// __static_gcd
-
-template <intmax_t _Xp, intmax_t _Yp>
-struct __static_gcd
-{
- static const intmax_t value = __static_gcd<_Yp, _Xp % _Yp>::value;
-};
-
-template <intmax_t _Xp>
-struct __static_gcd<_Xp, 0>
-{
- static const intmax_t value = _Xp;
-};
-
-template <>
-struct __static_gcd<0, 0>
-{
- static const intmax_t value = 1;
-};
-
-// __static_lcm
-
-template <intmax_t _Xp, intmax_t _Yp>
-struct __static_lcm
-{
- static const intmax_t value = _Xp / __static_gcd<_Xp, _Yp>::value * _Yp;
-};
-
-template <intmax_t _Xp>
-struct __static_abs
-{
- static const intmax_t value = _Xp < 0 ? -_Xp : _Xp;
-};
-
-template <intmax_t _Xp>
-struct __static_sign
-{
- static const intmax_t value = _Xp == 0 ? 0 : (_Xp < 0 ? -1 : 1);
-};
-
-template <intmax_t _Xp, intmax_t _Yp, intmax_t = __static_sign<_Yp>::value>
-class __ll_add;
-
-template <intmax_t _Xp, intmax_t _Yp>
-class __ll_add<_Xp, _Yp, 1>
-{
- static const intmax_t min = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1;
- static const intmax_t max = -min;
-
- static_assert(_Xp <= max - _Yp, "overflow in __ll_add");
-public:
- static const intmax_t value = _Xp + _Yp;
-};
-
-template <intmax_t _Xp, intmax_t _Yp>
-class __ll_add<_Xp, _Yp, 0>
-{
-public:
- static const intmax_t value = _Xp;
-};
-
-template <intmax_t _Xp, intmax_t _Yp>
-class __ll_add<_Xp, _Yp, -1>
-{
- static const intmax_t min = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1;
- static const intmax_t max = -min;
-
- static_assert(min - _Yp <= _Xp, "overflow in __ll_add");
-public:
- static const intmax_t value = _Xp + _Yp;
-};
-
-template <intmax_t _Xp, intmax_t _Yp, intmax_t = __static_sign<_Yp>::value>
-class __ll_sub;
-
-template <intmax_t _Xp, intmax_t _Yp>
-class __ll_sub<_Xp, _Yp, 1>
-{
- static const intmax_t min = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1;
- static const intmax_t max = -min;
-
- static_assert(min + _Yp <= _Xp, "overflow in __ll_sub");
-public:
- static const intmax_t value = _Xp - _Yp;
-};
-
-template <intmax_t _Xp, intmax_t _Yp>
-class __ll_sub<_Xp, _Yp, 0>
-{
-public:
- static const intmax_t value = _Xp;
-};
-
-template <intmax_t _Xp, intmax_t _Yp>
-class __ll_sub<_Xp, _Yp, -1>
-{
- static const intmax_t min = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1;
- static const intmax_t max = -min;
-
- static_assert(_Xp <= max + _Yp, "overflow in __ll_sub");
-public:
- static const intmax_t value = _Xp - _Yp;
-};
-
-template <intmax_t _Xp, intmax_t _Yp>
-class __ll_mul
-{
- static const intmax_t nan = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1));
- static const intmax_t min = nan + 1;
- static const intmax_t max = -min;
- static const intmax_t __a_x = __static_abs<_Xp>::value;
- static const intmax_t __a_y = __static_abs<_Yp>::value;
-
- static_assert(_Xp != nan && _Yp != nan && __a_x <= max / __a_y, "overflow in __ll_mul");
-public:
- static const intmax_t value = _Xp * _Yp;
-};
-
-template <intmax_t _Yp>
-class __ll_mul<0, _Yp>
-{
-public:
- static const intmax_t value = 0;
-};
-
-template <intmax_t _Xp>
-class __ll_mul<_Xp, 0>
-{
-public:
- static const intmax_t value = 0;
-};
-
-template <>
-class __ll_mul<0, 0>
-{
-public:
- static const intmax_t value = 0;
-};
-
-// Not actually used but left here in case needed in future maintenance
-template <intmax_t _Xp, intmax_t _Yp>
-class __ll_div
-{
- static const intmax_t nan = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1));
- static const intmax_t min = nan + 1;
- static const intmax_t max = -min;
-
- static_assert(_Xp != nan && _Yp != nan && _Yp != 0, "overflow in __ll_div");
-public:
- static const intmax_t value = _Xp / _Yp;
-};
-
-template <intmax_t _Num, intmax_t _Den = 1>
-class _LIBCPP_TEMPLATE_VIS ratio
-{
- static_assert(__static_abs<_Num>::value >= 0, "ratio numerator is out of range");
- static_assert(_Den != 0, "ratio divide by 0");
- static_assert(__static_abs<_Den>::value > 0, "ratio denominator is out of range");
- static _LIBCPP_CONSTEXPR const intmax_t __na = __static_abs<_Num>::value;
- static _LIBCPP_CONSTEXPR const intmax_t __da = __static_abs<_Den>::value;
- static _LIBCPP_CONSTEXPR const intmax_t __s = __static_sign<_Num>::value * __static_sign<_Den>::value;
- static _LIBCPP_CONSTEXPR const intmax_t __gcd = __static_gcd<__na, __da>::value;
-public:
- static _LIBCPP_CONSTEXPR const intmax_t num = __s * __na / __gcd;
- static _LIBCPP_CONSTEXPR const intmax_t den = __da / __gcd;
-
- typedef ratio<num, den> type;
-};
-
-template <intmax_t _Num, intmax_t _Den>
-_LIBCPP_CONSTEXPR const intmax_t ratio<_Num, _Den>::num;
-
-template <intmax_t _Num, intmax_t _Den>
-_LIBCPP_CONSTEXPR const intmax_t ratio<_Num, _Den>::den;
-
-template <class _Tp> struct __is_ratio : false_type {};
-template <intmax_t _Num, intmax_t _Den> struct __is_ratio<ratio<_Num, _Den> > : true_type {};
-
-typedef ratio<1LL, 1000000000000000000LL> atto;
-typedef ratio<1LL, 1000000000000000LL> femto;
-typedef ratio<1LL, 1000000000000LL> pico;
-typedef ratio<1LL, 1000000000LL> nano;
-typedef ratio<1LL, 1000000LL> micro;
-typedef ratio<1LL, 1000LL> milli;
-typedef ratio<1LL, 100LL> centi;
-typedef ratio<1LL, 10LL> deci;
-typedef ratio< 10LL, 1LL> deca;
-typedef ratio< 100LL, 1LL> hecto;
-typedef ratio< 1000LL, 1LL> kilo;
-typedef ratio< 1000000LL, 1LL> mega;
-typedef ratio< 1000000000LL, 1LL> giga;
-typedef ratio< 1000000000000LL, 1LL> tera;
-typedef ratio< 1000000000000000LL, 1LL> peta;
-typedef ratio<1000000000000000000LL, 1LL> exa;
-
-template <class _R1, class _R2>
-struct __ratio_multiply
-{
-private:
- static const intmax_t __gcd_n1_d2 = __static_gcd<_R1::num, _R2::den>::value;
- static const intmax_t __gcd_d1_n2 = __static_gcd<_R1::den, _R2::num>::value;
-public:
- typedef typename ratio
- <
- __ll_mul<_R1::num / __gcd_n1_d2, _R2::num / __gcd_d1_n2>::value,
- __ll_mul<_R2::den / __gcd_n1_d2, _R1::den / __gcd_d1_n2>::value
- >::type type;
-};
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _R1, class _R2> using ratio_multiply
- = typename __ratio_multiply<_R1, _R2>::type;
-
-#else // _LIBCPP_CXX03_LANG
-
-template <class _R1, class _R2>
-struct _LIBCPP_TEMPLATE_VIS ratio_multiply
- : public __ratio_multiply<_R1, _R2>::type {};
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _R1, class _R2>
-struct __ratio_divide
-{
-private:
- static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value;
- static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value;
-public:
- typedef typename ratio
- <
- __ll_mul<_R1::num / __gcd_n1_n2, _R2::den / __gcd_d1_d2>::value,
- __ll_mul<_R2::num / __gcd_n1_n2, _R1::den / __gcd_d1_d2>::value
- >::type type;
-};
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _R1, class _R2> using ratio_divide
- = typename __ratio_divide<_R1, _R2>::type;
-
-#else // _LIBCPP_CXX03_LANG
-
-template <class _R1, class _R2>
-struct _LIBCPP_TEMPLATE_VIS ratio_divide
- : public __ratio_divide<_R1, _R2>::type {};
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _R1, class _R2>
-struct __ratio_add
-{
-private:
- static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value;
- static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value;
-public:
- typedef typename ratio_multiply
- <
- ratio<__gcd_n1_n2, _R1::den / __gcd_d1_d2>,
- ratio
- <
- __ll_add
- <
- __ll_mul<_R1::num / __gcd_n1_n2, _R2::den / __gcd_d1_d2>::value,
- __ll_mul<_R2::num / __gcd_n1_n2, _R1::den / __gcd_d1_d2>::value
- >::value,
- _R2::den
- >
- >::type type;
-};
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _R1, class _R2> using ratio_add
- = typename __ratio_add<_R1, _R2>::type;
-
-#else // _LIBCPP_CXX03_LANG
-
-template <class _R1, class _R2>
-struct _LIBCPP_TEMPLATE_VIS ratio_add
- : public __ratio_add<_R1, _R2>::type {};
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _R1, class _R2>
-struct __ratio_subtract
-{
-private:
- static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value;
- static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value;
-public:
- typedef typename ratio_multiply
- <
- ratio<__gcd_n1_n2, _R1::den / __gcd_d1_d2>,
- ratio
- <
- __ll_sub
- <
- __ll_mul<_R1::num / __gcd_n1_n2, _R2::den / __gcd_d1_d2>::value,
- __ll_mul<_R2::num / __gcd_n1_n2, _R1::den / __gcd_d1_d2>::value
- >::value,
- _R2::den
- >
- >::type type;
-};
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _R1, class _R2> using ratio_subtract
- = typename __ratio_subtract<_R1, _R2>::type;
-
-#else // _LIBCPP_CXX03_LANG
-
-template <class _R1, class _R2>
-struct _LIBCPP_TEMPLATE_VIS ratio_subtract
- : public __ratio_subtract<_R1, _R2>::type {};
-
-#endif // _LIBCPP_CXX03_LANG
-
-// ratio_equal
-
-template <class _R1, class _R2>
-struct _LIBCPP_TEMPLATE_VIS ratio_equal
- : public _LIBCPP_BOOL_CONSTANT((_R1::num == _R2::num && _R1::den == _R2::den)) {};
-
-template <class _R1, class _R2>
-struct _LIBCPP_TEMPLATE_VIS ratio_not_equal
- : public _LIBCPP_BOOL_CONSTANT((!ratio_equal<_R1, _R2>::value)) {};
-
-// ratio_less
-
-template <class _R1, class _R2, bool _Odd = false,
- intmax_t _Q1 = _R1::num / _R1::den, intmax_t _M1 = _R1::num % _R1::den,
- intmax_t _Q2 = _R2::num / _R2::den, intmax_t _M2 = _R2::num % _R2::den>
-struct __ratio_less1
-{
- static const bool value = _Odd ? _Q2 < _Q1 : _Q1 < _Q2;
-};
-
-template <class _R1, class _R2, bool _Odd, intmax_t _Qp>
-struct __ratio_less1<_R1, _R2, _Odd, _Qp, 0, _Qp, 0>
-{
- static const bool value = false;
-};
-
-template <class _R1, class _R2, bool _Odd, intmax_t _Qp, intmax_t _M2>
-struct __ratio_less1<_R1, _R2, _Odd, _Qp, 0, _Qp, _M2>
-{
- static const bool value = !_Odd;
-};
-
-template <class _R1, class _R2, bool _Odd, intmax_t _Qp, intmax_t _M1>
-struct __ratio_less1<_R1, _R2, _Odd, _Qp, _M1, _Qp, 0>
-{
- static const bool value = _Odd;
-};
-
-template <class _R1, class _R2, bool _Odd, intmax_t _Qp, intmax_t _M1,
- intmax_t _M2>
-struct __ratio_less1<_R1, _R2, _Odd, _Qp, _M1, _Qp, _M2>
-{
- static const bool value = __ratio_less1<ratio<_R1::den, _M1>,
- ratio<_R2::den, _M2>, !_Odd>::value;
-};
-
-template <class _R1, class _R2, intmax_t _S1 = __static_sign<_R1::num>::value,
- intmax_t _S2 = __static_sign<_R2::num>::value>
-struct __ratio_less
-{
- static const bool value = _S1 < _S2;
-};
-
-template <class _R1, class _R2>
-struct __ratio_less<_R1, _R2, 1LL, 1LL>
-{
- static const bool value = __ratio_less1<_R1, _R2>::value;
-};
-
-template <class _R1, class _R2>
-struct __ratio_less<_R1, _R2, -1LL, -1LL>
-{
- static const bool value = __ratio_less1<ratio<-_R2::num, _R2::den>, ratio<-_R1::num, _R1::den> >::value;
-};
-
-template <class _R1, class _R2>
-struct _LIBCPP_TEMPLATE_VIS ratio_less
- : public _LIBCPP_BOOL_CONSTANT((__ratio_less<_R1, _R2>::value)) {};
-
-template <class _R1, class _R2>
-struct _LIBCPP_TEMPLATE_VIS ratio_less_equal
- : public _LIBCPP_BOOL_CONSTANT((!ratio_less<_R2, _R1>::value)) {};
-
-template <class _R1, class _R2>
-struct _LIBCPP_TEMPLATE_VIS ratio_greater
- : public _LIBCPP_BOOL_CONSTANT((ratio_less<_R2, _R1>::value)) {};
-
-template <class _R1, class _R2>
-struct _LIBCPP_TEMPLATE_VIS ratio_greater_equal
- : public _LIBCPP_BOOL_CONSTANT((!ratio_less<_R1, _R2>::value)) {};
-
-template <class _R1, class _R2>
-struct __ratio_gcd
-{
- typedef ratio<__static_gcd<_R1::num, _R2::num>::value,
- __static_lcm<_R1::den, _R2::den>::value> type;
-};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _R1, class _R2>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool ratio_equal_v
- = ratio_equal<_R1, _R2>::value;
-
-template <class _R1, class _R2>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool ratio_not_equal_v
- = ratio_not_equal<_R1, _R2>::value;
-
-template <class _R1, class _R2>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool ratio_less_v
- = ratio_less<_R1, _R2>::value;
-
-template <class _R1, class _R2>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool ratio_less_equal_v
- = ratio_less_equal<_R1, _R2>::value;
-
-template <class _R1, class _R2>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool ratio_greater_v
- = ratio_greater<_R1, _R2>::value;
-
-template <class _R1, class _R2>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool ratio_greater_equal_v
- = ratio_greater_equal<_R1, _R2>::value;
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_RATIO
diff --git a/lib/libcxx/include/regex b/lib/libcxx/include/regex
deleted file mode 100644
index bd83d7c10ca..00000000000
--- a/lib/libcxx/include/regex
+++ /dev/null
@@ -1,6619 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- regex ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_REGEX
-#define _LIBCPP_REGEX
-
-/*
- regex synopsis
-
-#include <initializer_list>
-
-namespace std
-{
-
-namespace regex_constants
-{
-
-emum syntax_option_type
-{
- icase = unspecified,
- nosubs = unspecified,
- optimize = unspecified,
- collate = unspecified,
- ECMAScript = unspecified,
- basic = unspecified,
- extended = unspecified,
- awk = unspecified,
- grep = unspecified,
- egrep = unspecified
-};
-
-constexpr syntax_option_type operator~(syntax_option_type f);
-constexpr syntax_option_type operator&(syntax_option_type lhs, syntax_option_type rhs);
-constexpr syntax_option_type operator|(syntax_option_type lhs, syntax_option_type rhs);
-
-enum match_flag_type
-{
- match_default = 0,
- match_not_bol = unspecified,
- match_not_eol = unspecified,
- match_not_bow = unspecified,
- match_not_eow = unspecified,
- match_any = unspecified,
- match_not_null = unspecified,
- match_continuous = unspecified,
- match_prev_avail = unspecified,
- format_default = 0,
- format_sed = unspecified,
- format_no_copy = unspecified,
- format_first_only = unspecified
-};
-
-constexpr match_flag_type operator~(match_flag_type f);
-constexpr match_flag_type operator&(match_flag_type lhs, match_flag_type rhs);
-constexpr match_flag_type operator|(match_flag_type lhs, match_flag_type rhs);
-
-enum error_type
-{
- error_collate = unspecified,
- error_ctype = unspecified,
- error_escape = unspecified,
- error_backref = unspecified,
- error_brack = unspecified,
- error_paren = unspecified,
- error_brace = unspecified,
- error_badbrace = unspecified,
- error_range = unspecified,
- error_space = unspecified,
- error_badrepeat = unspecified,
- error_complexity = unspecified,
- error_stack = unspecified
-};
-
-} // regex_constants
-
-class regex_error
- : public runtime_error
-{
-public:
- explicit regex_error(regex_constants::error_type ecode);
- regex_constants::error_type code() const;
-};
-
-template <class charT>
-struct regex_traits
-{
-public:
- typedef charT char_type;
- typedef basic_string<char_type> string_type;
- typedef locale locale_type;
- typedef /bitmask_type/ char_class_type;
-
- regex_traits();
-
- static size_t length(const char_type* p);
- charT translate(charT c) const;
- charT translate_nocase(charT c) const;
- template <class ForwardIterator>
- string_type
- transform(ForwardIterator first, ForwardIterator last) const;
- template <class ForwardIterator>
- string_type
- transform_primary( ForwardIterator first, ForwardIterator last) const;
- template <class ForwardIterator>
- string_type
- lookup_collatename(ForwardIterator first, ForwardIterator last) const;
- template <class ForwardIterator>
- char_class_type
- lookup_classname(ForwardIterator first, ForwardIterator last,
- bool icase = false) const;
- bool isctype(charT c, char_class_type f) const;
- int value(charT ch, int radix) const;
- locale_type imbue(locale_type l);
- locale_type getloc()const;
-};
-
-template <class charT, class traits = regex_traits<charT>>
-class basic_regex
-{
-public:
- // types:
- typedef charT value_type;
- typedef traits traits_type;
- typedef typename traits::string_type string_type;
- typedef regex_constants::syntax_option_type flag_type;
- typedef typename traits::locale_type locale_type;
-
- // constants:
- static constexpr regex_constants::syntax_option_type icase = regex_constants::icase;
- static constexpr regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
- static constexpr regex_constants::syntax_option_type optimize = regex_constants::optimize;
- static constexpr regex_constants::syntax_option_type collate = regex_constants::collate;
- static constexpr regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
- static constexpr regex_constants::syntax_option_type basic = regex_constants::basic;
- static constexpr regex_constants::syntax_option_type extended = regex_constants::extended;
- static constexpr regex_constants::syntax_option_type awk = regex_constants::awk;
- static constexpr regex_constants::syntax_option_type grep = regex_constants::grep;
- static constexpr regex_constants::syntax_option_type egrep = regex_constants::egrep;
-
- // construct/copy/destroy:
- basic_regex();
- explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);
- basic_regex(const charT* p, size_t len, flag_type f = regex_constants::ECMAScript);
- basic_regex(const basic_regex&);
- basic_regex(basic_regex&&) noexcept;
- template <class ST, class SA>
- explicit basic_regex(const basic_string<charT, ST, SA>& p,
- flag_type f = regex_constants::ECMAScript);
- template <class ForwardIterator>
- basic_regex(ForwardIterator first, ForwardIterator last,
- flag_type f = regex_constants::ECMAScript);
- basic_regex(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
-
- ~basic_regex();
-
- basic_regex& operator=(const basic_regex&);
- basic_regex& operator=(basic_regex&&) noexcept;
- basic_regex& operator=(const charT* ptr);
- basic_regex& operator=(initializer_list<charT> il);
- template <class ST, class SA>
- basic_regex& operator=(const basic_string<charT, ST, SA>& p);
-
- // assign:
- basic_regex& assign(const basic_regex& that);
- basic_regex& assign(basic_regex&& that) noexcept;
- basic_regex& assign(const charT* ptr, flag_type f = regex_constants::ECMAScript);
- basic_regex& assign(const charT* p, size_t len, flag_type f);
- template <class string_traits, class A>
- basic_regex& assign(const basic_string<charT, string_traits, A>& s,
- flag_type f = regex_constants::ECMAScript);
- template <class InputIterator>
- basic_regex& assign(InputIterator first, InputIterator last,
- flag_type f = regex_constants::ECMAScript);
- basic_regex& assign(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
-
- // const operations:
- unsigned mark_count() const;
- flag_type flags() const;
-
- // locale:
- locale_type imbue(locale_type loc);
- locale_type getloc() const;
-
- // swap:
- void swap(basic_regex&);
-};
-
-template<class ForwardIterator>
-basic_regex(ForwardIterator, ForwardIterator,
- regex_constants::syntax_option_type = regex_constants::ECMAScript)
- -> basic_regex<typename iterator_traits<ForwardIterator>::value_type>; // C++17
-
-typedef basic_regex<char> regex;
-typedef basic_regex<wchar_t> wregex;
-
-template <class charT, class traits>
- void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2);
-
-template <class BidirectionalIterator>
-class sub_match
- : public pair<BidirectionalIterator, BidirectionalIterator>
-{
-public:
- typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
- typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
- typedef BidirectionalIterator iterator;
- typedef basic_string<value_type> string_type;
-
- bool matched;
-
- constexpr sub_match();
-
- difference_type length() const;
- operator string_type() const;
- string_type str() const;
-
- int compare(const sub_match& s) const;
- int compare(const string_type& s) const;
- int compare(const value_type* s) const;
-};
-
-typedef sub_match<const char*> csub_match;
-typedef sub_match<const wchar_t*> wcsub_match;
-typedef sub_match<string::const_iterator> ssub_match;
-typedef sub_match<wstring::const_iterator> wssub_match;
-
-template <class BiIter>
- bool
- operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
-
-template <class BiIter>
- bool
- operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
-
-template <class BiIter>
- bool
- operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
-
-template <class BiIter>
- bool
- operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
-
-template <class BiIter>
- bool
- operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
-
-template <class BiIter>
- bool
- operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
-
-template <class BiIter, class ST, class SA>
- bool
- operator==(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter, class ST, class SA>
- bool
- operator!=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter, class ST, class SA>
- bool
- operator<(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter, class ST, class SA>
- bool
- operator>(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter, class ST, class SA>
- bool operator>=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter, class ST, class SA>
- bool
- operator<=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter, class ST, class SA>
- bool
- operator==(const sub_match<BiIter>& lhs,
- const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
-
-template <class BiIter, class ST, class SA>
- bool
- operator!=(const sub_match<BiIter>& lhs,
- const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
-
-template <class BiIter, class ST, class SA>
- bool
- operator<(const sub_match<BiIter>& lhs,
- const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
-
-template <class BiIter, class ST, class SA>
- bool operator>(const sub_match<BiIter>& lhs,
- const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
-
-template <class BiIter, class ST, class SA>
- bool
- operator>=(const sub_match<BiIter>& lhs,
- const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
-
-template <class BiIter, class ST, class SA>
- bool
- operator<=(const sub_match<BiIter>& lhs,
- const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
-
-template <class BiIter>
- bool
- operator==(typename iterator_traits<BiIter>::value_type const* lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter>
- bool
- operator!=(typename iterator_traits<BiIter>::value_type const* lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter>
- bool
- operator<(typename iterator_traits<BiIter>::value_type const* lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter>
- bool
- operator>(typename iterator_traits<BiIter>::value_type const* lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter>
- bool
- operator>=(typename iterator_traits<BiIter>::value_type const* lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter>
- bool
- operator<=(typename iterator_traits<BiIter>::value_type const* lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter>
- bool
- operator==(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const* rhs);
-
-template <class BiIter>
- bool
- operator!=(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const* rhs);
-
-template <class BiIter>
- bool
- operator<(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const* rhs);
-
-template <class BiIter>
- bool
- operator>(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const* rhs);
-
-template <class BiIter>
- bool
- operator>=(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const* rhs);
-
-template <class BiIter>
- bool
- operator<=(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const* rhs);
-
-template <class BiIter>
- bool
- operator==(typename iterator_traits<BiIter>::value_type const& lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter>
- bool
- operator!=(typename iterator_traits<BiIter>::value_type const& lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter>
- bool
- operator<(typename iterator_traits<BiIter>::value_type const& lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter>
- bool
- operator>(typename iterator_traits<BiIter>::value_type const& lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter>
- bool
- operator>=(typename iterator_traits<BiIter>::value_type const& lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter>
- bool
- operator<=(typename iterator_traits<BiIter>::value_type const& lhs,
- const sub_match<BiIter>& rhs);
-
-template <class BiIter>
- bool
- operator==(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const& rhs);
-
-template <class BiIter>
- bool
- operator!=(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const& rhs);
-
-template <class BiIter>
- bool
- operator<(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const& rhs);
-
-template <class BiIter>
- bool
- operator>(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const& rhs);
-
-template <class BiIter>
- bool
- operator>=(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const& rhs);
-
-template <class BiIter>
- bool
- operator<=(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const& rhs);
-
-template <class charT, class ST, class BiIter>
- basic_ostream<charT, ST>&
- operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m);
-
-template <class BidirectionalIterator,
- class Allocator = allocator<sub_match<BidirectionalIterator>>>
-class match_results
-{
-public:
- typedef sub_match<BidirectionalIterator> value_type;
- typedef const value_type& const_reference;
- typedef value_type& reference;
- typedef /implementation-defined/ const_iterator;
- typedef const_iterator iterator;
- typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
- typedef typename allocator_traits<Allocator>::size_type size_type;
- typedef Allocator allocator_type;
- typedef typename iterator_traits<BidirectionalIterator>::value_type char_type;
- typedef basic_string<char_type> string_type;
-
- // construct/copy/destroy:
- explicit match_results(const Allocator& a = Allocator());
- match_results(const match_results& m);
- match_results(match_results&& m) noexcept;
- match_results& operator=(const match_results& m);
- match_results& operator=(match_results&& m);
- ~match_results();
-
- bool ready() const;
-
- // size:
- size_type size() const;
- size_type max_size() const;
- bool empty() const;
-
- // element access:
- difference_type length(size_type sub = 0) const;
- difference_type position(size_type sub = 0) const;
- string_type str(size_type sub = 0) const;
- const_reference operator[](size_type n) const;
-
- const_reference prefix() const;
- const_reference suffix() const;
-
- const_iterator begin() const;
- const_iterator end() const;
- const_iterator cbegin() const;
- const_iterator cend() const;
-
- // format:
- template <class OutputIter>
- OutputIter
- format(OutputIter out, const char_type* fmt_first,
- const char_type* fmt_last,
- regex_constants::match_flag_type flags = regex_constants::format_default) const;
- template <class OutputIter, class ST, class SA>
- OutputIter
- format(OutputIter out, const basic_string<char_type, ST, SA>& fmt,
- regex_constants::match_flag_type flags = regex_constants::format_default) const;
- template <class ST, class SA>
- basic_string<char_type, ST, SA>
- format(const basic_string<char_type, ST, SA>& fmt,
- regex_constants::match_flag_type flags = regex_constants::format_default) const;
- string_type
- format(const char_type* fmt,
- regex_constants::match_flag_type flags = regex_constants::format_default) const;
-
- // allocator:
- allocator_type get_allocator() const;
-
- // swap:
- void swap(match_results& that);
-};
-
-typedef match_results<const char*> cmatch;
-typedef match_results<const wchar_t*> wcmatch;
-typedef match_results<string::const_iterator> smatch;
-typedef match_results<wstring::const_iterator> wsmatch;
-
-template <class BidirectionalIterator, class Allocator>
- bool
- operator==(const match_results<BidirectionalIterator, Allocator>& m1,
- const match_results<BidirectionalIterator, Allocator>& m2);
-
-template <class BidirectionalIterator, class Allocator>
- bool
- operator!=(const match_results<BidirectionalIterator, Allocator>& m1,
- const match_results<BidirectionalIterator, Allocator>& m2);
-
-template <class BidirectionalIterator, class Allocator>
- void
- swap(match_results<BidirectionalIterator, Allocator>& m1,
- match_results<BidirectionalIterator, Allocator>& m2);
-
-template <class BidirectionalIterator, class Allocator, class charT, class traits>
- bool
- regex_match(BidirectionalIterator first, BidirectionalIterator last,
- match_results<BidirectionalIterator, Allocator>& m,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class BidirectionalIterator, class charT, class traits>
- bool
- regex_match(BidirectionalIterator first, BidirectionalIterator last,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class charT, class Allocator, class traits>
- bool
- regex_match(const charT* str, match_results<const charT*, Allocator>& m,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class ST, class SA, class Allocator, class charT, class traits>
- bool
- regex_match(const basic_string<charT, ST, SA>& s,
- match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class ST, class SA, class Allocator, class charT, class traits>
- bool
- regex_match(const basic_string<charT, ST, SA>&& s,
- match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
-
-template <class charT, class traits>
- bool
- regex_match(const charT* str, const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class ST, class SA, class charT, class traits>
- bool
- regex_match(const basic_string<charT, ST, SA>& s,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class BidirectionalIterator, class Allocator, class charT, class traits>
- bool
- regex_search(BidirectionalIterator first, BidirectionalIterator last,
- match_results<BidirectionalIterator, Allocator>& m,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class BidirectionalIterator, class charT, class traits>
- bool
- regex_search(BidirectionalIterator first, BidirectionalIterator last,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class charT, class Allocator, class traits>
- bool
- regex_search(const charT* str, match_results<const charT*, Allocator>& m,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class charT, class traits>
- bool
- regex_search(const charT* str, const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class ST, class SA, class charT, class traits>
- bool
- regex_search(const basic_string<charT, ST, SA>& s,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class ST, class SA, class Allocator, class charT, class traits>
- bool
- regex_search(const basic_string<charT, ST, SA>& s,
- match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class ST, class SA, class Allocator, class charT, class traits>
- bool
- regex_search(const basic_string<charT, ST, SA>&& s,
- match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
-
-template <class OutputIterator, class BidirectionalIterator,
- class traits, class charT, class ST, class SA>
- OutputIterator
- regex_replace(OutputIterator out,
- BidirectionalIterator first, BidirectionalIterator last,
- const basic_regex<charT, traits>& e,
- const basic_string<charT, ST, SA>& fmt,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class OutputIterator, class BidirectionalIterator,
- class traits, class charT>
- OutputIterator
- regex_replace(OutputIterator out,
- BidirectionalIterator first, BidirectionalIterator last,
- const basic_regex<charT, traits>& e, const charT* fmt,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class traits, class charT, class ST, class SA, class FST, class FSA>>
- basic_string<charT, ST, SA>
- regex_replace(const basic_string<charT, ST, SA>& s,
- const basic_regex<charT, traits>& e,
- const basic_string<charT, FST, FSA>& fmt,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class traits, class charT, class ST, class SA>
- basic_string<charT, ST, SA>
- regex_replace(const basic_string<charT, ST, SA>& s,
- const basic_regex<charT, traits>& e, const charT* fmt,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class traits, class charT, class ST, class SA>
- basic_string<charT>
- regex_replace(const charT* s,
- const basic_regex<charT, traits>& e,
- const basic_string<charT, ST, SA>& fmt,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class traits, class charT>
- basic_string<charT>
- regex_replace(const charT* s,
- const basic_regex<charT, traits>& e,
- const charT* fmt,
- regex_constants::match_flag_type flags = regex_constants::match_default);
-
-template <class BidirectionalIterator,
- class charT = typename iterator_traits< BidirectionalIterator>::value_type,
- class traits = regex_traits<charT>>
-class regex_iterator
-{
-public:
- typedef basic_regex<charT, traits> regex_type;
- typedef match_results<BidirectionalIterator> value_type;
- typedef ptrdiff_t difference_type;
- typedef const value_type* pointer;
- typedef const value_type& reference;
- typedef forward_iterator_tag iterator_category;
-
- regex_iterator();
- regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
- const regex_type& re,
- regex_constants::match_flag_type m = regex_constants::match_default);
- regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type&& __re,
- regex_constants::match_flag_type __m
- = regex_constants::match_default) = delete; // C++14
- regex_iterator(const regex_iterator&);
- regex_iterator& operator=(const regex_iterator&);
-
- bool operator==(const regex_iterator&) const;
- bool operator!=(const regex_iterator&) const;
-
- const value_type& operator*() const;
- const value_type* operator->() const;
-
- regex_iterator& operator++();
- regex_iterator operator++(int);
-};
-
-typedef regex_iterator<const char*> cregex_iterator;
-typedef regex_iterator<const wchar_t*> wcregex_iterator;
-typedef regex_iterator<string::const_iterator> sregex_iterator;
-typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
-
-template <class BidirectionalIterator,
- class charT = typename iterator_traits< BidirectionalIterator>::value_type,
- class traits = regex_traits<charT>>
-class regex_token_iterator
-{
-public:
- typedef basic_regex<charT, traits> regex_type;
- typedef sub_match<BidirectionalIterator> value_type;
- typedef ptrdiff_t difference_type;
- typedef const value_type* pointer;
- typedef const value_type& reference;
- typedef forward_iterator_tag iterator_category;
-
- regex_token_iterator();
- regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
- const regex_type& re, int submatch = 0,
- regex_constants::match_flag_type m = regex_constants::match_default);
- regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
- const regex_type&& re, int submatch = 0,
- regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
- regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
- const regex_type& re, const vector<int>& submatches,
- regex_constants::match_flag_type m = regex_constants::match_default);
- regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
- const regex_type&& re, const vector<int>& submatches,
- regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
- regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
- const regex_type& re, initializer_list<int> submatches,
- regex_constants::match_flag_type m = regex_constants::match_default);
- regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
- const regex_type&& re, initializer_list<int> submatches,
- regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
- template <size_t N>
- regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
- const regex_type& re, const int (&submatches)[N],
- regex_constants::match_flag_type m = regex_constants::match_default);
- template <size_t N>
- regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
- const regex_type& re, const int (&submatches)[N],
- regex_constants::match_flag_type m = regex_constants::match_default) = delete // C++14;
- regex_token_iterator(const regex_token_iterator&);
- regex_token_iterator& operator=(const regex_token_iterator&);
-
- bool operator==(const regex_token_iterator&) const;
- bool operator!=(const regex_token_iterator&) const;
-
- const value_type& operator*() const;
- const value_type* operator->() const;
-
- regex_token_iterator& operator++();
- regex_token_iterator operator++(int);
-};
-
-typedef regex_token_iterator<const char*> cregex_token_iterator;
-typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
-typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
-typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
-
-} // std
-*/
-
-#include <__config>
-#include <stdexcept>
-#include <__locale>
-#include <initializer_list>
-#include <utility>
-#include <iterator>
-#include <string>
-#include <memory>
-#include <vector>
-#include <deque>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-#define _LIBCPP_REGEX_COMPLEXITY_FACTOR 4096
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-namespace regex_constants
-{
-
-// syntax_option_type
-
-enum syntax_option_type
-{
- icase = 1 << 0,
- nosubs = 1 << 1,
- optimize = 1 << 2,
- collate = 1 << 3,
- ECMAScript = 0,
- basic = 1 << 4,
- extended = 1 << 5,
- awk = 1 << 6,
- grep = 1 << 7,
- egrep = 1 << 8
-};
-
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-syntax_option_type
-operator~(syntax_option_type __x)
-{
- return syntax_option_type(~int(__x) & 0x1FF);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-syntax_option_type
-operator&(syntax_option_type __x, syntax_option_type __y)
-{
- return syntax_option_type(int(__x) & int(__y));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-syntax_option_type
-operator|(syntax_option_type __x, syntax_option_type __y)
-{
- return syntax_option_type(int(__x) | int(__y));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-syntax_option_type
-operator^(syntax_option_type __x, syntax_option_type __y)
-{
- return syntax_option_type(int(__x) ^ int(__y));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-syntax_option_type&
-operator&=(syntax_option_type& __x, syntax_option_type __y)
-{
- __x = __x & __y;
- return __x;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-syntax_option_type&
-operator|=(syntax_option_type& __x, syntax_option_type __y)
-{
- __x = __x | __y;
- return __x;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-syntax_option_type&
-operator^=(syntax_option_type& __x, syntax_option_type __y)
-{
- __x = __x ^ __y;
- return __x;
-}
-
-// match_flag_type
-
-enum match_flag_type
-{
- match_default = 0,
- match_not_bol = 1 << 0,
- match_not_eol = 1 << 1,
- match_not_bow = 1 << 2,
- match_not_eow = 1 << 3,
- match_any = 1 << 4,
- match_not_null = 1 << 5,
- match_continuous = 1 << 6,
- match_prev_avail = 1 << 7,
- format_default = 0,
- format_sed = 1 << 8,
- format_no_copy = 1 << 9,
- format_first_only = 1 << 10,
- __no_update_pos = 1 << 11,
- __full_match = 1 << 12
-};
-
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-match_flag_type
-operator~(match_flag_type __x)
-{
- return match_flag_type(~int(__x) & 0x0FFF);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-match_flag_type
-operator&(match_flag_type __x, match_flag_type __y)
-{
- return match_flag_type(int(__x) & int(__y));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-match_flag_type
-operator|(match_flag_type __x, match_flag_type __y)
-{
- return match_flag_type(int(__x) | int(__y));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR
-match_flag_type
-operator^(match_flag_type __x, match_flag_type __y)
-{
- return match_flag_type(int(__x) ^ int(__y));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-match_flag_type&
-operator&=(match_flag_type& __x, match_flag_type __y)
-{
- __x = __x & __y;
- return __x;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-match_flag_type&
-operator|=(match_flag_type& __x, match_flag_type __y)
-{
- __x = __x | __y;
- return __x;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-match_flag_type&
-operator^=(match_flag_type& __x, match_flag_type __y)
-{
- __x = __x ^ __y;
- return __x;
-}
-
-enum error_type
-{
- error_collate = 1,
- error_ctype,
- error_escape,
- error_backref,
- error_brack,
- error_paren,
- error_brace,
- error_badbrace,
- error_range,
- error_space,
- error_badrepeat,
- error_complexity,
- error_stack,
- __re_err_grammar,
- __re_err_empty,
- __re_err_unknown
-};
-
-} // regex_constants
-
-class _LIBCPP_EXCEPTION_ABI regex_error
- : public runtime_error
-{
- regex_constants::error_type __code_;
-public:
- explicit regex_error(regex_constants::error_type __ecode);
- virtual ~regex_error() throw();
- _LIBCPP_INLINE_VISIBILITY
- regex_constants::error_type code() const {return __code_;}
-};
-
-template <regex_constants::error_type _Ev>
-_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
-void __throw_regex_error()
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- throw regex_error(_Ev);
-#else
- _VSTD::abort();
-#endif
-}
-
-template <class _CharT>
-struct _LIBCPP_TEMPLATE_VIS regex_traits
-{
-public:
- typedef _CharT char_type;
- typedef basic_string<char_type> string_type;
- typedef locale locale_type;
- typedef ctype_base::mask char_class_type;
-
-#if defined(__mips__) && defined(__GLIBC__)
- static const char_class_type __regex_word = static_cast<char_class_type>(_ISbit(15));
-#elif defined(__NetBSD__)
- // NetBSD defines classes up to 0x2000
- // see sys/ctype_bits.h, _CTYPE_Q
- static const char_class_type __regex_word = 0x8000;
-#else
- static const char_class_type __regex_word = 0x80;
-#endif
-
-private:
- locale __loc_;
- const ctype<char_type>* __ct_;
- const collate<char_type>* __col_;
-
-public:
- regex_traits();
-
- _LIBCPP_INLINE_VISIBILITY
- static size_t length(const char_type* __p)
- {return char_traits<char_type>::length(__p);}
- _LIBCPP_INLINE_VISIBILITY
- char_type translate(char_type __c) const {return __c;}
- char_type translate_nocase(char_type __c) const;
- template <class _ForwardIterator>
- string_type
- transform(_ForwardIterator __f, _ForwardIterator __l) const;
- template <class _ForwardIterator>
- _LIBCPP_INLINE_VISIBILITY
- string_type
- transform_primary( _ForwardIterator __f, _ForwardIterator __l) const
- {return __transform_primary(__f, __l, char_type());}
- template <class _ForwardIterator>
- _LIBCPP_INLINE_VISIBILITY
- string_type
- lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const
- {return __lookup_collatename(__f, __l, char_type());}
- template <class _ForwardIterator>
- _LIBCPP_INLINE_VISIBILITY
- char_class_type
- lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
- bool __icase = false) const
- {return __lookup_classname(__f, __l, __icase, char_type());}
- bool isctype(char_type __c, char_class_type __m) const;
- _LIBCPP_INLINE_VISIBILITY
- int value(char_type __ch, int __radix) const
- {return __regex_traits_value(__ch, __radix);}
- locale_type imbue(locale_type __l);
- _LIBCPP_INLINE_VISIBILITY
- locale_type getloc()const {return __loc_;}
-
-private:
- void __init();
-
- template <class _ForwardIterator>
- string_type
- __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const;
- template <class _ForwardIterator>
- string_type
- __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
-
- template <class _ForwardIterator>
- string_type
- __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const;
- template <class _ForwardIterator>
- string_type
- __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
-
- template <class _ForwardIterator>
- char_class_type
- __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
- bool __icase, char) const;
- template <class _ForwardIterator>
- char_class_type
- __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
- bool __icase, wchar_t) const;
-
- static int __regex_traits_value(unsigned char __ch, int __radix);
- _LIBCPP_INLINE_VISIBILITY
- int __regex_traits_value(char __ch, int __radix) const
- {return __regex_traits_value(static_cast<unsigned char>(__ch), __radix);}
- _LIBCPP_INLINE_VISIBILITY
- int __regex_traits_value(wchar_t __ch, int __radix) const;
-};
-
-template <class _CharT>
-const typename regex_traits<_CharT>::char_class_type
-regex_traits<_CharT>::__regex_word;
-
-template <class _CharT>
-regex_traits<_CharT>::regex_traits()
-{
- __init();
-}
-
-template <class _CharT>
-typename regex_traits<_CharT>::char_type
-regex_traits<_CharT>::translate_nocase(char_type __c) const
-{
- return __ct_->tolower(__c);
-}
-
-template <class _CharT>
-template <class _ForwardIterator>
-typename regex_traits<_CharT>::string_type
-regex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const
-{
- string_type __s(__f, __l);
- return __col_->transform(__s.data(), __s.data() + __s.size());
-}
-
-template <class _CharT>
-void
-regex_traits<_CharT>::__init()
-{
- __ct_ = &use_facet<ctype<char_type> >(__loc_);
- __col_ = &use_facet<collate<char_type> >(__loc_);
-}
-
-template <class _CharT>
-typename regex_traits<_CharT>::locale_type
-regex_traits<_CharT>::imbue(locale_type __l)
-{
- locale __r = __loc_;
- __loc_ = __l;
- __init();
- return __r;
-}
-
-// transform_primary is very FreeBSD-specific
-
-template <class _CharT>
-template <class _ForwardIterator>
-typename regex_traits<_CharT>::string_type
-regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
- _ForwardIterator __l, char) const
-{
- const string_type __s(__f, __l);
- string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
- switch (__d.size())
- {
- case 1:
- break;
- case 12:
- __d[11] = __d[3];
- break;
- default:
- __d.clear();
- break;
- }
- return __d;
-}
-
-template <class _CharT>
-template <class _ForwardIterator>
-typename regex_traits<_CharT>::string_type
-regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
- _ForwardIterator __l, wchar_t) const
-{
- const string_type __s(__f, __l);
- string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
- switch (__d.size())
- {
- case 1:
- break;
- case 3:
- __d[2] = __d[0];
- break;
- default:
- __d.clear();
- break;
- }
- return __d;
-}
-
-// lookup_collatename is very FreeBSD-specific
-
-_LIBCPP_FUNC_VIS string __get_collation_name(const char* __s);
-
-template <class _CharT>
-template <class _ForwardIterator>
-typename regex_traits<_CharT>::string_type
-regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
- _ForwardIterator __l, char) const
-{
- string_type __s(__f, __l);
- string_type __r;
- if (!__s.empty())
- {
- __r = __get_collation_name(__s.c_str());
- if (__r.empty() && __s.size() <= 2)
- {
- __r = __col_->transform(__s.data(), __s.data() + __s.size());
- if (__r.size() == 1 || __r.size() == 12)
- __r = __s;
- else
- __r.clear();
- }
- }
- return __r;
-}
-
-template <class _CharT>
-template <class _ForwardIterator>
-typename regex_traits<_CharT>::string_type
-regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
- _ForwardIterator __l, wchar_t) const
-{
- string_type __s(__f, __l);
- string __n;
- __n.reserve(__s.size());
- for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
- __i != __e; ++__i)
- {
- if (static_cast<unsigned>(*__i) >= 127)
- return string_type();
- __n.push_back(char(*__i));
- }
- string_type __r;
- if (!__s.empty())
- {
- __n = __get_collation_name(__n.c_str());
- if (!__n.empty())
- __r.assign(__n.begin(), __n.end());
- else if (__s.size() <= 2)
- {
- __r = __col_->transform(__s.data(), __s.data() + __s.size());
- if (__r.size() == 1 || __r.size() == 3)
- __r = __s;
- else
- __r.clear();
- }
- }
- return __r;
-}
-
-// lookup_classname
-
-regex_traits<char>::char_class_type _LIBCPP_FUNC_VIS
-__get_classname(const char* __s, bool __icase);
-
-template <class _CharT>
-template <class _ForwardIterator>
-typename regex_traits<_CharT>::char_class_type
-regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
- _ForwardIterator __l,
- bool __icase, char) const
-{
- string_type __s(__f, __l);
- __ct_->tolower(&__s[0], &__s[0] + __s.size());
- return __get_classname(__s.c_str(), __icase);
-}
-
-template <class _CharT>
-template <class _ForwardIterator>
-typename regex_traits<_CharT>::char_class_type
-regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
- _ForwardIterator __l,
- bool __icase, wchar_t) const
-{
- string_type __s(__f, __l);
- __ct_->tolower(&__s[0], &__s[0] + __s.size());
- string __n;
- __n.reserve(__s.size());
- for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
- __i != __e; ++__i)
- {
- if (static_cast<unsigned>(*__i) >= 127)
- return char_class_type();
- __n.push_back(char(*__i));
- }
- return __get_classname(__n.c_str(), __icase);
-}
-
-template <class _CharT>
-bool
-regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const
-{
- if (__ct_->is(__m, __c))
- return true;
- return (__c == '_' && (__m & __regex_word));
-}
-
-template <class _CharT>
-int
-regex_traits<_CharT>::__regex_traits_value(unsigned char __ch, int __radix)
-{
- if ((__ch & 0xF8u) == 0x30) // '0' <= __ch && __ch <= '7'
- return __ch - '0';
- if (__radix != 8)
- {
- if ((__ch & 0xFEu) == 0x38) // '8' <= __ch && __ch <= '9'
- return __ch - '0';
- if (__radix == 16)
- {
- __ch |= 0x20; // tolower
- if ('a' <= __ch && __ch <= 'f')
- return __ch - ('a' - 10);
- }
- }
- return -1;
-}
-
-template <class _CharT>
-inline
-int
-regex_traits<_CharT>::__regex_traits_value(wchar_t __ch, int __radix) const
-{
- return __regex_traits_value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
-}
-
-template <class _CharT> class __node;
-
-template <class _BidirectionalIterator> class _LIBCPP_TEMPLATE_VIS sub_match;
-
-template <class _BidirectionalIterator,
- class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
-class _LIBCPP_TEMPLATE_VIS match_results;
-
-template <class _CharT>
-struct __state
-{
- enum
- {
- __end_state = -1000,
- __consume_input, // -999
- __begin_marked_expr, // -998
- __end_marked_expr, // -997
- __pop_state, // -996
- __accept_and_consume, // -995
- __accept_but_not_consume, // -994
- __reject, // -993
- __split,
- __repeat
- };
-
- int __do_;
- const _CharT* __first_;
- const _CharT* __current_;
- const _CharT* __last_;
- vector<sub_match<const _CharT*> > __sub_matches_;
- vector<pair<size_t, const _CharT*> > __loop_data_;
- const __node<_CharT>* __node_;
- regex_constants::match_flag_type __flags_;
- bool __at_first_;
-
- _LIBCPP_INLINE_VISIBILITY
- __state()
- : __do_(0), __first_(nullptr), __current_(nullptr), __last_(nullptr),
- __node_(nullptr), __flags_() {}
-};
-
-// __node
-
-template <class _CharT>
-class __node
-{
- __node(const __node&);
- __node& operator=(const __node&);
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- __node() {}
- _LIBCPP_INLINE_VISIBILITY
- virtual ~__node() {}
-
- _LIBCPP_INLINE_VISIBILITY
- virtual void __exec(__state&) const {}
- _LIBCPP_INLINE_VISIBILITY
- virtual void __exec_split(bool, __state&) const {}
-};
-
-// __end_state
-
-template <class _CharT>
-class __end_state
- : public __node<_CharT>
-{
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- __end_state() {}
-
- virtual void __exec(__state&) const;
-};
-
-template <class _CharT>
-void
-__end_state<_CharT>::__exec(__state& __s) const
-{
- __s.__do_ = __state::__end_state;
-}
-
-// __has_one_state
-
-template <class _CharT>
-class __has_one_state
- : public __node<_CharT>
-{
- __node<_CharT>* __first_;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __has_one_state(__node<_CharT>* __s)
- : __first_(__s) {}
-
- _LIBCPP_INLINE_VISIBILITY
- __node<_CharT>* first() const {return __first_;}
- _LIBCPP_INLINE_VISIBILITY
- __node<_CharT>*& first() {return __first_;}
-};
-
-// __owns_one_state
-
-template <class _CharT>
-class __owns_one_state
- : public __has_one_state<_CharT>
-{
- typedef __has_one_state<_CharT> base;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __owns_one_state(__node<_CharT>* __s)
- : base(__s) {}
-
- virtual ~__owns_one_state();
-};
-
-template <class _CharT>
-__owns_one_state<_CharT>::~__owns_one_state()
-{
- delete this->first();
-}
-
-// __empty_state
-
-template <class _CharT>
-class __empty_state
- : public __owns_one_state<_CharT>
-{
- typedef __owns_one_state<_CharT> base;
-
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __empty_state(__node<_CharT>* __s)
- : base(__s) {}
-
- virtual void __exec(__state&) const;
-};
-
-template <class _CharT>
-void
-__empty_state<_CharT>::__exec(__state& __s) const
-{
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->first();
-}
-
-// __empty_non_own_state
-
-template <class _CharT>
-class __empty_non_own_state
- : public __has_one_state<_CharT>
-{
- typedef __has_one_state<_CharT> base;
-
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __empty_non_own_state(__node<_CharT>* __s)
- : base(__s) {}
-
- virtual void __exec(__state&) const;
-};
-
-template <class _CharT>
-void
-__empty_non_own_state<_CharT>::__exec(__state& __s) const
-{
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->first();
-}
-
-// __repeat_one_loop
-
-template <class _CharT>
-class __repeat_one_loop
- : public __has_one_state<_CharT>
-{
- typedef __has_one_state<_CharT> base;
-
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __repeat_one_loop(__node<_CharT>* __s)
- : base(__s) {}
-
- virtual void __exec(__state&) const;
-};
-
-template <class _CharT>
-void
-__repeat_one_loop<_CharT>::__exec(__state& __s) const
-{
- __s.__do_ = __state::__repeat;
- __s.__node_ = this->first();
-}
-
-// __owns_two_states
-
-template <class _CharT>
-class __owns_two_states
- : public __owns_one_state<_CharT>
-{
- typedef __owns_one_state<_CharT> base;
-
- base* __second_;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __owns_two_states(__node<_CharT>* __s1, base* __s2)
- : base(__s1), __second_(__s2) {}
-
- virtual ~__owns_two_states();
-
- _LIBCPP_INLINE_VISIBILITY
- base* second() const {return __second_;}
- _LIBCPP_INLINE_VISIBILITY
- base*& second() {return __second_;}
-};
-
-template <class _CharT>
-__owns_two_states<_CharT>::~__owns_two_states()
-{
- delete __second_;
-}
-
-// __loop
-
-template <class _CharT>
-class __loop
- : public __owns_two_states<_CharT>
-{
- typedef __owns_two_states<_CharT> base;
-
- size_t __min_;
- size_t __max_;
- unsigned __loop_id_;
- unsigned __mexp_begin_;
- unsigned __mexp_end_;
- bool __greedy_;
-
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __loop(unsigned __loop_id,
- __node<_CharT>* __s1, __owns_one_state<_CharT>* __s2,
- unsigned __mexp_begin, unsigned __mexp_end,
- bool __greedy = true,
- size_t __min = 0,
- size_t __max = numeric_limits<size_t>::max())
- : base(__s1, __s2), __min_(__min), __max_(__max), __loop_id_(__loop_id),
- __mexp_begin_(__mexp_begin), __mexp_end_(__mexp_end),
- __greedy_(__greedy) {}
-
- virtual void __exec(__state& __s) const;
- virtual void __exec_split(bool __second, __state& __s) const;
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- void __init_repeat(__state& __s) const
- {
- __s.__loop_data_[__loop_id_].second = __s.__current_;
- for (size_t __i = __mexp_begin_-1; __i != __mexp_end_-1; ++__i)
- {
- __s.__sub_matches_[__i].first = __s.__last_;
- __s.__sub_matches_[__i].second = __s.__last_;
- __s.__sub_matches_[__i].matched = false;
- }
- }
-};
-
-template <class _CharT>
-void
-__loop<_CharT>::__exec(__state& __s) const
-{
- if (__s.__do_ == __state::__repeat)
- {
- bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_;
- bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_;
- if (__do_repeat && __do_alt &&
- __s.__loop_data_[__loop_id_].second == __s.__current_)
- __do_repeat = false;
- if (__do_repeat && __do_alt)
- __s.__do_ = __state::__split;
- else if (__do_repeat)
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->first();
- __init_repeat(__s);
- }
- else
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->second();
- }
- }
- else
- {
- __s.__loop_data_[__loop_id_].first = 0;
- bool __do_repeat = 0 < __max_;
- bool __do_alt = 0 >= __min_;
- if (__do_repeat && __do_alt)
- __s.__do_ = __state::__split;
- else if (__do_repeat)
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->first();
- __init_repeat(__s);
- }
- else
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->second();
- }
- }
-}
-
-template <class _CharT>
-void
-__loop<_CharT>::__exec_split(bool __second, __state& __s) const
-{
- __s.__do_ = __state::__accept_but_not_consume;
- if (__greedy_ != __second)
- {
- __s.__node_ = this->first();
- __init_repeat(__s);
- }
- else
- __s.__node_ = this->second();
-}
-
-// __alternate
-
-template <class _CharT>
-class __alternate
- : public __owns_two_states<_CharT>
-{
- typedef __owns_two_states<_CharT> base;
-
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __alternate(__owns_one_state<_CharT>* __s1,
- __owns_one_state<_CharT>* __s2)
- : base(__s1, __s2) {}
-
- virtual void __exec(__state& __s) const;
- virtual void __exec_split(bool __second, __state& __s) const;
-};
-
-template <class _CharT>
-void
-__alternate<_CharT>::__exec(__state& __s) const
-{
- __s.__do_ = __state::__split;
-}
-
-template <class _CharT>
-void
-__alternate<_CharT>::__exec_split(bool __second, __state& __s) const
-{
- __s.__do_ = __state::__accept_but_not_consume;
- if (__second)
- __s.__node_ = this->second();
- else
- __s.__node_ = this->first();
-}
-
-// __begin_marked_subexpression
-
-template <class _CharT>
-class __begin_marked_subexpression
- : public __owns_one_state<_CharT>
-{
- typedef __owns_one_state<_CharT> base;
-
- unsigned __mexp_;
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
- : base(__s), __mexp_(__mexp) {}
-
- virtual void __exec(__state&) const;
-};
-
-template <class _CharT>
-void
-__begin_marked_subexpression<_CharT>::__exec(__state& __s) const
-{
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__sub_matches_[__mexp_-1].first = __s.__current_;
- __s.__node_ = this->first();
-}
-
-// __end_marked_subexpression
-
-template <class _CharT>
-class __end_marked_subexpression
- : public __owns_one_state<_CharT>
-{
- typedef __owns_one_state<_CharT> base;
-
- unsigned __mexp_;
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
- : base(__s), __mexp_(__mexp) {}
-
- virtual void __exec(__state&) const;
-};
-
-template <class _CharT>
-void
-__end_marked_subexpression<_CharT>::__exec(__state& __s) const
-{
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__sub_matches_[__mexp_-1].second = __s.__current_;
- __s.__sub_matches_[__mexp_-1].matched = true;
- __s.__node_ = this->first();
-}
-
-// __back_ref
-
-template <class _CharT>
-class __back_ref
- : public __owns_one_state<_CharT>
-{
- typedef __owns_one_state<_CharT> base;
-
- unsigned __mexp_;
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __back_ref(unsigned __mexp, __node<_CharT>* __s)
- : base(__s), __mexp_(__mexp) {}
-
- virtual void __exec(__state&) const;
-};
-
-template <class _CharT>
-void
-__back_ref<_CharT>::__exec(__state& __s) const
-{
- if (__mexp_ > __s.__sub_matches_.size())
- __throw_regex_error<regex_constants::error_backref>();
- sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
- if (__sm.matched)
- {
- ptrdiff_t __len = __sm.second - __sm.first;
- if (__s.__last_ - __s.__current_ >= __len &&
- _VSTD::equal(__sm.first, __sm.second, __s.__current_))
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__current_ += __len;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
-}
-
-// __back_ref_icase
-
-template <class _CharT, class _Traits>
-class __back_ref_icase
- : public __owns_one_state<_CharT>
-{
- typedef __owns_one_state<_CharT> base;
-
- _Traits __traits_;
- unsigned __mexp_;
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp,
- __node<_CharT>* __s)
- : base(__s), __traits_(__traits), __mexp_(__mexp) {}
-
- virtual void __exec(__state&) const;
-};
-
-template <class _CharT, class _Traits>
-void
-__back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const
-{
- sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
- if (__sm.matched)
- {
- ptrdiff_t __len = __sm.second - __sm.first;
- if (__s.__last_ - __s.__current_ >= __len)
- {
- for (ptrdiff_t __i = 0; __i < __len; ++__i)
- {
- if (__traits_.translate_nocase(__sm.first[__i]) !=
- __traits_.translate_nocase(__s.__current_[__i]))
- goto __not_equal;
- }
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__current_ += __len;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- else
- {
-__not_equal:
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
-}
-
-// __back_ref_collate
-
-template <class _CharT, class _Traits>
-class __back_ref_collate
- : public __owns_one_state<_CharT>
-{
- typedef __owns_one_state<_CharT> base;
-
- _Traits __traits_;
- unsigned __mexp_;
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp,
- __node<_CharT>* __s)
- : base(__s), __traits_(__traits), __mexp_(__mexp) {}
-
- virtual void __exec(__state&) const;
-};
-
-template <class _CharT, class _Traits>
-void
-__back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const
-{
- sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
- if (__sm.matched)
- {
- ptrdiff_t __len = __sm.second - __sm.first;
- if (__s.__last_ - __s.__current_ >= __len)
- {
- for (ptrdiff_t __i = 0; __i < __len; ++__i)
- {
- if (__traits_.translate(__sm.first[__i]) !=
- __traits_.translate(__s.__current_[__i]))
- goto __not_equal;
- }
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__current_ += __len;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- else
- {
-__not_equal:
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
-}
-
-// __word_boundary
-
-template <class _CharT, class _Traits>
-class __word_boundary
- : public __owns_one_state<_CharT>
-{
- typedef __owns_one_state<_CharT> base;
-
- _Traits __traits_;
- bool __invert_;
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __word_boundary(const _Traits& __traits, bool __invert,
- __node<_CharT>* __s)
- : base(__s), __traits_(__traits), __invert_(__invert) {}
-
- virtual void __exec(__state&) const;
-};
-
-template <class _CharT, class _Traits>
-void
-__word_boundary<_CharT, _Traits>::__exec(__state& __s) const
-{
- bool __is_word_b = false;
- if (__s.__first_ != __s.__last_)
- {
- if (__s.__current_ == __s.__last_)
- {
- if (!(__s.__flags_ & regex_constants::match_not_eow))
- {
- _CharT __c = __s.__current_[-1];
- __is_word_b = __c == '_' ||
- __traits_.isctype(__c, ctype_base::alnum);
- }
- }
- else if (__s.__current_ == __s.__first_ &&
- !(__s.__flags_ & regex_constants::match_prev_avail))
- {
- if (!(__s.__flags_ & regex_constants::match_not_bow))
- {
- _CharT __c = *__s.__current_;
- __is_word_b = __c == '_' ||
- __traits_.isctype(__c, ctype_base::alnum);
- }
- }
- else
- {
- _CharT __c1 = __s.__current_[-1];
- _CharT __c2 = *__s.__current_;
- bool __is_c1_b = __c1 == '_' ||
- __traits_.isctype(__c1, ctype_base::alnum);
- bool __is_c2_b = __c2 == '_' ||
- __traits_.isctype(__c2, ctype_base::alnum);
- __is_word_b = __is_c1_b != __is_c2_b;
- }
- }
- if (__is_word_b != __invert_)
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
-}
-
-// __l_anchor
-
-template <class _CharT>
-class __l_anchor
- : public __owns_one_state<_CharT>
-{
- typedef __owns_one_state<_CharT> base;
-
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- __l_anchor(__node<_CharT>* __s)
- : base(__s) {}
-
- virtual void __exec(__state&) const;
-};
-
-template <class _CharT>
-void
-__l_anchor<_CharT>::__exec(__state& __s) const
-{
- if (__s.__at_first_ && __s.__current_ == __s.__first_ &&
- !(__s.__flags_ & regex_constants::match_not_bol))
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
-}
-
-// __r_anchor
-
-template <class _CharT>
-class __r_anchor
- : public __owns_one_state<_CharT>
-{
- typedef __owns_one_state<_CharT> base;
-
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- __r_anchor(__node<_CharT>* __s)
- : base(__s) {}
-
- virtual void __exec(__state&) const;
-};
-
-template <class _CharT>
-void
-__r_anchor<_CharT>::__exec(__state& __s) const
-{
- if (__s.__current_ == __s.__last_ &&
- !(__s.__flags_ & regex_constants::match_not_eol))
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
-}
-
-// __match_any
-
-template <class _CharT>
-class __match_any
- : public __owns_one_state<_CharT>
-{
- typedef __owns_one_state<_CharT> base;
-
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- __match_any(__node<_CharT>* __s)
- : base(__s) {}
-
- virtual void __exec(__state&) const;
-};
-
-template <class _CharT>
-void
-__match_any<_CharT>::__exec(__state& __s) const
-{
- if (__s.__current_ != __s.__last_ && *__s.__current_ != 0)
- {
- __s.__do_ = __state::__accept_and_consume;
- ++__s.__current_;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
-}
-
-// __match_any_but_newline
-
-template <class _CharT>
-class __match_any_but_newline
- : public __owns_one_state<_CharT>
-{
- typedef __owns_one_state<_CharT> base;
-
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- __match_any_but_newline(__node<_CharT>* __s)
- : base(__s) {}
-
- virtual void __exec(__state&) const;
-};
-
-template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<char>::__exec(__state&) const;
-template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<wchar_t>::__exec(__state&) const;
-
-// __match_char
-
-template <class _CharT>
-class __match_char
- : public __owns_one_state<_CharT>
-{
- typedef __owns_one_state<_CharT> base;
-
- _CharT __c_;
-
- __match_char(const __match_char&);
- __match_char& operator=(const __match_char&);
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- __match_char(_CharT __c, __node<_CharT>* __s)
- : base(__s), __c_(__c) {}
-
- virtual void __exec(__state&) const;
-};
-
-template <class _CharT>
-void
-__match_char<_CharT>::__exec(__state& __s) const
-{
- if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_)
- {
- __s.__do_ = __state::__accept_and_consume;
- ++__s.__current_;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
-}
-
-// __match_char_icase
-
-template <class _CharT, class _Traits>
-class __match_char_icase
- : public __owns_one_state<_CharT>
-{
- typedef __owns_one_state<_CharT> base;
-
- _Traits __traits_;
- _CharT __c_;
-
- __match_char_icase(const __match_char_icase&);
- __match_char_icase& operator=(const __match_char_icase&);
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
- : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {}
-
- virtual void __exec(__state&) const;
-};
-
-template <class _CharT, class _Traits>
-void
-__match_char_icase<_CharT, _Traits>::__exec(__state& __s) const
-{
- if (__s.__current_ != __s.__last_ &&
- __traits_.translate_nocase(*__s.__current_) == __c_)
- {
- __s.__do_ = __state::__accept_and_consume;
- ++__s.__current_;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
-}
-
-// __match_char_collate
-
-template <class _CharT, class _Traits>
-class __match_char_collate
- : public __owns_one_state<_CharT>
-{
- typedef __owns_one_state<_CharT> base;
-
- _Traits __traits_;
- _CharT __c_;
-
- __match_char_collate(const __match_char_collate&);
- __match_char_collate& operator=(const __match_char_collate&);
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
- : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {}
-
- virtual void __exec(__state&) const;
-};
-
-template <class _CharT, class _Traits>
-void
-__match_char_collate<_CharT, _Traits>::__exec(__state& __s) const
-{
- if (__s.__current_ != __s.__last_ &&
- __traits_.translate(*__s.__current_) == __c_)
- {
- __s.__do_ = __state::__accept_and_consume;
- ++__s.__current_;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
-}
-
-// __bracket_expression
-
-template <class _CharT, class _Traits>
-class __bracket_expression
- : public __owns_one_state<_CharT>
-{
- typedef __owns_one_state<_CharT> base;
- typedef typename _Traits::string_type string_type;
-
- _Traits __traits_;
- vector<_CharT> __chars_;
- vector<_CharT> __neg_chars_;
- vector<pair<string_type, string_type> > __ranges_;
- vector<pair<_CharT, _CharT> > __digraphs_;
- vector<string_type> __equivalences_;
- typename regex_traits<_CharT>::char_class_type __mask_;
- typename regex_traits<_CharT>::char_class_type __neg_mask_;
- bool __negate_;
- bool __icase_;
- bool __collate_;
- bool __might_have_digraph_;
-
- __bracket_expression(const __bracket_expression&);
- __bracket_expression& operator=(const __bracket_expression&);
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- __bracket_expression(const _Traits& __traits, __node<_CharT>* __s,
- bool __negate, bool __icase, bool __collate)
- : base(__s), __traits_(__traits), __mask_(), __neg_mask_(),
- __negate_(__negate), __icase_(__icase), __collate_(__collate),
- __might_have_digraph_(__traits_.getloc().name() != "C") {}
-
- virtual void __exec(__state&) const;
-
- _LIBCPP_INLINE_VISIBILITY
- bool __negated() const {return __negate_;}
-
- _LIBCPP_INLINE_VISIBILITY
- void __add_char(_CharT __c)
- {
- if (__icase_)
- __chars_.push_back(__traits_.translate_nocase(__c));
- else if (__collate_)
- __chars_.push_back(__traits_.translate(__c));
- else
- __chars_.push_back(__c);
- }
- _LIBCPP_INLINE_VISIBILITY
- void __add_neg_char(_CharT __c)
- {
- if (__icase_)
- __neg_chars_.push_back(__traits_.translate_nocase(__c));
- else if (__collate_)
- __neg_chars_.push_back(__traits_.translate(__c));
- else
- __neg_chars_.push_back(__c);
- }
- _LIBCPP_INLINE_VISIBILITY
- void __add_range(string_type __b, string_type __e)
- {
- if (__collate_)
- {
- if (__icase_)
- {
- for (size_t __i = 0; __i < __b.size(); ++__i)
- __b[__i] = __traits_.translate_nocase(__b[__i]);
- for (size_t __i = 0; __i < __e.size(); ++__i)
- __e[__i] = __traits_.translate_nocase(__e[__i]);
- }
- else
- {
- for (size_t __i = 0; __i < __b.size(); ++__i)
- __b[__i] = __traits_.translate(__b[__i]);
- for (size_t __i = 0; __i < __e.size(); ++__i)
- __e[__i] = __traits_.translate(__e[__i]);
- }
- __ranges_.push_back(make_pair(
- __traits_.transform(__b.begin(), __b.end()),
- __traits_.transform(__e.begin(), __e.end())));
- }
- else
- {
- if (__b.size() != 1 || __e.size() != 1)
- __throw_regex_error<regex_constants::error_collate>();
- if (__icase_)
- {
- __b[0] = __traits_.translate_nocase(__b[0]);
- __e[0] = __traits_.translate_nocase(__e[0]);
- }
- __ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e)));
- }
- }
- _LIBCPP_INLINE_VISIBILITY
- void __add_digraph(_CharT __c1, _CharT __c2)
- {
- if (__icase_)
- __digraphs_.push_back(make_pair(__traits_.translate_nocase(__c1),
- __traits_.translate_nocase(__c2)));
- else if (__collate_)
- __digraphs_.push_back(make_pair(__traits_.translate(__c1),
- __traits_.translate(__c2)));
- else
- __digraphs_.push_back(make_pair(__c1, __c2));
- }
- _LIBCPP_INLINE_VISIBILITY
- void __add_equivalence(const string_type& __s)
- {__equivalences_.push_back(__s);}
- _LIBCPP_INLINE_VISIBILITY
- void __add_class(typename regex_traits<_CharT>::char_class_type __mask)
- {__mask_ |= __mask;}
- _LIBCPP_INLINE_VISIBILITY
- void __add_neg_class(typename regex_traits<_CharT>::char_class_type __mask)
- {__neg_mask_ |= __mask;}
-};
-
-template <class _CharT, class _Traits>
-void
-__bracket_expression<_CharT, _Traits>::__exec(__state& __s) const
-{
- bool __found = false;
- unsigned __consumed = 0;
- if (__s.__current_ != __s.__last_)
- {
- ++__consumed;
- if (__might_have_digraph_)
- {
- const _CharT* __next = _VSTD::next(__s.__current_);
- if (__next != __s.__last_)
- {
- pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
- if (__icase_)
- {
- __ch2.first = __traits_.translate_nocase(__ch2.first);
- __ch2.second = __traits_.translate_nocase(__ch2.second);
- }
- else if (__collate_)
- {
- __ch2.first = __traits_.translate(__ch2.first);
- __ch2.second = __traits_.translate(__ch2.second);
- }
- if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty())
- {
- // __ch2 is a digraph in this locale
- ++__consumed;
- for (size_t __i = 0; __i < __digraphs_.size(); ++__i)
- {
- if (__ch2 == __digraphs_[__i])
- {
- __found = true;
- goto __exit;
- }
- }
- if (__collate_ && !__ranges_.empty())
- {
- string_type __s2 = __traits_.transform(&__ch2.first,
- &__ch2.first + 2);
- for (size_t __i = 0; __i < __ranges_.size(); ++__i)
- {
- if (__ranges_[__i].first <= __s2 &&
- __s2 <= __ranges_[__i].second)
- {
- __found = true;
- goto __exit;
- }
- }
- }
- if (!__equivalences_.empty())
- {
- string_type __s2 = __traits_.transform_primary(&__ch2.first,
- &__ch2.first + 2);
- for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
- {
- if (__s2 == __equivalences_[__i])
- {
- __found = true;
- goto __exit;
- }
- }
- }
- if (__traits_.isctype(__ch2.first, __mask_) &&
- __traits_.isctype(__ch2.second, __mask_))
- {
- __found = true;
- goto __exit;
- }
- if (!__traits_.isctype(__ch2.first, __neg_mask_) &&
- !__traits_.isctype(__ch2.second, __neg_mask_))
- {
- __found = true;
- goto __exit;
- }
- goto __exit;
- }
- }
- }
- // test *__s.__current_ as not a digraph
- _CharT __ch = *__s.__current_;
- if (__icase_)
- __ch = __traits_.translate_nocase(__ch);
- else if (__collate_)
- __ch = __traits_.translate(__ch);
- for (size_t __i = 0; __i < __chars_.size(); ++__i)
- {
- if (__ch == __chars_[__i])
- {
- __found = true;
- goto __exit;
- }
- }
- // When there's at least one of __neg_chars_ and __neg_mask_, the set
- // of "__found" chars is
- // union(complement(union(__neg_chars_, __neg_mask_)),
- // other cases...)
- //
- // It doesn't make sense to check this when there are no __neg_chars_
- // and no __neg_mask_.
- if (!(__neg_mask_ == 0 && __neg_chars_.empty()))
- {
- const bool __in_neg_mask = __traits_.isctype(__ch, __neg_mask_);
- const bool __in_neg_chars =
- std::find(__neg_chars_.begin(), __neg_chars_.end(), __ch) !=
- __neg_chars_.end();
- if (!(__in_neg_mask || __in_neg_chars))
- {
- __found = true;
- goto __exit;
- }
- }
- if (!__ranges_.empty())
- {
- string_type __s2 = __collate_ ?
- __traits_.transform(&__ch, &__ch + 1) :
- string_type(1, __ch);
- for (size_t __i = 0; __i < __ranges_.size(); ++__i)
- {
- if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second)
- {
- __found = true;
- goto __exit;
- }
- }
- }
- if (!__equivalences_.empty())
- {
- string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1);
- for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
- {
- if (__s2 == __equivalences_[__i])
- {
- __found = true;
- goto __exit;
- }
- }
- }
- if (__traits_.isctype(__ch, __mask_))
- {
- __found = true;
- goto __exit;
- }
- }
- else
- __found = __negate_; // force reject
-__exit:
- if (__found != __negate_)
- {
- __s.__do_ = __state::__accept_and_consume;
- __s.__current_ += __consumed;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
-}
-
-template <class _CharT, class _Traits> class __lookahead;
-
-template <class _CharT, class _Traits = regex_traits<_CharT> >
-class _LIBCPP_TEMPLATE_VIS basic_regex
-{
-public:
- // types:
- typedef _CharT value_type;
- typedef _Traits traits_type;
- typedef typename _Traits::string_type string_type;
- typedef regex_constants::syntax_option_type flag_type;
- typedef typename _Traits::locale_type locale_type;
-
-private:
- _Traits __traits_;
- flag_type __flags_;
- unsigned __marked_count_;
- unsigned __loop_count_;
- int __open_count_;
- shared_ptr<__empty_state<_CharT> > __start_;
- __owns_one_state<_CharT>* __end_;
-
- typedef _VSTD::__state<_CharT> __state;
- typedef _VSTD::__node<_CharT> __node;
-
-public:
- // constants:
- static const regex_constants::syntax_option_type icase = regex_constants::icase;
- static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
- static const regex_constants::syntax_option_type optimize = regex_constants::optimize;
- static const regex_constants::syntax_option_type collate = regex_constants::collate;
- static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
- static const regex_constants::syntax_option_type basic = regex_constants::basic;
- static const regex_constants::syntax_option_type extended = regex_constants::extended;
- static const regex_constants::syntax_option_type awk = regex_constants::awk;
- static const regex_constants::syntax_option_type grep = regex_constants::grep;
- static const regex_constants::syntax_option_type egrep = regex_constants::egrep;
-
- // construct/copy/destroy:
- _LIBCPP_INLINE_VISIBILITY
- basic_regex()
- : __flags_(), __marked_count_(0), __loop_count_(0), __open_count_(0),
- __end_(0)
- {}
- _LIBCPP_INLINE_VISIBILITY
- explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
- : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
- __end_(0)
- {__parse(__p, __p + __traits_.length(__p));}
- _LIBCPP_INLINE_VISIBILITY
- basic_regex(const value_type* __p, size_t __len, flag_type __f = regex_constants::ECMAScript)
- : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
- __end_(0)
- {__parse(__p, __p + __len);}
-// basic_regex(const basic_regex&) = default;
-// basic_regex(basic_regex&&) = default;
- template <class _ST, class _SA>
- _LIBCPP_INLINE_VISIBILITY
- explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p,
- flag_type __f = regex_constants::ECMAScript)
- : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
- __end_(0)
- {__parse(__p.begin(), __p.end());}
- template <class _ForwardIterator>
- _LIBCPP_INLINE_VISIBILITY
- basic_regex(_ForwardIterator __first, _ForwardIterator __last,
- flag_type __f = regex_constants::ECMAScript)
- : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
- __end_(0)
- {__parse(__first, __last);}
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- basic_regex(initializer_list<value_type> __il,
- flag_type __f = regex_constants::ECMAScript)
- : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
- __end_(0)
- {__parse(__il.begin(), __il.end());}
-#endif // _LIBCPP_CXX03_LANG
-
-// ~basic_regex() = default;
-
-// basic_regex& operator=(const basic_regex&) = default;
-// basic_regex& operator=(basic_regex&&) = default;
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& operator=(const value_type* __p)
- {return assign(__p);}
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& operator=(initializer_list<value_type> __il)
- {return assign(__il);}
-#endif // _LIBCPP_CXX03_LANG
- template <class _ST, class _SA>
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p)
- {return assign(__p);}
-
- // assign:
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& assign(const basic_regex& __that)
- {return *this = __that;}
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& assign(basic_regex&& __that) _NOEXCEPT
- {return *this = _VSTD::move(__that);}
-#endif
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
- {return assign(__p, __p + __traits_.length(__p), __f);}
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& assign(const value_type* __p, size_t __len, flag_type __f)
- {return assign(__p, __p + __len, __f);}
- template <class _ST, class _SA>
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s,
- flag_type __f = regex_constants::ECMAScript)
- {return assign(__s.begin(), __s.end(), __f);}
-
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __is_input_iterator <_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value,
- basic_regex&
- >::type
- assign(_InputIterator __first, _InputIterator __last,
- flag_type __f = regex_constants::ECMAScript)
- {
- basic_string<_CharT> __t(__first, __last);
- return assign(__t.begin(), __t.end(), __f);
- }
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- void __member_init(flag_type __f)
- {
- __flags_ = __f;
- __marked_count_ = 0;
- __loop_count_ = 0;
- __open_count_ = 0;
- __end_ = nullptr;
- }
-public:
-
- template <class _ForwardIterator>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __is_forward_iterator<_ForwardIterator>::value,
- basic_regex&
- >::type
- assign(_ForwardIterator __first, _ForwardIterator __last,
- flag_type __f = regex_constants::ECMAScript)
- {
- return assign(basic_regex(__first, __last, __f));
- }
-
-#ifndef _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& assign(initializer_list<value_type> __il,
- flag_type __f = regex_constants::ECMAScript)
- {return assign(__il.begin(), __il.end(), __f);}
-
-#endif // _LIBCPP_CXX03_LANG
-
- // const operations:
- _LIBCPP_INLINE_VISIBILITY
- unsigned mark_count() const {return __marked_count_;}
- _LIBCPP_INLINE_VISIBILITY
- flag_type flags() const {return __flags_;}
-
- // locale:
- _LIBCPP_INLINE_VISIBILITY
- locale_type imbue(locale_type __loc)
- {
- __member_init(ECMAScript);
- __start_.reset();
- return __traits_.imbue(__loc);
- }
- _LIBCPP_INLINE_VISIBILITY
- locale_type getloc() const {return __traits_.getloc();}
-
- // swap:
- void swap(basic_regex& __r);
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- unsigned __loop_count() const {return __loop_count_;}
-
- template <class _ForwardIterator>
- _ForwardIterator
- __parse(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
- __owns_one_state<_CharT>* __s,
- unsigned __mexp_begin, unsigned __mexp_end);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
- __owns_one_state<_CharT>* __s,
- unsigned __mexp_begin, unsigned __mexp_end);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last,
- __bracket_expression<_CharT, _Traits>* __ml);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last,
- __bracket_expression<_CharT, _Traits>* __ml);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last,
- __bracket_expression<_CharT, _Traits>* __ml);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_character_class(_ForwardIterator __first, _ForwardIterator __last,
- __bracket_expression<_CharT, _Traits>* __ml);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last,
- basic_string<_CharT>& __col_sym);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_term(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_atom(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last,
- basic_string<_CharT>* __str = nullptr);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_grep(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last,
- basic_string<_CharT>& __str,
- __bracket_expression<_CharT, _Traits>* __ml);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last,
- basic_string<_CharT>* __str = nullptr);
-
- _LIBCPP_INLINE_VISIBILITY
- void __push_l_anchor();
- void __push_r_anchor();
- void __push_match_any();
- void __push_match_any_but_newline();
- _LIBCPP_INLINE_VISIBILITY
- void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
- unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
- {__push_loop(__min, numeric_limits<size_t>::max(), __s,
- __mexp_begin, __mexp_end);}
- _LIBCPP_INLINE_VISIBILITY
- void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
- unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
- {__push_loop(__min, numeric_limits<size_t>::max(), __s,
- __mexp_begin, __mexp_end, false);}
- void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s,
- size_t __mexp_begin = 0, size_t __mexp_end = 0,
- bool __greedy = true);
- __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
- void __push_char(value_type __c);
- void __push_back_ref(int __i);
- void __push_alternation(__owns_one_state<_CharT>* __sa,
- __owns_one_state<_CharT>* __sb);
- void __push_begin_marked_subexpression();
- void __push_end_marked_subexpression(unsigned);
- void __push_empty();
- void __push_word_boundary(bool);
- void __push_lookahead(const basic_regex&, bool, unsigned);
-
- template <class _Allocator>
- bool
- __search(const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags) const;
-
- template <class _Allocator>
- bool
- __match_at_start(const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags, bool) const;
- template <class _Allocator>
- bool
- __match_at_start_ecma(const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags, bool) const;
- template <class _Allocator>
- bool
- __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags, bool) const;
- template <class _Allocator>
- bool
- __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags, bool) const;
-
- template <class _Bp, class _Ap, class _Cp, class _Tp>
- friend
- bool
- regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
- regex_constants::match_flag_type);
-
- template <class _Ap, class _Cp, class _Tp>
- friend
- bool
- regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&,
- const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
-
- template <class _Bp, class _Cp, class _Tp>
- friend
- bool
- regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&,
- regex_constants::match_flag_type);
-
- template <class _Cp, class _Tp>
- friend
- bool
- regex_search(const _Cp*, const _Cp*,
- const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
-
- template <class _Cp, class _Ap, class _Tp>
- friend
- bool
- regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&,
- regex_constants::match_flag_type);
-
- template <class _ST, class _SA, class _Cp, class _Tp>
- friend
- bool
- regex_search(const basic_string<_Cp, _ST, _SA>& __s,
- const basic_regex<_Cp, _Tp>& __e,
- regex_constants::match_flag_type __flags);
-
- template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
- friend
- bool
- regex_search(const basic_string<_Cp, _ST, _SA>& __s,
- match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
- const basic_regex<_Cp, _Tp>& __e,
- regex_constants::match_flag_type __flags);
-
- template <class _Iter, class _Ap, class _Cp, class _Tp>
- friend
- bool
- regex_search(__wrap_iter<_Iter> __first,
- __wrap_iter<_Iter> __last,
- match_results<__wrap_iter<_Iter>, _Ap>& __m,
- const basic_regex<_Cp, _Tp>& __e,
- regex_constants::match_flag_type __flags);
-
- template <class, class> friend class __lookahead;
-};
-
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-template <class _ForwardIterator,
- class = typename enable_if<__is_forward_iterator<_ForwardIterator>::value, nullptr_t>::type
->
-basic_regex(_ForwardIterator, _ForwardIterator,
- regex_constants::syntax_option_type = regex_constants::ECMAScript)
- -> basic_regex<typename iterator_traits<_ForwardIterator>::value_type>;
-#endif
-
-template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase;
-template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs;
-template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize;
-template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate;
-template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript;
-template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic;
-template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended;
-template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk;
-template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep;
-template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep;
-
-template <class _CharT, class _Traits>
-void
-basic_regex<_CharT, _Traits>::swap(basic_regex& __r)
-{
- using _VSTD::swap;
- swap(__traits_, __r.__traits_);
- swap(__flags_, __r.__flags_);
- swap(__marked_count_, __r.__marked_count_);
- swap(__loop_count_, __r.__loop_count_);
- swap(__open_count_, __r.__open_count_);
- swap(__start_, __r.__start_);
- swap(__end_, __r.__end_);
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y)
-{
- return __x.swap(__y);
-}
-
-// __lookahead
-
-template <class _CharT, class _Traits>
-class __lookahead
- : public __owns_one_state<_CharT>
-{
- typedef __owns_one_state<_CharT> base;
-
- basic_regex<_CharT, _Traits> __exp_;
- unsigned __mexp_;
- bool __invert_;
-
- __lookahead(const __lookahead&);
- __lookahead& operator=(const __lookahead&);
-public:
- typedef _VSTD::__state<_CharT> __state;
-
- _LIBCPP_INLINE_VISIBILITY
- __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp)
- : base(__s), __exp_(__exp), __mexp_(__mexp), __invert_(__invert) {}
-
- virtual void __exec(__state&) const;
-};
-
-template <class _CharT, class _Traits>
-void
-__lookahead<_CharT, _Traits>::__exec(__state& __s) const
-{
- match_results<const _CharT*> __m;
- __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
- bool __matched = __exp_.__match_at_start_ecma(
- __s.__current_, __s.__last_,
- __m,
- (__s.__flags_ | regex_constants::match_continuous) &
- ~regex_constants::__full_match,
- __s.__at_first_ && __s.__current_ == __s.__first_);
- if (__matched != __invert_)
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->first();
- for (unsigned __i = 1; __i < __m.size(); ++__i) {
- __s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i];
- }
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- {
- unique_ptr<__node> __h(new __end_state<_CharT>);
- __start_.reset(new __empty_state<_CharT>(__h.get()));
- __h.release();
- __end_ = __start_.get();
- }
- switch (__flags_ & 0x1F0)
- {
- case ECMAScript:
- __first = __parse_ecma_exp(__first, __last);
- break;
- case basic:
- __first = __parse_basic_reg_exp(__first, __last);
- break;
- case extended:
- case awk:
- __first = __parse_extended_reg_exp(__first, __last);
- break;
- case grep:
- __first = __parse_grep(__first, __last);
- break;
- case egrep:
- __first = __parse_egrep(__first, __last);
- break;
- default:
- __throw_regex_error<regex_constants::__re_err_grammar>();
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last)
- {
- if (*__first == '^')
- {
- __push_l_anchor();
- ++__first;
- }
- if (__first != __last)
- {
- __first = __parse_RE_expression(__first, __last);
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp == __last && *__first == '$')
- {
- __push_r_anchor();
- ++__first;
- }
- }
- }
- if (__first != __last)
- __throw_regex_error<regex_constants::__re_err_empty>();
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- __owns_one_state<_CharT>* __sa = __end_;
- _ForwardIterator __temp = __parse_ERE_branch(__first, __last);
- if (__temp == __first)
- __throw_regex_error<regex_constants::__re_err_empty>();
- __first = __temp;
- while (__first != __last && *__first == '|')
- {
- __owns_one_state<_CharT>* __sb = __end_;
- __temp = __parse_ERE_branch(++__first, __last);
- if (__temp == __first)
- __throw_regex_error<regex_constants::__re_err_empty>();
- __push_alternation(__sa, __sb);
- __first = __temp;
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- _ForwardIterator __temp = __parse_ERE_expression(__first, __last);
- if (__temp == __first)
- __throw_regex_error<regex_constants::__re_err_empty>();
- do
- {
- __first = __temp;
- __temp = __parse_ERE_expression(__first, __last);
- } while (__temp != __first);
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- __owns_one_state<_CharT>* __e = __end_;
- unsigned __mexp_begin = __marked_count_;
- _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last);
- if (__temp == __first && __temp != __last)
- {
- switch (*__temp)
- {
- case '^':
- __push_l_anchor();
- ++__temp;
- break;
- case '$':
- __push_r_anchor();
- ++__temp;
- break;
- case '(':
- __push_begin_marked_subexpression();
- unsigned __temp_count = __marked_count_;
- ++__open_count_;
- __temp = __parse_extended_reg_exp(++__temp, __last);
- if (__temp == __last || *__temp != ')')
- __throw_regex_error<regex_constants::error_paren>();
- __push_end_marked_subexpression(__temp_count);
- --__open_count_;
- ++__temp;
- break;
- }
- }
- if (__temp != __first)
- __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1,
- __marked_count_+1);
- __first = __temp;
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- while (true)
- {
- _ForwardIterator __temp = __parse_simple_RE(__first, __last);
- if (__temp == __first)
- break;
- __first = __temp;
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last)
- {
- __owns_one_state<_CharT>* __e = __end_;
- unsigned __mexp_begin = __marked_count_;
- _ForwardIterator __temp = __parse_nondupl_RE(__first, __last);
- if (__temp != __first)
- __first = __parse_RE_dupl_symbol(__temp, __last, __e,
- __mexp_begin+1, __marked_count_+1);
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- _ForwardIterator __temp = __first;
- __first = __parse_one_char_or_coll_elem_RE(__first, __last);
- if (__temp == __first)
- {
- __temp = __parse_Back_open_paren(__first, __last);
- if (__temp != __first)
- {
- __push_begin_marked_subexpression();
- unsigned __temp_count = __marked_count_;
- __first = __parse_RE_expression(__temp, __last);
- __temp = __parse_Back_close_paren(__first, __last);
- if (__temp == __first)
- __throw_regex_error<regex_constants::error_paren>();
- __push_end_marked_subexpression(__temp_count);
- __first = __temp;
- }
- else
- __first = __parse_BACKREF(__first, __last);
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(
- _ForwardIterator __first,
- _ForwardIterator __last)
-{
- _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
- if (__temp == __first)
- {
- __temp = __parse_QUOTED_CHAR(__first, __last);
- if (__temp == __first)
- {
- if (__temp != __last && *__temp == '.')
- {
- __push_match_any();
- ++__temp;
- }
- else
- __temp = __parse_bracket_expression(__first, __last);
- }
- }
- __first = __temp;
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(
- _ForwardIterator __first,
- _ForwardIterator __last)
-{
- _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
- if (__temp == __first)
- {
- __temp = __parse_QUOTED_CHAR_ERE(__first, __last);
- if (__temp == __first)
- {
- if (__temp != __last && *__temp == '.')
- {
- __push_match_any();
- ++__temp;
- }
- else
- __temp = __parse_bracket_expression(__first, __last);
- }
- }
- __first = __temp;
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last)
- {
- if (*__first == '\\' && *__temp == '(')
- __first = ++__temp;
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last)
- {
- if (*__first == '\\' && *__temp == ')')
- __first = ++__temp;
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last)
- {
- if (*__first == '\\' && *__temp == '{')
- __first = ++__temp;
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last)
- {
- if (*__first == '\\' && *__temp == '}')
- __first = ++__temp;
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last)
- {
- if (*__first == '\\')
- {
- int __val = __traits_.value(*__temp, 10);
- if (__val >= 1 && __val <= 9)
- {
- __push_back_ref(__val);
- __first = ++__temp;
- }
- }
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp == __last && *__first == '$')
- return __first;
- // Not called inside a bracket
- if (*__first == '.' || *__first == '\\' || *__first == '[')
- return __first;
- __push_char(*__first);
- ++__first;
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last)
- {
- switch (*__first)
- {
- case '^':
- case '.':
- case '[':
- case '$':
- case '(':
- case '|':
- case '*':
- case '+':
- case '?':
- case '{':
- case '\\':
- break;
- case ')':
- if (__open_count_ == 0)
- {
- __push_char(*__first);
- ++__first;
- }
- break;
- default:
- __push_char(*__first);
- ++__first;
- break;
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last)
- {
- if (*__first == '\\')
- {
- switch (*__temp)
- {
- case '^':
- case '.':
- case '*':
- case '[':
- case '$':
- case '\\':
- __push_char(*__temp);
- __first = ++__temp;
- break;
- }
- }
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last)
- {
- if (*__first == '\\')
- {
- switch (*__temp)
- {
- case '^':
- case '.':
- case '*':
- case '[':
- case '$':
- case '\\':
- case '(':
- case ')':
- case '|':
- case '+':
- case '?':
- case '{':
- case '}':
- __push_char(*__temp);
- __first = ++__temp;
- break;
- default:
- if ((__flags_ & 0x1F0) == awk)
- __first = __parse_awk_escape(++__first, __last);
- break;
- }
- }
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first,
- _ForwardIterator __last,
- __owns_one_state<_CharT>* __s,
- unsigned __mexp_begin,
- unsigned __mexp_end)
-{
- if (__first != __last)
- {
- if (*__first == '*')
- {
- __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
- ++__first;
- }
- else
- {
- _ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
- if (__temp != __first)
- {
- int __min = 0;
- __first = __temp;
- __temp = __parse_DUP_COUNT(__first, __last, __min);
- if (__temp == __first)
- __throw_regex_error<regex_constants::error_badbrace>();
- __first = __temp;
- if (__first == __last)
- __throw_regex_error<regex_constants::error_brace>();
- if (*__first != ',')
- {
- __temp = __parse_Back_close_brace(__first, __last);
- if (__temp == __first)
- __throw_regex_error<regex_constants::error_brace>();
- __push_loop(__min, __min, __s, __mexp_begin, __mexp_end,
- true);
- __first = __temp;
- }
- else
- {
- ++__first; // consume ','
- int __max = -1;
- __first = __parse_DUP_COUNT(__first, __last, __max);
- __temp = __parse_Back_close_brace(__first, __last);
- if (__temp == __first)
- __throw_regex_error<regex_constants::error_brace>();
- if (__max == -1)
- __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
- else
- {
- if (__max < __min)
- __throw_regex_error<regex_constants::error_badbrace>();
- __push_loop(__min, __max, __s, __mexp_begin, __mexp_end,
- true);
- }
- __first = __temp;
- }
- }
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first,
- _ForwardIterator __last,
- __owns_one_state<_CharT>* __s,
- unsigned __mexp_begin,
- unsigned __mexp_end)
-{
- if (__first != __last)
- {
- unsigned __grammar = __flags_ & 0x1F0;
- switch (*__first)
- {
- case '*':
- ++__first;
- if (__grammar == ECMAScript && __first != __last && *__first == '?')
- {
- ++__first;
- __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
- }
- else
- __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
- break;
- case '+':
- ++__first;
- if (__grammar == ECMAScript && __first != __last && *__first == '?')
- {
- ++__first;
- __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
- }
- else
- __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
- break;
- case '?':
- ++__first;
- if (__grammar == ECMAScript && __first != __last && *__first == '?')
- {
- ++__first;
- __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
- }
- else
- __push_loop(0, 1, __s, __mexp_begin, __mexp_end);
- break;
- case '{':
- {
- int __min;
- _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
- if (__temp == __first)
- __throw_regex_error<regex_constants::error_badbrace>();
- __first = __temp;
- if (__first == __last)
- __throw_regex_error<regex_constants::error_brace>();
- switch (*__first)
- {
- case '}':
- ++__first;
- if (__grammar == ECMAScript && __first != __last && *__first == '?')
- {
- ++__first;
- __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false);
- }
- else
- __push_loop(__min, __min, __s, __mexp_begin, __mexp_end);
- break;
- case ',':
- ++__first;
- if (__first == __last)
- __throw_regex_error<regex_constants::error_badbrace>();
- if (*__first == '}')
- {
- ++__first;
- if (__grammar == ECMAScript && __first != __last && *__first == '?')
- {
- ++__first;
- __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
- }
- else
- __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
- }
- else
- {
- int __max = -1;
- __temp = __parse_DUP_COUNT(__first, __last, __max);
- if (__temp == __first)
- __throw_regex_error<regex_constants::error_brace>();
- __first = __temp;
- if (__first == __last || *__first != '}')
- __throw_regex_error<regex_constants::error_brace>();
- ++__first;
- if (__max < __min)
- __throw_regex_error<regex_constants::error_badbrace>();
- if (__grammar == ECMAScript && __first != __last && *__first == '?')
- {
- ++__first;
- __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
- }
- else
- __push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
- }
- break;
- default:
- __throw_regex_error<regex_constants::error_badbrace>();
- }
- }
- break;
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last && *__first == '[')
- {
- ++__first;
- if (__first == __last)
- __throw_regex_error<regex_constants::error_brack>();
- bool __negate = false;
- if (*__first == '^')
- {
- ++__first;
- __negate = true;
- }
- __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
- // __ml owned by *this
- if (__first == __last)
- __throw_regex_error<regex_constants::error_brack>();
- if ((__flags_ & 0x1F0) != ECMAScript && *__first == ']')
- {
- __ml->__add_char(']');
- ++__first;
- }
- __first = __parse_follow_list(__first, __last, __ml);
- if (__first == __last)
- __throw_regex_error<regex_constants::error_brack>();
- if (*__first == '-')
- {
- __ml->__add_char('-');
- ++__first;
- }
- if (__first == __last || *__first != ']')
- __throw_regex_error<regex_constants::error_brack>();
- ++__first;
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first,
- _ForwardIterator __last,
- __bracket_expression<_CharT, _Traits>* __ml)
-{
- if (__first != __last)
- {
- while (true)
- {
- _ForwardIterator __temp = __parse_expression_term(__first, __last,
- __ml);
- if (__temp == __first)
- break;
- __first = __temp;
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
- _ForwardIterator __last,
- __bracket_expression<_CharT, _Traits>* __ml)
-{
- if (__first != __last && *__first != ']')
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- basic_string<_CharT> __start_range;
- if (__temp != __last && *__first == '[')
- {
- if (*__temp == '=')
- return __parse_equivalence_class(++__temp, __last, __ml);
- else if (*__temp == ':')
- return __parse_character_class(++__temp, __last, __ml);
- else if (*__temp == '.')
- __first = __parse_collating_symbol(++__temp, __last, __start_range);
- }
- unsigned __grammar = __flags_ & 0x1F0;
- if (__start_range.empty())
- {
- if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
- {
- if (__grammar == ECMAScript)
- __first = __parse_class_escape(++__first, __last, __start_range, __ml);
- else
- __first = __parse_awk_escape(++__first, __last, &__start_range);
- }
- else
- {
- __start_range = *__first;
- ++__first;
- }
- }
- if (__first != __last && *__first != ']')
- {
- __temp = _VSTD::next(__first);
- if (__temp != __last && *__first == '-' && *__temp != ']')
- {
- // parse a range
- basic_string<_CharT> __end_range;
- __first = __temp;
- ++__temp;
- if (__temp != __last && *__first == '[' && *__temp == '.')
- __first = __parse_collating_symbol(++__temp, __last, __end_range);
- else
- {
- if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
- {
- if (__grammar == ECMAScript)
- __first = __parse_class_escape(++__first, __last,
- __end_range, __ml);
- else
- __first = __parse_awk_escape(++__first, __last,
- &__end_range);
- }
- else
- {
- __end_range = *__first;
- ++__first;
- }
- }
- __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
- }
- else if (!__start_range.empty())
- {
- if (__start_range.size() == 1)
- __ml->__add_char(__start_range[0]);
- else
- __ml->__add_digraph(__start_range[0], __start_range[1]);
- }
- }
- else if (!__start_range.empty())
- {
- if (__start_range.size() == 1)
- __ml->__add_char(__start_range[0]);
- else
- __ml->__add_digraph(__start_range[0], __start_range[1]);
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first,
- _ForwardIterator __last,
- basic_string<_CharT>& __str,
- __bracket_expression<_CharT, _Traits>* __ml)
-{
- if (__first == __last)
- __throw_regex_error<regex_constants::error_escape>();
- switch (*__first)
- {
- case 0:
- __str = *__first;
- return ++__first;
- case 'b':
- __str = _CharT(8);
- return ++__first;
- case 'd':
- __ml->__add_class(ctype_base::digit);
- return ++__first;
- case 'D':
- __ml->__add_neg_class(ctype_base::digit);
- return ++__first;
- case 's':
- __ml->__add_class(ctype_base::space);
- return ++__first;
- case 'S':
- __ml->__add_neg_class(ctype_base::space);
- return ++__first;
- case 'w':
- __ml->__add_class(ctype_base::alnum);
- __ml->__add_char('_');
- return ++__first;
- case 'W':
- __ml->__add_neg_class(ctype_base::alnum);
- __ml->__add_neg_char('_');
- return ++__first;
- }
- __first = __parse_character_escape(__first, __last, &__str);
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
- _ForwardIterator __last,
- basic_string<_CharT>* __str)
-{
- if (__first == __last)
- __throw_regex_error<regex_constants::error_escape>();
- switch (*__first)
- {
- case '\\':
- case '"':
- case '/':
- if (__str)
- *__str = *__first;
- else
- __push_char(*__first);
- return ++__first;
- case 'a':
- if (__str)
- *__str = _CharT(7);
- else
- __push_char(_CharT(7));
- return ++__first;
- case 'b':
- if (__str)
- *__str = _CharT(8);
- else
- __push_char(_CharT(8));
- return ++__first;
- case 'f':
- if (__str)
- *__str = _CharT(0xC);
- else
- __push_char(_CharT(0xC));
- return ++__first;
- case 'n':
- if (__str)
- *__str = _CharT(0xA);
- else
- __push_char(_CharT(0xA));
- return ++__first;
- case 'r':
- if (__str)
- *__str = _CharT(0xD);
- else
- __push_char(_CharT(0xD));
- return ++__first;
- case 't':
- if (__str)
- *__str = _CharT(0x9);
- else
- __push_char(_CharT(0x9));
- return ++__first;
- case 'v':
- if (__str)
- *__str = _CharT(0xB);
- else
- __push_char(_CharT(0xB));
- return ++__first;
- }
- if ('0' <= *__first && *__first <= '7')
- {
- unsigned __val = *__first - '0';
- if (++__first != __last && ('0' <= *__first && *__first <= '7'))
- {
- __val = 8 * __val + *__first - '0';
- if (++__first != __last && ('0' <= *__first && *__first <= '7'))
- __val = 8 * __val + *__first++ - '0';
- }
- if (__str)
- *__str = _CharT(__val);
- else
- __push_char(_CharT(__val));
- }
- else
- __throw_regex_error<regex_constants::error_escape>();
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first,
- _ForwardIterator __last,
- __bracket_expression<_CharT, _Traits>* __ml)
-{
- // Found [=
- // This means =] must exist
- value_type _Equal_close[2] = {'=', ']'};
- _ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close,
- _Equal_close+2);
- if (__temp == __last)
- __throw_regex_error<regex_constants::error_brack>();
- // [__first, __temp) contains all text in [= ... =]
- string_type __collate_name =
- __traits_.lookup_collatename(__first, __temp);
- if (__collate_name.empty())
- __throw_regex_error<regex_constants::error_collate>();
- string_type __equiv_name =
- __traits_.transform_primary(__collate_name.begin(),
- __collate_name.end());
- if (!__equiv_name.empty())
- __ml->__add_equivalence(__equiv_name);
- else
- {
- switch (__collate_name.size())
- {
- case 1:
- __ml->__add_char(__collate_name[0]);
- break;
- case 2:
- __ml->__add_digraph(__collate_name[0], __collate_name[1]);
- break;
- default:
- __throw_regex_error<regex_constants::error_collate>();
- }
- }
- __first = _VSTD::next(__temp, 2);
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first,
- _ForwardIterator __last,
- __bracket_expression<_CharT, _Traits>* __ml)
-{
- // Found [:
- // This means :] must exist
- value_type _Colon_close[2] = {':', ']'};
- _ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close,
- _Colon_close+2);
- if (__temp == __last)
- __throw_regex_error<regex_constants::error_brack>();
- // [__first, __temp) contains all text in [: ... :]
- typedef typename _Traits::char_class_type char_class_type;
- char_class_type __class_type =
- __traits_.lookup_classname(__first, __temp, __flags_ & icase);
- if (__class_type == 0)
- __throw_regex_error<regex_constants::error_ctype>();
- __ml->__add_class(__class_type);
- __first = _VSTD::next(__temp, 2);
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first,
- _ForwardIterator __last,
- basic_string<_CharT>& __col_sym)
-{
- // Found [.
- // This means .] must exist
- value_type _Dot_close[2] = {'.', ']'};
- _ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close,
- _Dot_close+2);
- if (__temp == __last)
- __throw_regex_error<regex_constants::error_brack>();
- // [__first, __temp) contains all text in [. ... .]
- __col_sym = __traits_.lookup_collatename(__first, __temp);
- switch (__col_sym.size())
- {
- case 1:
- case 2:
- break;
- default:
- __throw_regex_error<regex_constants::error_collate>();
- }
- __first = _VSTD::next(__temp, 2);
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first,
- _ForwardIterator __last,
- int& __c)
-{
- if (__first != __last )
- {
- int __val = __traits_.value(*__first, 10);
- if ( __val != -1 )
- {
- __c = __val;
- for (++__first;
- __first != __last && ( __val = __traits_.value(*__first, 10)) != -1;
- ++__first)
- {
- if (__c >= std::numeric_limits<int>::max() / 10)
- __throw_regex_error<regex_constants::error_badbrace>();
- __c *= 10;
- __c += __val;
- }
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- __owns_one_state<_CharT>* __sa = __end_;
- _ForwardIterator __temp = __parse_alternative(__first, __last);
- if (__temp == __first)
- __push_empty();
- __first = __temp;
- while (__first != __last && *__first == '|')
- {
- __owns_one_state<_CharT>* __sb = __end_;
- __temp = __parse_alternative(++__first, __last);
- if (__temp == __first)
- __push_empty();
- __push_alternation(__sa, __sb);
- __first = __temp;
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- while (true)
- {
- _ForwardIterator __temp = __parse_term(__first, __last);
- if (__temp == __first)
- break;
- __first = __temp;
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- _ForwardIterator __temp = __parse_assertion(__first, __last);
- if (__temp == __first)
- {
- __owns_one_state<_CharT>* __e = __end_;
- unsigned __mexp_begin = __marked_count_;
- __temp = __parse_atom(__first, __last);
- if (__temp != __first)
- __first = __parse_ERE_dupl_symbol(__temp, __last, __e,
- __mexp_begin+1, __marked_count_+1);
- }
- else
- __first = __temp;
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last)
- {
- switch (*__first)
- {
- case '^':
- __push_l_anchor();
- ++__first;
- break;
- case '$':
- __push_r_anchor();
- ++__first;
- break;
- case '\\':
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last)
- {
- if (*__temp == 'b')
- {
- __push_word_boundary(false);
- __first = ++__temp;
- }
- else if (*__temp == 'B')
- {
- __push_word_boundary(true);
- __first = ++__temp;
- }
- }
- }
- break;
- case '(':
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last && *__temp == '?')
- {
- if (++__temp != __last)
- {
- switch (*__temp)
- {
- case '=':
- {
- basic_regex __exp;
- __exp.__flags_ = __flags_;
- __temp = __exp.__parse(++__temp, __last);
- unsigned __mexp = __exp.__marked_count_;
- __push_lookahead(_VSTD::move(__exp), false, __marked_count_);
- __marked_count_ += __mexp;
- if (__temp == __last || *__temp != ')')
- __throw_regex_error<regex_constants::error_paren>();
- __first = ++__temp;
- }
- break;
- case '!':
- {
- basic_regex __exp;
- __exp.__flags_ = __flags_;
- __temp = __exp.__parse(++__temp, __last);
- unsigned __mexp = __exp.__marked_count_;
- __push_lookahead(_VSTD::move(__exp), true, __marked_count_);
- __marked_count_ += __mexp;
- if (__temp == __last || *__temp != ')')
- __throw_regex_error<regex_constants::error_paren>();
- __first = ++__temp;
- }
- break;
- }
- }
- }
- }
- break;
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last)
- {
- switch (*__first)
- {
- case '.':
- __push_match_any_but_newline();
- ++__first;
- break;
- case '\\':
- __first = __parse_atom_escape(__first, __last);
- break;
- case '[':
- __first = __parse_bracket_expression(__first, __last);
- break;
- case '(':
- {
- ++__first;
- if (__first == __last)
- __throw_regex_error<regex_constants::error_paren>();
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last && *__first == '?' && *__temp == ':')
- {
- ++__open_count_;
- __first = __parse_ecma_exp(++__temp, __last);
- if (__first == __last || *__first != ')')
- __throw_regex_error<regex_constants::error_paren>();
- --__open_count_;
- ++__first;
- }
- else
- {
- __push_begin_marked_subexpression();
- unsigned __temp_count = __marked_count_;
- ++__open_count_;
- __first = __parse_ecma_exp(__first, __last);
- if (__first == __last || *__first != ')')
- __throw_regex_error<regex_constants::error_paren>();
- __push_end_marked_subexpression(__temp_count);
- --__open_count_;
- ++__first;
- }
- }
- break;
- case '*':
- case '+':
- case '?':
- case '{':
- __throw_regex_error<regex_constants::error_badrepeat>();
- break;
- default:
- __first = __parse_pattern_character(__first, __last);
- break;
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last && *__first == '\\')
- {
- _ForwardIterator __t1 = _VSTD::next(__first);
- if (__t1 == __last)
- __throw_regex_error<regex_constants::error_escape>();
-
- _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
- if (__t2 != __t1)
- __first = __t2;
- else
- {
- __t2 = __parse_character_class_escape(__t1, __last);
- if (__t2 != __t1)
- __first = __t2;
- else
- {
- __t2 = __parse_character_escape(__t1, __last);
- if (__t2 != __t1)
- __first = __t2;
- }
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last)
- {
- if (*__first == '0')
- {
- __push_char(_CharT());
- ++__first;
- }
- else if ('1' <= *__first && *__first <= '9')
- {
- unsigned __v = *__first - '0';
- for (++__first;
- __first != __last && '0' <= *__first && *__first <= '9'; ++__first)
- {
- if (__v >= std::numeric_limits<unsigned>::max() / 10)
- __throw_regex_error<regex_constants::error_backref>();
- __v = 10 * __v + *__first - '0';
- }
- if (__v == 0 || __v > mark_count())
- __throw_regex_error<regex_constants::error_backref>();
- __push_back_ref(__v);
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last)
- {
- __bracket_expression<_CharT, _Traits>* __ml;
- switch (*__first)
- {
- case 'd':
- __ml = __start_matching_list(false);
- __ml->__add_class(ctype_base::digit);
- ++__first;
- break;
- case 'D':
- __ml = __start_matching_list(true);
- __ml->__add_class(ctype_base::digit);
- ++__first;
- break;
- case 's':
- __ml = __start_matching_list(false);
- __ml->__add_class(ctype_base::space);
- ++__first;
- break;
- case 'S':
- __ml = __start_matching_list(true);
- __ml->__add_class(ctype_base::space);
- ++__first;
- break;
- case 'w':
- __ml = __start_matching_list(false);
- __ml->__add_class(ctype_base::alnum);
- __ml->__add_char('_');
- ++__first;
- break;
- case 'W':
- __ml = __start_matching_list(true);
- __ml->__add_class(ctype_base::alnum);
- __ml->__add_char('_');
- ++__first;
- break;
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
- _ForwardIterator __last,
- basic_string<_CharT>* __str)
-{
- if (__first != __last)
- {
- _ForwardIterator __t;
- unsigned __sum = 0;
- int __hd;
- switch (*__first)
- {
- case 'f':
- if (__str)
- *__str = _CharT(0xC);
- else
- __push_char(_CharT(0xC));
- ++__first;
- break;
- case 'n':
- if (__str)
- *__str = _CharT(0xA);
- else
- __push_char(_CharT(0xA));
- ++__first;
- break;
- case 'r':
- if (__str)
- *__str = _CharT(0xD);
- else
- __push_char(_CharT(0xD));
- ++__first;
- break;
- case 't':
- if (__str)
- *__str = _CharT(0x9);
- else
- __push_char(_CharT(0x9));
- ++__first;
- break;
- case 'v':
- if (__str)
- *__str = _CharT(0xB);
- else
- __push_char(_CharT(0xB));
- ++__first;
- break;
- case 'c':
- if ((__t = _VSTD::next(__first)) != __last)
- {
- if (('A' <= *__t && *__t <= 'Z') ||
- ('a' <= *__t && *__t <= 'z'))
- {
- if (__str)
- *__str = _CharT(*__t % 32);
- else
- __push_char(_CharT(*__t % 32));
- __first = ++__t;
- }
- else
- __throw_regex_error<regex_constants::error_escape>();
- }
- else
- __throw_regex_error<regex_constants::error_escape>();
- break;
- case 'u':
- ++__first;
- if (__first == __last)
- __throw_regex_error<regex_constants::error_escape>();
- __hd = __traits_.value(*__first, 16);
- if (__hd == -1)
- __throw_regex_error<regex_constants::error_escape>();
- __sum = 16 * __sum + static_cast<unsigned>(__hd);
- ++__first;
- if (__first == __last)
- __throw_regex_error<regex_constants::error_escape>();
- __hd = __traits_.value(*__first, 16);
- if (__hd == -1)
- __throw_regex_error<regex_constants::error_escape>();
- __sum = 16 * __sum + static_cast<unsigned>(__hd);
- // drop through
- case 'x':
- ++__first;
- if (__first == __last)
- __throw_regex_error<regex_constants::error_escape>();
- __hd = __traits_.value(*__first, 16);
- if (__hd == -1)
- __throw_regex_error<regex_constants::error_escape>();
- __sum = 16 * __sum + static_cast<unsigned>(__hd);
- ++__first;
- if (__first == __last)
- __throw_regex_error<regex_constants::error_escape>();
- __hd = __traits_.value(*__first, 16);
- if (__hd == -1)
- __throw_regex_error<regex_constants::error_escape>();
- __sum = 16 * __sum + static_cast<unsigned>(__hd);
- if (__str)
- *__str = _CharT(__sum);
- else
- __push_char(_CharT(__sum));
- ++__first;
- break;
- case '0':
- if (__str)
- *__str = _CharT(0);
- else
- __push_char(_CharT(0));
- ++__first;
- break;
- default:
- if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum))
- {
- if (__str)
- *__str = *__first;
- else
- __push_char(*__first);
- ++__first;
- }
- else
- __throw_regex_error<regex_constants::error_escape>();
- break;
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- if (__first != __last)
- {
- switch (*__first)
- {
- case '^':
- case '$':
- case '\\':
- case '.':
- case '*':
- case '+':
- case '?':
- case '(':
- case ')':
- case '[':
- case ']':
- case '{':
- case '}':
- case '|':
- break;
- default:
- __push_char(*__first);
- ++__first;
- break;
- }
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- __owns_one_state<_CharT>* __sa = __end_;
- _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
- if (__t1 != __first)
- __parse_basic_reg_exp(__first, __t1);
- else
- __push_empty();
- __first = __t1;
- if (__first != __last)
- ++__first;
- while (__first != __last)
- {
- __t1 = _VSTD::find(__first, __last, _CharT('\n'));
- __owns_one_state<_CharT>* __sb = __end_;
- if (__t1 != __first)
- __parse_basic_reg_exp(__first, __t1);
- else
- __push_empty();
- __push_alternation(__sa, __sb);
- __first = __t1;
- if (__first != __last)
- ++__first;
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-template <class _ForwardIterator>
-_ForwardIterator
-basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first,
- _ForwardIterator __last)
-{
- __owns_one_state<_CharT>* __sa = __end_;
- _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
- if (__t1 != __first)
- __parse_extended_reg_exp(__first, __t1);
- else
- __push_empty();
- __first = __t1;
- if (__first != __last)
- ++__first;
- while (__first != __last)
- {
- __t1 = _VSTD::find(__first, __last, _CharT('\n'));
- __owns_one_state<_CharT>* __sb = __end_;
- if (__t1 != __first)
- __parse_extended_reg_exp(__first, __t1);
- else
- __push_empty();
- __push_alternation(__sa, __sb);
- __first = __t1;
- if (__first != __last)
- ++__first;
- }
- return __first;
-}
-
-template <class _CharT, class _Traits>
-void
-basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max,
- __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end,
- bool __greedy)
-{
- unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
- __end_->first() = nullptr;
- unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_,
- __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy,
- __min, __max));
- __s->first() = nullptr;
- __e1.release();
- __end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
- __end_ = __e2->second();
- __s->first() = __e2.release();
- ++__loop_count_;
-}
-
-template <class _CharT, class _Traits>
-void
-basic_regex<_CharT, _Traits>::__push_char(value_type __c)
-{
- if (flags() & icase)
- __end_->first() = new __match_char_icase<_CharT, _Traits>
- (__traits_, __c, __end_->first());
- else if (flags() & collate)
- __end_->first() = new __match_char_collate<_CharT, _Traits>
- (__traits_, __c, __end_->first());
- else
- __end_->first() = new __match_char<_CharT>(__c, __end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
-}
-
-template <class _CharT, class _Traits>
-void
-basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression()
-{
- if (!(__flags_ & nosubs))
- {
- __end_->first() =
- new __begin_marked_subexpression<_CharT>(++__marked_count_,
- __end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
- }
-}
-
-template <class _CharT, class _Traits>
-void
-basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub)
-{
- if (!(__flags_ & nosubs))
- {
- __end_->first() =
- new __end_marked_subexpression<_CharT>(__sub, __end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
- }
-}
-
-template <class _CharT, class _Traits>
-void
-basic_regex<_CharT, _Traits>::__push_l_anchor()
-{
- __end_->first() = new __l_anchor<_CharT>(__end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
-}
-
-template <class _CharT, class _Traits>
-void
-basic_regex<_CharT, _Traits>::__push_r_anchor()
-{
- __end_->first() = new __r_anchor<_CharT>(__end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
-}
-
-template <class _CharT, class _Traits>
-void
-basic_regex<_CharT, _Traits>::__push_match_any()
-{
- __end_->first() = new __match_any<_CharT>(__end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
-}
-
-template <class _CharT, class _Traits>
-void
-basic_regex<_CharT, _Traits>::__push_match_any_but_newline()
-{
- __end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
-}
-
-template <class _CharT, class _Traits>
-void
-basic_regex<_CharT, _Traits>::__push_empty()
-{
- __end_->first() = new __empty_state<_CharT>(__end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
-}
-
-template <class _CharT, class _Traits>
-void
-basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert)
-{
- __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert,
- __end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
-}
-
-template <class _CharT, class _Traits>
-void
-basic_regex<_CharT, _Traits>::__push_back_ref(int __i)
-{
- if (flags() & icase)
- __end_->first() = new __back_ref_icase<_CharT, _Traits>
- (__traits_, __i, __end_->first());
- else if (flags() & collate)
- __end_->first() = new __back_ref_collate<_CharT, _Traits>
- (__traits_, __i, __end_->first());
- else
- __end_->first() = new __back_ref<_CharT>(__i, __end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
-}
-
-template <class _CharT, class _Traits>
-void
-basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa,
- __owns_one_state<_CharT>* __ea)
-{
- __sa->first() = new __alternate<_CharT>(
- static_cast<__owns_one_state<_CharT>*>(__sa->first()),
- static_cast<__owns_one_state<_CharT>*>(__ea->first()));
- __ea->first() = nullptr;
- __ea->first() = new __empty_state<_CharT>(__end_->first());
- __end_->first() = nullptr;
- __end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first());
-}
-
-template <class _CharT, class _Traits>
-__bracket_expression<_CharT, _Traits>*
-basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
-{
- __bracket_expression<_CharT, _Traits>* __r =
- new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(),
- __negate, __flags_ & icase,
- __flags_ & collate);
- __end_->first() = __r;
- __end_ = __r;
- return __r;
-}
-
-template <class _CharT, class _Traits>
-void
-basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
- bool __invert,
- unsigned __mexp)
-{
- __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
- __end_->first(), __mexp);
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
-}
-
-typedef basic_regex<char> regex;
-typedef basic_regex<wchar_t> wregex;
-
-// sub_match
-
-template <class _BidirectionalIterator>
-class _LIBCPP_TEMPLATE_VIS sub_match
- : public pair<_BidirectionalIterator, _BidirectionalIterator>
-{
-public:
- typedef _BidirectionalIterator iterator;
- typedef typename iterator_traits<iterator>::value_type value_type;
- typedef typename iterator_traits<iterator>::difference_type difference_type;
- typedef basic_string<value_type> string_type;
-
- bool matched;
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR sub_match() : matched() {}
-
- _LIBCPP_INLINE_VISIBILITY
- difference_type length() const
- {return matched ? _VSTD::distance(this->first, this->second) : 0;}
- _LIBCPP_INLINE_VISIBILITY
- string_type str() const
- {return matched ? string_type(this->first, this->second) : string_type();}
- _LIBCPP_INLINE_VISIBILITY
- operator string_type() const
- {return str();}
-
- _LIBCPP_INLINE_VISIBILITY
- int compare(const sub_match& __s) const
- {return str().compare(__s.str());}
- _LIBCPP_INLINE_VISIBILITY
- int compare(const string_type& __s) const
- {return str().compare(__s);}
- _LIBCPP_INLINE_VISIBILITY
- int compare(const value_type* __s) const
- {return str().compare(__s);}
-};
-
-typedef sub_match<const char*> csub_match;
-typedef sub_match<const wchar_t*> wcsub_match;
-typedef sub_match<string::const_iterator> ssub_match;
-typedef sub_match<wstring::const_iterator> wssub_match;
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
-{
- return __x.compare(__y) == 0;
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
-{
- return __x.compare(__y) < 0;
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
-{
- return !(__y < __x);
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
-{
- return !(__x < __y);
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
-{
- return __y < __x;
-}
-
-template <class _BiIter, class _ST, class _SA>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
- const sub_match<_BiIter>& __y)
-{
- return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) == 0;
-}
-
-template <class _BiIter, class _ST, class _SA>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
- const sub_match<_BiIter>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _BiIter, class _ST, class _SA>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
- const sub_match<_BiIter>& __y)
-{
- return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) > 0;
-}
-
-template <class _BiIter, class _ST, class _SA>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
- const sub_match<_BiIter>& __y)
-{
- return __y < __x;
-}
-
-template <class _BiIter, class _ST, class _SA>
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
- const sub_match<_BiIter>& __y)
-{
- return !(__x < __y);
-}
-
-template <class _BiIter, class _ST, class _SA>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
- const sub_match<_BiIter>& __y)
-{
- return !(__y < __x);
-}
-
-template <class _BiIter, class _ST, class _SA>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const sub_match<_BiIter>& __x,
- const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
-{
- return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) == 0;
-}
-
-template <class _BiIter, class _ST, class _SA>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const sub_match<_BiIter>& __x,
- const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _BiIter, class _ST, class _SA>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<(const sub_match<_BiIter>& __x,
- const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
-{
- return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) < 0;
-}
-
-template <class _BiIter, class _ST, class _SA>
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator>(const sub_match<_BiIter>& __x,
- const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
-{
- return __y < __x;
-}
-
-template <class _BiIter, class _ST, class _SA>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const sub_match<_BiIter>& __x,
- const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
-{
- return !(__x < __y);
-}
-
-template <class _BiIter, class _ST, class _SA>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const sub_match<_BiIter>& __x,
- const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
-{
- return !(__y < __x);
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(typename iterator_traits<_BiIter>::value_type const* __x,
- const sub_match<_BiIter>& __y)
-{
- return __y.compare(__x) == 0;
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(typename iterator_traits<_BiIter>::value_type const* __x,
- const sub_match<_BiIter>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<(typename iterator_traits<_BiIter>::value_type const* __x,
- const sub_match<_BiIter>& __y)
-{
- return __y.compare(__x) > 0;
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>(typename iterator_traits<_BiIter>::value_type const* __x,
- const sub_match<_BiIter>& __y)
-{
- return __y < __x;
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(typename iterator_traits<_BiIter>::value_type const* __x,
- const sub_match<_BiIter>& __y)
-{
- return !(__x < __y);
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(typename iterator_traits<_BiIter>::value_type const* __x,
- const sub_match<_BiIter>& __y)
-{
- return !(__y < __x);
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const* __y)
-{
- return __x.compare(__y) == 0;
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const* __y)
-{
- return !(__x == __y);
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const* __y)
-{
- return __x.compare(__y) < 0;
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const* __y)
-{
- return __y < __x;
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const* __y)
-{
- return !(__x < __y);
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const* __y)
-{
- return !(__y < __x);
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(typename iterator_traits<_BiIter>::value_type const& __x,
- const sub_match<_BiIter>& __y)
-{
- typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
- return __y.compare(string_type(1, __x)) == 0;
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(typename iterator_traits<_BiIter>::value_type const& __x,
- const sub_match<_BiIter>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<(typename iterator_traits<_BiIter>::value_type const& __x,
- const sub_match<_BiIter>& __y)
-{
- typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
- return __y.compare(string_type(1, __x)) > 0;
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>(typename iterator_traits<_BiIter>::value_type const& __x,
- const sub_match<_BiIter>& __y)
-{
- return __y < __x;
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(typename iterator_traits<_BiIter>::value_type const& __x,
- const sub_match<_BiIter>& __y)
-{
- return !(__x < __y);
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(typename iterator_traits<_BiIter>::value_type const& __x,
- const sub_match<_BiIter>& __y)
-{
- return !(__y < __x);
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const& __y)
-{
- typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
- return __x.compare(string_type(1, __y)) == 0;
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const& __y)
-{
- return !(__x == __y);
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const& __y)
-{
- typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
- return __x.compare(string_type(1, __y)) < 0;
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const& __y)
-{
- return __y < __x;
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const& __y)
-{
- return !(__x < __y);
-}
-
-template <class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const& __y)
-{
- return !(__y < __x);
-}
-
-template <class _CharT, class _ST, class _BiIter>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_ostream<_CharT, _ST>&
-operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
-{
- return __os << __m.str();
-}
-
-template <class _BidirectionalIterator, class _Allocator>
-class _LIBCPP_TEMPLATE_VIS match_results
-{
-public:
- typedef _Allocator allocator_type;
- typedef sub_match<_BidirectionalIterator> value_type;
-private:
- typedef vector<value_type, allocator_type> __container_type;
-
- __container_type __matches_;
- value_type __unmatched_;
- value_type __prefix_;
- value_type __suffix_;
- bool __ready_;
-public:
- _BidirectionalIterator __position_start_;
- typedef const value_type& const_reference;
- typedef value_type& reference;
- typedef typename __container_type::const_iterator const_iterator;
- typedef const_iterator iterator;
- typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
- typedef typename allocator_traits<allocator_type>::size_type size_type;
- typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
- typedef basic_string<char_type> string_type;
-
- // construct/copy/destroy:
- explicit match_results(const allocator_type& __a = allocator_type());
-// match_results(const match_results&) = default;
-// match_results& operator=(const match_results&) = default;
-// match_results(match_results&& __m) = default;
-// match_results& operator=(match_results&& __m) = default;
-// ~match_results() = default;
-
- _LIBCPP_INLINE_VISIBILITY
- bool ready() const {return __ready_;}
-
- // size:
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT {return __matches_.size();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const _NOEXCEPT {return __matches_.max_size();}
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const _NOEXCEPT {return size() == 0;}
-
- // element access:
- _LIBCPP_INLINE_VISIBILITY
- difference_type length(size_type __sub = 0) const
- {return (*this)[__sub].length();}
- _LIBCPP_INLINE_VISIBILITY
- difference_type position(size_type __sub = 0) const
- {return _VSTD::distance(__position_start_, (*this)[__sub].first);}
- _LIBCPP_INLINE_VISIBILITY
- string_type str(size_type __sub = 0) const
- {return (*this)[__sub].str();}
- _LIBCPP_INLINE_VISIBILITY
- const_reference operator[](size_type __n) const
- {return __n < __matches_.size() ? __matches_[__n] : __unmatched_;}
-
- _LIBCPP_INLINE_VISIBILITY
- const_reference prefix() const {return __prefix_;}
- _LIBCPP_INLINE_VISIBILITY
- const_reference suffix() const {return __suffix_;}
-
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const {return __matches_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const {return __matches_.end();}
-
- // format:
- template <class _OutputIter>
- _OutputIter
- format(_OutputIter __output_iter, const char_type* __fmt_first,
- const char_type* __fmt_last,
- regex_constants::match_flag_type __flags = regex_constants::format_default) const;
- template <class _OutputIter, class _ST, class _SA>
- _LIBCPP_INLINE_VISIBILITY
- _OutputIter
- format(_OutputIter __output_iter, const basic_string<char_type, _ST, _SA>& __fmt,
- regex_constants::match_flag_type __flags = regex_constants::format_default) const
- {return format(__output_iter, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
- template <class _ST, class _SA>
- _LIBCPP_INLINE_VISIBILITY
- basic_string<char_type, _ST, _SA>
- format(const basic_string<char_type, _ST, _SA>& __fmt,
- regex_constants::match_flag_type __flags = regex_constants::format_default) const
- {
- basic_string<char_type, _ST, _SA> __r;
- format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
- __flags);
- return __r;
- }
- _LIBCPP_INLINE_VISIBILITY
- string_type
- format(const char_type* __fmt,
- regex_constants::match_flag_type __flags = regex_constants::format_default) const
- {
- string_type __r;
- format(back_inserter(__r), __fmt,
- __fmt + char_traits<char_type>::length(__fmt), __flags);
- return __r;
- }
-
- // allocator:
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const {return __matches_.get_allocator();}
-
- // swap:
- void swap(match_results& __m);
-
- template <class _Bp, class _Ap>
- _LIBCPP_INLINE_VISIBILITY
- void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
- const match_results<_Bp, _Ap>& __m, bool __no_update_pos)
- {
- _Bp __mf = __m.prefix().first;
- __matches_.resize(__m.size());
- for (size_type __i = 0; __i < __matches_.size(); ++__i)
- {
- __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
- __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
- __matches_[__i].matched = __m[__i].matched;
- }
- __unmatched_.first = __l;
- __unmatched_.second = __l;
- __unmatched_.matched = false;
- __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
- __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
- __prefix_.matched = __m.prefix().matched;
- __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
- __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
- __suffix_.matched = __m.suffix().matched;
- if (!__no_update_pos)
- __position_start_ = __prefix_.first;
- __ready_ = __m.ready();
- }
-
-private:
- void __init(unsigned __s,
- _BidirectionalIterator __f, _BidirectionalIterator __l,
- bool __no_update_pos = false);
-
- template <class, class> friend class basic_regex;
-
- template <class _Bp, class _Ap, class _Cp, class _Tp>
- friend
- bool
- regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
- regex_constants::match_flag_type);
-
- template <class _Bp, class _Ap>
- friend
- bool
- operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&);
-
- template <class, class> friend class __lookahead;
-};
-
-template <class _BidirectionalIterator, class _Allocator>
-match_results<_BidirectionalIterator, _Allocator>::match_results(
- const allocator_type& __a)
- : __matches_(__a),
- __unmatched_(),
- __prefix_(),
- __suffix_(),
- __ready_(false),
- __position_start_()
-{
-}
-
-template <class _BidirectionalIterator, class _Allocator>
-void
-match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
- _BidirectionalIterator __f, _BidirectionalIterator __l,
- bool __no_update_pos)
-{
- __unmatched_.first = __l;
- __unmatched_.second = __l;
- __unmatched_.matched = false;
- __matches_.assign(__s, __unmatched_);
- __prefix_.first = __f;
- __prefix_.second = __f;
- __prefix_.matched = false;
- __suffix_ = __unmatched_;
- if (!__no_update_pos)
- __position_start_ = __prefix_.first;
- __ready_ = true;
-}
-
-template <class _BidirectionalIterator, class _Allocator>
-template <class _OutputIter>
-_OutputIter
-match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __output_iter,
- const char_type* __fmt_first, const char_type* __fmt_last,
- regex_constants::match_flag_type __flags) const
-{
- if (__flags & regex_constants::format_sed)
- {
- for (; __fmt_first != __fmt_last; ++__fmt_first)
- {
- if (*__fmt_first == '&')
- __output_iter = _VSTD::copy(__matches_[0].first, __matches_[0].second,
- __output_iter);
- else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
- {
- ++__fmt_first;
- if ('0' <= *__fmt_first && *__fmt_first <= '9')
- {
- size_t __i = *__fmt_first - '0';
- __output_iter = _VSTD::copy((*this)[__i].first,
- (*this)[__i].second, __output_iter);
- }
- else
- {
- *__output_iter = *__fmt_first;
- ++__output_iter;
- }
- }
- else
- {
- *__output_iter = *__fmt_first;
- ++__output_iter;
- }
- }
- }
- else
- {
- for (; __fmt_first != __fmt_last; ++__fmt_first)
- {
- if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
- {
- switch (__fmt_first[1])
- {
- case '$':
- *__output_iter = *++__fmt_first;
- ++__output_iter;
- break;
- case '&':
- ++__fmt_first;
- __output_iter = _VSTD::copy(__matches_[0].first, __matches_[0].second,
- __output_iter);
- break;
- case '`':
- ++__fmt_first;
- __output_iter = _VSTD::copy(__prefix_.first, __prefix_.second, __output_iter);
- break;
- case '\'':
- ++__fmt_first;
- __output_iter = _VSTD::copy(__suffix_.first, __suffix_.second, __output_iter);
- break;
- default:
- if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
- {
- ++__fmt_first;
- size_t __idx = *__fmt_first - '0';
- if (__fmt_first + 1 != __fmt_last &&
- '0' <= __fmt_first[1] && __fmt_first[1] <= '9')
- {
- ++__fmt_first;
- if (__idx >= std::numeric_limits<size_t>::max() / 10)
- __throw_regex_error<regex_constants::error_escape>();
- __idx = 10 * __idx + *__fmt_first - '0';
- }
- __output_iter = _VSTD::copy((*this)[__idx].first,
- (*this)[__idx].second, __output_iter);
- }
- else
- {
- *__output_iter = *__fmt_first;
- ++__output_iter;
- }
- break;
- }
- }
- else
- {
- *__output_iter = *__fmt_first;
- ++__output_iter;
- }
- }
- }
- return __output_iter;
-}
-
-template <class _BidirectionalIterator, class _Allocator>
-void
-match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
-{
- using _VSTD::swap;
- swap(__matches_, __m.__matches_);
- swap(__unmatched_, __m.__unmatched_);
- swap(__prefix_, __m.__prefix_);
- swap(__suffix_, __m.__suffix_);
- swap(__position_start_, __m.__position_start_);
- swap(__ready_, __m.__ready_);
-}
-
-typedef match_results<const char*> cmatch;
-typedef match_results<const wchar_t*> wcmatch;
-typedef match_results<string::const_iterator> smatch;
-typedef match_results<wstring::const_iterator> wsmatch;
-
-template <class _BidirectionalIterator, class _Allocator>
-bool
-operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
- const match_results<_BidirectionalIterator, _Allocator>& __y)
-{
- if (__x.__ready_ != __y.__ready_)
- return false;
- if (!__x.__ready_)
- return true;
- return __x.__matches_ == __y.__matches_ &&
- __x.__prefix_ == __y.__prefix_ &&
- __x.__suffix_ == __y.__suffix_;
-}
-
-template <class _BidirectionalIterator, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
- const match_results<_BidirectionalIterator, _Allocator>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _BidirectionalIterator, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(match_results<_BidirectionalIterator, _Allocator>& __x,
- match_results<_BidirectionalIterator, _Allocator>& __y)
-{
- __x.swap(__y);
-}
-
-// regex_search
-
-template <class _CharT, class _Traits>
-template <class _Allocator>
-bool
-basic_regex<_CharT, _Traits>::__match_at_start_ecma(
- const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags, bool __at_first) const
-{
- vector<__state> __states;
- __node* __st = __start_.get();
- if (__st)
- {
- sub_match<const _CharT*> __unmatched;
- __unmatched.first = __last;
- __unmatched.second = __last;
- __unmatched.matched = false;
-
- __states.push_back(__state());
- __states.back().__do_ = 0;
- __states.back().__first_ = __first;
- __states.back().__current_ = __first;
- __states.back().__last_ = __last;
- __states.back().__sub_matches_.resize(mark_count(), __unmatched);
- __states.back().__loop_data_.resize(__loop_count());
- __states.back().__node_ = __st;
- __states.back().__flags_ = __flags;
- __states.back().__at_first_ = __at_first;
- int __counter = 0;
- int __length = __last - __first;
- do
- {
- ++__counter;
- if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
- __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
- __throw_regex_error<regex_constants::error_complexity>();
- __state& __s = __states.back();
- if (__s.__node_)
- __s.__node_->__exec(__s);
- switch (__s.__do_)
- {
- case __state::__end_state:
- if ((__flags & regex_constants::match_not_null) &&
- __s.__current_ == __first)
- {
- __states.pop_back();
- break;
- }
- if ((__flags & regex_constants::__full_match) &&
- __s.__current_ != __last)
- {
- __states.pop_back();
- break;
- }
- __m.__matches_[0].first = __first;
- __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
- __m.__matches_[0].matched = true;
- for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
- __m.__matches_[__i+1] = __s.__sub_matches_[__i];
- return true;
- case __state::__accept_and_consume:
- case __state::__repeat:
- case __state::__accept_but_not_consume:
- break;
- case __state::__split:
- {
- __state __snext = __s;
- __s.__node_->__exec_split(true, __s);
- __snext.__node_->__exec_split(false, __snext);
- __states.push_back(_VSTD::move(__snext));
- }
- break;
- case __state::__reject:
- __states.pop_back();
- break;
- default:
- __throw_regex_error<regex_constants::__re_err_unknown>();
- break;
-
- }
- } while (!__states.empty());
- }
- return false;
-}
-
-template <class _CharT, class _Traits>
-template <class _Allocator>
-bool
-basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
- const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags, bool __at_first) const
-{
- deque<__state> __states;
- ptrdiff_t __highest_j = 0;
- ptrdiff_t _Np = _VSTD::distance(__first, __last);
- __node* __st = __start_.get();
- if (__st)
- {
- __states.push_back(__state());
- __states.back().__do_ = 0;
- __states.back().__first_ = __first;
- __states.back().__current_ = __first;
- __states.back().__last_ = __last;
- __states.back().__loop_data_.resize(__loop_count());
- __states.back().__node_ = __st;
- __states.back().__flags_ = __flags;
- __states.back().__at_first_ = __at_first;
- bool __matched = false;
- int __counter = 0;
- int __length = __last - __first;
- do
- {
- ++__counter;
- if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
- __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
- __throw_regex_error<regex_constants::error_complexity>();
- __state& __s = __states.back();
- if (__s.__node_)
- __s.__node_->__exec(__s);
- switch (__s.__do_)
- {
- case __state::__end_state:
- if ((__flags & regex_constants::match_not_null) &&
- __s.__current_ == __first)
- {
- __states.pop_back();
- break;
- }
- if ((__flags & regex_constants::__full_match) &&
- __s.__current_ != __last)
- {
- __states.pop_back();
- break;
- }
- if (!__matched || __highest_j < __s.__current_ - __s.__first_)
- __highest_j = __s.__current_ - __s.__first_;
- __matched = true;
- if (__highest_j == _Np)
- __states.clear();
- else
- __states.pop_back();
- break;
- case __state::__consume_input:
- break;
- case __state::__accept_and_consume:
- __states.push_front(_VSTD::move(__s));
- __states.pop_back();
- break;
- case __state::__repeat:
- case __state::__accept_but_not_consume:
- break;
- case __state::__split:
- {
- __state __snext = __s;
- __s.__node_->__exec_split(true, __s);
- __snext.__node_->__exec_split(false, __snext);
- __states.push_back(_VSTD::move(__snext));
- }
- break;
- case __state::__reject:
- __states.pop_back();
- break;
- default:
- __throw_regex_error<regex_constants::__re_err_unknown>();
- break;
- }
- } while (!__states.empty());
- if (__matched)
- {
- __m.__matches_[0].first = __first;
- __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
- __m.__matches_[0].matched = true;
- return true;
- }
- }
- return false;
-}
-
-template <class _CharT, class _Traits>
-template <class _Allocator>
-bool
-basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
- const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags, bool __at_first) const
-{
- vector<__state> __states;
- __state __best_state;
- ptrdiff_t __j = 0;
- ptrdiff_t __highest_j = 0;
- ptrdiff_t _Np = _VSTD::distance(__first, __last);
- __node* __st = __start_.get();
- if (__st)
- {
- sub_match<const _CharT*> __unmatched;
- __unmatched.first = __last;
- __unmatched.second = __last;
- __unmatched.matched = false;
-
- __states.push_back(__state());
- __states.back().__do_ = 0;
- __states.back().__first_ = __first;
- __states.back().__current_ = __first;
- __states.back().__last_ = __last;
- __states.back().__sub_matches_.resize(mark_count(), __unmatched);
- __states.back().__loop_data_.resize(__loop_count());
- __states.back().__node_ = __st;
- __states.back().__flags_ = __flags;
- __states.back().__at_first_ = __at_first;
- const _CharT* __current = __first;
- bool __matched = false;
- int __counter = 0;
- int __length = __last - __first;
- do
- {
- ++__counter;
- if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
- __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
- __throw_regex_error<regex_constants::error_complexity>();
- __state& __s = __states.back();
- if (__s.__node_)
- __s.__node_->__exec(__s);
- switch (__s.__do_)
- {
- case __state::__end_state:
- if ((__flags & regex_constants::match_not_null) &&
- __s.__current_ == __first)
- {
- __states.pop_back();
- break;
- }
- if ((__flags & regex_constants::__full_match) &&
- __s.__current_ != __last)
- {
- __states.pop_back();
- break;
- }
- if (!__matched || __highest_j < __s.__current_ - __s.__first_)
- {
- __highest_j = __s.__current_ - __s.__first_;
- __best_state = __s;
- }
- __matched = true;
- if (__highest_j == _Np)
- __states.clear();
- else
- __states.pop_back();
- break;
- case __state::__accept_and_consume:
- __j += __s.__current_ - __current;
- __current = __s.__current_;
- break;
- case __state::__repeat:
- case __state::__accept_but_not_consume:
- break;
- case __state::__split:
- {
- __state __snext = __s;
- __s.__node_->__exec_split(true, __s);
- __snext.__node_->__exec_split(false, __snext);
- __states.push_back(_VSTD::move(__snext));
- }
- break;
- case __state::__reject:
- __states.pop_back();
- break;
- default:
- __throw_regex_error<regex_constants::__re_err_unknown>();
- break;
- }
- } while (!__states.empty());
- if (__matched)
- {
- __m.__matches_[0].first = __first;
- __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
- __m.__matches_[0].matched = true;
- for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
- __m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
- return true;
- }
- }
- return false;
-}
-
-template <class _CharT, class _Traits>
-template <class _Allocator>
-bool
-basic_regex<_CharT, _Traits>::__match_at_start(
- const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags, bool __at_first) const
-{
- if ((__flags_ & 0x1F0) == ECMAScript)
- return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
- if (mark_count() == 0)
- return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
- return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
-}
-
-template <class _CharT, class _Traits>
-template <class _Allocator>
-bool
-basic_regex<_CharT, _Traits>::__search(
- const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags) const
-{
- __m.__init(1 + mark_count(), __first, __last,
- __flags & regex_constants::__no_update_pos);
- if (__match_at_start(__first, __last, __m, __flags,
- !(__flags & regex_constants::__no_update_pos)))
- {
- __m.__prefix_.second = __m[0].first;
- __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
- __m.__suffix_.first = __m[0].second;
- __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
- return true;
- }
- if (__first != __last && !(__flags & regex_constants::match_continuous))
- {
- __flags |= regex_constants::match_prev_avail;
- for (++__first; __first != __last; ++__first)
- {
- __m.__matches_.assign(__m.size(), __m.__unmatched_);
- if (__match_at_start(__first, __last, __m, __flags, false))
- {
- __m.__prefix_.second = __m[0].first;
- __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
- __m.__suffix_.first = __m[0].second;
- __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
- return true;
- }
- __m.__matches_.assign(__m.size(), __m.__unmatched_);
- }
- }
- __m.__matches_.clear();
- return false;
-}
-
-template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
- match_results<_BidirectionalIterator, _Allocator>& __m,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0;
- basic_string<_CharT> __s(_VSTD::prev(__first, __offset), __last);
- match_results<const _CharT*> __mc;
- bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags);
- __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
- return __r;
-}
-
-template <class _Iter, class _Allocator, class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-regex_search(__wrap_iter<_Iter> __first,
- __wrap_iter<_Iter> __last,
- match_results<__wrap_iter<_Iter>, _Allocator>& __m,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- match_results<const _CharT*> __mc;
- bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
- __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
- return __r;
-}
-
-template <class _Allocator, class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-regex_search(const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- return __e.__search(__first, __last, __m, __flags);
-}
-
-template <class _BidirectionalIterator, class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- basic_string<_CharT> __s(__first, __last);
- match_results<const _CharT*> __mc;
- return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-regex_search(const _CharT* __first, const _CharT* __last,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- match_results<const _CharT*> __mc;
- return __e.__search(__first, __last, __mc, __flags);
-}
-
-template <class _CharT, class _Allocator, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
-}
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- match_results<const _CharT*> __m;
- return _VSTD::regex_search(__str, __m, __e, __flags);
-}
-
-template <class _ST, class _SA, class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-regex_search(const basic_string<_CharT, _ST, _SA>& __s,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- match_results<const _CharT*> __mc;
- return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
-}
-
-template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-regex_search(const basic_string<_CharT, _ST, _SA>& __s,
- match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- match_results<const _CharT*> __mc;
- bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
- __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
- return __r;
-}
-
-#if _LIBCPP_STD_VER > 11
-template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
-bool
-regex_search(const basic_string<_Cp, _ST, _SA>&& __s,
- match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
- const basic_regex<_Cp, _Tp>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
-#endif
-
-// regex_match
-
-template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
-bool
-regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
- match_results<_BidirectionalIterator, _Allocator>& __m,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- bool __r = _VSTD::regex_search(
- __first, __last, __m, __e,
- __flags | regex_constants::match_continuous |
- regex_constants::__full_match);
- if (__r)
- {
- __r = !__m.suffix().matched;
- if (!__r)
- __m.__matches_.clear();
- }
- return __r;
-}
-
-template <class _BidirectionalIterator, class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- match_results<_BidirectionalIterator> __m;
- return _VSTD::regex_match(__first, __last, __m, __e, __flags);
-}
-
-template <class _CharT, class _Allocator, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
-}
-
-template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-regex_match(const basic_string<_CharT, _ST, _SA>& __s,
- match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
-}
-
-#if _LIBCPP_STD_VER > 11
-template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-regex_match(const basic_string<_CharT, _ST, _SA>&& __s,
- match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
-#endif
-
-template <class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
-}
-
-template <class _ST, class _SA, class _CharT, class _Traits>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-regex_match(const basic_string<_CharT, _ST, _SA>& __s,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
-}
-
-// regex_iterator
-
-template <class _BidirectionalIterator,
- class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
- class _Traits = regex_traits<_CharT> >
-class _LIBCPP_TEMPLATE_VIS regex_iterator
-{
-public:
- typedef basic_regex<_CharT, _Traits> regex_type;
- typedef match_results<_BidirectionalIterator> value_type;
- typedef ptrdiff_t difference_type;
- typedef const value_type* pointer;
- typedef const value_type& reference;
- typedef forward_iterator_tag iterator_category;
-
-private:
- _BidirectionalIterator __begin_;
- _BidirectionalIterator __end_;
- const regex_type* __pregex_;
- regex_constants::match_flag_type __flags_;
- value_type __match_;
-
-public:
- regex_iterator();
- regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re,
- regex_constants::match_flag_type __m
- = regex_constants::match_default);
-#if _LIBCPP_STD_VER > 11
- regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type&& __re,
- regex_constants::match_flag_type __m
- = regex_constants::match_default) = delete;
-#endif
-
- bool operator==(const regex_iterator& __x) const;
- _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const regex_iterator& __x) const {return !(*this == __x);}
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {return __match_;}
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return &__match_;}
-
- regex_iterator& operator++();
- _LIBCPP_INLINE_VISIBILITY
- regex_iterator operator++(int)
- {
- regex_iterator __t(*this);
- ++(*this);
- return __t;
- }
-};
-
-template <class _BidirectionalIterator, class _CharT, class _Traits>
-regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
- : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_()
-{
-}
-
-template <class _BidirectionalIterator, class _CharT, class _Traits>
-regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
- regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re, regex_constants::match_flag_type __m)
- : __begin_(__a),
- __end_(__b),
- __pregex_(&__re),
- __flags_(__m)
-{
- _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
-}
-
-template <class _BidirectionalIterator, class _CharT, class _Traits>
-bool
-regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
- operator==(const regex_iterator& __x) const
-{
- if (__match_.empty() && __x.__match_.empty())
- return true;
- if (__match_.empty() || __x.__match_.empty())
- return false;
- return __begin_ == __x.__begin_ &&
- __end_ == __x.__end_ &&
- __pregex_ == __x.__pregex_ &&
- __flags_ == __x.__flags_ &&
- __match_[0] == __x.__match_[0];
-}
-
-template <class _BidirectionalIterator, class _CharT, class _Traits>
-regex_iterator<_BidirectionalIterator, _CharT, _Traits>&
-regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
-{
- __flags_ |= regex_constants::__no_update_pos;
- _BidirectionalIterator __start = __match_[0].second;
- if (__match_[0].first == __match_[0].second)
- {
- if (__start == __end_)
- {
- __match_ = value_type();
- return *this;
- }
- else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
- __flags_ | regex_constants::match_not_null |
- regex_constants::match_continuous))
- return *this;
- else
- ++__start;
- }
- __flags_ |= regex_constants::match_prev_avail;
- if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
- __match_ = value_type();
- return *this;
-}
-
-typedef regex_iterator<const char*> cregex_iterator;
-typedef regex_iterator<const wchar_t*> wcregex_iterator;
-typedef regex_iterator<string::const_iterator> sregex_iterator;
-typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
-
-// regex_token_iterator
-
-template <class _BidirectionalIterator,
- class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
- class _Traits = regex_traits<_CharT> >
-class _LIBCPP_TEMPLATE_VIS regex_token_iterator
-{
-public:
- typedef basic_regex<_CharT, _Traits> regex_type;
- typedef sub_match<_BidirectionalIterator> value_type;
- typedef ptrdiff_t difference_type;
- typedef const value_type* pointer;
- typedef const value_type& reference;
- typedef forward_iterator_tag iterator_category;
-
-private:
- typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;
-
- _Position __position_;
- const value_type* __result_;
- value_type __suffix_;
- ptrdiff_t __n_;
- vector<int> __subs_;
-
-public:
- regex_token_iterator();
- regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re, int __submatch = 0,
- regex_constants::match_flag_type __m =
- regex_constants::match_default);
-#if _LIBCPP_STD_VER > 11
- regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type&& __re, int __submatch = 0,
- regex_constants::match_flag_type __m =
- regex_constants::match_default) = delete;
-#endif
-
- regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re, const vector<int>& __submatches,
- regex_constants::match_flag_type __m =
- regex_constants::match_default);
-#if _LIBCPP_STD_VER > 11
- regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type&& __re, const vector<int>& __submatches,
- regex_constants::match_flag_type __m =
- regex_constants::match_default) = delete;
-#endif
-
-#ifndef _LIBCPP_CXX03_LANG
- regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re,
- initializer_list<int> __submatches,
- regex_constants::match_flag_type __m =
- regex_constants::match_default);
-
-#if _LIBCPP_STD_VER > 11
- regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type&& __re,
- initializer_list<int> __submatches,
- regex_constants::match_flag_type __m =
- regex_constants::match_default) = delete;
-#endif
-#endif // _LIBCPP_CXX03_LANG
- template <size_t _Np>
- regex_token_iterator(_BidirectionalIterator __a,
- _BidirectionalIterator __b,
- const regex_type& __re,
- const int (&__submatches)[_Np],
- regex_constants::match_flag_type __m =
- regex_constants::match_default);
-#if _LIBCPP_STD_VER > 11
- template <std::size_t _Np>
- regex_token_iterator(_BidirectionalIterator __a,
- _BidirectionalIterator __b,
- const regex_type&& __re,
- const int (&__submatches)[_Np],
- regex_constants::match_flag_type __m =
- regex_constants::match_default) = delete;
-#endif
-
- regex_token_iterator(const regex_token_iterator&);
- regex_token_iterator& operator=(const regex_token_iterator&);
-
- bool operator==(const regex_token_iterator& __x) const;
- _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);}
-
- _LIBCPP_INLINE_VISIBILITY
- const value_type& operator*() const {return *__result_;}
- _LIBCPP_INLINE_VISIBILITY
- const value_type* operator->() const {return __result_;}
-
- regex_token_iterator& operator++();
- _LIBCPP_INLINE_VISIBILITY
- regex_token_iterator operator++(int)
- {
- regex_token_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
-private:
- void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
- void __establish_result () {
- if (__subs_[__n_] == -1)
- __result_ = &__position_->prefix();
- else
- __result_ = &(*__position_)[__subs_[__n_]];
- }
-};
-
-template <class _BidirectionalIterator, class _CharT, class _Traits>
-regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- regex_token_iterator()
- : __result_(nullptr),
- __suffix_(),
- __n_(0)
-{
-}
-
-template <class _BidirectionalIterator, class _CharT, class _Traits>
-void
-regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- __init(_BidirectionalIterator __a, _BidirectionalIterator __b)
-{
- if (__position_ != _Position())
- __establish_result ();
- else if (__subs_[__n_] == -1)
- {
- __suffix_.matched = true;
- __suffix_.first = __a;
- __suffix_.second = __b;
- __result_ = &__suffix_;
- }
- else
- __result_ = nullptr;
-}
-
-template <class _BidirectionalIterator, class _CharT, class _Traits>
-regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re, int __submatch,
- regex_constants::match_flag_type __m)
- : __position_(__a, __b, __re, __m),
- __n_(0),
- __subs_(1, __submatch)
-{
- __init(__a, __b);
-}
-
-template <class _BidirectionalIterator, class _CharT, class _Traits>
-regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re, const vector<int>& __submatches,
- regex_constants::match_flag_type __m)
- : __position_(__a, __b, __re, __m),
- __n_(0),
- __subs_(__submatches)
-{
- __init(__a, __b);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _BidirectionalIterator, class _CharT, class _Traits>
-regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re,
- initializer_list<int> __submatches,
- regex_constants::match_flag_type __m)
- : __position_(__a, __b, __re, __m),
- __n_(0),
- __subs_(__submatches)
-{
- __init(__a, __b);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _BidirectionalIterator, class _CharT, class _Traits>
-template <size_t _Np>
-regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re,
- const int (&__submatches)[_Np],
- regex_constants::match_flag_type __m)
- : __position_(__a, __b, __re, __m),
- __n_(0),
- __subs_(__submatches, __submatches + _Np)
-{
- __init(__a, __b);
-}
-
-template <class _BidirectionalIterator, class _CharT, class _Traits>
-regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- regex_token_iterator(const regex_token_iterator& __x)
- : __position_(__x.__position_),
- __result_(__x.__result_),
- __suffix_(__x.__suffix_),
- __n_(__x.__n_),
- __subs_(__x.__subs_)
-{
- if (__x.__result_ == &__x.__suffix_)
- __result_ = &__suffix_;
- else if ( __result_ != nullptr )
- __establish_result ();
-}
-
-template <class _BidirectionalIterator, class _CharT, class _Traits>
-regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
-regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- operator=(const regex_token_iterator& __x)
-{
- if (this != &__x)
- {
- __position_ = __x.__position_;
- if (__x.__result_ == &__x.__suffix_)
- __result_ = &__suffix_;
- else
- __result_ = __x.__result_;
- __suffix_ = __x.__suffix_;
- __n_ = __x.__n_;
- __subs_ = __x.__subs_;
-
- if ( __result_ != nullptr && __result_ != &__suffix_ )
- __establish_result();
- }
- return *this;
-}
-
-template <class _BidirectionalIterator, class _CharT, class _Traits>
-bool
-regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- operator==(const regex_token_iterator& __x) const
-{
- if (__result_ == nullptr && __x.__result_ == nullptr)
- return true;
- if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ &&
- __suffix_ == __x.__suffix_)
- return true;
- if (__result_ == nullptr || __x.__result_ == nullptr)
- return false;
- if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
- return false;
- return __position_ == __x.__position_ && __n_ == __x.__n_ &&
- __subs_ == __x.__subs_;
-}
-
-template <class _BidirectionalIterator, class _CharT, class _Traits>
-regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
-regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
-{
- _Position __prev = __position_;
- if (__result_ == &__suffix_)
- __result_ = nullptr;
- else if (static_cast<size_t>(__n_ + 1) < __subs_.size())
- {
- ++__n_;
- __establish_result();
- }
- else
- {
- __n_ = 0;
- ++__position_;
- if (__position_ != _Position())
- __establish_result();
- else
- {
- if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
- && __prev->suffix().length() != 0)
- {
- __suffix_.matched = true;
- __suffix_.first = __prev->suffix().first;
- __suffix_.second = __prev->suffix().second;
- __result_ = &__suffix_;
- }
- else
- __result_ = nullptr;
- }
- }
- return *this;
-}
-
-typedef regex_token_iterator<const char*> cregex_token_iterator;
-typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
-typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
-typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
-
-// regex_replace
-
-template <class _OutputIterator, class _BidirectionalIterator,
- class _Traits, class _CharT>
-_OutputIterator
-regex_replace(_OutputIterator __output_iter,
- _BidirectionalIterator __first, _BidirectionalIterator __last,
- const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
- _Iter __i(__first, __last, __e, __flags);
- _Iter __eof;
- if (__i == __eof)
- {
- if (!(__flags & regex_constants::format_no_copy))
- __output_iter = _VSTD::copy(__first, __last, __output_iter);
- }
- else
- {
- sub_match<_BidirectionalIterator> __lm;
- for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
- {
- if (!(__flags & regex_constants::format_no_copy))
- __output_iter = _VSTD::copy(__i->prefix().first, __i->prefix().second, __output_iter);
- __output_iter = __i->format(__output_iter, __fmt, __fmt + __len, __flags);
- __lm = __i->suffix();
- if (__flags & regex_constants::format_first_only)
- break;
- }
- if (!(__flags & regex_constants::format_no_copy))
- __output_iter = _VSTD::copy(__lm.first, __lm.second, __output_iter);
- }
- return __output_iter;
-}
-
-template <class _OutputIterator, class _BidirectionalIterator,
- class _Traits, class _CharT, class _ST, class _SA>
-inline _LIBCPP_INLINE_VISIBILITY
-_OutputIterator
-regex_replace(_OutputIterator __output_iter,
- _BidirectionalIterator __first, _BidirectionalIterator __last,
- const basic_regex<_CharT, _Traits>& __e,
- const basic_string<_CharT, _ST, _SA>& __fmt,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- return _VSTD::regex_replace(__output_iter, __first, __last, __e, __fmt.c_str(), __flags);
-}
-
-template <class _Traits, class _CharT, class _ST, class _SA, class _FST,
- class _FSA>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_string<_CharT, _ST, _SA>
-regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
- const basic_regex<_CharT, _Traits>& __e,
- const basic_string<_CharT, _FST, _FSA>& __fmt,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- basic_string<_CharT, _ST, _SA> __r;
- _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
- __fmt.c_str(), __flags);
- return __r;
-}
-
-template <class _Traits, class _CharT, class _ST, class _SA>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_string<_CharT, _ST, _SA>
-regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
- const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- basic_string<_CharT, _ST, _SA> __r;
- _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
- __fmt, __flags);
- return __r;
-}
-
-template <class _Traits, class _CharT, class _ST, class _SA>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_string<_CharT>
-regex_replace(const _CharT* __s,
- const basic_regex<_CharT, _Traits>& __e,
- const basic_string<_CharT, _ST, _SA>& __fmt,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- basic_string<_CharT> __r;
- _VSTD::regex_replace(back_inserter(__r), __s,
- __s + char_traits<_CharT>::length(__s), __e,
- __fmt.c_str(), __flags);
- return __r;
-}
-
-template <class _Traits, class _CharT>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_string<_CharT>
-regex_replace(const _CharT* __s,
- const basic_regex<_CharT, _Traits>& __e,
- const _CharT* __fmt,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
-{
- basic_string<_CharT> __r;
- _VSTD::regex_replace(back_inserter(__r), __s,
- __s + char_traits<_CharT>::length(__s), __e,
- __fmt, __flags);
- return __r;
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_REGEX
diff --git a/lib/libcxx/include/scoped_allocator b/lib/libcxx/include/scoped_allocator
deleted file mode 100644
index bdbb0136b5c..00000000000
--- a/lib/libcxx/include/scoped_allocator
+++ /dev/null
@@ -1,684 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- scoped_allocator --------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SCOPED_ALLOCATOR
-#define _LIBCPP_SCOPED_ALLOCATOR
-
-/*
- scoped_allocator synopsis
-
-namespace std
-{
-
-template <class OuterAlloc, class... InnerAllocs>
-class scoped_allocator_adaptor : public OuterAlloc
-{
- typedef allocator_traits<OuterAlloc> OuterTraits; // exposition only
- scoped_allocator_adaptor<InnerAllocs...> inner; // exposition only
-public:
-
- typedef OuterAlloc outer_allocator_type;
- typedef see below inner_allocator_type;
-
- typedef typename OuterTraits::value_type value_type;
- typedef typename OuterTraits::size_type size_type;
- typedef typename OuterTraits::difference_type difference_type;
- typedef typename OuterTraits::pointer pointer;
- typedef typename OuterTraits::const_pointer const_pointer;
- typedef typename OuterTraits::void_pointer void_pointer;
- typedef typename OuterTraits::const_void_pointer const_void_pointer;
-
- typedef see below propagate_on_container_copy_assignment;
- typedef see below propagate_on_container_move_assignment;
- typedef see below propagate_on_container_swap;
- typedef see below is_always_equal;
-
- template <class Tp>
- struct rebind
- {
- typedef scoped_allocator_adaptor<
- OuterTraits::template rebind_alloc<Tp>, InnerAllocs...> other;
- };
-
- scoped_allocator_adaptor();
- template <class OuterA2>
- scoped_allocator_adaptor(OuterA2&& outerAlloc,
- const InnerAllocs&... innerAllocs) noexcept;
- scoped_allocator_adaptor(const scoped_allocator_adaptor& other) noexcept;
- scoped_allocator_adaptor(scoped_allocator_adaptor&& other) noexcept;
- template <class OuterA2>
- scoped_allocator_adaptor(const scoped_allocator_adaptor<OuterA2, InnerAllocs...>& other) noexcept;
- template <class OuterA2>
- scoped_allocator_adaptor(const scoped_allocator_adaptor<OuterA2, InnerAllocs...>&& other) noexcept;
-
- scoped_allocator_adaptor& operator=(const scoped_allocator_adaptor&) = default;
- scoped_allocator_adaptor& operator=(scoped_allocator_adaptor&&) = default;
- ~scoped_allocator_adaptor();
-
- inner_allocator_type& inner_allocator() noexcept;
- const inner_allocator_type& inner_allocator() const noexcept;
-
- outer_allocator_type& outer_allocator() noexcept;
- const outer_allocator_type& outer_allocator() const noexcept;
-
- pointer allocate(size_type n); // [[nodiscard]] in C++20
- pointer allocate(size_type n, const_void_pointer hint); // [[nodiscard]] in C++20
- void deallocate(pointer p, size_type n) noexcept;
-
- size_type max_size() const;
- template <class T, class... Args> void construct(T* p, Args&& args);
- template <class T1, class T2, class... Args1, class... Args2>
- void construct(pair<T1, T2>* p, piecewise_construct t, tuple<Args1...> x,
- tuple<Args2...> y);
- template <class T1, class T2>
- void construct(pair<T1, T2>* p);
- template <class T1, class T2, class U, class V>
- void construct(pair<T1, T2>* p, U&& x, V&& y);
- template <class T1, class T2, class U, class V>
- void construct(pair<T1, T2>* p, const pair<U, V>& x);
- template <class T1, class T2, class U, class V>
- void construct(pair<T1, T2>* p, pair<U, V>&& x);
- template <class T> void destroy(T* p);
-
- template <class T> void destroy(T* p) noexcept;
-
- scoped_allocator_adaptor select_on_container_copy_construction() const noexcept;
-};
-
-template <class OuterA1, class OuterA2, class... InnerAllocs>
- bool
- operator==(const scoped_allocator_adaptor<OuterA1, InnerAllocs...>& a,
- const scoped_allocator_adaptor<OuterA2, InnerAllocs...>& b) noexcept;
-
-template <class OuterA1, class OuterA2, class... InnerAllocs>
- bool
- operator!=(const scoped_allocator_adaptor<OuterA1, InnerAllocs...>& a,
- const scoped_allocator_adaptor<OuterA2, InnerAllocs...>& b) noexcept;
-
-} // std
-
-*/
-
-#include <__config>
-#include <memory>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-#if !defined(_LIBCPP_CXX03_LANG)
-
-// scoped_allocator_adaptor
-
-template <class ..._Allocs>
-class scoped_allocator_adaptor;
-
-template <class ..._Allocs> struct __get_poc_copy_assignment;
-
-template <class _A0>
-struct __get_poc_copy_assignment<_A0>
-{
- static const bool value = allocator_traits<_A0>::
- propagate_on_container_copy_assignment::value;
-};
-
-template <class _A0, class ..._Allocs>
-struct __get_poc_copy_assignment<_A0, _Allocs...>
-{
- static const bool value =
- allocator_traits<_A0>::propagate_on_container_copy_assignment::value ||
- __get_poc_copy_assignment<_Allocs...>::value;
-};
-
-template <class ..._Allocs> struct __get_poc_move_assignment;
-
-template <class _A0>
-struct __get_poc_move_assignment<_A0>
-{
- static const bool value = allocator_traits<_A0>::
- propagate_on_container_move_assignment::value;
-};
-
-template <class _A0, class ..._Allocs>
-struct __get_poc_move_assignment<_A0, _Allocs...>
-{
- static const bool value =
- allocator_traits<_A0>::propagate_on_container_move_assignment::value ||
- __get_poc_move_assignment<_Allocs...>::value;
-};
-
-template <class ..._Allocs> struct __get_poc_swap;
-
-template <class _A0>
-struct __get_poc_swap<_A0>
-{
- static const bool value = allocator_traits<_A0>::
- propagate_on_container_swap::value;
-};
-
-template <class _A0, class ..._Allocs>
-struct __get_poc_swap<_A0, _Allocs...>
-{
- static const bool value =
- allocator_traits<_A0>::propagate_on_container_swap::value ||
- __get_poc_swap<_Allocs...>::value;
-};
-
-template <class ..._Allocs> struct __get_is_always_equal;
-
-template <class _A0>
-struct __get_is_always_equal<_A0>
-{
- static const bool value = allocator_traits<_A0>::is_always_equal::value;
-};
-
-template <class _A0, class ..._Allocs>
-struct __get_is_always_equal<_A0, _Allocs...>
-{
- static const bool value =
- allocator_traits<_A0>::is_always_equal::value &&
- __get_is_always_equal<_Allocs...>::value;
-};
-
-template <class ..._Allocs>
-class __scoped_allocator_storage;
-
-template <class _OuterAlloc, class... _InnerAllocs>
-class __scoped_allocator_storage<_OuterAlloc, _InnerAllocs...>
- : public _OuterAlloc
-{
- typedef _OuterAlloc outer_allocator_type;
-protected:
- typedef scoped_allocator_adaptor<_InnerAllocs...> inner_allocator_type;
-
-private:
- inner_allocator_type __inner_;
-
-protected:
-
- _LIBCPP_INLINE_VISIBILITY
- __scoped_allocator_storage() _NOEXCEPT {}
-
- template <class _OuterA2,
- class = typename enable_if<
- is_constructible<outer_allocator_type, _OuterA2>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- __scoped_allocator_storage(_OuterA2&& __outerAlloc,
- const _InnerAllocs& ...__innerAllocs) _NOEXCEPT
- : outer_allocator_type(_VSTD::forward<_OuterA2>(__outerAlloc)),
- __inner_(__innerAllocs...) {}
-
- template <class _OuterA2,
- class = typename enable_if<
- is_constructible<outer_allocator_type, const _OuterA2&>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- __scoped_allocator_storage(
- const __scoped_allocator_storage<_OuterA2, _InnerAllocs...>& __other) _NOEXCEPT
- : outer_allocator_type(__other.outer_allocator()),
- __inner_(__other.inner_allocator()) {}
-
- template <class _OuterA2,
- class = typename enable_if<
- is_constructible<outer_allocator_type, _OuterA2>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- __scoped_allocator_storage(
- __scoped_allocator_storage<_OuterA2, _InnerAllocs...>&& __other) _NOEXCEPT
- : outer_allocator_type(_VSTD::move(__other.outer_allocator())),
- __inner_(_VSTD::move(__other.inner_allocator())) {}
-
- template <class _OuterA2,
- class = typename enable_if<
- is_constructible<outer_allocator_type, _OuterA2>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- __scoped_allocator_storage(_OuterA2&& __o,
- const inner_allocator_type& __i) _NOEXCEPT
- : outer_allocator_type(_VSTD::forward<_OuterA2>(__o)),
- __inner_(__i)
- {
- }
-
- _LIBCPP_INLINE_VISIBILITY
- inner_allocator_type& inner_allocator() _NOEXCEPT {return __inner_;}
- _LIBCPP_INLINE_VISIBILITY
- const inner_allocator_type& inner_allocator() const _NOEXCEPT {return __inner_;}
-
- _LIBCPP_INLINE_VISIBILITY
- outer_allocator_type& outer_allocator() _NOEXCEPT
- {return static_cast<outer_allocator_type&>(*this);}
- _LIBCPP_INLINE_VISIBILITY
- const outer_allocator_type& outer_allocator() const _NOEXCEPT
- {return static_cast<const outer_allocator_type&>(*this);}
-
- scoped_allocator_adaptor<outer_allocator_type, _InnerAllocs...>
- _LIBCPP_INLINE_VISIBILITY
- select_on_container_copy_construction() const _NOEXCEPT
- {
- return scoped_allocator_adaptor<outer_allocator_type, _InnerAllocs...>
- (
- allocator_traits<outer_allocator_type>::
- select_on_container_copy_construction(outer_allocator()),
- allocator_traits<inner_allocator_type>::
- select_on_container_copy_construction(inner_allocator())
- );
- }
-
- template <class...> friend class __scoped_allocator_storage;
-};
-
-template <class _OuterAlloc>
-class __scoped_allocator_storage<_OuterAlloc>
- : public _OuterAlloc
-{
- typedef _OuterAlloc outer_allocator_type;
-protected:
- typedef scoped_allocator_adaptor<_OuterAlloc> inner_allocator_type;
-
- _LIBCPP_INLINE_VISIBILITY
- __scoped_allocator_storage() _NOEXCEPT {}
-
- template <class _OuterA2,
- class = typename enable_if<
- is_constructible<outer_allocator_type, _OuterA2>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- __scoped_allocator_storage(_OuterA2&& __outerAlloc) _NOEXCEPT
- : outer_allocator_type(_VSTD::forward<_OuterA2>(__outerAlloc)) {}
-
- template <class _OuterA2,
- class = typename enable_if<
- is_constructible<outer_allocator_type, const _OuterA2&>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- __scoped_allocator_storage(
- const __scoped_allocator_storage<_OuterA2>& __other) _NOEXCEPT
- : outer_allocator_type(__other.outer_allocator()) {}
-
- template <class _OuterA2,
- class = typename enable_if<
- is_constructible<outer_allocator_type, _OuterA2>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- __scoped_allocator_storage(
- __scoped_allocator_storage<_OuterA2>&& __other) _NOEXCEPT
- : outer_allocator_type(_VSTD::move(__other.outer_allocator())) {}
-
- _LIBCPP_INLINE_VISIBILITY
- inner_allocator_type& inner_allocator() _NOEXCEPT
- {return static_cast<inner_allocator_type&>(*this);}
- _LIBCPP_INLINE_VISIBILITY
- const inner_allocator_type& inner_allocator() const _NOEXCEPT
- {return static_cast<const inner_allocator_type&>(*this);}
-
- _LIBCPP_INLINE_VISIBILITY
- outer_allocator_type& outer_allocator() _NOEXCEPT
- {return static_cast<outer_allocator_type&>(*this);}
- _LIBCPP_INLINE_VISIBILITY
- const outer_allocator_type& outer_allocator() const _NOEXCEPT
- {return static_cast<const outer_allocator_type&>(*this);}
-
- _LIBCPP_INLINE_VISIBILITY
- scoped_allocator_adaptor<outer_allocator_type>
- select_on_container_copy_construction() const _NOEXCEPT
- {return scoped_allocator_adaptor<outer_allocator_type>(
- allocator_traits<outer_allocator_type>::
- select_on_container_copy_construction(outer_allocator())
- );}
-
- __scoped_allocator_storage(const outer_allocator_type& __o,
- const inner_allocator_type& __i) _NOEXCEPT;
-
- template <class...> friend class __scoped_allocator_storage;
-};
-
-// __outermost
-
-template <class _Alloc>
-decltype(declval<_Alloc>().outer_allocator(), true_type())
-__has_outer_allocator_test(_Alloc&& __a);
-
-template <class _Alloc>
-false_type
-__has_outer_allocator_test(const volatile _Alloc& __a);
-
-template <class _Alloc>
-struct __has_outer_allocator
- : public common_type
- <
- decltype(__has_outer_allocator_test(declval<_Alloc&>()))
- >::type
-{
-};
-
-template <class _Alloc, bool = __has_outer_allocator<_Alloc>::value>
-struct __outermost
-{
- typedef _Alloc type;
- _LIBCPP_INLINE_VISIBILITY
- type& operator()(type& __a) const _NOEXCEPT {return __a;}
-};
-
-template <class _Alloc>
-struct __outermost<_Alloc, true>
-{
- typedef typename remove_reference
- <
- decltype(_VSTD::declval<_Alloc>().outer_allocator())
- >::type _OuterAlloc;
- typedef typename __outermost<_OuterAlloc>::type type;
- _LIBCPP_INLINE_VISIBILITY
- type& operator()(_Alloc& __a) const _NOEXCEPT
- {return __outermost<_OuterAlloc>()(__a.outer_allocator());}
-};
-
-template <class _OuterAlloc, class... _InnerAllocs>
-class _LIBCPP_TEMPLATE_VIS scoped_allocator_adaptor<_OuterAlloc, _InnerAllocs...>
- : public __scoped_allocator_storage<_OuterAlloc, _InnerAllocs...>
-{
- typedef __scoped_allocator_storage<_OuterAlloc, _InnerAllocs...> base;
- typedef allocator_traits<_OuterAlloc> _OuterTraits;
-public:
- typedef _OuterAlloc outer_allocator_type;
- typedef typename base::inner_allocator_type inner_allocator_type;
- typedef typename _OuterTraits::size_type size_type;
- typedef typename _OuterTraits::difference_type difference_type;
- typedef typename _OuterTraits::pointer pointer;
- typedef typename _OuterTraits::const_pointer const_pointer;
- typedef typename _OuterTraits::void_pointer void_pointer;
- typedef typename _OuterTraits::const_void_pointer const_void_pointer;
-
- typedef integral_constant
- <
- bool,
- __get_poc_copy_assignment<outer_allocator_type,
- _InnerAllocs...>::value
- > propagate_on_container_copy_assignment;
- typedef integral_constant
- <
- bool,
- __get_poc_move_assignment<outer_allocator_type,
- _InnerAllocs...>::value
- > propagate_on_container_move_assignment;
- typedef integral_constant
- <
- bool,
- __get_poc_swap<outer_allocator_type, _InnerAllocs...>::value
- > propagate_on_container_swap;
- typedef integral_constant
- <
- bool,
- __get_is_always_equal<outer_allocator_type, _InnerAllocs...>::value
- > is_always_equal;
-
- template <class _Tp>
- struct rebind
- {
- typedef scoped_allocator_adaptor
- <
- typename _OuterTraits::template rebind_alloc<_Tp>, _InnerAllocs...
- > other;
- };
-
- _LIBCPP_INLINE_VISIBILITY
- scoped_allocator_adaptor() _NOEXCEPT {}
- template <class _OuterA2,
- class = typename enable_if<
- is_constructible<outer_allocator_type, _OuterA2>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- scoped_allocator_adaptor(_OuterA2&& __outerAlloc,
- const _InnerAllocs& ...__innerAllocs) _NOEXCEPT
- : base(_VSTD::forward<_OuterA2>(__outerAlloc), __innerAllocs...) {}
- // scoped_allocator_adaptor(const scoped_allocator_adaptor& __other) = default;
- template <class _OuterA2,
- class = typename enable_if<
- is_constructible<outer_allocator_type, const _OuterA2&>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- scoped_allocator_adaptor(
- const scoped_allocator_adaptor<_OuterA2, _InnerAllocs...>& __other) _NOEXCEPT
- : base(__other) {}
- template <class _OuterA2,
- class = typename enable_if<
- is_constructible<outer_allocator_type, _OuterA2>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- scoped_allocator_adaptor(
- scoped_allocator_adaptor<_OuterA2, _InnerAllocs...>&& __other) _NOEXCEPT
- : base(_VSTD::move(__other)) {}
-
- // scoped_allocator_adaptor& operator=(const scoped_allocator_adaptor&) = default;
- // scoped_allocator_adaptor& operator=(scoped_allocator_adaptor&&) = default;
- // ~scoped_allocator_adaptor() = default;
-
- _LIBCPP_INLINE_VISIBILITY
- inner_allocator_type& inner_allocator() _NOEXCEPT
- {return base::inner_allocator();}
- _LIBCPP_INLINE_VISIBILITY
- const inner_allocator_type& inner_allocator() const _NOEXCEPT
- {return base::inner_allocator();}
-
- _LIBCPP_INLINE_VISIBILITY
- outer_allocator_type& outer_allocator() _NOEXCEPT
- {return base::outer_allocator();}
- _LIBCPP_INLINE_VISIBILITY
- const outer_allocator_type& outer_allocator() const _NOEXCEPT
- {return base::outer_allocator();}
-
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- pointer allocate(size_type __n)
- {return allocator_traits<outer_allocator_type>::
- allocate(outer_allocator(), __n);}
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- pointer allocate(size_type __n, const_void_pointer __hint)
- {return allocator_traits<outer_allocator_type>::
- allocate(outer_allocator(), __n, __hint);}
-
- _LIBCPP_INLINE_VISIBILITY
- void deallocate(pointer __p, size_type __n) _NOEXCEPT
- {allocator_traits<outer_allocator_type>::
- deallocate(outer_allocator(), __p, __n);}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const
- {return allocator_traits<outer_allocator_type>::max_size(outer_allocator());}
-
- template <class _Tp, class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- void construct(_Tp* __p, _Args&& ...__args)
- {__construct(__uses_alloc_ctor<_Tp, inner_allocator_type&, _Args...>(),
- __p, _VSTD::forward<_Args>(__args)...);}
-
- template <class _T1, class _T2, class... _Args1, class... _Args2>
- void construct(pair<_T1, _T2>* __p, piecewise_construct_t,
- tuple<_Args1...> __x, tuple<_Args2...> __y)
- {
- typedef __outermost<outer_allocator_type> _OM;
- allocator_traits<typename _OM::type>::construct(
- _OM()(outer_allocator()), __p, piecewise_construct
- , __transform_tuple(
- typename __uses_alloc_ctor<
- _T1, inner_allocator_type&, _Args1...
- >::type()
- , _VSTD::move(__x)
- , typename __make_tuple_indices<sizeof...(_Args1)>::type{}
- )
- , __transform_tuple(
- typename __uses_alloc_ctor<
- _T2, inner_allocator_type&, _Args2...
- >::type()
- , _VSTD::move(__y)
- , typename __make_tuple_indices<sizeof...(_Args2)>::type{}
- )
- );
- }
-
- template <class _T1, class _T2>
- void construct(pair<_T1, _T2>* __p)
- { construct(__p, piecewise_construct, tuple<>{}, tuple<>{}); }
-
- template <class _T1, class _T2, class _Up, class _Vp>
- void construct(pair<_T1, _T2>* __p, _Up&& __x, _Vp&& __y) {
- construct(__p, piecewise_construct,
- _VSTD::forward_as_tuple(_VSTD::forward<_Up>(__x)),
- _VSTD::forward_as_tuple(_VSTD::forward<_Vp>(__y)));
- }
-
- template <class _T1, class _T2, class _Up, class _Vp>
- void construct(pair<_T1, _T2>* __p, const pair<_Up, _Vp>& __x) {
- construct(__p, piecewise_construct,
- _VSTD::forward_as_tuple(__x.first),
- _VSTD::forward_as_tuple(__x.second));
- }
-
- template <class _T1, class _T2, class _Up, class _Vp>
- void construct(pair<_T1, _T2>* __p, pair<_Up, _Vp>&& __x) {
- construct(__p, piecewise_construct,
- _VSTD::forward_as_tuple(_VSTD::forward<_Up>(__x.first)),
- _VSTD::forward_as_tuple(_VSTD::forward<_Vp>(__x.second)));
- }
-
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY
- void destroy(_Tp* __p)
- {
- typedef __outermost<outer_allocator_type> _OM;
- allocator_traits<typename _OM::type>::
- destroy(_OM()(outer_allocator()), __p);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- scoped_allocator_adaptor select_on_container_copy_construction() const _NOEXCEPT
- {return base::select_on_container_copy_construction();}
-
-private:
-
-
- template <class _OuterA2,
- class = typename enable_if<
- is_constructible<outer_allocator_type, _OuterA2>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- scoped_allocator_adaptor(_OuterA2&& __o,
- const inner_allocator_type& __i) _NOEXCEPT
- : base(_VSTD::forward<_OuterA2>(__o), __i) {}
-
- template <class _Tp, class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- void __construct(integral_constant<int, 0>, _Tp* __p, _Args&& ...__args)
- {
- typedef __outermost<outer_allocator_type> _OM;
- allocator_traits<typename _OM::type>::construct
- (
- _OM()(outer_allocator()),
- __p,
- _VSTD::forward<_Args>(__args)...
- );
- }
-
- template <class _Tp, class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- void __construct(integral_constant<int, 1>, _Tp* __p, _Args&& ...__args)
- {
- typedef __outermost<outer_allocator_type> _OM;
- allocator_traits<typename _OM::type>::construct
- (
- _OM()(outer_allocator()),
- __p, allocator_arg, inner_allocator(),
- _VSTD::forward<_Args>(__args)...
- );
- }
-
- template <class _Tp, class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- void __construct(integral_constant<int, 2>, _Tp* __p, _Args&& ...__args)
- {
- typedef __outermost<outer_allocator_type> _OM;
- allocator_traits<typename _OM::type>::construct
- (
- _OM()(outer_allocator()),
- __p,
- _VSTD::forward<_Args>(__args)...,
- inner_allocator()
- );
- }
-
- template <class ..._Args, size_t ..._Idx>
- _LIBCPP_INLINE_VISIBILITY
- tuple<_Args&&...>
- __transform_tuple(integral_constant<int, 0>, tuple<_Args...>&& __t,
- __tuple_indices<_Idx...>)
- {
- return _VSTD::forward_as_tuple(_VSTD::get<_Idx>(_VSTD::move(__t))...);
- }
-
- template <class ..._Args, size_t ..._Idx>
- _LIBCPP_INLINE_VISIBILITY
- tuple<allocator_arg_t, inner_allocator_type&, _Args&&...>
- __transform_tuple(integral_constant<int, 1>, tuple<_Args...> && __t,
- __tuple_indices<_Idx...>)
- {
- using _Tup = tuple<allocator_arg_t, inner_allocator_type&, _Args&&...>;
- return _Tup(allocator_arg, inner_allocator(),
- _VSTD::get<_Idx>(_VSTD::move(__t))...);
- }
-
- template <class ..._Args, size_t ..._Idx>
- _LIBCPP_INLINE_VISIBILITY
- tuple<_Args&&..., inner_allocator_type&>
- __transform_tuple(integral_constant<int, 2>, tuple<_Args...> && __t,
- __tuple_indices<_Idx...>)
- {
- using _Tup = tuple<_Args&&..., inner_allocator_type&>;
- return _Tup(_VSTD::get<_Idx>(_VSTD::move(__t))..., inner_allocator());
- }
-
- template <class...> friend class __scoped_allocator_storage;
-};
-
-template <class _OuterA1, class _OuterA2>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const scoped_allocator_adaptor<_OuterA1>& __a,
- const scoped_allocator_adaptor<_OuterA2>& __b) _NOEXCEPT
-{
- return __a.outer_allocator() == __b.outer_allocator();
-}
-
-template <class _OuterA1, class _OuterA2, class _InnerA0, class... _InnerAllocs>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const scoped_allocator_adaptor<_OuterA1, _InnerA0, _InnerAllocs...>& __a,
- const scoped_allocator_adaptor<_OuterA2, _InnerA0, _InnerAllocs...>& __b) _NOEXCEPT
-{
- return __a.outer_allocator() == __b.outer_allocator() &&
- __a.inner_allocator() == __b.inner_allocator();
-}
-
-template <class _OuterA1, class _OuterA2, class... _InnerAllocs>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const scoped_allocator_adaptor<_OuterA1, _InnerAllocs...>& __a,
- const scoped_allocator_adaptor<_OuterA2, _InnerAllocs...>& __b) _NOEXCEPT
-{
- return !(__a == __b);
-}
-
-#endif // !defined(_LIBCPP_CXX03_LANG)
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_SCOPED_ALLOCATOR
diff --git a/lib/libcxx/include/set b/lib/libcxx/include/set
deleted file mode 100644
index a0155f0b275..00000000000
--- a/lib/libcxx/include/set
+++ /dev/null
@@ -1,1417 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- set -------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SET
-#define _LIBCPP_SET
-
-/*
-
- set synopsis
-
-namespace std
-{
-
-template <class Key, class Compare = less<Key>,
- class Allocator = allocator<Key>>
-class set
-{
-public:
- // types:
- typedef Key key_type;
- typedef key_type value_type;
- typedef Compare key_compare;
- typedef key_compare value_compare;
- typedef Allocator allocator_type;
- typedef typename allocator_type::reference reference;
- typedef typename allocator_type::const_reference const_reference;
- typedef typename allocator_type::size_type size_type;
- typedef typename allocator_type::difference_type difference_type;
- typedef typename allocator_type::pointer pointer;
- typedef typename allocator_type::const_pointer const_pointer;
-
- typedef implementation-defined iterator;
- typedef implementation-defined const_iterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
- typedef unspecified node_type; // C++17
- typedef INSERT_RETURN_TYPE<iterator, node_type> insert_return_type; // C++17
-
- // construct/copy/destroy:
- set()
- noexcept(
- is_nothrow_default_constructible<allocator_type>::value &&
- is_nothrow_default_constructible<key_compare>::value &&
- is_nothrow_copy_constructible<key_compare>::value);
- explicit set(const value_compare& comp);
- set(const value_compare& comp, const allocator_type& a);
- template <class InputIterator>
- set(InputIterator first, InputIterator last,
- const value_compare& comp = value_compare());
- template <class InputIterator>
- set(InputIterator first, InputIterator last, const value_compare& comp,
- const allocator_type& a);
- set(const set& s);
- set(set&& s)
- noexcept(
- is_nothrow_move_constructible<allocator_type>::value &&
- is_nothrow_move_constructible<key_compare>::value);
- explicit set(const allocator_type& a);
- set(const set& s, const allocator_type& a);
- set(set&& s, const allocator_type& a);
- set(initializer_list<value_type> il, const value_compare& comp = value_compare());
- set(initializer_list<value_type> il, const value_compare& comp,
- const allocator_type& a);
- template <class InputIterator>
- set(InputIterator first, InputIterator last, const allocator_type& a)
- : set(first, last, Compare(), a) {} // C++14
- set(initializer_list<value_type> il, const allocator_type& a)
- : set(il, Compare(), a) {} // C++14
- ~set();
-
- set& operator=(const set& s);
- set& operator=(set&& s)
- noexcept(
- allocator_type::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value &&
- is_nothrow_move_assignable<key_compare>::value);
- set& operator=(initializer_list<value_type> il);
-
- // iterators:
- iterator begin() noexcept;
- const_iterator begin() const noexcept;
- iterator end() noexcept;
- const_iterator end() const noexcept;
-
- reverse_iterator rbegin() noexcept;
- const_reverse_iterator rbegin() const noexcept;
- reverse_iterator rend() noexcept;
- const_reverse_iterator rend() const noexcept;
-
- const_iterator cbegin() const noexcept;
- const_iterator cend() const noexcept;
- const_reverse_iterator crbegin() const noexcept;
- const_reverse_iterator crend() const noexcept;
-
- // capacity:
- bool empty() const noexcept;
- size_type size() const noexcept;
- size_type max_size() const noexcept;
-
- // modifiers:
- template <class... Args>
- pair<iterator, bool> emplace(Args&&... args);
- template <class... Args>
- iterator emplace_hint(const_iterator position, Args&&... args);
- pair<iterator,bool> insert(const value_type& v);
- pair<iterator,bool> insert(value_type&& v);
- iterator insert(const_iterator position, const value_type& v);
- iterator insert(const_iterator position, value_type&& v);
- template <class InputIterator>
- void insert(InputIterator first, InputIterator last);
- void insert(initializer_list<value_type> il);
-
- node_type extract(const_iterator position); // C++17
- node_type extract(const key_type& x); // C++17
- insert_return_type insert(node_type&& nh); // C++17
- iterator insert(const_iterator hint, node_type&& nh); // C++17
-
- iterator erase(const_iterator position);
- iterator erase(iterator position); // C++14
- size_type erase(const key_type& k);
- iterator erase(const_iterator first, const_iterator last);
- void clear() noexcept;
-
- template<class C2>
- void merge(set<Key, C2, Allocator>& source); // C++17
- template<class C2>
- void merge(set<Key, C2, Allocator>&& source); // C++17
- template<class C2>
- void merge(multiset<Key, C2, Allocator>& source); // C++17
- template<class C2>
- void merge(multiset<Key, C2, Allocator>&& source); // C++17
-
- void swap(set& s)
- noexcept(
- __is_nothrow_swappable<key_compare>::value &&
- (!allocator_type::propagate_on_container_swap::value ||
- __is_nothrow_swappable<allocator_type>::value));
-
- // observers:
- allocator_type get_allocator() const noexcept;
- key_compare key_comp() const;
- value_compare value_comp() const;
-
- // set operations:
- iterator find(const key_type& k);
- const_iterator find(const key_type& k) const;
- template<typename K>
- iterator find(const K& x);
- template<typename K>
- const_iterator find(const K& x) const; // C++14
- template<typename K>
- size_type count(const K& x) const; // C++14
-
- size_type count(const key_type& k) const;
- iterator lower_bound(const key_type& k);
- const_iterator lower_bound(const key_type& k) const;
- template<typename K>
- iterator lower_bound(const K& x); // C++14
- template<typename K>
- const_iterator lower_bound(const K& x) const; // C++14
-
- iterator upper_bound(const key_type& k);
- const_iterator upper_bound(const key_type& k) const;
- template<typename K>
- iterator upper_bound(const K& x); // C++14
- template<typename K>
- const_iterator upper_bound(const K& x) const; // C++14
- pair<iterator,iterator> equal_range(const key_type& k);
- pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
- template<typename K>
- pair<iterator,iterator> equal_range(const K& x); // C++14
- template<typename K>
- pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14
-};
-
-template <class Key, class Compare, class Allocator>
-bool
-operator==(const set<Key, Compare, Allocator>& x,
- const set<Key, Compare, Allocator>& y);
-
-template <class Key, class Compare, class Allocator>
-bool
-operator< (const set<Key, Compare, Allocator>& x,
- const set<Key, Compare, Allocator>& y);
-
-template <class Key, class Compare, class Allocator>
-bool
-operator!=(const set<Key, Compare, Allocator>& x,
- const set<Key, Compare, Allocator>& y);
-
-template <class Key, class Compare, class Allocator>
-bool
-operator> (const set<Key, Compare, Allocator>& x,
- const set<Key, Compare, Allocator>& y);
-
-template <class Key, class Compare, class Allocator>
-bool
-operator>=(const set<Key, Compare, Allocator>& x,
- const set<Key, Compare, Allocator>& y);
-
-template <class Key, class Compare, class Allocator>
-bool
-operator<=(const set<Key, Compare, Allocator>& x,
- const set<Key, Compare, Allocator>& y);
-
-// specialized algorithms:
-template <class Key, class Compare, class Allocator>
-void
-swap(set<Key, Compare, Allocator>& x, set<Key, Compare, Allocator>& y)
- noexcept(noexcept(x.swap(y)));
-
-template <class Key, class Compare, class Allocator, class Predicate>
- void erase_if(set<Key, Compare, Allocator>& c, Predicate pred); // C++20
-
-template <class Key, class Compare = less<Key>,
- class Allocator = allocator<Key>>
-class multiset
-{
-public:
- // types:
- typedef Key key_type;
- typedef key_type value_type;
- typedef Compare key_compare;
- typedef key_compare value_compare;
- typedef Allocator allocator_type;
- typedef typename allocator_type::reference reference;
- typedef typename allocator_type::const_reference const_reference;
- typedef typename allocator_type::size_type size_type;
- typedef typename allocator_type::difference_type difference_type;
- typedef typename allocator_type::pointer pointer;
- typedef typename allocator_type::const_pointer const_pointer;
-
- typedef implementation-defined iterator;
- typedef implementation-defined const_iterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
- typedef unspecified node_type; // C++17
-
- // construct/copy/destroy:
- multiset()
- noexcept(
- is_nothrow_default_constructible<allocator_type>::value &&
- is_nothrow_default_constructible<key_compare>::value &&
- is_nothrow_copy_constructible<key_compare>::value);
- explicit multiset(const value_compare& comp);
- multiset(const value_compare& comp, const allocator_type& a);
- template <class InputIterator>
- multiset(InputIterator first, InputIterator last,
- const value_compare& comp = value_compare());
- template <class InputIterator>
- multiset(InputIterator first, InputIterator last,
- const value_compare& comp, const allocator_type& a);
- multiset(const multiset& s);
- multiset(multiset&& s)
- noexcept(
- is_nothrow_move_constructible<allocator_type>::value &&
- is_nothrow_move_constructible<key_compare>::value);
- explicit multiset(const allocator_type& a);
- multiset(const multiset& s, const allocator_type& a);
- multiset(multiset&& s, const allocator_type& a);
- multiset(initializer_list<value_type> il, const value_compare& comp = value_compare());
- multiset(initializer_list<value_type> il, const value_compare& comp,
- const allocator_type& a);
- template <class InputIterator>
- multiset(InputIterator first, InputIterator last, const allocator_type& a)
- : set(first, last, Compare(), a) {} // C++14
- multiset(initializer_list<value_type> il, const allocator_type& a)
- : set(il, Compare(), a) {} // C++14
- ~multiset();
-
- multiset& operator=(const multiset& s);
- multiset& operator=(multiset&& s)
- noexcept(
- allocator_type::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value &&
- is_nothrow_move_assignable<key_compare>::value);
- multiset& operator=(initializer_list<value_type> il);
-
- // iterators:
- iterator begin() noexcept;
- const_iterator begin() const noexcept;
- iterator end() noexcept;
- const_iterator end() const noexcept;
-
- reverse_iterator rbegin() noexcept;
- const_reverse_iterator rbegin() const noexcept;
- reverse_iterator rend() noexcept;
- const_reverse_iterator rend() const noexcept;
-
- const_iterator cbegin() const noexcept;
- const_iterator cend() const noexcept;
- const_reverse_iterator crbegin() const noexcept;
- const_reverse_iterator crend() const noexcept;
-
- // capacity:
- bool empty() const noexcept;
- size_type size() const noexcept;
- size_type max_size() const noexcept;
-
- // modifiers:
- template <class... Args>
- iterator emplace(Args&&... args);
- template <class... Args>
- iterator emplace_hint(const_iterator position, Args&&... args);
- iterator insert(const value_type& v);
- iterator insert(value_type&& v);
- iterator insert(const_iterator position, const value_type& v);
- iterator insert(const_iterator position, value_type&& v);
- template <class InputIterator>
- void insert(InputIterator first, InputIterator last);
- void insert(initializer_list<value_type> il);
-
- node_type extract(const_iterator position); // C++17
- node_type extract(const key_type& x); // C++17
- iterator insert(node_type&& nh); // C++17
- iterator insert(const_iterator hint, node_type&& nh); // C++17
-
- iterator erase(const_iterator position);
- iterator erase(iterator position); // C++14
- size_type erase(const key_type& k);
- iterator erase(const_iterator first, const_iterator last);
- void clear() noexcept;
-
- template<class C2>
- void merge(multiset<Key, C2, Allocator>& source); // C++17
- template<class C2>
- void merge(multiset<Key, C2, Allocator>&& source); // C++17
- template<class C2>
- void merge(set<Key, C2, Allocator>& source); // C++17
- template<class C2>
- void merge(set<Key, C2, Allocator>&& source); // C++17
-
- void swap(multiset& s)
- noexcept(
- __is_nothrow_swappable<key_compare>::value &&
- (!allocator_type::propagate_on_container_swap::value ||
- __is_nothrow_swappable<allocator_type>::value));
-
- // observers:
- allocator_type get_allocator() const noexcept;
- key_compare key_comp() const;
- value_compare value_comp() const;
-
- // set operations:
- iterator find(const key_type& k);
- const_iterator find(const key_type& k) const;
- template<typename K>
- iterator find(const K& x);
- template<typename K>
- const_iterator find(const K& x) const; // C++14
-
- size_type count(const key_type& k) const;
- iterator lower_bound(const key_type& k);
- const_iterator lower_bound(const key_type& k) const;
- template<typename K>
- iterator lower_bound(const K& x); // C++14
- template<typename K>
- const_iterator lower_bound(const K& x) const; // C++14
-
- iterator upper_bound(const key_type& k);
- const_iterator upper_bound(const key_type& k) const;
- template<typename K>
- iterator upper_bound(const K& x); // C++14
- template<typename K>
- const_iterator upper_bound(const K& x) const; // C++14
-
- pair<iterator,iterator> equal_range(const key_type& k);
- pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
- template<typename K>
- pair<iterator,iterator> equal_range(const K& x); // C++14
- template<typename K>
- pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14
-};
-
-template <class Key, class Compare, class Allocator>
-bool
-operator==(const multiset<Key, Compare, Allocator>& x,
- const multiset<Key, Compare, Allocator>& y);
-
-template <class Key, class Compare, class Allocator>
-bool
-operator< (const multiset<Key, Compare, Allocator>& x,
- const multiset<Key, Compare, Allocator>& y);
-
-template <class Key, class Compare, class Allocator>
-bool
-operator!=(const multiset<Key, Compare, Allocator>& x,
- const multiset<Key, Compare, Allocator>& y);
-
-template <class Key, class Compare, class Allocator>
-bool
-operator> (const multiset<Key, Compare, Allocator>& x,
- const multiset<Key, Compare, Allocator>& y);
-
-template <class Key, class Compare, class Allocator>
-bool
-operator>=(const multiset<Key, Compare, Allocator>& x,
- const multiset<Key, Compare, Allocator>& y);
-
-template <class Key, class Compare, class Allocator>
-bool
-operator<=(const multiset<Key, Compare, Allocator>& x,
- const multiset<Key, Compare, Allocator>& y);
-
-// specialized algorithms:
-template <class Key, class Compare, class Allocator>
-void
-swap(multiset<Key, Compare, Allocator>& x, multiset<Key, Compare, Allocator>& y)
- noexcept(noexcept(x.swap(y)));
-
-template <class Key, class Compare, class Allocator, class Predicate>
- void erase_if(multiset<Key, Compare, Allocator>& c, Predicate pred); // C++20
-
-} // std
-
-*/
-
-#include <__config>
-#include <__tree>
-#include <__node_handle>
-#include <functional>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Key, class _Compare, class _Allocator>
-class multiset;
-
-template <class _Key, class _Compare = less<_Key>,
- class _Allocator = allocator<_Key> >
-class _LIBCPP_TEMPLATE_VIS set
-{
-public:
- // types:
- typedef _Key key_type;
- typedef key_type value_type;
- typedef _Compare key_compare;
- typedef key_compare value_compare;
- typedef _Allocator allocator_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
-
- static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
- static_assert((is_same<typename allocator_type::value_type, value_type>::value),
- "Allocator::value_type must be same type as value_type");
-
-private:
- typedef __tree<value_type, value_compare, allocator_type> __base;
- typedef allocator_traits<allocator_type> __alloc_traits;
- typedef typename __base::__node_holder __node_holder;
-
- __base __tree_;
-
-public:
- typedef typename __base::pointer pointer;
- typedef typename __base::const_pointer const_pointer;
- typedef typename __base::size_type size_type;
- typedef typename __base::difference_type difference_type;
- typedef typename __base::const_iterator iterator;
- typedef typename __base::const_iterator const_iterator;
- typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
- typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
-
-#if _LIBCPP_STD_VER > 14
- typedef __set_node_handle<typename __base::__node, allocator_type> node_type;
- typedef __insert_return_type<iterator, node_type> insert_return_type;
-#endif
-
- template <class _Key2, class _Compare2, class _Alloc2>
- friend class _LIBCPP_TEMPLATE_VIS set;
- template <class _Key2, class _Compare2, class _Alloc2>
- friend class _LIBCPP_TEMPLATE_VIS multiset;
-
- _LIBCPP_INLINE_VISIBILITY
- set()
- _NOEXCEPT_(
- is_nothrow_default_constructible<allocator_type>::value &&
- is_nothrow_default_constructible<key_compare>::value &&
- is_nothrow_copy_constructible<key_compare>::value)
- : __tree_(value_compare()) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit set(const value_compare& __comp)
- _NOEXCEPT_(
- is_nothrow_default_constructible<allocator_type>::value &&
- is_nothrow_copy_constructible<key_compare>::value)
- : __tree_(__comp) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit set(const value_compare& __comp, const allocator_type& __a)
- : __tree_(__comp, __a) {}
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- set(_InputIterator __f, _InputIterator __l,
- const value_compare& __comp = value_compare())
- : __tree_(__comp)
- {
- insert(__f, __l);
- }
-
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- set(_InputIterator __f, _InputIterator __l, const value_compare& __comp,
- const allocator_type& __a)
- : __tree_(__comp, __a)
- {
- insert(__f, __l);
- }
-
-#if _LIBCPP_STD_VER > 11
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- set(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
- : set(__f, __l, key_compare(), __a) {}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- set(const set& __s)
- : __tree_(__s.__tree_)
- {
- insert(__s.begin(), __s.end());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- set& operator=(const set& __s)
- {
- __tree_ = __s.__tree_;
- return *this;
- }
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- set(set&& __s)
- _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
- : __tree_(_VSTD::move(__s.__tree_)) {}
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- explicit set(const allocator_type& __a)
- : __tree_(__a) {}
-
- _LIBCPP_INLINE_VISIBILITY
- set(const set& __s, const allocator_type& __a)
- : __tree_(__s.__tree_.value_comp(), __a)
- {
- insert(__s.begin(), __s.end());
- }
-
-#ifndef _LIBCPP_CXX03_LANG
- set(set&& __s, const allocator_type& __a);
-
- _LIBCPP_INLINE_VISIBILITY
- set(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
- : __tree_(__comp)
- {
- insert(__il.begin(), __il.end());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- set(initializer_list<value_type> __il, const value_compare& __comp,
- const allocator_type& __a)
- : __tree_(__comp, __a)
- {
- insert(__il.begin(), __il.end());
- }
-
-#if _LIBCPP_STD_VER > 11
- _LIBCPP_INLINE_VISIBILITY
- set(initializer_list<value_type> __il, const allocator_type& __a)
- : set(__il, key_compare(), __a) {}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- set& operator=(initializer_list<value_type> __il)
- {
- __tree_.__assign_unique(__il.begin(), __il.end());
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- set& operator=(set&& __s)
- _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
- {
- __tree_ = _VSTD::move(__s.__tree_);
- return *this;
- }
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT {return __tree_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT {return __tree_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT {return __tree_.end();}
-
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rbegin() _NOEXCEPT
- {return reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rbegin() const _NOEXCEPT
- {return const_reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rend() _NOEXCEPT
- {return reverse_iterator(begin());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rend() const _NOEXCEPT
- {return const_reverse_iterator(begin());}
-
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const _NOEXCEPT {return begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const _NOEXCEPT {return end();}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crend() const _NOEXCEPT {return rend();}
-
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT {return __tree_.size();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
-
- // modifiers:
-#ifndef _LIBCPP_CXX03_LANG
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> emplace(_Args&&... __args)
- {return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);}
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator emplace_hint(const_iterator __p, _Args&&... __args)
- {return __tree_.__emplace_hint_unique(__p, _VSTD::forward<_Args>(__args)...);}
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator,bool> insert(const value_type& __v)
- {return __tree_.__insert_unique(__v);}
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __p, const value_type& __v)
- {return __tree_.__insert_unique(__p, __v);}
-
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- void insert(_InputIterator __f, _InputIterator __l)
- {
- for (const_iterator __e = cend(); __f != __l; ++__f)
- __tree_.__insert_unique(__e, *__f);
- }
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator,bool> insert(value_type&& __v)
- {return __tree_.__insert_unique(_VSTD::move(__v));}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __p, value_type&& __v)
- {return __tree_.__insert_unique(__p, _VSTD::move(__v));}
-
- _LIBCPP_INLINE_VISIBILITY
- void insert(initializer_list<value_type> __il)
- {insert(__il.begin(), __il.end());}
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __p) {return __tree_.erase(__p);}
- _LIBCPP_INLINE_VISIBILITY
- size_type erase(const key_type& __k)
- {return __tree_.__erase_unique(__k);}
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __f, const_iterator __l)
- {return __tree_.erase(__f, __l);}
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT {__tree_.clear();}
-
-#if _LIBCPP_STD_VER > 14
- _LIBCPP_INLINE_VISIBILITY
- insert_return_type insert(node_type&& __nh)
- {
- _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
- "node_type with incompatible allocator passed to set::insert()");
- return __tree_.template __node_handle_insert_unique<
- node_type, insert_return_type>(_VSTD::move(__nh));
- }
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __hint, node_type&& __nh)
- {
- _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
- "node_type with incompatible allocator passed to set::insert()");
- return __tree_.template __node_handle_insert_unique<node_type>(
- __hint, _VSTD::move(__nh));
- }
- _LIBCPP_INLINE_VISIBILITY
- node_type extract(key_type const& __key)
- {
- return __tree_.template __node_handle_extract<node_type>(__key);
- }
- _LIBCPP_INLINE_VISIBILITY
- node_type extract(const_iterator __it)
- {
- return __tree_.template __node_handle_extract<node_type>(__it);
- }
- template <class _Compare2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(set<key_type, _Compare2, allocator_type>& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- __tree_.__node_handle_merge_unique(__source.__tree_);
- }
- template <class _Compare2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(set<key_type, _Compare2, allocator_type>&& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- __tree_.__node_handle_merge_unique(__source.__tree_);
- }
- template <class _Compare2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(multiset<key_type, _Compare2, allocator_type>& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- __tree_.__node_handle_merge_unique(__source.__tree_);
- }
- template <class _Compare2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(multiset<key_type, _Compare2, allocator_type>&& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- __tree_.__node_handle_merge_unique(__source.__tree_);
- }
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(set& __s) _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
- {__tree_.swap(__s.__tree_);}
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
- _LIBCPP_INLINE_VISIBILITY
- key_compare key_comp() const {return __tree_.value_comp();}
- _LIBCPP_INLINE_VISIBILITY
- value_compare value_comp() const {return __tree_.value_comp();}
-
- // set operations:
- _LIBCPP_INLINE_VISIBILITY
- iterator find(const key_type& __k) {return __tree_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
- find(const _K2& __k) {return __tree_.find(__k);}
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
- find(const _K2& __k) const {return __tree_.find(__k);}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- size_type count(const key_type& __k) const
- {return __tree_.__count_unique(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
- count(const _K2& __k) const {return __tree_.__count_multi(__k);}
-#endif
- _LIBCPP_INLINE_VISIBILITY
- iterator lower_bound(const key_type& __k)
- {return __tree_.lower_bound(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator lower_bound(const key_type& __k) const
- {return __tree_.lower_bound(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
- lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
-
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
- lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- iterator upper_bound(const key_type& __k)
- {return __tree_.upper_bound(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator upper_bound(const key_type& __k) const
- {return __tree_.upper_bound(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
- upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
- upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator,iterator> equal_range(const key_type& __k)
- {return __tree_.__equal_range_unique(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
- {return __tree_.__equal_range_unique(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
- equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);}
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
- equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
-#endif
-};
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Key, class _Compare, class _Allocator>
-set<_Key, _Compare, _Allocator>::set(set&& __s, const allocator_type& __a)
- : __tree_(_VSTD::move(__s.__tree_), __a)
-{
- if (__a != __s.get_allocator())
- {
- const_iterator __e = cend();
- while (!__s.empty())
- insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_));
- }
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Key, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const set<_Key, _Compare, _Allocator>& __x,
- const set<_Key, _Compare, _Allocator>& __y)
-{
- return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
-}
-
-template <class _Key, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator< (const set<_Key, _Compare, _Allocator>& __x,
- const set<_Key, _Compare, _Allocator>& __y)
-{
- return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
-}
-
-template <class _Key, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const set<_Key, _Compare, _Allocator>& __x,
- const set<_Key, _Compare, _Allocator>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _Key, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator> (const set<_Key, _Compare, _Allocator>& __x,
- const set<_Key, _Compare, _Allocator>& __y)
-{
- return __y < __x;
-}
-
-template <class _Key, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const set<_Key, _Compare, _Allocator>& __x,
- const set<_Key, _Compare, _Allocator>& __y)
-{
- return !(__x < __y);
-}
-
-template <class _Key, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const set<_Key, _Compare, _Allocator>& __x,
- const set<_Key, _Compare, _Allocator>& __y)
-{
- return !(__y < __x);
-}
-
-// specialized algorithms:
-template <class _Key, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(set<_Key, _Compare, _Allocator>& __x,
- set<_Key, _Compare, _Allocator>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-#if _LIBCPP_STD_VER > 17
-template <class _Key, class _Compare, class _Allocator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase_if(set<_Key, _Compare, _Allocator>& __c, _Predicate __pred)
-{ __libcpp_erase_if_container(__c, __pred); }
-#endif
-
-template <class _Key, class _Compare = less<_Key>,
- class _Allocator = allocator<_Key> >
-class _LIBCPP_TEMPLATE_VIS multiset
-{
-public:
- // types:
- typedef _Key key_type;
- typedef key_type value_type;
- typedef _Compare key_compare;
- typedef key_compare value_compare;
- typedef _Allocator allocator_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
-
- static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
- static_assert((is_same<typename allocator_type::value_type, value_type>::value),
- "Allocator::value_type must be same type as value_type");
-
-private:
- typedef __tree<value_type, value_compare, allocator_type> __base;
- typedef allocator_traits<allocator_type> __alloc_traits;
- typedef typename __base::__node_holder __node_holder;
-
- __base __tree_;
-
-public:
- typedef typename __base::pointer pointer;
- typedef typename __base::const_pointer const_pointer;
- typedef typename __base::size_type size_type;
- typedef typename __base::difference_type difference_type;
- typedef typename __base::const_iterator iterator;
- typedef typename __base::const_iterator const_iterator;
- typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
- typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
-
-#if _LIBCPP_STD_VER > 14
- typedef __set_node_handle<typename __base::__node, allocator_type> node_type;
-#endif
-
- template <class _Key2, class _Compare2, class _Alloc2>
- friend class _LIBCPP_TEMPLATE_VIS set;
- template <class _Key2, class _Compare2, class _Alloc2>
- friend class _LIBCPP_TEMPLATE_VIS multiset;
-
- // construct/copy/destroy:
- _LIBCPP_INLINE_VISIBILITY
- multiset()
- _NOEXCEPT_(
- is_nothrow_default_constructible<allocator_type>::value &&
- is_nothrow_default_constructible<key_compare>::value &&
- is_nothrow_copy_constructible<key_compare>::value)
- : __tree_(value_compare()) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit multiset(const value_compare& __comp)
- _NOEXCEPT_(
- is_nothrow_default_constructible<allocator_type>::value &&
- is_nothrow_copy_constructible<key_compare>::value)
- : __tree_(__comp) {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit multiset(const value_compare& __comp, const allocator_type& __a)
- : __tree_(__comp, __a) {}
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- multiset(_InputIterator __f, _InputIterator __l,
- const value_compare& __comp = value_compare())
- : __tree_(__comp)
- {
- insert(__f, __l);
- }
-
-#if _LIBCPP_STD_VER > 11
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- multiset(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
- : multiset(__f, __l, key_compare(), __a) {}
-#endif
-
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- multiset(_InputIterator __f, _InputIterator __l,
- const value_compare& __comp, const allocator_type& __a)
- : __tree_(__comp, __a)
- {
- insert(__f, __l);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- multiset(const multiset& __s)
- : __tree_(__s.__tree_.value_comp(),
- __alloc_traits::select_on_container_copy_construction(__s.__tree_.__alloc()))
- {
- insert(__s.begin(), __s.end());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- multiset& operator=(const multiset& __s)
- {
- __tree_ = __s.__tree_;
- return *this;
- }
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- multiset(multiset&& __s)
- _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
- : __tree_(_VSTD::move(__s.__tree_)) {}
-
- multiset(multiset&& __s, const allocator_type& __a);
-#endif // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- explicit multiset(const allocator_type& __a)
- : __tree_(__a) {}
- _LIBCPP_INLINE_VISIBILITY
- multiset(const multiset& __s, const allocator_type& __a)
- : __tree_(__s.__tree_.value_comp(), __a)
- {
- insert(__s.begin(), __s.end());
- }
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- multiset(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
- : __tree_(__comp)
- {
- insert(__il.begin(), __il.end());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- multiset(initializer_list<value_type> __il, const value_compare& __comp,
- const allocator_type& __a)
- : __tree_(__comp, __a)
- {
- insert(__il.begin(), __il.end());
- }
-
-#if _LIBCPP_STD_VER > 11
- _LIBCPP_INLINE_VISIBILITY
- multiset(initializer_list<value_type> __il, const allocator_type& __a)
- : multiset(__il, key_compare(), __a) {}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- multiset& operator=(initializer_list<value_type> __il)
- {
- __tree_.__assign_multi(__il.begin(), __il.end());
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- multiset& operator=(multiset&& __s)
- _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
- {
- __tree_ = _VSTD::move(__s.__tree_);
- return *this;
- }
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT {return __tree_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT {return __tree_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT {return __tree_.end();}
-
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rbegin() _NOEXCEPT
- {return reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rbegin() const _NOEXCEPT
- {return const_reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rend() _NOEXCEPT
- {return reverse_iterator(begin());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rend() const _NOEXCEPT
- {return const_reverse_iterator(begin());}
-
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const _NOEXCEPT {return begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const _NOEXCEPT {return end();}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crend() const _NOEXCEPT {return rend();}
-
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT {return __tree_.size();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
-
- // modifiers:
-#ifndef _LIBCPP_CXX03_LANG
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator emplace(_Args&&... __args)
- {return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);}
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator emplace_hint(const_iterator __p, _Args&&... __args)
- {return __tree_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);}
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const value_type& __v)
- {return __tree_.__insert_multi(__v);}
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __p, const value_type& __v)
- {return __tree_.__insert_multi(__p, __v);}
-
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- void insert(_InputIterator __f, _InputIterator __l)
- {
- for (const_iterator __e = cend(); __f != __l; ++__f)
- __tree_.__insert_multi(__e, *__f);
- }
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(value_type&& __v)
- {return __tree_.__insert_multi(_VSTD::move(__v));}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __p, value_type&& __v)
- {return __tree_.__insert_multi(__p, _VSTD::move(__v));}
-
- _LIBCPP_INLINE_VISIBILITY
- void insert(initializer_list<value_type> __il)
- {insert(__il.begin(), __il.end());}
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __p) {return __tree_.erase(__p);}
- _LIBCPP_INLINE_VISIBILITY
- size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __f, const_iterator __l)
- {return __tree_.erase(__f, __l);}
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT {__tree_.clear();}
-
-#if _LIBCPP_STD_VER > 14
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(node_type&& __nh)
- {
- _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
- "node_type with incompatible allocator passed to multiset::insert()");
- return __tree_.template __node_handle_insert_multi<node_type>(
- _VSTD::move(__nh));
- }
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __hint, node_type&& __nh)
- {
- _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
- "node_type with incompatible allocator passed to multiset::insert()");
- return __tree_.template __node_handle_insert_multi<node_type>(
- __hint, _VSTD::move(__nh));
- }
- _LIBCPP_INLINE_VISIBILITY
- node_type extract(key_type const& __key)
- {
- return __tree_.template __node_handle_extract<node_type>(__key);
- }
- _LIBCPP_INLINE_VISIBILITY
- node_type extract(const_iterator __it)
- {
- return __tree_.template __node_handle_extract<node_type>(__it);
- }
- template <class _Compare2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(multiset<key_type, _Compare2, allocator_type>& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- __tree_.__node_handle_merge_multi(__source.__tree_);
- }
- template <class _Compare2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(multiset<key_type, _Compare2, allocator_type>&& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- __tree_.__node_handle_merge_multi(__source.__tree_);
- }
- template <class _Compare2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(set<key_type, _Compare2, allocator_type>& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- __tree_.__node_handle_merge_multi(__source.__tree_);
- }
- template <class _Compare2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(set<key_type, _Compare2, allocator_type>&& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- __tree_.__node_handle_merge_multi(__source.__tree_);
- }
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(multiset& __s)
- _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
- {__tree_.swap(__s.__tree_);}
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
- _LIBCPP_INLINE_VISIBILITY
- key_compare key_comp() const {return __tree_.value_comp();}
- _LIBCPP_INLINE_VISIBILITY
- value_compare value_comp() const {return __tree_.value_comp();}
-
- // set operations:
- _LIBCPP_INLINE_VISIBILITY
- iterator find(const key_type& __k) {return __tree_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type
- find(const _K2& __k) {return __tree_.find(__k);}
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
- find(const _K2& __k) const {return __tree_.find(__k);}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- size_type count(const key_type& __k) const
- {return __tree_.__count_multi(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
- count(const _K2& __k) const {return __tree_.__count_multi(__k);}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- iterator lower_bound(const key_type& __k)
- {return __tree_.lower_bound(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator lower_bound(const key_type& __k) const
- {return __tree_.lower_bound(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type
- lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
-
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
- lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- iterator upper_bound(const key_type& __k)
- {return __tree_.upper_bound(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator upper_bound(const key_type& __k) const
- {return __tree_.upper_bound(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type
- upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
- upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator,iterator> equal_range(const key_type& __k)
- {return __tree_.__equal_range_multi(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
- {return __tree_.__equal_range_multi(__k);}
-#if _LIBCPP_STD_VER > 11
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
- equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);}
- template <typename _K2>
- _LIBCPP_INLINE_VISIBILITY
- typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
- equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
-#endif
-};
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Key, class _Compare, class _Allocator>
-multiset<_Key, _Compare, _Allocator>::multiset(multiset&& __s, const allocator_type& __a)
- : __tree_(_VSTD::move(__s.__tree_), __a)
-{
- if (__a != __s.get_allocator())
- {
- const_iterator __e = cend();
- while (!__s.empty())
- insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_));
- }
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Key, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const multiset<_Key, _Compare, _Allocator>& __x,
- const multiset<_Key, _Compare, _Allocator>& __y)
-{
- return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
-}
-
-template <class _Key, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator< (const multiset<_Key, _Compare, _Allocator>& __x,
- const multiset<_Key, _Compare, _Allocator>& __y)
-{
- return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
-}
-
-template <class _Key, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const multiset<_Key, _Compare, _Allocator>& __x,
- const multiset<_Key, _Compare, _Allocator>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _Key, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator> (const multiset<_Key, _Compare, _Allocator>& __x,
- const multiset<_Key, _Compare, _Allocator>& __y)
-{
- return __y < __x;
-}
-
-template <class _Key, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const multiset<_Key, _Compare, _Allocator>& __x,
- const multiset<_Key, _Compare, _Allocator>& __y)
-{
- return !(__x < __y);
-}
-
-template <class _Key, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const multiset<_Key, _Compare, _Allocator>& __x,
- const multiset<_Key, _Compare, _Allocator>& __y)
-{
- return !(__y < __x);
-}
-
-template <class _Key, class _Compare, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(multiset<_Key, _Compare, _Allocator>& __x,
- multiset<_Key, _Compare, _Allocator>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-#if _LIBCPP_STD_VER > 17
-template <class _Key, class _Compare, class _Allocator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase_if(multiset<_Key, _Compare, _Allocator>& __c, _Predicate __pred)
-{ __libcpp_erase_if_container(__c, __pred); }
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_SET
diff --git a/lib/libcxx/include/setjmp.h b/lib/libcxx/include/setjmp.h
deleted file mode 100644
index 464b4a54089..00000000000
--- a/lib/libcxx/include/setjmp.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- setjmp.h ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SETJMP_H
-#define _LIBCPP_SETJMP_H
-
-/*
- setjmp.h synopsis
-
-Macros:
-
- setjmp
-
-Types:
-
- jmp_buf
-
-void longjmp(jmp_buf env, int val);
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#include_next <setjmp.h>
-
-#ifdef __cplusplus
-
-#ifndef setjmp
-#define setjmp(env) setjmp(env)
-#endif
-
-#endif // __cplusplus
-
-#endif // _LIBCPP_SETJMP_H
diff --git a/lib/libcxx/include/shared_mutex b/lib/libcxx/include/shared_mutex
deleted file mode 100644
index 3daf74d26c7..00000000000
--- a/lib/libcxx/include/shared_mutex
+++ /dev/null
@@ -1,509 +0,0 @@
-// -*- C++ -*-
-//===------------------------ shared_mutex --------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SHARED_MUTEX
-#define _LIBCPP_SHARED_MUTEX
-
-/*
- shared_mutex synopsis
-
-// C++1y
-
-namespace std
-{
-
-class shared_mutex // C++17
-{
-public:
- shared_mutex();
- ~shared_mutex();
-
- shared_mutex(const shared_mutex&) = delete;
- shared_mutex& operator=(const shared_mutex&) = delete;
-
- // Exclusive ownership
- void lock(); // blocking
- bool try_lock();
- void unlock();
-
- // Shared ownership
- void lock_shared(); // blocking
- bool try_lock_shared();
- void unlock_shared();
-
- typedef implementation-defined native_handle_type; // See 30.2.3
- native_handle_type native_handle(); // See 30.2.3
-};
-
-class shared_timed_mutex
-{
-public:
- shared_timed_mutex();
- ~shared_timed_mutex();
-
- shared_timed_mutex(const shared_timed_mutex&) = delete;
- shared_timed_mutex& operator=(const shared_timed_mutex&) = delete;
-
- // Exclusive ownership
- void lock(); // blocking
- bool try_lock();
- template <class Rep, class Period>
- bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
- template <class Clock, class Duration>
- bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
- void unlock();
-
- // Shared ownership
- void lock_shared(); // blocking
- bool try_lock_shared();
- template <class Rep, class Period>
- bool
- try_lock_shared_for(const chrono::duration<Rep, Period>& rel_time);
- template <class Clock, class Duration>
- bool
- try_lock_shared_until(const chrono::time_point<Clock, Duration>& abs_time);
- void unlock_shared();
-};
-
-template <class Mutex>
-class shared_lock
-{
-public:
- typedef Mutex mutex_type;
-
- // Shared locking
- shared_lock() noexcept;
- explicit shared_lock(mutex_type& m); // blocking
- shared_lock(mutex_type& m, defer_lock_t) noexcept;
- shared_lock(mutex_type& m, try_to_lock_t);
- shared_lock(mutex_type& m, adopt_lock_t);
- template <class Clock, class Duration>
- shared_lock(mutex_type& m,
- const chrono::time_point<Clock, Duration>& abs_time);
- template <class Rep, class Period>
- shared_lock(mutex_type& m,
- const chrono::duration<Rep, Period>& rel_time);
- ~shared_lock();
-
- shared_lock(shared_lock const&) = delete;
- shared_lock& operator=(shared_lock const&) = delete;
-
- shared_lock(shared_lock&& u) noexcept;
- shared_lock& operator=(shared_lock&& u) noexcept;
-
- void lock(); // blocking
- bool try_lock();
- template <class Rep, class Period>
- bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
- template <class Clock, class Duration>
- bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
- void unlock();
-
- // Setters
- void swap(shared_lock& u) noexcept;
- mutex_type* release() noexcept;
-
- // Getters
- bool owns_lock() const noexcept;
- explicit operator bool () const noexcept;
- mutex_type* mutex() const noexcept;
-};
-
-template <class Mutex>
- void swap(shared_lock<Mutex>& x, shared_lock<Mutex>& y) noexcept;
-
-} // std
-
-*/
-
-#include <__config>
-#include <version>
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-#if _LIBCPP_STD_VER > 11 || defined(_LIBCPP_BUILDING_LIBRARY)
-
-#include <__mutex_base>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#ifdef _LIBCPP_HAS_NO_THREADS
-#error <shared_mutex> is not supported on this single threaded system
-#else // !_LIBCPP_HAS_NO_THREADS
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-struct _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_SHARED_MUTEX _LIBCPP_THREAD_SAFETY_ANNOTATION(capability("shared_mutex"))
-__shared_mutex_base
-{
- mutex __mut_;
- condition_variable __gate1_;
- condition_variable __gate2_;
- unsigned __state_;
-
- static const unsigned __write_entered_ = 1U << (sizeof(unsigned)*__CHAR_BIT__ - 1);
- static const unsigned __n_readers_ = ~__write_entered_;
-
- __shared_mutex_base();
- _LIBCPP_INLINE_VISIBILITY ~__shared_mutex_base() = default;
-
- __shared_mutex_base(const __shared_mutex_base&) = delete;
- __shared_mutex_base& operator=(const __shared_mutex_base&) = delete;
-
- // Exclusive ownership
- void lock() _LIBCPP_THREAD_SAFETY_ANNOTATION(acquire_capability()); // blocking
- bool try_lock() _LIBCPP_THREAD_SAFETY_ANNOTATION(try_acquire_capability(true));
- void unlock() _LIBCPP_THREAD_SAFETY_ANNOTATION(release_capability());
-
- // Shared ownership
- void lock_shared() _LIBCPP_THREAD_SAFETY_ANNOTATION(acquire_shared_capability()); // blocking
- bool try_lock_shared() _LIBCPP_THREAD_SAFETY_ANNOTATION(try_acquire_shared_capability(true));
- void unlock_shared() _LIBCPP_THREAD_SAFETY_ANNOTATION(release_shared_capability());
-
-// typedef implementation-defined native_handle_type; // See 30.2.3
-// native_handle_type native_handle(); // See 30.2.3
-};
-
-
-#if _LIBCPP_STD_VER > 14
-class _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_SHARED_MUTEX shared_mutex
-{
- __shared_mutex_base __base;
-public:
- _LIBCPP_INLINE_VISIBILITY shared_mutex() : __base() {}
- _LIBCPP_INLINE_VISIBILITY ~shared_mutex() = default;
-
- shared_mutex(const shared_mutex&) = delete;
- shared_mutex& operator=(const shared_mutex&) = delete;
-
- // Exclusive ownership
- _LIBCPP_INLINE_VISIBILITY void lock() { return __base.lock(); }
- _LIBCPP_INLINE_VISIBILITY bool try_lock() { return __base.try_lock(); }
- _LIBCPP_INLINE_VISIBILITY void unlock() { return __base.unlock(); }
-
- // Shared ownership
- _LIBCPP_INLINE_VISIBILITY void lock_shared() { return __base.lock_shared(); }
- _LIBCPP_INLINE_VISIBILITY bool try_lock_shared() { return __base.try_lock_shared(); }
- _LIBCPP_INLINE_VISIBILITY void unlock_shared() { return __base.unlock_shared(); }
-
-// typedef __shared_mutex_base::native_handle_type native_handle_type;
-// _LIBCPP_INLINE_VISIBILITY native_handle_type native_handle() { return __base::unlock_shared(); }
-};
-#endif
-
-
-class _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_SHARED_MUTEX shared_timed_mutex
-{
- __shared_mutex_base __base;
-public:
- shared_timed_mutex();
- _LIBCPP_INLINE_VISIBILITY ~shared_timed_mutex() = default;
-
- shared_timed_mutex(const shared_timed_mutex&) = delete;
- shared_timed_mutex& operator=(const shared_timed_mutex&) = delete;
-
- // Exclusive ownership
- void lock();
- bool try_lock();
- template <class _Rep, class _Period>
- _LIBCPP_INLINE_VISIBILITY
- bool
- try_lock_for(const chrono::duration<_Rep, _Period>& __rel_time)
- {
- return try_lock_until(chrono::steady_clock::now() + __rel_time);
- }
- template <class _Clock, class _Duration>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- bool
- try_lock_until(const chrono::time_point<_Clock, _Duration>& __abs_time);
- void unlock();
-
- // Shared ownership
- void lock_shared();
- bool try_lock_shared();
- template <class _Rep, class _Period>
- _LIBCPP_INLINE_VISIBILITY
- bool
- try_lock_shared_for(const chrono::duration<_Rep, _Period>& __rel_time)
- {
- return try_lock_shared_until(chrono::steady_clock::now() + __rel_time);
- }
- template <class _Clock, class _Duration>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- bool
- try_lock_shared_until(const chrono::time_point<_Clock, _Duration>& __abs_time);
- void unlock_shared();
-};
-
-template <class _Clock, class _Duration>
-bool
-shared_timed_mutex::try_lock_until(
- const chrono::time_point<_Clock, _Duration>& __abs_time)
-{
- unique_lock<mutex> __lk(__base.__mut_);
- if (__base.__state_ & __base.__write_entered_)
- {
- while (true)
- {
- cv_status __status = __base.__gate1_.wait_until(__lk, __abs_time);
- if ((__base.__state_ & __base.__write_entered_) == 0)
- break;
- if (__status == cv_status::timeout)
- return false;
- }
- }
- __base.__state_ |= __base.__write_entered_;
- if (__base.__state_ & __base.__n_readers_)
- {
- while (true)
- {
- cv_status __status = __base.__gate2_.wait_until(__lk, __abs_time);
- if ((__base.__state_ & __base.__n_readers_) == 0)
- break;
- if (__status == cv_status::timeout)
- {
- __base.__state_ &= ~__base.__write_entered_;
- __base.__gate1_.notify_all();
- return false;
- }
- }
- }
- return true;
-}
-
-template <class _Clock, class _Duration>
-bool
-shared_timed_mutex::try_lock_shared_until(
- const chrono::time_point<_Clock, _Duration>& __abs_time)
-{
- unique_lock<mutex> __lk(__base.__mut_);
- if ((__base.__state_ & __base.__write_entered_) || (__base.__state_ & __base.__n_readers_) == __base.__n_readers_)
- {
- while (true)
- {
- cv_status status = __base.__gate1_.wait_until(__lk, __abs_time);
- if ((__base.__state_ & __base.__write_entered_) == 0 &&
- (__base.__state_ & __base.__n_readers_) < __base.__n_readers_)
- break;
- if (status == cv_status::timeout)
- return false;
- }
- }
- unsigned __num_readers = (__base.__state_ & __base.__n_readers_) + 1;
- __base.__state_ &= ~__base.__n_readers_;
- __base.__state_ |= __num_readers;
- return true;
-}
-
-template <class _Mutex>
-class shared_lock
-{
-public:
- typedef _Mutex mutex_type;
-
-private:
- mutex_type* __m_;
- bool __owns_;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- shared_lock() _NOEXCEPT
- : __m_(nullptr),
- __owns_(false)
- {}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit shared_lock(mutex_type& __m)
- : __m_(_VSTD::addressof(__m)),
- __owns_(true)
- {__m_->lock_shared();}
-
- _LIBCPP_INLINE_VISIBILITY
- shared_lock(mutex_type& __m, defer_lock_t) _NOEXCEPT
- : __m_(_VSTD::addressof(__m)),
- __owns_(false)
- {}
-
- _LIBCPP_INLINE_VISIBILITY
- shared_lock(mutex_type& __m, try_to_lock_t)
- : __m_(_VSTD::addressof(__m)),
- __owns_(__m.try_lock_shared())
- {}
-
- _LIBCPP_INLINE_VISIBILITY
- shared_lock(mutex_type& __m, adopt_lock_t)
- : __m_(_VSTD::addressof(__m)),
- __owns_(true)
- {}
-
- template <class _Clock, class _Duration>
- _LIBCPP_INLINE_VISIBILITY
- shared_lock(mutex_type& __m,
- const chrono::time_point<_Clock, _Duration>& __abs_time)
- : __m_(_VSTD::addressof(__m)),
- __owns_(__m.try_lock_shared_until(__abs_time))
- {}
-
- template <class _Rep, class _Period>
- _LIBCPP_INLINE_VISIBILITY
- shared_lock(mutex_type& __m,
- const chrono::duration<_Rep, _Period>& __rel_time)
- : __m_(_VSTD::addressof(__m)),
- __owns_(__m.try_lock_shared_for(__rel_time))
- {}
-
- _LIBCPP_INLINE_VISIBILITY
- ~shared_lock()
- {
- if (__owns_)
- __m_->unlock_shared();
- }
-
- shared_lock(shared_lock const&) = delete;
- shared_lock& operator=(shared_lock const&) = delete;
-
- _LIBCPP_INLINE_VISIBILITY
- shared_lock(shared_lock&& __u) _NOEXCEPT
- : __m_(__u.__m_),
- __owns_(__u.__owns_)
- {
- __u.__m_ = nullptr;
- __u.__owns_ = false;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- shared_lock& operator=(shared_lock&& __u) _NOEXCEPT
- {
- if (__owns_)
- __m_->unlock_shared();
- __m_ = nullptr;
- __owns_ = false;
- __m_ = __u.__m_;
- __owns_ = __u.__owns_;
- __u.__m_ = nullptr;
- __u.__owns_ = false;
- return *this;
- }
-
- void lock();
- bool try_lock();
- template <class Rep, class Period>
- bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
- template <class Clock, class Duration>
- bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
- void unlock();
-
- // Setters
- _LIBCPP_INLINE_VISIBILITY
- void swap(shared_lock& __u) _NOEXCEPT
- {
- _VSTD::swap(__m_, __u.__m_);
- _VSTD::swap(__owns_, __u.__owns_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- mutex_type* release() _NOEXCEPT
- {
- mutex_type* __m = __m_;
- __m_ = nullptr;
- __owns_ = false;
- return __m;
- }
-
- // Getters
- _LIBCPP_INLINE_VISIBILITY
- bool owns_lock() const _NOEXCEPT {return __owns_;}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit operator bool () const _NOEXCEPT {return __owns_;}
-
- _LIBCPP_INLINE_VISIBILITY
- mutex_type* mutex() const _NOEXCEPT {return __m_;}
-};
-
-template <class _Mutex>
-void
-shared_lock<_Mutex>::lock()
-{
- if (__m_ == nullptr)
- __throw_system_error(EPERM, "shared_lock::lock: references null mutex");
- if (__owns_)
- __throw_system_error(EDEADLK, "shared_lock::lock: already locked");
- __m_->lock_shared();
- __owns_ = true;
-}
-
-template <class _Mutex>
-bool
-shared_lock<_Mutex>::try_lock()
-{
- if (__m_ == nullptr)
- __throw_system_error(EPERM, "shared_lock::try_lock: references null mutex");
- if (__owns_)
- __throw_system_error(EDEADLK, "shared_lock::try_lock: already locked");
- __owns_ = __m_->try_lock_shared();
- return __owns_;
-}
-
-template <class _Mutex>
-template <class _Rep, class _Period>
-bool
-shared_lock<_Mutex>::try_lock_for(const chrono::duration<_Rep, _Period>& __d)
-{
- if (__m_ == nullptr)
- __throw_system_error(EPERM, "shared_lock::try_lock_for: references null mutex");
- if (__owns_)
- __throw_system_error(EDEADLK, "shared_lock::try_lock_for: already locked");
- __owns_ = __m_->try_lock_shared_for(__d);
- return __owns_;
-}
-
-template <class _Mutex>
-template <class _Clock, class _Duration>
-bool
-shared_lock<_Mutex>::try_lock_until(const chrono::time_point<_Clock, _Duration>& __t)
-{
- if (__m_ == nullptr)
- __throw_system_error(EPERM, "shared_lock::try_lock_until: references null mutex");
- if (__owns_)
- __throw_system_error(EDEADLK, "shared_lock::try_lock_until: already locked");
- __owns_ = __m_->try_lock_shared_until(__t);
- return __owns_;
-}
-
-template <class _Mutex>
-void
-shared_lock<_Mutex>::unlock()
-{
- if (!__owns_)
- __throw_system_error(EPERM, "shared_lock::unlock: not locked");
- __m_->unlock_shared();
- __owns_ = false;
-}
-
-template <class _Mutex>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(shared_lock<_Mutex>& __x, shared_lock<_Mutex>& __y) _NOEXCEPT
- {__x.swap(__y);}
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // !_LIBCPP_HAS_NO_THREADS
-
-#endif // _LIBCPP_STD_VER > 11
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_SHARED_MUTEX
diff --git a/lib/libcxx/include/span b/lib/libcxx/include/span
deleted file mode 100644
index cebe98760f2..00000000000
--- a/lib/libcxx/include/span
+++ /dev/null
@@ -1,564 +0,0 @@
-// -*- C++ -*-
-//===------------------------------ span ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===---------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SPAN
-#define _LIBCPP_SPAN
-
-/*
- span synopsis
-
-namespace std {
-
-// constants
-inline constexpr ptrdiff_t dynamic_extent = -1;
-
-// [views.span], class template span
-template <class ElementType, ptrdiff_t Extent = dynamic_extent>
- class span;
-
-// [span.objectrep], views of object representation
-template <class ElementType, ptrdiff_t Extent>
- span<const byte, ((Extent == dynamic_extent) ? dynamic_extent :
- (static_cast<ptrdiff_t>(sizeof(ElementType)) * Extent))> as_bytes(span<ElementType, Extent> s) noexcept;
-
-template <class ElementType, ptrdiff_t Extent>
- span< byte, ((Extent == dynamic_extent) ? dynamic_extent :
- (static_cast<ptrdiff_t>(sizeof(ElementType)) * Extent))> as_writable_bytes(span<ElementType, Extent> s) noexcept;
-
-
-namespace std {
-template <class ElementType, ptrdiff_t Extent = dynamic_extent>
-class span {
-public:
- // constants and types
- using element_type = ElementType;
- using value_type = remove_cv_t<ElementType>;
- using index_type = ptrdiff_t;
- using difference_type = ptrdiff_t;
- using pointer = element_type*;
- using reference = element_type&;
- using iterator = implementation-defined;
- using const_iterator = implementation-defined;
- using reverse_iterator = std::reverse_iterator<iterator>;
- using const_reverse_iterator = std::reverse_iterator<const_iterator>;
- static constexpr index_type extent = Extent;
-
- // [span.cons], span constructors, copy, assignment, and destructor
- constexpr span() noexcept;
- constexpr span(pointer ptr, index_type count);
- constexpr span(pointer firstElem, pointer lastElem);
- template <size_t N>
- constexpr span(element_type (&arr)[N]) noexcept;
- template <size_t N>
- constexpr span(array<value_type, N>& arr) noexcept;
- template <size_t N>
- constexpr span(const array<value_type, N>& arr) noexcept;
- template <class Container>
- constexpr span(Container& cont);
- template <class Container>
- constexpr span(const Container& cont);
- constexpr span(const span& other) noexcept = default;
- template <class OtherElementType, ptrdiff_t OtherExtent>
- constexpr span(const span<OtherElementType, OtherExtent>& s) noexcept;
- ~span() noexcept = default;
- constexpr span& operator=(const span& other) noexcept = default;
-
- // [span.sub], span subviews
- template <ptrdiff_t Count>
- constexpr span<element_type, Count> first() const;
- template <ptrdiff_t Count>
- constexpr span<element_type, Count> last() const;
- template <ptrdiff_t Offset, ptrdiff_t Count = dynamic_extent>
- constexpr span<element_type, see below> subspan() const;
-
- constexpr span<element_type, dynamic_extent> first(index_type count) const;
- constexpr span<element_type, dynamic_extent> last(index_type count) const;
- constexpr span<element_type, dynamic_extent> subspan(index_type offset, index_type count = dynamic_extent) const;
-
- // [span.obs], span observers
- constexpr index_type size() const noexcept;
- constexpr index_type size_bytes() const noexcept;
- constexpr bool empty() const noexcept;
-
- // [span.elem], span element access
- constexpr reference operator[](index_type idx) const;
- constexpr reference operator()(index_type idx) const;
- constexpr pointer data() const noexcept;
-
- // [span.iterators], span iterator support
- constexpr iterator begin() const noexcept;
- constexpr iterator end() const noexcept;
- constexpr const_iterator cbegin() const noexcept;
- constexpr const_iterator cend() const noexcept;
- constexpr reverse_iterator rbegin() const noexcept;
- constexpr reverse_iterator rend() const noexcept;
- constexpr const_reverse_iterator crbegin() const noexcept;
- constexpr const_reverse_iterator crend() const noexcept;
-
-private:
- pointer data_; // exposition only
- index_type size_; // exposition only
-};
-
-template<class T, size_t N>
- span(T (&)[N]) -> span<T, N>;
-
-template<class T, size_t N>
- span(array<T, N>&) -> span<T, N>;
-
-template<class T, size_t N>
- span(const array<T, N>&) -> span<const T, N>;
-
-template<class Container>
- span(Container&) -> span<typename Container::value_type>;
-
-template<class Container>
- span(const Container&) -> span<const typename Container::value_type>;
-
-} // namespace std
-
-*/
-
-#include <__config>
-#include <cstddef> // for ptrdiff_t
-#include <iterator> // for iterators
-#include <array> // for array
-#include <type_traits> // for remove_cv, etc
-#include <cstddef> // for byte
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-#if _LIBCPP_STD_VER > 17
-
-inline constexpr ptrdiff_t dynamic_extent = -1;
-template <typename _Tp, ptrdiff_t _Extent = dynamic_extent> class span;
-
-
-template <class _Tp>
-struct __is_span_impl : public false_type {};
-
-template <class _Tp, ptrdiff_t _Extent>
-struct __is_span_impl<span<_Tp, _Extent>> : public true_type {};
-
-template <class _Tp>
-struct __is_span : public __is_span_impl<remove_cv_t<_Tp>> {};
-
-template <class _Tp>
-struct __is_std_array_impl : public false_type {};
-
-template <class _Tp, size_t _Sz>
-struct __is_std_array_impl<array<_Tp, _Sz>> : public true_type {};
-
-template <class _Tp>
-struct __is_std_array : public __is_std_array_impl<remove_cv_t<_Tp>> {};
-
-template <class _Tp, class _ElementType, class = void>
-struct __is_span_compatible_container : public false_type {};
-
-template <class _Tp, class _ElementType>
-struct __is_span_compatible_container<_Tp, _ElementType,
- void_t<
- // is not a specialization of span
- typename enable_if<!__is_span<_Tp>::value, nullptr_t>::type,
- // is not a specialization of array
- typename enable_if<!__is_std_array<_Tp>::value, nullptr_t>::type,
- // is_array_v<Container> is false,
- typename enable_if<!is_array_v<_Tp>, nullptr_t>::type,
- // data(cont) and size(cont) are well formed
- decltype(data(declval<_Tp>())),
- decltype(size(declval<_Tp>())),
- // remove_pointer_t<decltype(data(cont))>(*)[] is convertible to ElementType(*)[]
- typename enable_if<
- is_convertible_v<remove_pointer_t<decltype(data(declval<_Tp &>()))>(*)[],
- _ElementType(*)[]>,
- nullptr_t>::type
- >>
- : public true_type {};
-
-
-template <typename _Tp, ptrdiff_t _Extent>
-class _LIBCPP_TEMPLATE_VIS span {
-public:
-// constants and types
- using element_type = _Tp;
- using value_type = remove_cv_t<_Tp>;
- using index_type = ptrdiff_t;
- using difference_type = ptrdiff_t;
- using pointer = _Tp *;
- using const_pointer = const _Tp *; // not in standard
- using reference = _Tp &;
- using const_reference = const _Tp &; // not in standard
- using iterator = __wrap_iter<pointer>;
- using const_iterator = __wrap_iter<const_pointer>;
- using reverse_iterator = _VSTD::reverse_iterator<iterator>;
- using const_reverse_iterator = _VSTD::reverse_iterator<const_iterator>;
-
- static constexpr index_type extent = _Extent;
- static_assert (_Extent >= 0, "Can't have a span with an extent < 0");
-
-// [span.cons], span constructors, copy, assignment, and destructor
- _LIBCPP_INLINE_VISIBILITY constexpr span() noexcept : __data{nullptr}
- { static_assert(_Extent == 0, "Can't default construct a statically sized span with size > 0"); }
-
- constexpr span (const span&) noexcept = default;
- constexpr span& operator=(const span&) noexcept = default;
-
- _LIBCPP_INLINE_VISIBILITY constexpr span(pointer __ptr, index_type __count) : __data{__ptr}
- { (void)__count; _LIBCPP_ASSERT(_Extent == __count, "size mismatch in span's constructor (ptr, len)"); }
- _LIBCPP_INLINE_VISIBILITY constexpr span(pointer __f, pointer __l) : __data{__f}
- { (void)__l; _LIBCPP_ASSERT(_Extent == distance(__f, __l), "size mismatch in span's constructor (ptr, ptr)"); }
-
- _LIBCPP_INLINE_VISIBILITY constexpr span(element_type (&__arr)[_Extent]) noexcept : __data{__arr} {}
- _LIBCPP_INLINE_VISIBILITY constexpr span( array<value_type, _Extent>& __arr) noexcept : __data{__arr.data()} {}
- _LIBCPP_INLINE_VISIBILITY constexpr span(const array<value_type, _Extent>& __arr) noexcept : __data{__arr.data()} {}
-
- template <class _Container>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr span( _Container& __c,
- enable_if_t<__is_span_compatible_container<_Container, _Tp>::value, nullptr_t> = nullptr)
- : __data{_VSTD::data(__c)}
- { _LIBCPP_ASSERT(_Extent == _VSTD::size(__c), "size mismatch in span's constructor (container)"); }
-
- template <class _Container>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr span(const _Container& __c,
- enable_if_t<__is_span_compatible_container<const _Container, _Tp>::value, nullptr_t> = nullptr)
- : __data{_VSTD::data(__c)}
- { _LIBCPP_ASSERT(_Extent == _VSTD::size(__c), "size mismatch in span's constructor (const container)"); }
-
- template <class _OtherElementType>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr span(const span<_OtherElementType, _Extent>& __other,
- enable_if_t<
- is_convertible_v<_OtherElementType(*)[], element_type (*)[]>,
- nullptr_t> = nullptr)
- : __data{__other.data()} {}
-
- template <class _OtherElementType>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr span(const span<_OtherElementType, dynamic_extent>& __other,
- enable_if_t<
- is_convertible_v<_OtherElementType(*)[], element_type (*)[]>,
- nullptr_t> = nullptr) noexcept
- : __data{__other.data()} { _LIBCPP_ASSERT(_Extent == __other.size(), "size mismatch in span's constructor (other span)"); }
-
-
-// ~span() noexcept = default;
-
- template <ptrdiff_t _Count>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr span<element_type, _Count> first() const noexcept
- {
- static_assert(_Count >= 0, "Count must be >= 0 in span::first()");
- static_assert(_Count <= _Extent, "Count out of range in span::first()");
- return {data(), _Count};
- }
-
- template <ptrdiff_t _Count>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr span<element_type, _Count> last() const noexcept
- {
- static_assert(_Count >= 0, "Count must be >= 0 in span::last()");
- static_assert(_Count <= _Extent, "Count out of range in span::last()");
- return {data() + size() - _Count, _Count};
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr span<element_type, dynamic_extent> first(index_type __count) const noexcept
- {
- _LIBCPP_ASSERT(__count >= 0 && __count <= size(), "Count out of range in span::first(count)");
- return {data(), __count};
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr span<element_type, dynamic_extent> last(index_type __count) const noexcept
- {
- _LIBCPP_ASSERT(__count >= 0 && __count <= size(), "Count out of range in span::last(count)");
- return {data() + size() - __count, __count};
- }
-
- template <ptrdiff_t _Offset, ptrdiff_t _Count = dynamic_extent>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr auto subspan() const noexcept
- -> span<element_type, _Count != dynamic_extent ? _Count : _Extent - _Offset>
- {
- _LIBCPP_ASSERT(_Offset >= 0 && _Offset <= size(), "Offset out of range in span::subspan()");
- return {data() + _Offset, _Count == dynamic_extent ? size() - _Offset : _Count};
- }
-
-
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr span<element_type, dynamic_extent>
- subspan(index_type __offset, index_type __count = dynamic_extent) const noexcept
- {
- _LIBCPP_ASSERT( __offset >= 0 && __offset <= size(), "Offset out of range in span::subspan(offset, count)");
- _LIBCPP_ASSERT((__count >= 0 && __count <= size()) || __count == dynamic_extent, "Count out of range in span::subspan(offset, count)");
- if (__count == dynamic_extent)
- return {data() + __offset, size() - __offset};
- _LIBCPP_ASSERT(__offset + __count <= size(), "count + offset out of range in span::subspan(offset, count)");
- return {data() + __offset, __count};
- }
-
- _LIBCPP_INLINE_VISIBILITY constexpr index_type size() const noexcept { return _Extent; }
- _LIBCPP_INLINE_VISIBILITY constexpr index_type size_bytes() const noexcept { return _Extent * sizeof(element_type); }
- _LIBCPP_INLINE_VISIBILITY constexpr bool empty() const noexcept { return _Extent == 0; }
-
- _LIBCPP_INLINE_VISIBILITY constexpr reference operator[](index_type __idx) const noexcept
- {
- _LIBCPP_ASSERT(__idx >= 0 && __idx < size(), "span<T,N>[] index out of bounds");
- return __data[__idx];
- }
-
- _LIBCPP_INLINE_VISIBILITY constexpr reference operator()(index_type __idx) const noexcept
- {
- _LIBCPP_ASSERT(__idx >= 0 && __idx < size(), "span<T,N>() index out of bounds");
- return __data[__idx];
- }
-
- _LIBCPP_INLINE_VISIBILITY constexpr pointer data() const noexcept { return __data; }
-
-// [span.iter], span iterator support
- _LIBCPP_INLINE_VISIBILITY constexpr iterator begin() const noexcept { return iterator(data()); }
- _LIBCPP_INLINE_VISIBILITY constexpr iterator end() const noexcept { return iterator(data() + size()); }
- _LIBCPP_INLINE_VISIBILITY constexpr const_iterator cbegin() const noexcept { return const_iterator(data()); }
- _LIBCPP_INLINE_VISIBILITY constexpr const_iterator cend() const noexcept { return const_iterator(data() + size()); }
- _LIBCPP_INLINE_VISIBILITY constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator(end()); }
- _LIBCPP_INLINE_VISIBILITY constexpr reverse_iterator rend() const noexcept { return reverse_iterator(begin()); }
- _LIBCPP_INLINE_VISIBILITY constexpr const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(cend()); }
- _LIBCPP_INLINE_VISIBILITY constexpr const_reverse_iterator crend() const noexcept { return const_reverse_iterator(cbegin()); }
-
- _LIBCPP_INLINE_VISIBILITY constexpr void swap(span &__other) noexcept
- {
- pointer __p = __data;
- __data = __other.__data;
- __other.__data = __p;
- }
-
- _LIBCPP_INLINE_VISIBILITY span<const byte, _Extent * sizeof(element_type)> __as_bytes() const noexcept
- { return {reinterpret_cast<const byte *>(data()), size_bytes()}; }
-
- _LIBCPP_INLINE_VISIBILITY span<byte, _Extent * sizeof(element_type)> __as_writeable_bytes() const noexcept
- { return {reinterpret_cast<byte *>(data()), size_bytes()}; }
-
-private:
- pointer __data;
-
-};
-
-
-template <typename _Tp>
-class _LIBCPP_TEMPLATE_VIS span<_Tp, dynamic_extent> {
-private:
-
-public:
-// constants and types
- using element_type = _Tp;
- using value_type = remove_cv_t<_Tp>;
- using index_type = ptrdiff_t;
- using difference_type = ptrdiff_t;
- using pointer = _Tp *;
- using const_pointer = const _Tp *; // not in standard
- using reference = _Tp &;
- using const_reference = const _Tp &; // not in standard
- using iterator = __wrap_iter<pointer>;
- using const_iterator = __wrap_iter<const_pointer>;
- using reverse_iterator = _VSTD::reverse_iterator<iterator>;
- using const_reverse_iterator = _VSTD::reverse_iterator<const_iterator>;
-
- static constexpr index_type extent = dynamic_extent;
-
-// [span.cons], span constructors, copy, assignment, and destructor
- _LIBCPP_INLINE_VISIBILITY constexpr span() noexcept : __data{nullptr}, __size{0} {}
-
- constexpr span (const span&) noexcept = default;
- constexpr span& operator=(const span&) noexcept = default;
-
- _LIBCPP_INLINE_VISIBILITY constexpr span(pointer __ptr, index_type __count) : __data{__ptr}, __size{__count} {}
- _LIBCPP_INLINE_VISIBILITY constexpr span(pointer __f, pointer __l) : __data{__f}, __size{distance(__f, __l)} {}
-
- template <size_t _Sz>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr span(element_type (&__arr)[_Sz]) noexcept : __data{__arr}, __size{_Sz} {}
-
- template <size_t _Sz>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr span(array<value_type, _Sz>& __arr) noexcept : __data{__arr.data()}, __size{_Sz} {}
-
- template <size_t _Sz>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr span(const array<value_type, _Sz>& __arr) noexcept : __data{__arr.data()}, __size{_Sz} {}
-
- template <class _Container>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr span( _Container& __c,
- enable_if_t<__is_span_compatible_container<_Container, _Tp>::value, nullptr_t> = nullptr)
- : __data{_VSTD::data(__c)}, __size{(index_type) _VSTD::size(__c)} {}
-
- template <class _Container>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr span(const _Container& __c,
- enable_if_t<__is_span_compatible_container<const _Container, _Tp>::value, nullptr_t> = nullptr)
- : __data{_VSTD::data(__c)}, __size{(index_type) _VSTD::size(__c)} {}
-
-
- template <class _OtherElementType, ptrdiff_t _OtherExtent>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr span(const span<_OtherElementType, _OtherExtent>& __other,
- enable_if_t<
- is_convertible_v<_OtherElementType(*)[], element_type (*)[]>,
- nullptr_t> = nullptr) noexcept
- : __data{__other.data()}, __size{__other.size()} {}
-
-// ~span() noexcept = default;
-
- template <ptrdiff_t _Count>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr span<element_type, _Count> first() const noexcept
- {
- static_assert(_Count >= 0, "Count must be >= 0 in span::first()");
- _LIBCPP_ASSERT(_Count <= size(), "Count out of range in span::first()");
- return {data(), _Count};
- }
-
- template <ptrdiff_t _Count>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr span<element_type, _Count> last() const noexcept
- {
- static_assert(_Count >= 0, "Count must be >= 0 in span::last()");
- _LIBCPP_ASSERT(_Count <= size(), "Count out of range in span::last()");
- return {data() + size() - _Count, _Count};
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr span<element_type, dynamic_extent> first(index_type __count) const noexcept
- {
- _LIBCPP_ASSERT(__count >= 0 && __count <= size(), "Count out of range in span::first(count)");
- return {data(), __count};
- }
-
- _LIBCPP_INLINE_VISIBILITY
- constexpr span<element_type, dynamic_extent> last (index_type __count) const noexcept
- {
- _LIBCPP_ASSERT(__count >= 0 && __count <= size(), "Count out of range in span::last(count)");
- return {data() + size() - __count, __count};
- }
-
- template <ptrdiff_t _Offset, ptrdiff_t _Count = dynamic_extent>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr span<_Tp, dynamic_extent> subspan() const noexcept
- {
- _LIBCPP_ASSERT(_Offset >= 0 && _Offset <= size(), "Offset out of range in span::subspan()");
- _LIBCPP_ASSERT(_Count == dynamic_extent || _Offset + _Count <= size(), "Count out of range in span::subspan()");
- return {data() + _Offset, _Count == dynamic_extent ? size() - _Offset : _Count};
- }
-
- constexpr span<element_type, dynamic_extent>
- inline _LIBCPP_INLINE_VISIBILITY
- subspan(index_type __offset, index_type __count = dynamic_extent) const noexcept
- {
- _LIBCPP_ASSERT( __offset >= 0 && __offset <= size(), "Offset out of range in span::subspan(offset, count)");
- _LIBCPP_ASSERT((__count >= 0 && __count <= size()) || __count == dynamic_extent, "count out of range in span::subspan(offset, count)");
- if (__count == dynamic_extent)
- return {data() + __offset, size() - __offset};
- _LIBCPP_ASSERT(__offset + __count <= size(), "Offset + count out of range in span::subspan(offset, count)");
- return {data() + __offset, __count};
- }
-
- _LIBCPP_INLINE_VISIBILITY constexpr index_type size() const noexcept { return __size; }
- _LIBCPP_INLINE_VISIBILITY constexpr index_type size_bytes() const noexcept { return __size * sizeof(element_type); }
- _LIBCPP_INLINE_VISIBILITY constexpr bool empty() const noexcept { return __size == 0; }
-
- _LIBCPP_INLINE_VISIBILITY constexpr reference operator[](index_type __idx) const noexcept
- {
- _LIBCPP_ASSERT(__idx >= 0 && __idx < size(), "span<T>[] index out of bounds");
- return __data[__idx];
- }
-
- _LIBCPP_INLINE_VISIBILITY constexpr reference operator()(index_type __idx) const noexcept
- {
- _LIBCPP_ASSERT(__idx >= 0 && __idx < size(), "span<T>() index out of bounds");
- return __data[__idx];
- }
-
- _LIBCPP_INLINE_VISIBILITY constexpr pointer data() const noexcept { return __data; }
-
-// [span.iter], span iterator support
- _LIBCPP_INLINE_VISIBILITY constexpr iterator begin() const noexcept { return iterator(data()); }
- _LIBCPP_INLINE_VISIBILITY constexpr iterator end() const noexcept { return iterator(data() + size()); }
- _LIBCPP_INLINE_VISIBILITY constexpr const_iterator cbegin() const noexcept { return const_iterator(data()); }
- _LIBCPP_INLINE_VISIBILITY constexpr const_iterator cend() const noexcept { return const_iterator(data() + size()); }
- _LIBCPP_INLINE_VISIBILITY constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator(end()); }
- _LIBCPP_INLINE_VISIBILITY constexpr reverse_iterator rend() const noexcept { return reverse_iterator(begin()); }
- _LIBCPP_INLINE_VISIBILITY constexpr const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(cend()); }
- _LIBCPP_INLINE_VISIBILITY constexpr const_reverse_iterator crend() const noexcept { return const_reverse_iterator(cbegin()); }
-
- _LIBCPP_INLINE_VISIBILITY constexpr void swap(span &__other) noexcept
- {
- pointer __p = __data;
- __data = __other.__data;
- __other.__data = __p;
-
- index_type __sz = __size;
- __size = __other.__size;
- __other.__size = __sz;
- }
-
- _LIBCPP_INLINE_VISIBILITY span<const byte, dynamic_extent> __as_bytes() const noexcept
- { return {reinterpret_cast<const byte *>(data()), size_bytes()}; }
-
- _LIBCPP_INLINE_VISIBILITY span<byte, dynamic_extent> __as_writeable_bytes() const noexcept
- { return {reinterpret_cast<byte *>(data()), size_bytes()}; }
-
-private:
- pointer __data;
- index_type __size;
-};
-
-// as_bytes & as_writeable_bytes
-template <class _Tp, ptrdiff_t _Extent>
- auto as_bytes(span<_Tp, _Extent> __s) noexcept
- -> decltype(__s.__as_bytes())
- { return __s.__as_bytes(); }
-
-template <class _Tp, ptrdiff_t _Extent>
- auto as_writeable_bytes(span<_Tp, _Extent> __s) noexcept
- -> typename enable_if<!is_const_v<_Tp>, decltype(__s.__as_writeable_bytes())>::type
- { return __s.__as_writeable_bytes(); }
-
-template <class _Tp, ptrdiff_t _Extent>
- constexpr void swap(span<_Tp, _Extent> &__lhs, span<_Tp, _Extent> &__rhs) noexcept
- { __lhs.swap(__rhs); }
-
-
-// Deduction guides
-template<class _Tp, size_t _Sz>
- span(_Tp (&)[_Sz]) -> span<_Tp, _Sz>;
-
-template<class _Tp, size_t _Sz>
- span(array<_Tp, _Sz>&) -> span<_Tp, _Sz>;
-
-template<class _Tp, size_t _Sz>
- span(const array<_Tp, _Sz>&) -> span<const _Tp, _Sz>;
-
-template<class _Container>
- span(_Container&) -> span<typename _Container::value_type>;
-
-template<class _Container>
- span(const _Container&) -> span<const typename _Container::value_type>;
-
-#endif // _LIBCPP_STD_VER > 17
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_SPAN
diff --git a/lib/libcxx/include/sstream b/lib/libcxx/include/sstream
deleted file mode 100644
index 9c3ee13bfba..00000000000
--- a/lib/libcxx/include/sstream
+++ /dev/null
@@ -1,986 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- sstream ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SSTREAM
-#define _LIBCPP_SSTREAM
-
-/*
- sstream synopsis
-
-template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
-class basic_stringbuf
- : public basic_streambuf<charT, traits>
-{
-public:
- typedef charT char_type;
- typedef traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
- typedef Allocator allocator_type;
-
- // 27.8.1.1 Constructors:
- explicit basic_stringbuf(ios_base::openmode which = ios_base::in | ios_base::out);
- explicit basic_stringbuf(const basic_string<char_type, traits_type, allocator_type>& str,
- ios_base::openmode which = ios_base::in | ios_base::out);
- basic_stringbuf(basic_stringbuf&& rhs);
-
- // 27.8.1.2 Assign and swap:
- basic_stringbuf& operator=(basic_stringbuf&& rhs);
- void swap(basic_stringbuf& rhs);
-
- // 27.8.1.3 Get and set:
- basic_string<char_type, traits_type, allocator_type> str() const;
- void str(const basic_string<char_type, traits_type, allocator_type>& s);
-
-protected:
- // 27.8.1.4 Overridden virtual functions:
- virtual int_type underflow();
- virtual int_type pbackfail(int_type c = traits_type::eof());
- virtual int_type overflow (int_type c = traits_type::eof());
- virtual basic_streambuf<char_type, traits_type>* setbuf(char_type*, streamsize);
- virtual pos_type seekoff(off_type off, ios_base::seekdir way,
- ios_base::openmode which = ios_base::in | ios_base::out);
- virtual pos_type seekpos(pos_type sp,
- ios_base::openmode which = ios_base::in | ios_base::out);
-};
-
-template <class charT, class traits, class Allocator>
- void swap(basic_stringbuf<charT, traits, Allocator>& x,
- basic_stringbuf<charT, traits, Allocator>& y);
-
-typedef basic_stringbuf<char> stringbuf;
-typedef basic_stringbuf<wchar_t> wstringbuf;
-
-template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
-class basic_istringstream
- : public basic_istream<charT, traits>
-{
-public:
- typedef charT char_type;
- typedef traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
- typedef Allocator allocator_type;
-
- // 27.8.2.1 Constructors:
- explicit basic_istringstream(ios_base::openmode which = ios_base::in);
- explicit basic_istringstream(const basic_string<char_type, traits_type,allocator_type>& str,
- ios_base::openmode which = ios_base::in);
- basic_istringstream(basic_istringstream&& rhs);
-
- // 27.8.2.2 Assign and swap:
- basic_istringstream& operator=(basic_istringstream&& rhs);
- void swap(basic_istringstream& rhs);
-
- // 27.8.2.3 Members:
- basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;
- basic_string<char_type, traits_type, allocator_type> str() const;
- void str(const basic_string<char_type, traits_type, allocator_type>& s);
-};
-
-template <class charT, class traits, class Allocator>
- void swap(basic_istringstream<charT, traits, Allocator>& x,
- basic_istringstream<charT, traits, Allocator>& y);
-
-typedef basic_istringstream<char> istringstream;
-typedef basic_istringstream<wchar_t> wistringstream;
-
-template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
-class basic_ostringstream
- : public basic_ostream<charT, traits>
-{
-public:
- // types:
- typedef charT char_type;
- typedef traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
- typedef Allocator allocator_type;
-
- // 27.8.3.1 Constructors/destructor:
- explicit basic_ostringstream(ios_base::openmode which = ios_base::out);
- explicit basic_ostringstream(const basic_string<char_type, traits_type, allocator_type>& str,
- ios_base::openmode which = ios_base::out);
- basic_ostringstream(basic_ostringstream&& rhs);
-
- // 27.8.3.2 Assign/swap:
- basic_ostringstream& operator=(basic_ostringstream&& rhs);
- void swap(basic_ostringstream& rhs);
-
- // 27.8.3.3 Members:
- basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;
- basic_string<char_type, traits_type, allocator_type> str() const;
- void str(const basic_string<char_type, traits_type, allocator_type>& s);
-};
-
-template <class charT, class traits, class Allocator>
- void swap(basic_ostringstream<charT, traits, Allocator>& x,
- basic_ostringstream<charT, traits, Allocator>& y);
-
-typedef basic_ostringstream<char> ostringstream;
-typedef basic_ostringstream<wchar_t> wostringstream;
-
-template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
-class basic_stringstream
- : public basic_iostream<charT, traits>
-{
-public:
- // types:
- typedef charT char_type;
- typedef traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
- typedef Allocator allocator_type;
-
- // constructors/destructor
- explicit basic_stringstream(ios_base::openmode which = ios_base::out|ios_base::in);
- explicit basic_stringstream(const basic_string<char_type, traits_type, allocator_type>& str,
- ios_base::openmode which = ios_base::out|ios_base::in);
- basic_stringstream(basic_stringstream&& rhs);
-
- // 27.8.5.1 Assign/swap:
- basic_stringstream& operator=(basic_stringstream&& rhs);
- void swap(basic_stringstream& rhs);
-
- // Members:
- basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;
- basic_string<char_type, traits_type, allocator_type> str() const;
- void str(const basic_string<char_type, traits_type, allocator_type>& str);
-};
-
-template <class charT, class traits, class Allocator>
- void swap(basic_stringstream<charT, traits, Allocator>& x,
- basic_stringstream<charT, traits, Allocator>& y);
-
-typedef basic_stringstream<char> stringstream;
-typedef basic_stringstream<wchar_t> wstringstream;
-
-} // std
-
-*/
-
-#include <__config>
-#include <ostream>
-#include <istream>
-#include <string>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-// basic_stringbuf
-
-template <class _CharT, class _Traits, class _Allocator>
-class _LIBCPP_TEMPLATE_VIS basic_stringbuf
- : public basic_streambuf<_CharT, _Traits>
-{
-public:
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
- typedef _Allocator allocator_type;
-
- typedef basic_string<char_type, traits_type, allocator_type> string_type;
-
-private:
-
- string_type __str_;
- mutable char_type* __hm_;
- ios_base::openmode __mode_;
-
-public:
- // 27.8.1.1 Constructors:
- inline _LIBCPP_INLINE_VISIBILITY
- explicit basic_stringbuf(ios_base::openmode __wch = ios_base::in | ios_base::out);
- inline _LIBCPP_INLINE_VISIBILITY
- explicit basic_stringbuf(const string_type& __s,
- ios_base::openmode __wch = ios_base::in | ios_base::out);
-#ifndef _LIBCPP_CXX03_LANG
- basic_stringbuf(basic_stringbuf&& __rhs);
-
- // 27.8.1.2 Assign and swap:
- basic_stringbuf& operator=(basic_stringbuf&& __rhs);
-#endif
- void swap(basic_stringbuf& __rhs);
-
- // 27.8.1.3 Get and set:
- string_type str() const;
- void str(const string_type& __s);
-
-protected:
- // 27.8.1.4 Overridden virtual functions:
- virtual int_type underflow();
- virtual int_type pbackfail(int_type __c = traits_type::eof());
- virtual int_type overflow (int_type __c = traits_type::eof());
- virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
- ios_base::openmode __wch = ios_base::in | ios_base::out);
- inline _LIBCPP_INLINE_VISIBILITY
- virtual pos_type seekpos(pos_type __sp,
- ios_base::openmode __wch = ios_base::in | ios_base::out);
-};
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(ios_base::openmode __wch)
- : __hm_(0),
- __mode_(__wch)
-{
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(const string_type& __s,
- ios_base::openmode __wch)
- : __str_(__s.get_allocator()),
- __hm_(0),
- __mode_(__wch)
-{
- str(__s);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(basic_stringbuf&& __rhs)
- : __mode_(__rhs.__mode_)
-{
- char_type* __p = const_cast<char_type*>(__rhs.__str_.data());
- ptrdiff_t __binp = -1;
- ptrdiff_t __ninp = -1;
- ptrdiff_t __einp = -1;
- if (__rhs.eback() != nullptr)
- {
- __binp = __rhs.eback() - __p;
- __ninp = __rhs.gptr() - __p;
- __einp = __rhs.egptr() - __p;
- }
- ptrdiff_t __bout = -1;
- ptrdiff_t __nout = -1;
- ptrdiff_t __eout = -1;
- if (__rhs.pbase() != nullptr)
- {
- __bout = __rhs.pbase() - __p;
- __nout = __rhs.pptr() - __p;
- __eout = __rhs.epptr() - __p;
- }
- ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p;
- __str_ = _VSTD::move(__rhs.__str_);
- __p = const_cast<char_type*>(__str_.data());
- if (__binp != -1)
- this->setg(__p + __binp, __p + __ninp, __p + __einp);
- if (__bout != -1)
- {
- this->setp(__p + __bout, __p + __eout);
- this->__pbump(__nout);
- }
- __hm_ = __hm == -1 ? nullptr : __p + __hm;
- __p = const_cast<char_type*>(__rhs.__str_.data());
- __rhs.setg(__p, __p, __p);
- __rhs.setp(__p, __p);
- __rhs.__hm_ = __p;
- this->pubimbue(__rhs.getloc());
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_stringbuf<_CharT, _Traits, _Allocator>&
-basic_stringbuf<_CharT, _Traits, _Allocator>::operator=(basic_stringbuf&& __rhs)
-{
- char_type* __p = const_cast<char_type*>(__rhs.__str_.data());
- ptrdiff_t __binp = -1;
- ptrdiff_t __ninp = -1;
- ptrdiff_t __einp = -1;
- if (__rhs.eback() != nullptr)
- {
- __binp = __rhs.eback() - __p;
- __ninp = __rhs.gptr() - __p;
- __einp = __rhs.egptr() - __p;
- }
- ptrdiff_t __bout = -1;
- ptrdiff_t __nout = -1;
- ptrdiff_t __eout = -1;
- if (__rhs.pbase() != nullptr)
- {
- __bout = __rhs.pbase() - __p;
- __nout = __rhs.pptr() - __p;
- __eout = __rhs.epptr() - __p;
- }
- ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p;
- __str_ = _VSTD::move(__rhs.__str_);
- __p = const_cast<char_type*>(__str_.data());
- if (__binp != -1)
- this->setg(__p + __binp, __p + __ninp, __p + __einp);
- else
- this->setg(nullptr, nullptr, nullptr);
- if (__bout != -1)
- {
- this->setp(__p + __bout, __p + __eout);
- this->__pbump(__nout);
- }
- else
- this->setp(nullptr, nullptr);
-
- __hm_ = __hm == -1 ? nullptr : __p + __hm;
- __mode_ = __rhs.__mode_;
- __p = const_cast<char_type*>(__rhs.__str_.data());
- __rhs.setg(__p, __p, __p);
- __rhs.setp(__p, __p);
- __rhs.__hm_ = __p;
- this->pubimbue(__rhs.getloc());
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits, class _Allocator>
-void
-basic_stringbuf<_CharT, _Traits, _Allocator>::swap(basic_stringbuf& __rhs)
-{
- char_type* __p = const_cast<char_type*>(__rhs.__str_.data());
- ptrdiff_t __rbinp = -1;
- ptrdiff_t __rninp = -1;
- ptrdiff_t __reinp = -1;
- if (__rhs.eback() != nullptr)
- {
- __rbinp = __rhs.eback() - __p;
- __rninp = __rhs.gptr() - __p;
- __reinp = __rhs.egptr() - __p;
- }
- ptrdiff_t __rbout = -1;
- ptrdiff_t __rnout = -1;
- ptrdiff_t __reout = -1;
- if (__rhs.pbase() != nullptr)
- {
- __rbout = __rhs.pbase() - __p;
- __rnout = __rhs.pptr() - __p;
- __reout = __rhs.epptr() - __p;
- }
- ptrdiff_t __rhm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p;
- __p = const_cast<char_type*>(__str_.data());
- ptrdiff_t __lbinp = -1;
- ptrdiff_t __lninp = -1;
- ptrdiff_t __leinp = -1;
- if (this->eback() != nullptr)
- {
- __lbinp = this->eback() - __p;
- __lninp = this->gptr() - __p;
- __leinp = this->egptr() - __p;
- }
- ptrdiff_t __lbout = -1;
- ptrdiff_t __lnout = -1;
- ptrdiff_t __leout = -1;
- if (this->pbase() != nullptr)
- {
- __lbout = this->pbase() - __p;
- __lnout = this->pptr() - __p;
- __leout = this->epptr() - __p;
- }
- ptrdiff_t __lhm = __hm_ == nullptr ? -1 : __hm_ - __p;
- _VSTD::swap(__mode_, __rhs.__mode_);
- __str_.swap(__rhs.__str_);
- __p = const_cast<char_type*>(__str_.data());
- if (__rbinp != -1)
- this->setg(__p + __rbinp, __p + __rninp, __p + __reinp);
- else
- this->setg(nullptr, nullptr, nullptr);
- if (__rbout != -1)
- {
- this->setp(__p + __rbout, __p + __reout);
- this->__pbump(__rnout);
- }
- else
- this->setp(nullptr, nullptr);
- __hm_ = __rhm == -1 ? nullptr : __p + __rhm;
- __p = const_cast<char_type*>(__rhs.__str_.data());
- if (__lbinp != -1)
- __rhs.setg(__p + __lbinp, __p + __lninp, __p + __leinp);
- else
- __rhs.setg(nullptr, nullptr, nullptr);
- if (__lbout != -1)
- {
- __rhs.setp(__p + __lbout, __p + __leout);
- __rhs.__pbump(__lnout);
- }
- else
- __rhs.setp(nullptr, nullptr);
- __rhs.__hm_ = __lhm == -1 ? nullptr : __p + __lhm;
- locale __tl = __rhs.getloc();
- __rhs.pubimbue(this->getloc());
- this->pubimbue(__tl);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(basic_stringbuf<_CharT, _Traits, _Allocator>& __x,
- basic_stringbuf<_CharT, _Traits, _Allocator>& __y)
-{
- __x.swap(__y);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>
-basic_stringbuf<_CharT, _Traits, _Allocator>::str() const
-{
- if (__mode_ & ios_base::out)
- {
- if (__hm_ < this->pptr())
- __hm_ = this->pptr();
- return string_type(this->pbase(), __hm_, __str_.get_allocator());
- }
- else if (__mode_ & ios_base::in)
- return string_type(this->eback(), this->egptr(), __str_.get_allocator());
- return string_type(__str_.get_allocator());
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-void
-basic_stringbuf<_CharT, _Traits, _Allocator>::str(const string_type& __s)
-{
- __str_ = __s;
- __hm_ = 0;
- if (__mode_ & ios_base::in)
- {
- __hm_ = const_cast<char_type*>(__str_.data()) + __str_.size();
- this->setg(const_cast<char_type*>(__str_.data()),
- const_cast<char_type*>(__str_.data()),
- __hm_);
- }
- if (__mode_ & ios_base::out)
- {
- typename string_type::size_type __sz = __str_.size();
- __hm_ = const_cast<char_type*>(__str_.data()) + __sz;
- __str_.resize(__str_.capacity());
- this->setp(const_cast<char_type*>(__str_.data()),
- const_cast<char_type*>(__str_.data()) + __str_.size());
- if (__mode_ & (ios_base::app | ios_base::ate))
- {
- while (__sz > INT_MAX)
- {
- this->pbump(INT_MAX);
- __sz -= INT_MAX;
- }
- if (__sz > 0)
- this->pbump(__sz);
- }
- }
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-typename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type
-basic_stringbuf<_CharT, _Traits, _Allocator>::underflow()
-{
- if (__hm_ < this->pptr())
- __hm_ = this->pptr();
- if (__mode_ & ios_base::in)
- {
- if (this->egptr() < __hm_)
- this->setg(this->eback(), this->gptr(), __hm_);
- if (this->gptr() < this->egptr())
- return traits_type::to_int_type(*this->gptr());
- }
- return traits_type::eof();
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-typename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type
-basic_stringbuf<_CharT, _Traits, _Allocator>::pbackfail(int_type __c)
-{
- if (__hm_ < this->pptr())
- __hm_ = this->pptr();
- if (this->eback() < this->gptr())
- {
- if (traits_type::eq_int_type(__c, traits_type::eof()))
- {
- this->setg(this->eback(), this->gptr()-1, __hm_);
- return traits_type::not_eof(__c);
- }
- if ((__mode_ & ios_base::out) ||
- traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1]))
- {
- this->setg(this->eback(), this->gptr()-1, __hm_);
- *this->gptr() = traits_type::to_char_type(__c);
- return __c;
- }
- }
- return traits_type::eof();
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-typename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type
-basic_stringbuf<_CharT, _Traits, _Allocator>::overflow(int_type __c)
-{
- if (!traits_type::eq_int_type(__c, traits_type::eof()))
- {
- ptrdiff_t __ninp = this->gptr() - this->eback();
- if (this->pptr() == this->epptr())
- {
- if (!(__mode_ & ios_base::out))
- return traits_type::eof();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- ptrdiff_t __nout = this->pptr() - this->pbase();
- ptrdiff_t __hm = __hm_ - this->pbase();
- __str_.push_back(char_type());
- __str_.resize(__str_.capacity());
- char_type* __p = const_cast<char_type*>(__str_.data());
- this->setp(__p, __p + __str_.size());
- this->__pbump(__nout);
- __hm_ = this->pbase() + __hm;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- return traits_type::eof();
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
- __hm_ = _VSTD::max(this->pptr() + 1, __hm_);
- if (__mode_ & ios_base::in)
- {
- char_type* __p = const_cast<char_type*>(__str_.data());
- this->setg(__p, __p + __ninp, __hm_);
- }
- return this->sputc(__c);
- }
- return traits_type::not_eof(__c);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-typename basic_stringbuf<_CharT, _Traits, _Allocator>::pos_type
-basic_stringbuf<_CharT, _Traits, _Allocator>::seekoff(off_type __off,
- ios_base::seekdir __way,
- ios_base::openmode __wch)
-{
- if (__hm_ < this->pptr())
- __hm_ = this->pptr();
- if ((__wch & (ios_base::in | ios_base::out)) == 0)
- return pos_type(-1);
- if ((__wch & (ios_base::in | ios_base::out)) == (ios_base::in | ios_base::out)
- && __way == ios_base::cur)
- return pos_type(-1);
- const ptrdiff_t __hm = __hm_ == nullptr ? 0 : __hm_ - __str_.data();
- off_type __noff;
- switch (__way)
- {
- case ios_base::beg:
- __noff = 0;
- break;
- case ios_base::cur:
- if (__wch & ios_base::in)
- __noff = this->gptr() - this->eback();
- else
- __noff = this->pptr() - this->pbase();
- break;
- case ios_base::end:
- __noff = __hm;
- break;
- default:
- return pos_type(-1);
- }
- __noff += __off;
- if (__noff < 0 || __hm < __noff)
- return pos_type(-1);
- if (__noff != 0)
- {
- if ((__wch & ios_base::in) && this->gptr() == 0)
- return pos_type(-1);
- if ((__wch & ios_base::out) && this->pptr() == 0)
- return pos_type(-1);
- }
- if (__wch & ios_base::in)
- this->setg(this->eback(), this->eback() + __noff, __hm_);
- if (__wch & ios_base::out)
- {
- this->setp(this->pbase(), this->epptr());
- this->pbump(__noff);
- }
- return pos_type(__noff);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-typename basic_stringbuf<_CharT, _Traits, _Allocator>::pos_type
-basic_stringbuf<_CharT, _Traits, _Allocator>::seekpos(pos_type __sp,
- ios_base::openmode __wch)
-{
- return seekoff(__sp, ios_base::beg, __wch);
-}
-
-// basic_istringstream
-
-template <class _CharT, class _Traits, class _Allocator>
-class _LIBCPP_TEMPLATE_VIS basic_istringstream
- : public basic_istream<_CharT, _Traits>
-{
-public:
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
- typedef _Allocator allocator_type;
-
- typedef basic_string<char_type, traits_type, allocator_type> string_type;
-
-private:
- basic_stringbuf<char_type, traits_type, allocator_type> __sb_;
-
-public:
- // 27.8.2.1 Constructors:
- inline _LIBCPP_INLINE_VISIBILITY
- explicit basic_istringstream(ios_base::openmode __wch = ios_base::in);
- inline _LIBCPP_INLINE_VISIBILITY
- explicit basic_istringstream(const string_type& __s,
- ios_base::openmode __wch = ios_base::in);
-#ifndef _LIBCPP_CXX03_LANG
- inline _LIBCPP_INLINE_VISIBILITY
- basic_istringstream(basic_istringstream&& __rhs);
-
- // 27.8.2.2 Assign and swap:
- basic_istringstream& operator=(basic_istringstream&& __rhs);
-#endif // _LIBCPP_CXX03_LANG
- inline _LIBCPP_INLINE_VISIBILITY
- void swap(basic_istringstream& __rhs);
-
- // 27.8.2.3 Members:
- inline _LIBCPP_INLINE_VISIBILITY
- basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;
- inline _LIBCPP_INLINE_VISIBILITY
- string_type str() const;
- inline _LIBCPP_INLINE_VISIBILITY
- void str(const string_type& __s);
-};
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_istringstream<_CharT, _Traits, _Allocator>::basic_istringstream(ios_base::openmode __wch)
- : basic_istream<_CharT, _Traits>(&__sb_),
- __sb_(__wch | ios_base::in)
-{
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_istringstream<_CharT, _Traits, _Allocator>::basic_istringstream(const string_type& __s,
- ios_base::openmode __wch)
- : basic_istream<_CharT, _Traits>(&__sb_),
- __sb_(__s, __wch | ios_base::in)
-{
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_istringstream<_CharT, _Traits, _Allocator>::basic_istringstream(basic_istringstream&& __rhs)
- : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs)),
- __sb_(_VSTD::move(__rhs.__sb_))
-{
- basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_istringstream<_CharT, _Traits, _Allocator>&
-basic_istringstream<_CharT, _Traits, _Allocator>::operator=(basic_istringstream&& __rhs)
-{
- basic_istream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
- __sb_ = _VSTD::move(__rhs.__sb_);
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits, class _Allocator>
-void basic_istringstream<_CharT, _Traits, _Allocator>::swap(basic_istringstream& __rhs)
-{
- basic_istream<char_type, traits_type>::swap(__rhs);
- __sb_.swap(__rhs.__sb_);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(basic_istringstream<_CharT, _Traits, _Allocator>& __x,
- basic_istringstream<_CharT, _Traits, _Allocator>& __y)
-{
- __x.swap(__y);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_stringbuf<_CharT, _Traits, _Allocator>*
-basic_istringstream<_CharT, _Traits, _Allocator>::rdbuf() const
-{
- return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>
-basic_istringstream<_CharT, _Traits, _Allocator>::str() const
-{
- return __sb_.str();
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-void basic_istringstream<_CharT, _Traits, _Allocator>::str(const string_type& __s)
-{
- __sb_.str(__s);
-}
-
-// basic_ostringstream
-
-template <class _CharT, class _Traits, class _Allocator>
-class _LIBCPP_TEMPLATE_VIS basic_ostringstream
- : public basic_ostream<_CharT, _Traits>
-{
-public:
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
- typedef _Allocator allocator_type;
-
- typedef basic_string<char_type, traits_type, allocator_type> string_type;
-
-private:
- basic_stringbuf<char_type, traits_type, allocator_type> __sb_;
-
-public:
- // 27.8.2.1 Constructors:
- inline _LIBCPP_INLINE_VISIBILITY
- explicit basic_ostringstream(ios_base::openmode __wch = ios_base::out);
- inline _LIBCPP_INLINE_VISIBILITY
- explicit basic_ostringstream(const string_type& __s,
- ios_base::openmode __wch = ios_base::out);
-#ifndef _LIBCPP_CXX03_LANG
- inline _LIBCPP_INLINE_VISIBILITY
- basic_ostringstream(basic_ostringstream&& __rhs);
-
- // 27.8.2.2 Assign and swap:
- basic_ostringstream& operator=(basic_ostringstream&& __rhs);
-#endif // _LIBCPP_CXX03_LANG
- inline _LIBCPP_INLINE_VISIBILITY
- void swap(basic_ostringstream& __rhs);
-
- // 27.8.2.3 Members:
- inline _LIBCPP_INLINE_VISIBILITY
- basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;
- inline _LIBCPP_INLINE_VISIBILITY
- string_type str() const;
- inline _LIBCPP_INLINE_VISIBILITY
- void str(const string_type& __s);
-};
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_ostringstream<_CharT, _Traits, _Allocator>::basic_ostringstream(ios_base::openmode __wch)
- : basic_ostream<_CharT, _Traits>(&__sb_),
- __sb_(__wch | ios_base::out)
-{
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_ostringstream<_CharT, _Traits, _Allocator>::basic_ostringstream(const string_type& __s,
- ios_base::openmode __wch)
- : basic_ostream<_CharT, _Traits>(&__sb_),
- __sb_(__s, __wch | ios_base::out)
-{
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_ostringstream<_CharT, _Traits, _Allocator>::basic_ostringstream(basic_ostringstream&& __rhs)
- : basic_ostream<_CharT, _Traits>(_VSTD::move(__rhs)),
- __sb_(_VSTD::move(__rhs.__sb_))
-{
- basic_ostream<_CharT, _Traits>::set_rdbuf(&__sb_);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_ostringstream<_CharT, _Traits, _Allocator>&
-basic_ostringstream<_CharT, _Traits, _Allocator>::operator=(basic_ostringstream&& __rhs)
-{
- basic_ostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
- __sb_ = _VSTD::move(__rhs.__sb_);
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits, class _Allocator>
-void
-basic_ostringstream<_CharT, _Traits, _Allocator>::swap(basic_ostringstream& __rhs)
-{
- basic_ostream<char_type, traits_type>::swap(__rhs);
- __sb_.swap(__rhs.__sb_);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(basic_ostringstream<_CharT, _Traits, _Allocator>& __x,
- basic_ostringstream<_CharT, _Traits, _Allocator>& __y)
-{
- __x.swap(__y);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_stringbuf<_CharT, _Traits, _Allocator>*
-basic_ostringstream<_CharT, _Traits, _Allocator>::rdbuf() const
-{
- return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>
-basic_ostringstream<_CharT, _Traits, _Allocator>::str() const
-{
- return __sb_.str();
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-void
-basic_ostringstream<_CharT, _Traits, _Allocator>::str(const string_type& __s)
-{
- __sb_.str(__s);
-}
-
-// basic_stringstream
-
-template <class _CharT, class _Traits, class _Allocator>
-class _LIBCPP_TEMPLATE_VIS basic_stringstream
- : public basic_iostream<_CharT, _Traits>
-{
-public:
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
- typedef _Allocator allocator_type;
-
- typedef basic_string<char_type, traits_type, allocator_type> string_type;
-
-private:
- basic_stringbuf<char_type, traits_type, allocator_type> __sb_;
-
-public:
- // 27.8.2.1 Constructors:
- inline _LIBCPP_INLINE_VISIBILITY
- explicit basic_stringstream(ios_base::openmode __wch = ios_base::in | ios_base::out);
- inline _LIBCPP_INLINE_VISIBILITY
- explicit basic_stringstream(const string_type& __s,
- ios_base::openmode __wch = ios_base::in | ios_base::out);
-#ifndef _LIBCPP_CXX03_LANG
- inline _LIBCPP_INLINE_VISIBILITY
- basic_stringstream(basic_stringstream&& __rhs);
-
- // 27.8.2.2 Assign and swap:
- basic_stringstream& operator=(basic_stringstream&& __rhs);
-#endif // _LIBCPP_CXX03_LANG
- inline _LIBCPP_INLINE_VISIBILITY
- void swap(basic_stringstream& __rhs);
-
- // 27.8.2.3 Members:
- inline _LIBCPP_INLINE_VISIBILITY
- basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;
- inline _LIBCPP_INLINE_VISIBILITY
- string_type str() const;
- inline _LIBCPP_INLINE_VISIBILITY
- void str(const string_type& __s);
-};
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_stringstream<_CharT, _Traits, _Allocator>::basic_stringstream(ios_base::openmode __wch)
- : basic_iostream<_CharT, _Traits>(&__sb_),
- __sb_(__wch)
-{
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_stringstream<_CharT, _Traits, _Allocator>::basic_stringstream(const string_type& __s,
- ios_base::openmode __wch)
- : basic_iostream<_CharT, _Traits>(&__sb_),
- __sb_(__s, __wch)
-{
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_stringstream<_CharT, _Traits, _Allocator>::basic_stringstream(basic_stringstream&& __rhs)
- : basic_iostream<_CharT, _Traits>(_VSTD::move(__rhs)),
- __sb_(_VSTD::move(__rhs.__sb_))
-{
- basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_stringstream<_CharT, _Traits, _Allocator>&
-basic_stringstream<_CharT, _Traits, _Allocator>::operator=(basic_stringstream&& __rhs)
-{
- basic_iostream<char_type, traits_type>::operator=(_VSTD::move(__rhs));
- __sb_ = _VSTD::move(__rhs.__sb_);
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits, class _Allocator>
-void
-basic_stringstream<_CharT, _Traits, _Allocator>::swap(basic_stringstream& __rhs)
-{
- basic_iostream<char_type, traits_type>::swap(__rhs);
- __sb_.swap(__rhs.__sb_);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(basic_stringstream<_CharT, _Traits, _Allocator>& __x,
- basic_stringstream<_CharT, _Traits, _Allocator>& __y)
-{
- __x.swap(__y);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_stringbuf<_CharT, _Traits, _Allocator>*
-basic_stringstream<_CharT, _Traits, _Allocator>::rdbuf() const
-{
- return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>
-basic_stringstream<_CharT, _Traits, _Allocator>::str() const
-{
- return __sb_.str();
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-void
-basic_stringstream<_CharT, _Traits, _Allocator>::str(const string_type& __s)
-{
- __sb_.str(__s);
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_SSTREAM
diff --git a/lib/libcxx/include/stack b/lib/libcxx/include/stack
deleted file mode 100644
index 2b3f8aea19e..00000000000
--- a/lib/libcxx/include/stack
+++ /dev/null
@@ -1,322 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- stack -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_STACK
-#define _LIBCPP_STACK
-
-/*
- stack synopsis
-
-namespace std
-{
-
-template <class T, class Container = deque<T>>
-class stack
-{
-public:
- typedef Container container_type;
- typedef typename container_type::value_type value_type;
- typedef typename container_type::reference reference;
- typedef typename container_type::const_reference const_reference;
- typedef typename container_type::size_type size_type;
-
-protected:
- container_type c;
-
-public:
- stack() = default;
- ~stack() = default;
-
- stack(const stack& q) = default;
- stack(stack&& q) = default;
-
- stack& operator=(const stack& q) = default;
- stack& operator=(stack&& q) = default;
-
- explicit stack(const container_type& c);
- explicit stack(container_type&& c);
- template <class Alloc> explicit stack(const Alloc& a);
- template <class Alloc> stack(const container_type& c, const Alloc& a);
- template <class Alloc> stack(container_type&& c, const Alloc& a);
- template <class Alloc> stack(const stack& c, const Alloc& a);
- template <class Alloc> stack(stack&& c, const Alloc& a);
-
- bool empty() const;
- size_type size() const;
- reference top();
- const_reference top() const;
-
- void push(const value_type& x);
- void push(value_type&& x);
- template <class... Args> reference emplace(Args&&... args); // reference in C++17
- void pop();
-
- void swap(stack& c) noexcept(is_nothrow_swappable_v<Container>)
-};
-
-template<class Container>
- stack(Container) -> stack<typename Container::value_type, Container>; // C++17
-
-template<class Container, class Allocator>
- stack(Container, Allocator) -> stack<typename Container::value_type, Container>; // C++17
-
-template <class T, class Container>
- bool operator==(const stack<T, Container>& x, const stack<T, Container>& y);
-template <class T, class Container>
- bool operator< (const stack<T, Container>& x, const stack<T, Container>& y);
-template <class T, class Container>
- bool operator!=(const stack<T, Container>& x, const stack<T, Container>& y);
-template <class T, class Container>
- bool operator> (const stack<T, Container>& x, const stack<T, Container>& y);
-template <class T, class Container>
- bool operator>=(const stack<T, Container>& x, const stack<T, Container>& y);
-template <class T, class Container>
- bool operator<=(const stack<T, Container>& x, const stack<T, Container>& y);
-
-template <class T, class Container>
- void swap(stack<T, Container>& x, stack<T, Container>& y)
- noexcept(noexcept(x.swap(y)));
-
-} // std
-
-*/
-
-#include <__config>
-#include <deque>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS stack;
-
-template <class _Tp, class _Container>
-_LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y);
-
-template <class _Tp, class _Container>
-_LIBCPP_INLINE_VISIBILITY
-bool
-operator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y);
-
-template <class _Tp, class _Container /*= deque<_Tp>*/>
-class _LIBCPP_TEMPLATE_VIS stack
-{
-public:
- typedef _Container container_type;
- typedef typename container_type::value_type value_type;
- typedef typename container_type::reference reference;
- typedef typename container_type::const_reference const_reference;
- typedef typename container_type::size_type size_type;
- static_assert((is_same<_Tp, value_type>::value), "" );
-
-protected:
- container_type c;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- stack()
- _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
- : c() {}
-
- _LIBCPP_INLINE_VISIBILITY
- stack(const stack& __q) : c(__q.c) {}
-
- _LIBCPP_INLINE_VISIBILITY
- stack& operator=(const stack& __q) {c = __q.c; return *this;}
-
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- stack(stack&& __q)
- _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
- : c(_VSTD::move(__q.c)) {}
-
- _LIBCPP_INLINE_VISIBILITY
- stack& operator=(stack&& __q)
- _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
- {c = _VSTD::move(__q.c); return *this;}
-
- _LIBCPP_INLINE_VISIBILITY
- explicit stack(container_type&& __c) : c(_VSTD::move(__c)) {}
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- explicit stack(const container_type& __c) : c(__c) {}
-
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- explicit stack(const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type* = 0)
- : c(__a) {}
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- stack(const container_type& __c, const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type* = 0)
- : c(__c, __a) {}
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- stack(const stack& __s, const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type* = 0)
- : c(__s.c, __a) {}
-#ifndef _LIBCPP_CXX03_LANG
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- stack(container_type&& __c, const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type* = 0)
- : c(_VSTD::move(__c), __a) {}
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- stack(stack&& __s, const _Alloc& __a,
- typename enable_if<uses_allocator<container_type,
- _Alloc>::value>::type* = 0)
- : c(_VSTD::move(__s.c), __a) {}
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const {return c.empty();}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const {return c.size();}
- _LIBCPP_INLINE_VISIBILITY
- reference top() {return c.back();}
- _LIBCPP_INLINE_VISIBILITY
- const_reference top() const {return c.back();}
-
- _LIBCPP_INLINE_VISIBILITY
- void push(const value_type& __v) {c.push_back(__v);}
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- void push(value_type&& __v) {c.push_back(_VSTD::move(__v));}
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
-#if _LIBCPP_STD_VER > 14
- decltype(auto) emplace(_Args&&... __args)
- { return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
-#else
- void emplace(_Args&&... __args)
- { c.emplace_back(_VSTD::forward<_Args>(__args)...);}
-#endif
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- void pop() {c.pop_back();}
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(stack& __s)
- _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
- {
- using _VSTD::swap;
- swap(c, __s.c);
- }
-
- template <class T1, class _C1>
- friend
- bool
- operator==(const stack<T1, _C1>& __x, const stack<T1, _C1>& __y);
-
- template <class T1, class _C1>
- friend
- bool
- operator< (const stack<T1, _C1>& __x, const stack<T1, _C1>& __y);
-};
-
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-template<class _Container,
- class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type
->
-stack(_Container)
- -> stack<typename _Container::value_type, _Container>;
-
-template<class _Container,
- class _Alloc,
- class = typename enable_if<!__is_allocator<_Container>::value, nullptr_t>::type,
- class = typename enable_if< __is_allocator<_Alloc>::value, nullptr_t>::type
- >
-stack(_Container, _Alloc)
- -> stack<typename _Container::value_type, _Container>;
-#endif
-
-template <class _Tp, class _Container>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
-{
- return __x.c == __y.c;
-}
-
-template <class _Tp, class _Container>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
-{
- return __x.c < __y.c;
-}
-
-template <class _Tp, class _Container>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _Tp, class _Container>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator> (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
-{
- return __y < __x;
-}
-
-template <class _Tp, class _Container>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
-{
- return !(__x < __y);
-}
-
-template <class _Tp, class _Container>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y)
-{
- return !(__y < __x);
-}
-
-template <class _Tp, class _Container>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if<
- __is_swappable<_Container>::value,
- void
->::type
-swap(stack<_Tp, _Container>& __x, stack<_Tp, _Container>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-template <class _Tp, class _Container, class _Alloc>
-struct _LIBCPP_TEMPLATE_VIS uses_allocator<stack<_Tp, _Container>, _Alloc>
- : public uses_allocator<_Container, _Alloc>
-{
-};
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_STACK
diff --git a/lib/libcxx/include/stdbool.h b/lib/libcxx/include/stdbool.h
deleted file mode 100644
index 86a127f0fd6..00000000000
--- a/lib/libcxx/include/stdbool.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- stdbool.h --------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#ifndef _LIBCPP_STDBOOL_H
-#define _LIBCPP_STDBOOL_H
-
-
-/*
- stdbool.h synopsis
-
-Macros:
-
- __bool_true_false_are_defined
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#include_next <stdbool.h>
-
-#ifdef __cplusplus
-#undef bool
-#undef true
-#undef false
-#undef __bool_true_false_are_defined
-#define __bool_true_false_are_defined 1
-#endif
-
-#endif // _LIBCPP_STDBOOL_H
diff --git a/lib/libcxx/include/stddef.h b/lib/libcxx/include/stddef.h
deleted file mode 100644
index f65065d869a..00000000000
--- a/lib/libcxx/include/stddef.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- stddef.h ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#if defined(__need_ptrdiff_t) || defined(__need_size_t) || \
- defined(__need_wchar_t) || defined(__need_NULL) || defined(__need_wint_t)
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#include_next <stddef.h>
-
-#elif !defined(_LIBCPP_STDDEF_H)
-#define _LIBCPP_STDDEF_H
-
-/*
- stddef.h synopsis
-
-Macros:
-
- offsetof(type,member-designator)
- NULL
-
-Types:
-
- ptrdiff_t
- size_t
- max_align_t
- nullptr_t
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#include_next <stddef.h>
-
-#ifdef __cplusplus
-
-extern "C++" {
-#include <__nullptr>
-using std::nullptr_t;
-}
-
-// Re-use the compiler's <stddef.h> max_align_t where possible.
-#if !defined(__CLANG_MAX_ALIGN_T_DEFINED) && !defined(_GCC_MAX_ALIGN_T) && \
- !defined(__DEFINED_max_align_t) && !defined(__NetBSD__)
-typedef long double max_align_t;
-#endif
-
-#endif
-
-#endif // _LIBCPP_STDDEF_H
diff --git a/lib/libcxx/include/stdexcept b/lib/libcxx/include/stdexcept
deleted file mode 100644
index 3ec79349aa9..00000000000
--- a/lib/libcxx/include/stdexcept
+++ /dev/null
@@ -1,278 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- stdexcept --------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_STDEXCEPT
-#define _LIBCPP_STDEXCEPT
-
-/*
- stdexcept synopsis
-
-namespace std
-{
-
-class logic_error;
- class domain_error;
- class invalid_argument;
- class length_error;
- class out_of_range;
-class runtime_error;
- class range_error;
- class overflow_error;
- class underflow_error;
-
-for each class xxx_error:
-
-class xxx_error : public exception // at least indirectly
-{
-public:
- explicit xxx_error(const string& what_arg);
- explicit xxx_error(const char* what_arg);
-
- virtual const char* what() const noexcept // returns what_arg
-};
-
-} // std
-
-*/
-
-#include <__config>
-#include <exception>
-#include <iosfwd> // for string forward decl
-#ifdef _LIBCPP_NO_EXCEPTIONS
-#include <cstdlib>
-#endif
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-class _LIBCPP_HIDDEN __libcpp_refstring
-{
- const char* __imp_;
-
- bool __uses_refcount() const;
-public:
- explicit __libcpp_refstring(const char* __msg);
- __libcpp_refstring(const __libcpp_refstring& __s) _NOEXCEPT;
- __libcpp_refstring& operator=(const __libcpp_refstring& __s) _NOEXCEPT;
- ~__libcpp_refstring();
-
- const char* c_str() const _NOEXCEPT {return __imp_;}
-};
-
-_LIBCPP_END_NAMESPACE_STD
-
-namespace std // purposefully not using versioning namespace
-{
-
-class _LIBCPP_EXCEPTION_ABI logic_error
- : public exception
-{
-private:
- _VSTD::__libcpp_refstring __imp_;
-public:
- explicit logic_error(const string&);
- explicit logic_error(const char*);
-
- logic_error(const logic_error&) _NOEXCEPT;
- logic_error& operator=(const logic_error&) _NOEXCEPT;
-
- virtual ~logic_error() _NOEXCEPT;
-
- virtual const char* what() const _NOEXCEPT;
-};
-
-class _LIBCPP_EXCEPTION_ABI runtime_error
- : public exception
-{
-private:
- _VSTD::__libcpp_refstring __imp_;
-public:
- explicit runtime_error(const string&);
- explicit runtime_error(const char*);
-
- runtime_error(const runtime_error&) _NOEXCEPT;
- runtime_error& operator=(const runtime_error&) _NOEXCEPT;
-
- virtual ~runtime_error() _NOEXCEPT;
-
- virtual const char* what() const _NOEXCEPT;
-};
-
-class _LIBCPP_EXCEPTION_ABI domain_error
- : public logic_error
-{
-public:
- _LIBCPP_INLINE_VISIBILITY explicit domain_error(const string& __s) : logic_error(__s) {}
- _LIBCPP_INLINE_VISIBILITY explicit domain_error(const char* __s) : logic_error(__s) {}
-
- virtual ~domain_error() _NOEXCEPT;
-};
-
-class _LIBCPP_EXCEPTION_ABI invalid_argument
- : public logic_error
-{
-public:
- _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const string& __s) : logic_error(__s) {}
- _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const char* __s) : logic_error(__s) {}
-
- virtual ~invalid_argument() _NOEXCEPT;
-};
-
-class _LIBCPP_EXCEPTION_ABI length_error
- : public logic_error
-{
-public:
- _LIBCPP_INLINE_VISIBILITY explicit length_error(const string& __s) : logic_error(__s) {}
- _LIBCPP_INLINE_VISIBILITY explicit length_error(const char* __s) : logic_error(__s) {}
-
- virtual ~length_error() _NOEXCEPT;
-};
-
-class _LIBCPP_EXCEPTION_ABI out_of_range
- : public logic_error
-{
-public:
- _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const string& __s) : logic_error(__s) {}
- _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const char* __s) : logic_error(__s) {}
-
- virtual ~out_of_range() _NOEXCEPT;
-};
-
-class _LIBCPP_EXCEPTION_ABI range_error
- : public runtime_error
-{
-public:
- _LIBCPP_INLINE_VISIBILITY explicit range_error(const string& __s) : runtime_error(__s) {}
- _LIBCPP_INLINE_VISIBILITY explicit range_error(const char* __s) : runtime_error(__s) {}
-
- virtual ~range_error() _NOEXCEPT;
-};
-
-class _LIBCPP_EXCEPTION_ABI overflow_error
- : public runtime_error
-{
-public:
- _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const string& __s) : runtime_error(__s) {}
- _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const char* __s) : runtime_error(__s) {}
-
- virtual ~overflow_error() _NOEXCEPT;
-};
-
-class _LIBCPP_EXCEPTION_ABI underflow_error
- : public runtime_error
-{
-public:
- _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const string& __s) : runtime_error(__s) {}
- _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const char* __s) : runtime_error(__s) {}
-
- virtual ~underflow_error() _NOEXCEPT;
-};
-
-} // std
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-// in the dylib
-_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_runtime_error(const char*);
-
-_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
-void __throw_logic_error(const char*__msg)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- throw logic_error(__msg);
-#else
- ((void)__msg);
- _VSTD::abort();
-#endif
-}
-
-_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
-void __throw_domain_error(const char*__msg)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- throw domain_error(__msg);
-#else
- ((void)__msg);
- _VSTD::abort();
-#endif
-}
-
-_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
-void __throw_invalid_argument(const char*__msg)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- throw invalid_argument(__msg);
-#else
- ((void)__msg);
- _VSTD::abort();
-#endif
-}
-
-_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
-void __throw_length_error(const char*__msg)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- throw length_error(__msg);
-#else
- ((void)__msg);
- _VSTD::abort();
-#endif
-}
-
-_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
-void __throw_out_of_range(const char*__msg)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- throw out_of_range(__msg);
-#else
- ((void)__msg);
- _VSTD::abort();
-#endif
-}
-
-_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
-void __throw_range_error(const char*__msg)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- throw range_error(__msg);
-#else
- ((void)__msg);
- _VSTD::abort();
-#endif
-}
-
-_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
-void __throw_overflow_error(const char*__msg)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- throw overflow_error(__msg);
-#else
- ((void)__msg);
- _VSTD::abort();
-#endif
-}
-
-_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
-void __throw_underflow_error(const char*__msg)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- throw underflow_error(__msg);
-#else
- ((void)__msg);
- _VSTD::abort();
-#endif
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_STDEXCEPT
diff --git a/lib/libcxx/include/stdint.h b/lib/libcxx/include/stdint.h
deleted file mode 100644
index 468f6cd97c2..00000000000
--- a/lib/libcxx/include/stdint.h
+++ /dev/null
@@ -1,121 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- stdint.h --------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_STDINT_H
-#define _LIBCPP_STDINT_H
-
-/*
- stdint.h synopsis
-
-Macros:
-
- INT8_MIN
- INT16_MIN
- INT32_MIN
- INT64_MIN
-
- INT8_MAX
- INT16_MAX
- INT32_MAX
- INT64_MAX
-
- UINT8_MAX
- UINT16_MAX
- UINT32_MAX
- UINT64_MAX
-
- INT_LEAST8_MIN
- INT_LEAST16_MIN
- INT_LEAST32_MIN
- INT_LEAST64_MIN
-
- INT_LEAST8_MAX
- INT_LEAST16_MAX
- INT_LEAST32_MAX
- INT_LEAST64_MAX
-
- UINT_LEAST8_MAX
- UINT_LEAST16_MAX
- UINT_LEAST32_MAX
- UINT_LEAST64_MAX
-
- INT_FAST8_MIN
- INT_FAST16_MIN
- INT_FAST32_MIN
- INT_FAST64_MIN
-
- INT_FAST8_MAX
- INT_FAST16_MAX
- INT_FAST32_MAX
- INT_FAST64_MAX
-
- UINT_FAST8_MAX
- UINT_FAST16_MAX
- UINT_FAST32_MAX
- UINT_FAST64_MAX
-
- INTPTR_MIN
- INTPTR_MAX
- UINTPTR_MAX
-
- INTMAX_MIN
- INTMAX_MAX
-
- UINTMAX_MAX
-
- PTRDIFF_MIN
- PTRDIFF_MAX
-
- SIG_ATOMIC_MIN
- SIG_ATOMIC_MAX
-
- SIZE_MAX
-
- WCHAR_MIN
- WCHAR_MAX
-
- WINT_MIN
- WINT_MAX
-
- INT8_C(value)
- INT16_C(value)
- INT32_C(value)
- INT64_C(value)
-
- UINT8_C(value)
- UINT16_C(value)
- UINT32_C(value)
- UINT64_C(value)
-
- INTMAX_C(value)
- UINTMAX_C(value)
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-/* C99 stdlib (e.g. glibc < 2.18) does not provide macros needed
- for C++11 unless __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS
- are defined
-*/
-#if defined(__cplusplus) && !defined(__STDC_LIMIT_MACROS)
-# define __STDC_LIMIT_MACROS
-#endif
-#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS)
-# define __STDC_CONSTANT_MACROS
-#endif
-
-#include_next <stdint.h>
-
-#endif // _LIBCPP_STDINT_H
diff --git a/lib/libcxx/include/stdio.h b/lib/libcxx/include/stdio.h
deleted file mode 100644
index b2e7cc28c98..00000000000
--- a/lib/libcxx/include/stdio.h
+++ /dev/null
@@ -1,122 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- stdio.h ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#if defined(__need_FILE) || defined(__need___FILE)
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#include_next <stdio.h>
-
-#elif !defined(_LIBCPP_STDIO_H)
-#define _LIBCPP_STDIO_H
-
-/*
- stdio.h synopsis
-
-Macros:
-
- BUFSIZ
- EOF
- FILENAME_MAX
- FOPEN_MAX
- L_tmpnam
- NULL
- SEEK_CUR
- SEEK_END
- SEEK_SET
- TMP_MAX
- _IOFBF
- _IOLBF
- _IONBF
- stderr
- stdin
- stdout
-
-Types:
-
-FILE
-fpos_t
-size_t
-
-int remove(const char* filename);
-int rename(const char* old, const char* new);
-FILE* tmpfile(void);
-char* tmpnam(char* s);
-int fclose(FILE* stream);
-int fflush(FILE* stream);
-FILE* fopen(const char* restrict filename, const char* restrict mode);
-FILE* freopen(const char* restrict filename, const char * restrict mode,
- FILE * restrict stream);
-void setbuf(FILE* restrict stream, char* restrict buf);
-int setvbuf(FILE* restrict stream, char* restrict buf, int mode, size_t size);
-int fprintf(FILE* restrict stream, const char* restrict format, ...);
-int fscanf(FILE* restrict stream, const char * restrict format, ...);
-int printf(const char* restrict format, ...);
-int scanf(const char* restrict format, ...);
-int snprintf(char* restrict s, size_t n, const char* restrict format, ...); // C99
-int sprintf(char* restrict s, const char* restrict format, ...);
-int sscanf(const char* restrict s, const char* restrict format, ...);
-int vfprintf(FILE* restrict stream, const char* restrict format, va_list arg);
-int vfscanf(FILE* restrict stream, const char* restrict format, va_list arg); // C99
-int vprintf(const char* restrict format, va_list arg);
-int vscanf(const char* restrict format, va_list arg); // C99
-int vsnprintf(char* restrict s, size_t n, const char* restrict format, // C99
- va_list arg);
-int vsprintf(char* restrict s, const char* restrict format, va_list arg);
-int vsscanf(const char* restrict s, const char* restrict format, va_list arg); // C99
-int fgetc(FILE* stream);
-char* fgets(char* restrict s, int n, FILE* restrict stream);
-int fputc(int c, FILE* stream);
-int fputs(const char* restrict s, FILE* restrict stream);
-int getc(FILE* stream);
-int getchar(void);
-char* gets(char* s); // removed in C++14
-int putc(int c, FILE* stream);
-int putchar(int c);
-int puts(const char* s);
-int ungetc(int c, FILE* stream);
-size_t fread(void* restrict ptr, size_t size, size_t nmemb,
- FILE* restrict stream);
-size_t fwrite(const void* restrict ptr, size_t size, size_t nmemb,
- FILE* restrict stream);
-int fgetpos(FILE* restrict stream, fpos_t* restrict pos);
-int fseek(FILE* stream, long offset, int whence);
-int fsetpos(FILE*stream, const fpos_t* pos);
-long ftell(FILE* stream);
-void rewind(FILE* stream);
-void clearerr(FILE* stream);
-int feof(FILE* stream);
-int ferror(FILE* stream);
-void perror(const char* s);
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#include_next <stdio.h>
-
-#ifdef __cplusplus
-
-#undef getc
-#undef putc
-#undef clearerr
-#undef feof
-#undef ferror
-#undef putchar
-#undef getchar
-
-#endif
-
-#endif // _LIBCPP_STDIO_H
diff --git a/lib/libcxx/include/stdlib.h b/lib/libcxx/include/stdlib.h
deleted file mode 100644
index f11c5e76226..00000000000
--- a/lib/libcxx/include/stdlib.h
+++ /dev/null
@@ -1,126 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- stdlib.h ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#if defined(__need_malloc_and_calloc)
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#include_next <stdlib.h>
-
-#elif !defined(_LIBCPP_STDLIB_H)
-#define _LIBCPP_STDLIB_H
-
-/*
- stdlib.h synopsis
-
-Macros:
-
- EXIT_FAILURE
- EXIT_SUCCESS
- MB_CUR_MAX
- NULL
- RAND_MAX
-
-Types:
-
- size_t
- div_t
- ldiv_t
- lldiv_t // C99
-
-double atof (const char* nptr);
-int atoi (const char* nptr);
-long atol (const char* nptr);
-long long atoll(const char* nptr); // C99
-double strtod (const char* restrict nptr, char** restrict endptr);
-float strtof (const char* restrict nptr, char** restrict endptr); // C99
-long double strtold (const char* restrict nptr, char** restrict endptr); // C99
-long strtol (const char* restrict nptr, char** restrict endptr, int base);
-long long strtoll (const char* restrict nptr, char** restrict endptr, int base); // C99
-unsigned long strtoul (const char* restrict nptr, char** restrict endptr, int base);
-unsigned long long strtoull(const char* restrict nptr, char** restrict endptr, int base); // C99
-int rand(void);
-void srand(unsigned int seed);
-void* calloc(size_t nmemb, size_t size);
-void free(void* ptr);
-void* malloc(size_t size);
-void* realloc(void* ptr, size_t size);
-void abort(void);
-int atexit(void (*func)(void));
-void exit(int status);
-void _Exit(int status);
-char* getenv(const char* name);
-int system(const char* string);
-void* bsearch(const void* key, const void* base, size_t nmemb, size_t size,
- int (*compar)(const void *, const void *));
-void qsort(void* base, size_t nmemb, size_t size,
- int (*compar)(const void *, const void *));
-int abs( int j);
-long abs( long j);
-long long abs(long long j); // C++0X
-long labs( long j);
-long long llabs(long long j); // C99
-div_t div( int numer, int denom);
-ldiv_t div( long numer, long denom);
-lldiv_t div(long long numer, long long denom); // C++0X
-ldiv_t ldiv( long numer, long denom);
-lldiv_t lldiv(long long numer, long long denom); // C99
-int mblen(const char* s, size_t n);
-int mbtowc(wchar_t* restrict pwc, const char* restrict s, size_t n);
-int wctomb(char* s, wchar_t wchar);
-size_t mbstowcs(wchar_t* restrict pwcs, const char* restrict s, size_t n);
-size_t wcstombs(char* restrict s, const wchar_t* restrict pwcs, size_t n);
-int at_quick_exit(void (*func)(void)) // C++11
-void quick_exit(int status); // C++11
-void *aligned_alloc(size_t alignment, size_t size); // C11
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#include_next <stdlib.h>
-
-#ifdef __cplusplus
-
-extern "C++" {
-
-#undef abs
-#undef div
-#undef labs
-#undef ldiv
-#ifndef _LIBCPP_HAS_NO_LONG_LONG
-#undef llabs
-#undef lldiv
-#endif
-
-// MSVCRT already has the correct prototype in <stdlib.h> if __cplusplus is defined
-#if !defined(_LIBCPP_MSVCRT) && !defined(__sun__) && !defined(_AIX)
-inline _LIBCPP_INLINE_VISIBILITY long abs( long __x) _NOEXCEPT {return labs(__x);}
-#ifndef _LIBCPP_HAS_NO_LONG_LONG
-inline _LIBCPP_INLINE_VISIBILITY long long abs(long long __x) _NOEXCEPT {return llabs(__x);}
-#endif // _LIBCPP_HAS_NO_LONG_LONG
-
-inline _LIBCPP_INLINE_VISIBILITY ldiv_t div( long __x, long __y) _NOEXCEPT {return ldiv(__x, __y);}
-#ifndef _LIBCPP_HAS_NO_LONG_LONG
-inline _LIBCPP_INLINE_VISIBILITY lldiv_t div(long long __x, long long __y) _NOEXCEPT {return lldiv(__x, __y);}
-#endif // _LIBCPP_HAS_NO_LONG_LONG
-#endif // _LIBCPP_MSVCRT / __sun__ / _AIX
-
-} // extern "C++"
-
-#endif // __cplusplus
-
-#endif // _LIBCPP_STDLIB_H
diff --git a/lib/libcxx/include/streambuf b/lib/libcxx/include/streambuf
deleted file mode 100644
index dd293dc639b..00000000000
--- a/lib/libcxx/include/streambuf
+++ /dev/null
@@ -1,501 +0,0 @@
-// -*- C++ -*-
-//===------------------------- streambuf ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_STEAMBUF
-#define _LIBCPP_STEAMBUF
-
-/*
- streambuf synopsis
-
-namespace std
-{
-
-template <class charT, class traits = char_traits<charT> >
-class basic_streambuf
-{
-public:
- // types:
- typedef charT char_type;
- typedef traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- virtual ~basic_streambuf();
-
- // 27.6.2.2.1 locales:
- locale pubimbue(const locale& loc);
- locale getloc() const;
-
- // 27.6.2.2.2 buffer and positioning:
- basic_streambuf* pubsetbuf(char_type* s, streamsize n);
- pos_type pubseekoff(off_type off, ios_base::seekdir way,
- ios_base::openmode which = ios_base::in | ios_base::out);
- pos_type pubseekpos(pos_type sp,
- ios_base::openmode which = ios_base::in | ios_base::out);
- int pubsync();
-
- // Get and put areas:
- // 27.6.2.2.3 Get area:
- streamsize in_avail();
- int_type snextc();
- int_type sbumpc();
- int_type sgetc();
- streamsize sgetn(char_type* s, streamsize n);
-
- // 27.6.2.2.4 Putback:
- int_type sputbackc(char_type c);
- int_type sungetc();
-
- // 27.6.2.2.5 Put area:
- int_type sputc(char_type c);
- streamsize sputn(const char_type* s, streamsize n);
-
-protected:
- basic_streambuf();
- basic_streambuf(const basic_streambuf& rhs);
- basic_streambuf& operator=(const basic_streambuf& rhs);
- void swap(basic_streambuf& rhs);
-
- // 27.6.2.3.2 Get area:
- char_type* eback() const;
- char_type* gptr() const;
- char_type* egptr() const;
- void gbump(int n);
- void setg(char_type* gbeg, char_type* gnext, char_type* gend);
-
- // 27.6.2.3.3 Put area:
- char_type* pbase() const;
- char_type* pptr() const;
- char_type* epptr() const;
- void pbump(int n);
- void setp(char_type* pbeg, char_type* pend);
-
- // 27.6.2.4 virtual functions:
- // 27.6.2.4.1 Locales:
- virtual void imbue(const locale& loc);
-
- // 27.6.2.4.2 Buffer management and positioning:
- virtual basic_streambuf* setbuf(char_type* s, streamsize n);
- virtual pos_type seekoff(off_type off, ios_base::seekdir way,
- ios_base::openmode which = ios_base::in | ios_base::out);
- virtual pos_type seekpos(pos_type sp,
- ios_base::openmode which = ios_base::in | ios_base::out);
- virtual int sync();
-
- // 27.6.2.4.3 Get area:
- virtual streamsize showmanyc();
- virtual streamsize xsgetn(char_type* s, streamsize n);
- virtual int_type underflow();
- virtual int_type uflow();
-
- // 27.6.2.4.4 Putback:
- virtual int_type pbackfail(int_type c = traits_type::eof());
-
- // 27.6.2.4.5 Put area:
- virtual streamsize xsputn(const char_type* s, streamsize n);
- virtual int_type overflow (int_type c = traits_type::eof());
-};
-
-} // std
-
-*/
-
-#include <__config>
-#include <iosfwd>
-#include <ios>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _CharT, class _Traits>
-class _LIBCPP_TEMPLATE_VIS basic_streambuf
-{
-public:
- // types:
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef typename traits_type::int_type int_type;
- typedef typename traits_type::pos_type pos_type;
- typedef typename traits_type::off_type off_type;
-
- static_assert((is_same<_CharT, typename traits_type::char_type>::value),
- "traits_type::char_type must be the same type as CharT");
-
- virtual ~basic_streambuf();
-
- // 27.6.2.2.1 locales:
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- locale pubimbue(const locale& __loc) {
- imbue(__loc);
- locale __r = __loc_;
- __loc_ = __loc;
- return __r;
- }
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- locale getloc() const { return __loc_; }
-
- // 27.6.2.2.2 buffer and positioning:
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- basic_streambuf* pubsetbuf(char_type* __s, streamsize __n)
- { return setbuf(__s, __n); }
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- pos_type pubseekoff(off_type __off, ios_base::seekdir __way,
- ios_base::openmode __which = ios_base::in | ios_base::out)
- { return seekoff(__off, __way, __which); }
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- pos_type pubseekpos(pos_type __sp,
- ios_base::openmode __which = ios_base::in | ios_base::out)
- { return seekpos(__sp, __which); }
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- int pubsync() { return sync(); }
-
- // Get and put areas:
- // 27.6.2.2.3 Get area:
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- streamsize in_avail() {
- if (__ninp_ < __einp_)
- return static_cast<streamsize>(__einp_ - __ninp_);
- return showmanyc();
- }
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- int_type snextc() {
- if (sbumpc() == traits_type::eof())
- return traits_type::eof();
- return sgetc();
- }
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- int_type sbumpc() {
- if (__ninp_ == __einp_)
- return uflow();
- return traits_type::to_int_type(*__ninp_++);
- }
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- int_type sgetc() {
- if (__ninp_ == __einp_)
- return underflow();
- return traits_type::to_int_type(*__ninp_);
- }
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- streamsize sgetn(char_type* __s, streamsize __n)
- { return xsgetn(__s, __n); }
-
- // 27.6.2.2.4 Putback:
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- int_type sputbackc(char_type __c) {
- if (__binp_ == __ninp_ || !traits_type::eq(__c, __ninp_[-1]))
- return pbackfail(traits_type::to_int_type(__c));
- return traits_type::to_int_type(*--__ninp_);
- }
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- int_type sungetc() {
- if (__binp_ == __ninp_)
- return pbackfail();
- return traits_type::to_int_type(*--__ninp_);
- }
-
- // 27.6.2.2.5 Put area:
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- int_type sputc(char_type __c) {
- if (__nout_ == __eout_)
- return overflow(traits_type::to_int_type(__c));
- *__nout_++ = __c;
- return traits_type::to_int_type(__c);
- }
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- streamsize sputn(const char_type* __s, streamsize __n)
- { return xsputn(__s, __n); }
-
-protected:
- basic_streambuf();
- basic_streambuf(const basic_streambuf& __rhs);
- basic_streambuf& operator=(const basic_streambuf& __rhs);
- void swap(basic_streambuf& __rhs);
-
- // 27.6.2.3.2 Get area:
- _LIBCPP_INLINE_VISIBILITY char_type* eback() const {return __binp_;}
- _LIBCPP_INLINE_VISIBILITY char_type* gptr() const {return __ninp_;}
- _LIBCPP_INLINE_VISIBILITY char_type* egptr() const {return __einp_;}
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- void gbump(int __n) { __ninp_ += __n; }
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- void setg(char_type* __gbeg, char_type* __gnext, char_type* __gend) {
- __binp_ = __gbeg;
- __ninp_ = __gnext;
- __einp_ = __gend;
- }
-
- // 27.6.2.3.3 Put area:
- _LIBCPP_INLINE_VISIBILITY char_type* pbase() const {return __bout_;}
- _LIBCPP_INLINE_VISIBILITY char_type* pptr() const {return __nout_;}
- _LIBCPP_INLINE_VISIBILITY char_type* epptr() const {return __eout_;}
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- void pbump(int __n) { __nout_ += __n; }
-
- _LIBCPP_INLINE_VISIBILITY
- void __pbump(streamsize __n) { __nout_ += __n; }
-
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- void setp(char_type* __pbeg, char_type* __pend) {
- __bout_ = __nout_ = __pbeg;
- __eout_ = __pend;
- }
-
- // 27.6.2.4 virtual functions:
- // 27.6.2.4.1 Locales:
- virtual void imbue(const locale& __loc);
-
- // 27.6.2.4.2 Buffer management and positioning:
- virtual basic_streambuf* setbuf(char_type* __s, streamsize __n);
- virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
- ios_base::openmode __which = ios_base::in | ios_base::out);
- virtual pos_type seekpos(pos_type __sp,
- ios_base::openmode __which = ios_base::in | ios_base::out);
- virtual int sync();
-
- // 27.6.2.4.3 Get area:
- virtual streamsize showmanyc();
- virtual streamsize xsgetn(char_type* __s, streamsize __n);
- virtual int_type underflow();
- virtual int_type uflow();
-
- // 27.6.2.4.4 Putback:
- virtual int_type pbackfail(int_type __c = traits_type::eof());
-
- // 27.6.2.4.5 Put area:
- virtual streamsize xsputn(const char_type* __s, streamsize __n);
- virtual int_type overflow(int_type __c = traits_type::eof());
-
-private:
- locale __loc_;
- char_type* __binp_;
- char_type* __ninp_;
- char_type* __einp_;
- char_type* __bout_;
- char_type* __nout_;
- char_type* __eout_;
-};
-
-template <class _CharT, class _Traits>
-basic_streambuf<_CharT, _Traits>::~basic_streambuf()
-{
-}
-
-template <class _CharT, class _Traits>
-basic_streambuf<_CharT, _Traits>::basic_streambuf()
- : __binp_(0),
- __ninp_(0),
- __einp_(0),
- __bout_(0),
- __nout_(0),
- __eout_(0)
-{
-}
-
-template <class _CharT, class _Traits>
-basic_streambuf<_CharT, _Traits>::basic_streambuf(const basic_streambuf& __sb)
- : __loc_(__sb.__loc_),
- __binp_(__sb.__binp_),
- __ninp_(__sb.__ninp_),
- __einp_(__sb.__einp_),
- __bout_(__sb.__bout_),
- __nout_(__sb.__nout_),
- __eout_(__sb.__eout_)
-{
-}
-
-template <class _CharT, class _Traits>
-basic_streambuf<_CharT, _Traits>&
-basic_streambuf<_CharT, _Traits>::operator=(const basic_streambuf& __sb)
-{
- __loc_ = __sb.__loc_;
- __binp_ = __sb.__binp_;
- __ninp_ = __sb.__ninp_;
- __einp_ = __sb.__einp_;
- __bout_ = __sb.__bout_;
- __nout_ = __sb.__nout_;
- __eout_ = __sb.__eout_;
- return *this;
-}
-
-template <class _CharT, class _Traits>
-void
-basic_streambuf<_CharT, _Traits>::swap(basic_streambuf& __sb)
-{
- _VSTD::swap(__loc_, __sb.__loc_);
- _VSTD::swap(__binp_, __sb.__binp_);
- _VSTD::swap(__ninp_, __sb.__ninp_);
- _VSTD::swap(__einp_, __sb.__einp_);
- _VSTD::swap(__bout_, __sb.__bout_);
- _VSTD::swap(__nout_, __sb.__nout_);
- _VSTD::swap(__eout_, __sb.__eout_);
-}
-
-template <class _CharT, class _Traits>
-void
-basic_streambuf<_CharT, _Traits>::imbue(const locale&)
-{
-}
-
-template <class _CharT, class _Traits>
-basic_streambuf<_CharT, _Traits>*
-basic_streambuf<_CharT, _Traits>::setbuf(char_type*, streamsize)
-{
- return this;
-}
-
-template <class _CharT, class _Traits>
-typename basic_streambuf<_CharT, _Traits>::pos_type
-basic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir,
- ios_base::openmode)
-{
- return pos_type(off_type(-1));
-}
-
-template <class _CharT, class _Traits>
-typename basic_streambuf<_CharT, _Traits>::pos_type
-basic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode)
-{
- return pos_type(off_type(-1));
-}
-
-template <class _CharT, class _Traits>
-int
-basic_streambuf<_CharT, _Traits>::sync()
-{
- return 0;
-}
-
-template <class _CharT, class _Traits>
-streamsize
-basic_streambuf<_CharT, _Traits>::showmanyc()
-{
- return 0;
-}
-
-template <class _CharT, class _Traits>
-streamsize
-basic_streambuf<_CharT, _Traits>::xsgetn(char_type* __s, streamsize __n)
-{
- const int_type __eof = traits_type::eof();
- int_type __c;
- streamsize __i = 0;
- while(__i < __n)
- {
- if (__ninp_ < __einp_)
- {
- const streamsize __len = _VSTD::min(static_cast<streamsize>(INT_MAX),
- _VSTD::min(__einp_ - __ninp_, __n - __i));
- traits_type::copy(__s, __ninp_, __len);
- __s += __len;
- __i += __len;
- this->gbump(__len);
- }
- else if ((__c = uflow()) != __eof)
- {
- *__s = traits_type::to_char_type(__c);
- ++__s;
- ++__i;
- }
- else
- break;
- }
- return __i;
-}
-
-template <class _CharT, class _Traits>
-typename basic_streambuf<_CharT, _Traits>::int_type
-basic_streambuf<_CharT, _Traits>::underflow()
-{
- return traits_type::eof();
-}
-
-template <class _CharT, class _Traits>
-typename basic_streambuf<_CharT, _Traits>::int_type
-basic_streambuf<_CharT, _Traits>::uflow()
-{
- if (underflow() == traits_type::eof())
- return traits_type::eof();
- return traits_type::to_int_type(*__ninp_++);
-}
-
-template <class _CharT, class _Traits>
-typename basic_streambuf<_CharT, _Traits>::int_type
-basic_streambuf<_CharT, _Traits>::pbackfail(int_type)
-{
- return traits_type::eof();
-}
-
-template <class _CharT, class _Traits>
-streamsize
-basic_streambuf<_CharT, _Traits>::xsputn(const char_type* __s, streamsize __n)
-{
- streamsize __i = 0;
- int_type __eof = traits_type::eof();
- while( __i < __n)
- {
- if (__nout_ >= __eout_)
- {
- if (overflow(traits_type::to_int_type(*__s)) == __eof)
- break;
- ++__s;
- ++__i;
- }
- else
- {
- streamsize __chunk_size = _VSTD::min(__eout_ - __nout_, __n - __i);
- traits_type::copy(__nout_, __s, __chunk_size);
- __nout_ += __chunk_size;
- __s += __chunk_size;
- __i += __chunk_size;
- }
- }
- return __i;
-}
-
-template <class _CharT, class _Traits>
-typename basic_streambuf<_CharT, _Traits>::int_type
-basic_streambuf<_CharT, _Traits>::overflow(int_type)
-{
- return traits_type::eof();
-}
-
-#ifndef _LIBCPP_DO_NOT_ASSUME_STREAMS_EXPLICIT_INSTANTIATION_IN_DYLIB
-_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<char>)
-_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_streambuf<wchar_t>)
-
-_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<char>)
-_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<wchar_t>)
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_STEAMBUF
diff --git a/lib/libcxx/include/string b/lib/libcxx/include/string
deleted file mode 100644
index fb838d1e5dd..00000000000
--- a/lib/libcxx/include/string
+++ /dev/null
@@ -1,4380 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- string -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_STRING
-#define _LIBCPP_STRING
-
-/*
- string synopsis
-
-namespace std
-{
-
-template <class stateT>
-class fpos
-{
-private:
- stateT st;
-public:
- fpos(streamoff = streamoff());
-
- operator streamoff() const;
-
- stateT state() const;
- void state(stateT);
-
- fpos& operator+=(streamoff);
- fpos operator+ (streamoff) const;
- fpos& operator-=(streamoff);
- fpos operator- (streamoff) const;
-};
-
-template <class stateT> streamoff operator-(const fpos<stateT>& x, const fpos<stateT>& y);
-
-template <class stateT> bool operator==(const fpos<stateT>& x, const fpos<stateT>& y);
-template <class stateT> bool operator!=(const fpos<stateT>& x, const fpos<stateT>& y);
-
-template <class charT>
-struct char_traits
-{
- typedef charT char_type;
- typedef ... int_type;
- typedef streamoff off_type;
- typedef streampos pos_type;
- typedef mbstate_t state_type;
-
- static void assign(char_type& c1, const char_type& c2) noexcept;
- static constexpr bool eq(char_type c1, char_type c2) noexcept;
- static constexpr bool lt(char_type c1, char_type c2) noexcept;
-
- static int compare(const char_type* s1, const char_type* s2, size_t n);
- static size_t length(const char_type* s);
- static const char_type* find(const char_type* s, size_t n, const char_type& a);
- static char_type* move(char_type* s1, const char_type* s2, size_t n);
- static char_type* copy(char_type* s1, const char_type* s2, size_t n);
- static char_type* assign(char_type* s, size_t n, char_type a);
-
- static constexpr int_type not_eof(int_type c) noexcept;
- static constexpr char_type to_char_type(int_type c) noexcept;
- static constexpr int_type to_int_type(char_type c) noexcept;
- static constexpr bool eq_int_type(int_type c1, int_type c2) noexcept;
- static constexpr int_type eof() noexcept;
-};
-
-template <> struct char_traits<char>;
-template <> struct char_traits<wchar_t>;
-
-template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
-class basic_string
-{
-public:
-// types:
- typedef traits traits_type;
- typedef typename traits_type::char_type value_type;
- typedef Allocator allocator_type;
- typedef typename allocator_type::size_type size_type;
- typedef typename allocator_type::difference_type difference_type;
- typedef typename allocator_type::reference reference;
- typedef typename allocator_type::const_reference const_reference;
- typedef typename allocator_type::pointer pointer;
- typedef typename allocator_type::const_pointer const_pointer;
- typedef implementation-defined iterator;
- typedef implementation-defined const_iterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
-
- static const size_type npos = -1;
-
- basic_string()
- noexcept(is_nothrow_default_constructible<allocator_type>::value);
- explicit basic_string(const allocator_type& a);
- basic_string(const basic_string& str);
- basic_string(basic_string&& str)
- noexcept(is_nothrow_move_constructible<allocator_type>::value);
- basic_string(const basic_string& str, size_type pos,
- const allocator_type& a = allocator_type());
- basic_string(const basic_string& str, size_type pos, size_type n,
- const Allocator& a = Allocator());
- template<class T>
- basic_string(const T& t, size_type pos, size_type n, const Allocator& a = Allocator()); // C++17
- template <class T>
- explicit basic_string(const T& t, const Allocator& a = Allocator()); // C++17
- basic_string(const value_type* s, const allocator_type& a = allocator_type());
- basic_string(const value_type* s, size_type n, const allocator_type& a = allocator_type());
- basic_string(size_type n, value_type c, const allocator_type& a = allocator_type());
- template<class InputIterator>
- basic_string(InputIterator begin, InputIterator end,
- const allocator_type& a = allocator_type());
- basic_string(initializer_list<value_type>, const Allocator& = Allocator());
- basic_string(const basic_string&, const Allocator&);
- basic_string(basic_string&&, const Allocator&);
-
- ~basic_string();
-
- operator basic_string_view<charT, traits>() const noexcept;
-
- basic_string& operator=(const basic_string& str);
- template <class T>
- basic_string& operator=(const T& t); // C++17
- basic_string& operator=(basic_string&& str)
- noexcept(
- allocator_type::propagate_on_container_move_assignment::value ||
- allocator_type::is_always_equal::value ); // C++17
- basic_string& operator=(const value_type* s);
- basic_string& operator=(value_type c);
- basic_string& operator=(initializer_list<value_type>);
-
- iterator begin() noexcept;
- const_iterator begin() const noexcept;
- iterator end() noexcept;
- const_iterator end() const noexcept;
-
- reverse_iterator rbegin() noexcept;
- const_reverse_iterator rbegin() const noexcept;
- reverse_iterator rend() noexcept;
- const_reverse_iterator rend() const noexcept;
-
- const_iterator cbegin() const noexcept;
- const_iterator cend() const noexcept;
- const_reverse_iterator crbegin() const noexcept;
- const_reverse_iterator crend() const noexcept;
-
- size_type size() const noexcept;
- size_type length() const noexcept;
- size_type max_size() const noexcept;
- size_type capacity() const noexcept;
-
- void resize(size_type n, value_type c);
- void resize(size_type n);
-
- void reserve(size_type res_arg = 0);
- void shrink_to_fit();
- void clear() noexcept;
- bool empty() const noexcept;
-
- const_reference operator[](size_type pos) const;
- reference operator[](size_type pos);
-
- const_reference at(size_type n) const;
- reference at(size_type n);
-
- basic_string& operator+=(const basic_string& str);
- template <class T>
- basic_string& operator+=(const T& t); // C++17
- basic_string& operator+=(const value_type* s);
- basic_string& operator+=(value_type c);
- basic_string& operator+=(initializer_list<value_type>);
-
- basic_string& append(const basic_string& str);
- template <class T>
- basic_string& append(const T& t); // C++17
- basic_string& append(const basic_string& str, size_type pos, size_type n=npos); //C++14
- template <class T>
- basic_string& append(const T& t, size_type pos, size_type n=npos); // C++17
- basic_string& append(const value_type* s, size_type n);
- basic_string& append(const value_type* s);
- basic_string& append(size_type n, value_type c);
- template<class InputIterator>
- basic_string& append(InputIterator first, InputIterator last);
- basic_string& append(initializer_list<value_type>);
-
- void push_back(value_type c);
- void pop_back();
- reference front();
- const_reference front() const;
- reference back();
- const_reference back() const;
-
- basic_string& assign(const basic_string& str);
- template <class T>
- basic_string& assign(const T& t); // C++17
- basic_string& assign(basic_string&& str);
- basic_string& assign(const basic_string& str, size_type pos, size_type n=npos); // C++14
- template <class T>
- basic_string& assign(const T& t, size_type pos, size_type n=npos); // C++17
- basic_string& assign(const value_type* s, size_type n);
- basic_string& assign(const value_type* s);
- basic_string& assign(size_type n, value_type c);
- template<class InputIterator>
- basic_string& assign(InputIterator first, InputIterator last);
- basic_string& assign(initializer_list<value_type>);
-
- basic_string& insert(size_type pos1, const basic_string& str);
- template <class T>
- basic_string& insert(size_type pos1, const T& t);
- basic_string& insert(size_type pos1, const basic_string& str,
- size_type pos2, size_type n);
- template <class T>
- basic_string& insert(size_type pos1, const T& t, size_type pos2, size_type n); // C++17
- basic_string& insert(size_type pos, const value_type* s, size_type n=npos); //C++14
- basic_string& insert(size_type pos, const value_type* s);
- basic_string& insert(size_type pos, size_type n, value_type c);
- iterator insert(const_iterator p, value_type c);
- iterator insert(const_iterator p, size_type n, value_type c);
- template<class InputIterator>
- iterator insert(const_iterator p, InputIterator first, InputIterator last);
- iterator insert(const_iterator p, initializer_list<value_type>);
-
- basic_string& erase(size_type pos = 0, size_type n = npos);
- iterator erase(const_iterator position);
- iterator erase(const_iterator first, const_iterator last);
-
- basic_string& replace(size_type pos1, size_type n1, const basic_string& str);
- template <class T>
- basic_string& replace(size_type pos1, size_type n1, const T& t); // C++17
- basic_string& replace(size_type pos1, size_type n1, const basic_string& str,
- size_type pos2, size_type n2=npos); // C++14
- template <class T>
- basic_string& replace(size_type pos1, size_type n1, const T& t,
- size_type pos2, size_type n); // C++17
- basic_string& replace(size_type pos, size_type n1, const value_type* s, size_type n2);
- basic_string& replace(size_type pos, size_type n1, const value_type* s);
- basic_string& replace(size_type pos, size_type n1, size_type n2, value_type c);
- basic_string& replace(const_iterator i1, const_iterator i2, const basic_string& str);
- template <class T>
- basic_string& replace(const_iterator i1, const_iterator i2, const T& t); // C++17
- basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s, size_type n);
- basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s);
- basic_string& replace(const_iterator i1, const_iterator i2, size_type n, value_type c);
- template<class InputIterator>
- basic_string& replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2);
- basic_string& replace(const_iterator i1, const_iterator i2, initializer_list<value_type>);
-
- size_type copy(value_type* s, size_type n, size_type pos = 0) const;
- basic_string substr(size_type pos = 0, size_type n = npos) const;
-
- void swap(basic_string& str)
- noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||
- allocator_traits<allocator_type>::is_always_equal::value); // C++17
-
- const value_type* c_str() const noexcept;
- const value_type* data() const noexcept;
- value_type* data() noexcept; // C++17
-
- allocator_type get_allocator() const noexcept;
-
- size_type find(const basic_string& str, size_type pos = 0) const noexcept;
- template <class T>
- size_type find(const T& t, size_type pos = 0) const; // C++17
- size_type find(const value_type* s, size_type pos, size_type n) const noexcept;
- size_type find(const value_type* s, size_type pos = 0) const noexcept;
- size_type find(value_type c, size_type pos = 0) const noexcept;
-
- size_type rfind(const basic_string& str, size_type pos = npos) const noexcept;
- template <class T>
- size_type rfind(const T& t, size_type pos = npos) const; // C++17
- size_type rfind(const value_type* s, size_type pos, size_type n) const noexcept;
- size_type rfind(const value_type* s, size_type pos = npos) const noexcept;
- size_type rfind(value_type c, size_type pos = npos) const noexcept;
-
- size_type find_first_of(const basic_string& str, size_type pos = 0) const noexcept;
- template <class T>
- size_type find_first_of(const T& t, size_type pos = 0) const; // C++17
- size_type find_first_of(const value_type* s, size_type pos, size_type n) const noexcept;
- size_type find_first_of(const value_type* s, size_type pos = 0) const noexcept;
- size_type find_first_of(value_type c, size_type pos = 0) const noexcept;
-
- size_type find_last_of(const basic_string& str, size_type pos = npos) const noexcept;
- template <class T>
- size_type find_last_of(const T& t, size_type pos = npos) const noexcept; // C++17
- size_type find_last_of(const value_type* s, size_type pos, size_type n) const noexcept;
- size_type find_last_of(const value_type* s, size_type pos = npos) const noexcept;
- size_type find_last_of(value_type c, size_type pos = npos) const noexcept;
-
- size_type find_first_not_of(const basic_string& str, size_type pos = 0) const noexcept;
- template <class T>
- size_type find_first_not_of(const T& t, size_type pos = 0) const; // C++17
- size_type find_first_not_of(const value_type* s, size_type pos, size_type n) const noexcept;
- size_type find_first_not_of(const value_type* s, size_type pos = 0) const noexcept;
- size_type find_first_not_of(value_type c, size_type pos = 0) const noexcept;
-
- size_type find_last_not_of(const basic_string& str, size_type pos = npos) const noexcept;
- template <class T>
- size_type find_last_not_of(const T& t, size_type pos = npos) const; // C++17
- size_type find_last_not_of(const value_type* s, size_type pos, size_type n) const noexcept;
- size_type find_last_not_of(const value_type* s, size_type pos = npos) const noexcept;
- size_type find_last_not_of(value_type c, size_type pos = npos) const noexcept;
-
- int compare(const basic_string& str) const noexcept;
- template <class T>
- int compare(const T& t) const noexcept; // C++17
- int compare(size_type pos1, size_type n1, const basic_string& str) const;
- template <class T>
- int compare(size_type pos1, size_type n1, const T& t) const; // C++17
- int compare(size_type pos1, size_type n1, const basic_string& str,
- size_type pos2, size_type n2=npos) const; // C++14
- template <class T>
- int compare(size_type pos1, size_type n1, const T& t,
- size_type pos2, size_type n2=npos) const; // C++17
- int compare(const value_type* s) const noexcept;
- int compare(size_type pos1, size_type n1, const value_type* s) const;
- int compare(size_type pos1, size_type n1, const value_type* s, size_type n2) const;
-
- bool starts_with(basic_string_view<charT, traits> sv) const noexcept; // C++2a
- bool starts_with(charT c) const noexcept; // C++2a
- bool starts_with(const charT* s) const; // C++2a
- bool ends_with(basic_string_view<charT, traits> sv) const noexcept; // C++2a
- bool ends_with(charT c) const noexcept; // C++2a
- bool ends_with(const charT* s) const; // C++2a
-
- bool __invariants() const;
-};
-
-template<class InputIterator,
- class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
-basic_string(InputIterator, InputIterator, Allocator = Allocator())
- -> basic_string<typename iterator_traits<InputIterator>::value_type,
- char_traits<typename iterator_traits<InputIterator>::value_type>,
- Allocator>; // C++17
-
-template<class charT, class traits, class Allocator>
-basic_string<charT, traits, Allocator>
-operator+(const basic_string<charT, traits, Allocator>& lhs,
- const basic_string<charT, traits, Allocator>& rhs);
-
-template<class charT, class traits, class Allocator>
-basic_string<charT, traits, Allocator>
-operator+(const charT* lhs , const basic_string<charT,traits,Allocator>&rhs);
-
-template<class charT, class traits, class Allocator>
-basic_string<charT, traits, Allocator>
-operator+(charT lhs, const basic_string<charT,traits,Allocator>& rhs);
-
-template<class charT, class traits, class Allocator>
-basic_string<charT, traits, Allocator>
-operator+(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs);
-
-template<class charT, class traits, class Allocator>
-basic_string<charT, traits, Allocator>
-operator+(const basic_string<charT, traits, Allocator>& lhs, charT rhs);
-
-template<class charT, class traits, class Allocator>
-bool operator==(const basic_string<charT, traits, Allocator>& lhs,
- const basic_string<charT, traits, Allocator>& rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-bool operator==(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-bool operator==(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-bool operator!=(const basic_string<charT,traits,Allocator>& lhs,
- const basic_string<charT, traits, Allocator>& rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-bool operator!=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-bool operator!=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-bool operator< (const basic_string<charT, traits, Allocator>& lhs,
- const basic_string<charT, traits, Allocator>& rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-bool operator< (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-bool operator< (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-bool operator> (const basic_string<charT, traits, Allocator>& lhs,
- const basic_string<charT, traits, Allocator>& rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-bool operator> (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-bool operator> (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-bool operator<=(const basic_string<charT, traits, Allocator>& lhs,
- const basic_string<charT, traits, Allocator>& rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-bool operator<=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-bool operator<=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-bool operator>=(const basic_string<charT, traits, Allocator>& lhs,
- const basic_string<charT, traits, Allocator>& rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-bool operator>=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-bool operator>=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
-
-template<class charT, class traits, class Allocator>
-void swap(basic_string<charT, traits, Allocator>& lhs,
- basic_string<charT, traits, Allocator>& rhs)
- noexcept(noexcept(lhs.swap(rhs)));
-
-template<class charT, class traits, class Allocator>
-basic_istream<charT, traits>&
-operator>>(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
-
-template<class charT, class traits, class Allocator>
-basic_ostream<charT, traits>&
-operator<<(basic_ostream<charT, traits>& os, const basic_string<charT, traits, Allocator>& str);
-
-template<class charT, class traits, class Allocator>
-basic_istream<charT, traits>&
-getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str,
- charT delim);
-
-template<class charT, class traits, class Allocator>
-basic_istream<charT, traits>&
-getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
-
-template<class charT, class traits, class Allocator, class U>
-void erase(basic_string<charT, traits, Allocator>& c, const U& value); // C++20
-template<class charT, class traits, class Allocator, class Predicate>
-void erase_if(basic_string<charT, traits, Allocator>& c, Predicate pred); // C++20
-
-typedef basic_string<char> string;
-typedef basic_string<wchar_t> wstring;
-typedef basic_string<char16_t> u16string;
-typedef basic_string<char32_t> u32string;
-
-int stoi (const string& str, size_t* idx = 0, int base = 10);
-long stol (const string& str, size_t* idx = 0, int base = 10);
-unsigned long stoul (const string& str, size_t* idx = 0, int base = 10);
-long long stoll (const string& str, size_t* idx = 0, int base = 10);
-unsigned long long stoull(const string& str, size_t* idx = 0, int base = 10);
-
-float stof (const string& str, size_t* idx = 0);
-double stod (const string& str, size_t* idx = 0);
-long double stold(const string& str, size_t* idx = 0);
-
-string to_string(int val);
-string to_string(unsigned val);
-string to_string(long val);
-string to_string(unsigned long val);
-string to_string(long long val);
-string to_string(unsigned long long val);
-string to_string(float val);
-string to_string(double val);
-string to_string(long double val);
-
-int stoi (const wstring& str, size_t* idx = 0, int base = 10);
-long stol (const wstring& str, size_t* idx = 0, int base = 10);
-unsigned long stoul (const wstring& str, size_t* idx = 0, int base = 10);
-long long stoll (const wstring& str, size_t* idx = 0, int base = 10);
-unsigned long long stoull(const wstring& str, size_t* idx = 0, int base = 10);
-
-float stof (const wstring& str, size_t* idx = 0);
-double stod (const wstring& str, size_t* idx = 0);
-long double stold(const wstring& str, size_t* idx = 0);
-
-wstring to_wstring(int val);
-wstring to_wstring(unsigned val);
-wstring to_wstring(long val);
-wstring to_wstring(unsigned long val);
-wstring to_wstring(long long val);
-wstring to_wstring(unsigned long long val);
-wstring to_wstring(float val);
-wstring to_wstring(double val);
-wstring to_wstring(long double val);
-
-template <> struct hash<string>;
-template <> struct hash<u16string>;
-template <> struct hash<u32string>;
-template <> struct hash<wstring>;
-
-basic_string<char> operator "" s( const char *str, size_t len ); // C++14
-basic_string<wchar_t> operator "" s( const wchar_t *str, size_t len ); // C++14
-basic_string<char16_t> operator "" s( const char16_t *str, size_t len ); // C++14
-basic_string<char32_t> operator "" s( const char32_t *str, size_t len ); // C++14
-
-} // std
-
-*/
-
-#include <__config>
-#include <string_view>
-#include <iosfwd>
-#include <cstring>
-#include <cstdio> // For EOF.
-#include <cwchar>
-#include <algorithm>
-#include <iterator>
-#include <utility>
-#include <memory>
-#include <stdexcept>
-#include <type_traits>
-#include <initializer_list>
-#include <__functional_base>
-#include <version>
-#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
-#include <cstdint>
-#endif
-
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-// fpos
-
-template <class _StateT>
-class _LIBCPP_TEMPLATE_VIS fpos
-{
-private:
- _StateT __st_;
- streamoff __off_;
-public:
- _LIBCPP_INLINE_VISIBILITY fpos(streamoff __off = streamoff()) : __st_(), __off_(__off) {}
-
- _LIBCPP_INLINE_VISIBILITY operator streamoff() const {return __off_;}
-
- _LIBCPP_INLINE_VISIBILITY _StateT state() const {return __st_;}
- _LIBCPP_INLINE_VISIBILITY void state(_StateT __st) {__st_ = __st;}
-
- _LIBCPP_INLINE_VISIBILITY fpos& operator+=(streamoff __off) {__off_ += __off; return *this;}
- _LIBCPP_INLINE_VISIBILITY fpos operator+ (streamoff __off) const {fpos __t(*this); __t += __off; return __t;}
- _LIBCPP_INLINE_VISIBILITY fpos& operator-=(streamoff __off) {__off_ -= __off; return *this;}
- _LIBCPP_INLINE_VISIBILITY fpos operator- (streamoff __off) const {fpos __t(*this); __t -= __off; return __t;}
-};
-
-template <class _StateT>
-inline _LIBCPP_INLINE_VISIBILITY
-streamoff operator-(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
- {return streamoff(__x) - streamoff(__y);}
-
-template <class _StateT>
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator==(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
- {return streamoff(__x) == streamoff(__y);}
-
-template <class _StateT>
-inline _LIBCPP_INLINE_VISIBILITY
-bool operator!=(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
- {return streamoff(__x) != streamoff(__y);}
-
-// basic_string
-
-template<class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>
-operator+(const basic_string<_CharT, _Traits, _Allocator>& __x,
- const basic_string<_CharT, _Traits, _Allocator>& __y);
-
-template<class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>
-operator+(const _CharT* __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
-
-template<class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>
-operator+(_CharT __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_string<_CharT, _Traits, _Allocator>
-operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, const _CharT* __y);
-
-template<class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>
-operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, _CharT __y);
-
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS string operator+<char, char_traits<char>, allocator<char> >(char const*, string const&))
-
-template <bool>
-class _LIBCPP_TEMPLATE_VIS __basic_string_common
-{
-protected:
- _LIBCPP_NORETURN void __throw_length_error() const;
- _LIBCPP_NORETURN void __throw_out_of_range() const;
-};
-
-template <bool __b>
-void
-__basic_string_common<__b>::__throw_length_error() const
-{
- _VSTD::__throw_length_error("basic_string");
-}
-
-template <bool __b>
-void
-__basic_string_common<__b>::__throw_out_of_range() const
-{
- _VSTD::__throw_out_of_range("basic_string");
-}
-
-_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __basic_string_common<true>)
-
-#ifdef _LIBCPP_NO_EXCEPTIONS
-template <class _Iter>
-struct __libcpp_string_gets_noexcept_iterator_impl : public true_type {};
-#elif defined(_LIBCPP_HAS_NO_NOEXCEPT)
-template <class _Iter>
-struct __libcpp_string_gets_noexcept_iterator_impl : public false_type {};
-#else
-template <class _Iter, bool = __is_forward_iterator<_Iter>::value>
-struct __libcpp_string_gets_noexcept_iterator_impl : public _LIBCPP_BOOL_CONSTANT((
- noexcept(++(declval<_Iter&>())) &&
- is_nothrow_assignable<_Iter&, _Iter>::value &&
- noexcept(declval<_Iter>() == declval<_Iter>()) &&
- noexcept(*declval<_Iter>())
-)) {};
-
-template <class _Iter>
-struct __libcpp_string_gets_noexcept_iterator_impl<_Iter, false> : public false_type {};
-#endif
-
-
-template <class _Iter>
-struct __libcpp_string_gets_noexcept_iterator
- : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value || __libcpp_string_gets_noexcept_iterator_impl<_Iter>::value) {};
-
-template <class _CharT, class _Traits, class _Tp>
-struct __can_be_converted_to_string_view : public _LIBCPP_BOOL_CONSTANT(
- ( is_convertible<const _Tp&, basic_string_view<_CharT, _Traits> >::value &&
- !is_convertible<const _Tp&, const _CharT*>::value)) {};
-
-#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
-
-template <class _CharT, size_t = sizeof(_CharT)>
-struct __padding
-{
- unsigned char __xx[sizeof(_CharT)-1];
-};
-
-template <class _CharT>
-struct __padding<_CharT, 1>
-{
-};
-
-#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
-
-template<class _CharT, class _Traits, class _Allocator>
-class _LIBCPP_TEMPLATE_VIS basic_string
- : private __basic_string_common<true>
-{
-public:
- typedef basic_string __self;
- typedef basic_string_view<_CharT, _Traits> __self_view;
- typedef _Traits traits_type;
- typedef _CharT value_type;
- typedef _Allocator allocator_type;
- typedef allocator_traits<allocator_type> __alloc_traits;
- typedef typename __alloc_traits::size_type size_type;
- typedef typename __alloc_traits::difference_type difference_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename __alloc_traits::pointer pointer;
- typedef typename __alloc_traits::const_pointer const_pointer;
-
- static_assert((!is_array<value_type>::value), "Character type of basic_string must not be an array");
- static_assert(( is_standard_layout<value_type>::value), "Character type of basic_string must be standard-layout");
- static_assert(( is_trivial<value_type>::value), "Character type of basic_string must be trivial");
- static_assert(( is_same<_CharT, typename traits_type::char_type>::value),
- "traits_type::char_type must be the same type as CharT");
- static_assert(( is_same<typename allocator_type::value_type, value_type>::value),
- "Allocator::value_type must be same type as value_type");
-
-#if defined(_LIBCPP_RAW_ITERATORS)
- typedef pointer iterator;
- typedef const_pointer const_iterator;
-#else // defined(_LIBCPP_RAW_ITERATORS)
- typedef __wrap_iter<pointer> iterator;
- typedef __wrap_iter<const_pointer> const_iterator;
-#endif // defined(_LIBCPP_RAW_ITERATORS)
- typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
- typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
-
-private:
-
-#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
-
- struct __long
- {
- pointer __data_;
- size_type __size_;
- size_type __cap_;
- };
-
-#ifdef _LIBCPP_BIG_ENDIAN
- static const size_type __short_mask = 0x01;
- static const size_type __long_mask = 0x1ul;
-#else // _LIBCPP_BIG_ENDIAN
- static const size_type __short_mask = 0x80;
- static const size_type __long_mask = ~(size_type(~0) >> 1);
-#endif // _LIBCPP_BIG_ENDIAN
-
- enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
- (sizeof(__long) - 1)/sizeof(value_type) : 2};
-
- struct __short
- {
- value_type __data_[__min_cap];
- struct
- : __padding<value_type>
- {
- unsigned char __size_;
- };
- };
-
-#else
-
- struct __long
- {
- size_type __cap_;
- size_type __size_;
- pointer __data_;
- };
-
-#ifdef _LIBCPP_BIG_ENDIAN
- static const size_type __short_mask = 0x80;
- static const size_type __long_mask = ~(size_type(~0) >> 1);
-#else // _LIBCPP_BIG_ENDIAN
- static const size_type __short_mask = 0x01;
- static const size_type __long_mask = 0x1ul;
-#endif // _LIBCPP_BIG_ENDIAN
-
- enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
- (sizeof(__long) - 1)/sizeof(value_type) : 2};
-
- struct __short
- {
- union
- {
- unsigned char __size_;
- value_type __lx;
- };
- value_type __data_[__min_cap];
- };
-
-#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
-
- union __ulx{__long __lx; __short __lxx;};
-
- enum {__n_words = sizeof(__ulx) / sizeof(size_type)};
-
- struct __raw
- {
- size_type __words[__n_words];
- };
-
- struct __rep
- {
- union
- {
- __long __l;
- __short __s;
- __raw __r;
- };
- };
-
- __compressed_pair<__rep, allocator_type> __r_;
-
-public:
- static const size_type npos = -1;
-
- _LIBCPP_INLINE_VISIBILITY basic_string()
- _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
-
- _LIBCPP_INLINE_VISIBILITY explicit basic_string(const allocator_type& __a)
-#if _LIBCPP_STD_VER <= 14
- _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value);
-#else
- _NOEXCEPT;
-#endif
-
- basic_string(const basic_string& __str);
- basic_string(const basic_string& __str, const allocator_type& __a);
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- basic_string(basic_string&& __str)
-#if _LIBCPP_STD_VER <= 14
- _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
-#else
- _NOEXCEPT;
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- basic_string(basic_string&& __str, const allocator_type& __a);
-#endif // _LIBCPP_CXX03_LANG
-
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
- template <class = typename enable_if<__is_allocator<_Allocator>::value, nullptr_t>::type>
-#endif
- _LIBCPP_INLINE_VISIBILITY
- basic_string(const _CharT* __s) {
- _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*) detected nullptr");
- __init(__s, traits_type::length(__s));
-# if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-# endif
- }
-
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
- template <class = typename enable_if<__is_allocator<_Allocator>::value, nullptr_t>::type>
-#endif
- _LIBCPP_INLINE_VISIBILITY
- basic_string(const _CharT* __s, const _Allocator& __a);
-
- _LIBCPP_INLINE_VISIBILITY
- basic_string(const _CharT* __s, size_type __n);
- _LIBCPP_INLINE_VISIBILITY
- basic_string(const _CharT* __s, size_type __n, const _Allocator& __a);
- _LIBCPP_INLINE_VISIBILITY
- basic_string(size_type __n, _CharT __c);
-
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
- template <class = typename enable_if<__is_allocator<_Allocator>::value, nullptr_t>::type>
-#endif
- _LIBCPP_INLINE_VISIBILITY
- basic_string(size_type __n, _CharT __c, const _Allocator& __a);
-
- basic_string(const basic_string& __str, size_type __pos, size_type __n,
- const _Allocator& __a = _Allocator());
- _LIBCPP_INLINE_VISIBILITY
- basic_string(const basic_string& __str, size_type __pos,
- const _Allocator& __a = _Allocator());
-
- template<class _Tp, class = typename enable_if<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, void>::type>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- basic_string(const _Tp& __t, size_type __pos, size_type __n,
- const allocator_type& __a = allocator_type());
-
- template<class _Tp, class = typename enable_if<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, void>::type>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- explicit basic_string(const _Tp& __t);
-
- template<class _Tp, class = typename enable_if<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, void>::type>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- explicit basic_string(const _Tp& __t, const allocator_type& __a);
-
- template<class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- basic_string(_InputIterator __first, _InputIterator __last);
- template<class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- basic_string(initializer_list<_CharT> __il);
- _LIBCPP_INLINE_VISIBILITY
- basic_string(initializer_list<_CharT> __il, const _Allocator& __a);
-#endif // _LIBCPP_CXX03_LANG
-
- inline ~basic_string();
-
- _LIBCPP_INLINE_VISIBILITY
- operator __self_view() const _NOEXCEPT { return __self_view(data(), size()); }
-
- basic_string& operator=(const basic_string& __str);
-
- template <class _Tp, class = typename enable_if<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, void>::type>
- basic_string& operator=(const _Tp& __t)
- {__self_view __sv = __t; return assign(__sv);}
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- basic_string& operator=(basic_string&& __str)
- _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
- _LIBCPP_INLINE_VISIBILITY
- basic_string& operator=(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
-#endif
- _LIBCPP_INLINE_VISIBILITY basic_string& operator=(const value_type* __s) {return assign(__s);}
- basic_string& operator=(value_type __c);
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT
- {return iterator(this, __get_pointer());}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT
- {return const_iterator(this, __get_pointer());}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT
- {return iterator(this, __get_pointer() + size());}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT
- {return const_iterator(this, __get_pointer() + size());}
-#else
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT
- {return iterator(__get_pointer());}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT
- {return const_iterator(__get_pointer());}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT
- {return iterator(__get_pointer() + size());}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT
- {return const_iterator(__get_pointer() + size());}
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rbegin() _NOEXCEPT
- {return reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rbegin() const _NOEXCEPT
- {return const_reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rend() _NOEXCEPT
- {return reverse_iterator(begin());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rend() const _NOEXCEPT
- {return const_reverse_iterator(begin());}
-
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const _NOEXCEPT
- {return begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const _NOEXCEPT
- {return end();}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crbegin() const _NOEXCEPT
- {return rbegin();}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crend() const _NOEXCEPT
- {return rend();}
-
- _LIBCPP_INLINE_VISIBILITY size_type size() const _NOEXCEPT
- {return __is_long() ? __get_long_size() : __get_short_size();}
- _LIBCPP_INLINE_VISIBILITY size_type length() const _NOEXCEPT {return size();}
- _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY size_type capacity() const _NOEXCEPT
- {return (__is_long() ? __get_long_cap()
- : static_cast<size_type>(__min_cap)) - 1;}
-
- void resize(size_type __n, value_type __c);
- _LIBCPP_INLINE_VISIBILITY void resize(size_type __n) {resize(__n, value_type());}
-
- void reserve(size_type __res_arg);
- _LIBCPP_INLINE_VISIBILITY void __resize_default_init(size_type __n);
-
- _LIBCPP_INLINE_VISIBILITY
- void reserve() _NOEXCEPT {reserve(0);}
- _LIBCPP_INLINE_VISIBILITY
- void shrink_to_fit() _NOEXCEPT {reserve();}
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT;
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const _NOEXCEPT {return size() == 0;}
-
- _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __pos) const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __pos) _NOEXCEPT;
-
- const_reference at(size_type __n) const;
- reference at(size_type __n);
-
- _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const basic_string& __str) {return append(__str);}
-
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- basic_string&
- >::type
- operator+=(const _Tp& __t) {__self_view __sv = __t; return append(__sv);}
- _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const value_type* __s) {return append(__s);}
- _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(value_type __c) {push_back(__c); return *this;}
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(initializer_list<value_type> __il) {return append(__il);}
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- basic_string& append(const basic_string& __str);
-
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- basic_string&
- >::type
- append(const _Tp& __t) { __self_view __sv = __t; return append(__sv.data(), __sv.size()); }
- basic_string& append(const basic_string& __str, size_type __pos, size_type __n=npos);
-
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- basic_string&
- >::type
- append(const _Tp& __t, size_type __pos, size_type __n=npos);
- basic_string& append(const value_type* __s, size_type __n);
- basic_string& append(const value_type* __s);
- basic_string& append(size_type __n, value_type __c);
-
- _LIBCPP_INLINE_VISIBILITY
- void __append_default_init(size_type __n);
-
- template <class _ForwardIterator>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- basic_string& __append_forward_unsafe(_ForwardIterator, _ForwardIterator);
- template<class _InputIterator>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __is_exactly_input_iterator<_InputIterator>::value
- || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value,
- basic_string&
- >::type
- _LIBCPP_INLINE_VISIBILITY
- append(_InputIterator __first, _InputIterator __last) {
- const basic_string __temp (__first, __last, __alloc());
- append(__temp.data(), __temp.size());
- return *this;
- }
- template<class _ForwardIterator>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __is_forward_iterator<_ForwardIterator>::value
- && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value,
- basic_string&
- >::type
- _LIBCPP_INLINE_VISIBILITY
- append(_ForwardIterator __first, _ForwardIterator __last) {
- return __append_forward_unsafe(__first, __last);
- }
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- basic_string& append(initializer_list<value_type> __il) {return append(__il.begin(), __il.size());}
-#endif // _LIBCPP_CXX03_LANG
-
- void push_back(value_type __c);
- _LIBCPP_INLINE_VISIBILITY
- void pop_back();
- _LIBCPP_INLINE_VISIBILITY reference front();
- _LIBCPP_INLINE_VISIBILITY const_reference front() const;
- _LIBCPP_INLINE_VISIBILITY reference back();
- _LIBCPP_INLINE_VISIBILITY const_reference back() const;
-
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- basic_string&
- >::type
- assign(const _Tp & __t) { __self_view __sv = __t; return assign(__sv.data(), __sv.size()); }
- _LIBCPP_INLINE_VISIBILITY
- basic_string& assign(const basic_string& __str) { return *this = __str; }
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- basic_string& assign(basic_string&& __str)
- _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
- {*this = _VSTD::move(__str); return *this;}
-#endif
- basic_string& assign(const basic_string& __str, size_type __pos, size_type __n=npos);
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- basic_string&
- >::type
- assign(const _Tp & __t, size_type __pos, size_type __n=npos);
- basic_string& assign(const value_type* __s, size_type __n);
- basic_string& assign(const value_type* __s);
- basic_string& assign(size_type __n, value_type __c);
- template<class _InputIterator>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __is_exactly_input_iterator<_InputIterator>::value
- || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value,
- basic_string&
- >::type
- assign(_InputIterator __first, _InputIterator __last);
- template<class _ForwardIterator>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __is_forward_iterator<_ForwardIterator>::value
- && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value,
- basic_string&
- >::type
- assign(_ForwardIterator __first, _ForwardIterator __last);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- basic_string& assign(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- basic_string& insert(size_type __pos1, const basic_string& __str);
-
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- basic_string&
- >::type
- insert(size_type __pos1, const _Tp& __t)
- { __self_view __sv = __t; return insert(__pos1, __sv.data(), __sv.size()); }
-
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- basic_string&
- >::type
- insert(size_type __pos1, const _Tp& __t, size_type __pos2, size_type __n=npos);
- basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n=npos);
- basic_string& insert(size_type __pos, const value_type* __s, size_type __n);
- basic_string& insert(size_type __pos, const value_type* __s);
- basic_string& insert(size_type __pos, size_type __n, value_type __c);
- iterator insert(const_iterator __pos, value_type __c);
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __pos, size_type __n, value_type __c);
- template<class _InputIterator>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __is_exactly_input_iterator<_InputIterator>::value
- || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value,
- iterator
- >::type
- insert(const_iterator __pos, _InputIterator __first, _InputIterator __last);
- template<class _ForwardIterator>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __is_forward_iterator<_ForwardIterator>::value
- && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value,
- iterator
- >::type
- insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __pos, initializer_list<value_type> __il)
- {return insert(__pos, __il.begin(), __il.end());}
-#endif // _LIBCPP_CXX03_LANG
-
- basic_string& erase(size_type __pos = 0, size_type __n = npos);
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __pos);
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __first, const_iterator __last);
-
- _LIBCPP_INLINE_VISIBILITY
- basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str);
-
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- basic_string&
- >::type
- replace(size_type __pos1, size_type __n1, const _Tp& __t) { __self_view __sv = __t; return replace(__pos1, __n1, __sv.data(), __sv.size()); }
- basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2=npos);
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- basic_string&
- >::type
- replace(size_type __pos1, size_type __n1, const _Tp& __t, size_type __pos2, size_type __n2=npos);
- basic_string& replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2);
- basic_string& replace(size_type __pos, size_type __n1, const value_type* __s);
- basic_string& replace(size_type __pos, size_type __n1, size_type __n2, value_type __c);
- _LIBCPP_INLINE_VISIBILITY
- basic_string& replace(const_iterator __i1, const_iterator __i2, const basic_string& __str);
-
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- basic_string&
- >::type
- replace(const_iterator __i1, const_iterator __i2, const _Tp& __t) { __self_view __sv = __t; return replace(__i1 - begin(), __i2 - __i1, __sv); }
-
- _LIBCPP_INLINE_VISIBILITY
- basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n);
- _LIBCPP_INLINE_VISIBILITY
- basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s);
- _LIBCPP_INLINE_VISIBILITY
- basic_string& replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c);
- template<class _InputIterator>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __is_input_iterator<_InputIterator>::value,
- basic_string&
- >::type
- replace(const_iterator __i1, const_iterator __i2, _InputIterator __j1, _InputIterator __j2);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- basic_string& replace(const_iterator __i1, const_iterator __i2, initializer_list<value_type> __il)
- {return replace(__i1, __i2, __il.begin(), __il.end());}
-#endif // _LIBCPP_CXX03_LANG
-
- size_type copy(value_type* __s, size_type __n, size_type __pos = 0) const;
- _LIBCPP_INLINE_VISIBILITY
- basic_string substr(size_type __pos = 0, size_type __n = npos) const;
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(basic_string& __str)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT_DEBUG;
-#else
- _NOEXCEPT_DEBUG_(!__alloc_traits::propagate_on_container_swap::value ||
- __is_nothrow_swappable<allocator_type>::value);
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- const value_type* c_str() const _NOEXCEPT {return data();}
- _LIBCPP_INLINE_VISIBILITY
- const value_type* data() const _NOEXCEPT {return _VSTD::__to_raw_pointer(__get_pointer());}
-#if _LIBCPP_STD_VER > 14 || defined(_LIBCPP_BUILDING_LIBRARY)
- _LIBCPP_INLINE_VISIBILITY
- value_type* data() _NOEXCEPT {return _VSTD::__to_raw_pointer(__get_pointer());}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const _NOEXCEPT {return __alloc();}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type find(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
-
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- size_type
- >::type
- find(const _Tp& __t, size_type __pos = 0) const;
- size_type find(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- size_type find(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
- size_type find(value_type __c, size_type __pos = 0) const _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- size_type rfind(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
-
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- size_type
- >::type
- rfind(const _Tp& __t, size_type __pos = npos) const;
- size_type rfind(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- size_type rfind(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
- size_type rfind(value_type __c, size_type __pos = npos) const _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- size_type find_first_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
-
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- size_type
- >::type
- find_first_of(const _Tp& __t, size_type __pos = 0) const;
- size_type find_first_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- size_type find_first_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- size_type find_first_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- size_type find_last_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
-
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- size_type
- >::type
- find_last_of(const _Tp& __t, size_type __pos = npos) const;
- size_type find_last_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- size_type find_last_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- size_type find_last_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
-
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- size_type
- >::type
- find_first_not_of(const _Tp &__t, size_type __pos = 0) const;
- size_type find_first_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- size_type find_first_not_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- size_type find_first_not_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
-
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- size_type
- >::type
- find_last_not_of(const _Tp& __t, size_type __pos = npos) const;
- size_type find_last_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- size_type find_last_not_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- size_type find_last_not_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- int compare(const basic_string& __str) const _NOEXCEPT;
-
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- int
- >::type
- compare(const _Tp &__t) const;
-
- template <class _Tp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- int
- >::type
- compare(size_type __pos1, size_type __n1, const _Tp& __t) const;
-
- _LIBCPP_INLINE_VISIBILITY
- int compare(size_type __pos1, size_type __n1, const basic_string& __str) const;
- int compare(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2=npos) const;
-
- template <class _Tp>
- inline _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- int
- >::type
- compare(size_type __pos1, size_type __n1, const _Tp& __t, size_type __pos2, size_type __n2=npos) const;
- int compare(const value_type* __s) const _NOEXCEPT;
- int compare(size_type __pos1, size_type __n1, const value_type* __s) const;
- int compare(size_type __pos1, size_type __n1, const value_type* __s, size_type __n2) const;
-
-#if _LIBCPP_STD_VER > 17
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool starts_with(__self_view __sv) const _NOEXCEPT
- { return __self_view(data(), size()).starts_with(__sv); }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool starts_with(value_type __c) const _NOEXCEPT
- { return !empty() && _Traits::eq(front(), __c); }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool starts_with(const value_type* __s) const _NOEXCEPT
- { return starts_with(__self_view(__s)); }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool ends_with(__self_view __sv) const _NOEXCEPT
- { return __self_view(data(), size()).ends_with( __sv); }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool ends_with(value_type __c) const _NOEXCEPT
- { return !empty() && _Traits::eq(back(), __c); }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool ends_with(const value_type* __s) const _NOEXCEPT
- { return ends_with(__self_view(__s)); }
-#endif
-
- _LIBCPP_INLINE_VISIBILITY bool __invariants() const;
-
- _LIBCPP_INLINE_VISIBILITY void __clear_and_shrink() _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- bool __is_long() const _NOEXCEPT
- {return bool(__r_.first().__s.__size_ & __short_mask);}
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
-
- bool __dereferenceable(const const_iterator* __i) const;
- bool __decrementable(const const_iterator* __i) const;
- bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
- bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
-
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- allocator_type& __alloc() _NOEXCEPT
- {return __r_.second();}
- _LIBCPP_INLINE_VISIBILITY
- const allocator_type& __alloc() const _NOEXCEPT
- {return __r_.second();}
-
-#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
-
- _LIBCPP_INLINE_VISIBILITY
- void __set_short_size(size_type __s) _NOEXCEPT
-# ifdef _LIBCPP_BIG_ENDIAN
- {__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
-# else
- {__r_.first().__s.__size_ = (unsigned char)(__s);}
-# endif
-
- _LIBCPP_INLINE_VISIBILITY
- size_type __get_short_size() const _NOEXCEPT
-# ifdef _LIBCPP_BIG_ENDIAN
- {return __r_.first().__s.__size_ >> 1;}
-# else
- {return __r_.first().__s.__size_;}
-# endif
-
-#else // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
-
- _LIBCPP_INLINE_VISIBILITY
- void __set_short_size(size_type __s) _NOEXCEPT
-# ifdef _LIBCPP_BIG_ENDIAN
- {__r_.first().__s.__size_ = (unsigned char)(__s);}
-# else
- {__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
-# endif
-
- _LIBCPP_INLINE_VISIBILITY
- size_type __get_short_size() const _NOEXCEPT
-# ifdef _LIBCPP_BIG_ENDIAN
- {return __r_.first().__s.__size_;}
-# else
- {return __r_.first().__s.__size_ >> 1;}
-# endif
-
-#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
-
- _LIBCPP_INLINE_VISIBILITY
- void __set_long_size(size_type __s) _NOEXCEPT
- {__r_.first().__l.__size_ = __s;}
- _LIBCPP_INLINE_VISIBILITY
- size_type __get_long_size() const _NOEXCEPT
- {return __r_.first().__l.__size_;}
- _LIBCPP_INLINE_VISIBILITY
- void __set_size(size_type __s) _NOEXCEPT
- {if (__is_long()) __set_long_size(__s); else __set_short_size(__s);}
-
- _LIBCPP_INLINE_VISIBILITY
- void __set_long_cap(size_type __s) _NOEXCEPT
- {__r_.first().__l.__cap_ = __long_mask | __s;}
- _LIBCPP_INLINE_VISIBILITY
- size_type __get_long_cap() const _NOEXCEPT
- {return __r_.first().__l.__cap_ & size_type(~__long_mask);}
-
- _LIBCPP_INLINE_VISIBILITY
- void __set_long_pointer(pointer __p) _NOEXCEPT
- {__r_.first().__l.__data_ = __p;}
- _LIBCPP_INLINE_VISIBILITY
- pointer __get_long_pointer() _NOEXCEPT
- {return __r_.first().__l.__data_;}
- _LIBCPP_INLINE_VISIBILITY
- const_pointer __get_long_pointer() const _NOEXCEPT
- {return __r_.first().__l.__data_;}
- _LIBCPP_INLINE_VISIBILITY
- pointer __get_short_pointer() _NOEXCEPT
- {return pointer_traits<pointer>::pointer_to(__r_.first().__s.__data_[0]);}
- _LIBCPP_INLINE_VISIBILITY
- const_pointer __get_short_pointer() const _NOEXCEPT
- {return pointer_traits<const_pointer>::pointer_to(__r_.first().__s.__data_[0]);}
- _LIBCPP_INLINE_VISIBILITY
- pointer __get_pointer() _NOEXCEPT
- {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
- _LIBCPP_INLINE_VISIBILITY
- const_pointer __get_pointer() const _NOEXCEPT
- {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
-
- _LIBCPP_INLINE_VISIBILITY
- void __zero() _NOEXCEPT
- {
- size_type (&__a)[__n_words] = __r_.first().__r.__words;
- for (unsigned __i = 0; __i < __n_words; ++__i)
- __a[__i] = 0;
- }
-
- template <size_type __a> static
- _LIBCPP_INLINE_VISIBILITY
- size_type __align_it(size_type __s) _NOEXCEPT
- {return (__s + (__a-1)) & ~(__a-1);}
- enum {__alignment = 16};
- static _LIBCPP_INLINE_VISIBILITY
- size_type __recommend(size_type __s) _NOEXCEPT
- {
- if (__s < __min_cap) return static_cast<size_type>(__min_cap) - 1;
- size_type __guess = __align_it<sizeof(value_type) < __alignment ?
- __alignment/sizeof(value_type) : 1 > (__s+1) - 1;
- if (__guess == __min_cap) ++__guess;
- return __guess;
- }
-
- inline
- void __init(const value_type* __s, size_type __sz, size_type __reserve);
- inline
- void __init(const value_type* __s, size_type __sz);
- inline
- void __init(size_type __n, value_type __c);
-
- template <class _InputIterator>
- inline
- typename enable_if
- <
- __is_exactly_input_iterator<_InputIterator>::value,
- void
- >::type
- __init(_InputIterator __first, _InputIterator __last);
-
- template <class _ForwardIterator>
- inline
- typename enable_if
- <
- __is_forward_iterator<_ForwardIterator>::value,
- void
- >::type
- __init(_ForwardIterator __first, _ForwardIterator __last);
-
- void __grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
- size_type __n_copy, size_type __n_del, size_type __n_add = 0);
- void __grow_by_and_replace(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
- size_type __n_copy, size_type __n_del,
- size_type __n_add, const value_type* __p_new_stuff);
-
- _LIBCPP_INLINE_VISIBILITY
- void __erase_to_end(size_type __pos);
-
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const basic_string& __str)
- {__copy_assign_alloc(__str, integral_constant<bool,
- __alloc_traits::propagate_on_container_copy_assignment::value>());}
-
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const basic_string& __str, true_type)
- {
- if (__alloc() == __str.__alloc())
- __alloc() = __str.__alloc();
- else
- {
- if (!__str.__is_long())
- {
- __clear_and_shrink();
- __alloc() = __str.__alloc();
- }
- else
- {
- allocator_type __a = __str.__alloc();
- pointer __p = __alloc_traits::allocate(__a, __str.__get_long_cap());
- __clear_and_shrink();
- __alloc() = _VSTD::move(__a);
- __set_long_pointer(__p);
- __set_long_cap(__str.__get_long_cap());
- __set_long_size(__str.size());
- }
- }
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const basic_string&, false_type) _NOEXCEPT
- {}
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign(basic_string& __str, false_type)
- _NOEXCEPT_(__alloc_traits::is_always_equal::value);
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign(basic_string& __str, true_type)
-#if _LIBCPP_STD_VER > 14
- _NOEXCEPT;
-#else
- _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
-#endif
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- void
- __move_assign_alloc(basic_string& __str)
- _NOEXCEPT_(
- !__alloc_traits::propagate_on_container_move_assignment::value ||
- is_nothrow_move_assignable<allocator_type>::value)
- {__move_assign_alloc(__str, integral_constant<bool,
- __alloc_traits::propagate_on_container_move_assignment::value>());}
-
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(basic_string& __c, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
- {
- __alloc() = _VSTD::move(__c.__alloc());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(basic_string&, false_type)
- _NOEXCEPT
- {}
-
- _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
- _LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(size_type);
-
- friend basic_string operator+<>(const basic_string&, const basic_string&);
- friend basic_string operator+<>(const value_type*, const basic_string&);
- friend basic_string operator+<>(value_type, const basic_string&);
- friend basic_string operator+<>(const basic_string&, const value_type*);
- friend basic_string operator+<>(const basic_string&, value_type);
-};
-
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-template<class _InputIterator,
- class _CharT = typename iterator_traits<_InputIterator>::value_type,
- class _Allocator = allocator<_CharT>,
- class = typename enable_if<__is_input_iterator<_InputIterator>::value, void>::type,
- class = typename enable_if<__is_allocator<_Allocator>::value, void>::type
- >
-basic_string(_InputIterator, _InputIterator, _Allocator = _Allocator())
- -> basic_string<_CharT, char_traits<_CharT>, _Allocator>;
-
-template<class _CharT,
- class _Traits,
- class _Allocator = allocator<_CharT>,
- class = typename enable_if<__is_allocator<_Allocator>::value, void>::type
- >
-explicit basic_string(basic_string_view<_CharT, _Traits>, const _Allocator& = _Allocator())
- -> basic_string<_CharT, _Traits, _Allocator>;
-
-template<class _CharT,
- class _Traits,
- class _Allocator = allocator<_CharT>,
- class = typename enable_if<__is_allocator<_Allocator>::value, void>::type,
- class _Sz = typename allocator_traits<_Allocator>::size_type
- >
-basic_string(basic_string_view<_CharT, _Traits>, _Sz, _Sz, const _Allocator& = _Allocator())
- -> basic_string<_CharT, _Traits, _Allocator>;
-#endif
-
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-void
-basic_string<_CharT, _Traits, _Allocator>::__invalidate_all_iterators()
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__invalidate_all(this);
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-void
-basic_string<_CharT, _Traits, _Allocator>::__invalidate_iterators_past(size_type
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __pos
-#endif
- )
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __c_node* __c = __get_db()->__find_c_and_lock(this);
- if (__c)
- {
- const_pointer __new_last = __get_pointer() + __pos;
- for (__i_node** __p = __c->end_; __p != __c->beg_; )
- {
- --__p;
- const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
- if (__i->base() > __new_last)
- {
- (*__p)->__c_ = nullptr;
- if (--__c->end_ != __p)
- memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
- }
- }
- __get_db()->unlock();
- }
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>::basic_string()
- _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __zero();
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>::basic_string(const allocator_type& __a)
-#if _LIBCPP_STD_VER <= 14
- _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
-#else
- _NOEXCEPT
-#endif
-: __r_(__second_tag(), __a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __zero();
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-void basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s,
- size_type __sz,
- size_type __reserve)
-{
- if (__reserve > max_size())
- this->__throw_length_error();
- pointer __p;
- if (__reserve < __min_cap)
- {
- __set_short_size(__sz);
- __p = __get_short_pointer();
- }
- else
- {
- size_type __cap = __recommend(__reserve);
- __p = __alloc_traits::allocate(__alloc(), __cap+1);
- __set_long_pointer(__p);
- __set_long_cap(__cap+1);
- __set_long_size(__sz);
- }
- traits_type::copy(_VSTD::__to_raw_pointer(__p), __s, __sz);
- traits_type::assign(__p[__sz], value_type());
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-void
-basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz)
-{
- if (__sz > max_size())
- this->__throw_length_error();
- pointer __p;
- if (__sz < __min_cap)
- {
- __set_short_size(__sz);
- __p = __get_short_pointer();
- }
- else
- {
- size_type __cap = __recommend(__sz);
- __p = __alloc_traits::allocate(__alloc(), __cap+1);
- __set_long_pointer(__p);
- __set_long_cap(__cap+1);
- __set_long_size(__sz);
- }
- traits_type::copy(_VSTD::__to_raw_pointer(__p), __s, __sz);
- traits_type::assign(__p[__sz], value_type());
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-template <class>
-#endif
-basic_string<_CharT, _Traits, _Allocator>::basic_string(const _CharT* __s, const _Allocator& __a)
- : __r_(__second_tag(), __a)
-{
- _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*, allocator) detected nullptr");
- __init(__s, traits_type::length(__s));
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>::basic_string(const _CharT* __s, size_type __n)
-{
- _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n) detected nullptr");
- __init(__s, __n);
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>::basic_string(const _CharT* __s, size_type __n, const _Allocator& __a)
- : __r_(__second_tag(), __a)
-{
- _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n, allocator) detected nullptr");
- __init(__s, __n);
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str)
- : __r_(__second_tag(), __alloc_traits::select_on_container_copy_construction(__str.__alloc()))
-{
- if (!__str.__is_long())
- __r_.first().__r = __str.__r_.first().__r;
- else
- __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>::basic_string(
- const basic_string& __str, const allocator_type& __a)
- : __r_(__second_tag(), __a)
-{
- if (!__str.__is_long())
- __r_.first().__r = __str.__r_.first().__r;
- else
- __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str)
-#if _LIBCPP_STD_VER <= 14
- _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
-#else
- _NOEXCEPT
-#endif
- : __r_(_VSTD::move(__str.__r_))
-{
- __str.__zero();
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
- if (__is_long())
- __get_db()->swap(this, &__str);
-#endif
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str, const allocator_type& __a)
- : __r_(__second_tag(), __a)
-{
- if (__str.__is_long() && __a != __str.__alloc()) // copy, not move
- __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
- else
- {
- __r_.first().__r = __str.__r_.first().__r;
- __str.__zero();
- }
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
- if (__is_long())
- __get_db()->swap(this, &__str);
-#endif
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits, class _Allocator>
-void
-basic_string<_CharT, _Traits, _Allocator>::__init(size_type __n, value_type __c)
-{
- if (__n > max_size())
- this->__throw_length_error();
- pointer __p;
- if (__n < __min_cap)
- {
- __set_short_size(__n);
- __p = __get_short_pointer();
- }
- else
- {
- size_type __cap = __recommend(__n);
- __p = __alloc_traits::allocate(__alloc(), __cap+1);
- __set_long_pointer(__p);
- __set_long_cap(__cap+1);
- __set_long_size(__n);
- }
- traits_type::assign(_VSTD::__to_raw_pointer(__p), __n, __c);
- traits_type::assign(__p[__n], value_type());
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, _CharT __c)
-{
- __init(__n, __c);
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-template <class>
-#endif
-basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, _CharT __c, const _Allocator& __a)
- : __r_(__second_tag(), __a)
-{
- __init(__n, __c);
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str,
- size_type __pos, size_type __n,
- const _Allocator& __a)
- : __r_(__second_tag(), __a)
-{
- size_type __str_sz = __str.size();
- if (__pos > __str_sz)
- this->__throw_out_of_range();
- __init(__str.data() + __pos, _VSTD::min(__n, __str_sz - __pos));
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, size_type __pos,
- const _Allocator& __a)
- : __r_(__second_tag(), __a)
-{
- size_type __str_sz = __str.size();
- if (__pos > __str_sz)
- this->__throw_out_of_range();
- __init(__str.data() + __pos, __str_sz - __pos);
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template <class _Tp, class>
-basic_string<_CharT, _Traits, _Allocator>::basic_string(
- const _Tp& __t, size_type __pos, size_type __n, const allocator_type& __a)
- : __r_(__second_tag(), __a)
-{
- __self_view __sv0 = __t;
- __self_view __sv = __sv0.substr(__pos, __n);
- __init(__sv.data(), __sv.size());
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template <class _Tp, class>
-basic_string<_CharT, _Traits, _Allocator>::basic_string(const _Tp & __t)
-{
- __self_view __sv = __t;
- __init(__sv.data(), __sv.size());
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template <class _Tp, class>
-basic_string<_CharT, _Traits, _Allocator>::basic_string(const _Tp & __t, const _Allocator& __a)
- : __r_(__second_tag(), __a)
-{
- __self_view __sv = __t;
- __init(__sv.data(), __sv.size());
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template <class _InputIterator>
-typename enable_if
-<
- __is_exactly_input_iterator<_InputIterator>::value,
- void
->::type
-basic_string<_CharT, _Traits, _Allocator>::__init(_InputIterator __first, _InputIterator __last)
-{
- __zero();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (; __first != __last; ++__first)
- push_back(*__first);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- if (__is_long())
- __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template <class _ForwardIterator>
-typename enable_if
-<
- __is_forward_iterator<_ForwardIterator>::value,
- void
->::type
-basic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _ForwardIterator __last)
-{
- size_type __sz = static_cast<size_type>(_VSTD::distance(__first, __last));
- if (__sz > max_size())
- this->__throw_length_error();
- pointer __p;
- if (__sz < __min_cap)
- {
- __set_short_size(__sz);
- __p = __get_short_pointer();
- }
- else
- {
- size_type __cap = __recommend(__sz);
- __p = __alloc_traits::allocate(__alloc(), __cap+1);
- __set_long_pointer(__p);
- __set_long_cap(__cap+1);
- __set_long_size(__sz);
- }
- for (; __first != __last; ++__first, (void) ++__p)
- traits_type::assign(*__p, *__first);
- traits_type::assign(*__p, value_type());
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template<class _InputIterator>
-inline
-basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last)
-{
- __init(__first, __last);
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template<class _InputIterator>
-inline
-basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last,
- const allocator_type& __a)
- : __r_(__second_tag(), __a)
-{
- __init(__first, __last);
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>::basic_string(
- initializer_list<_CharT> __il)
-{
- __init(__il.begin(), __il.end());
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-
-basic_string<_CharT, _Traits, _Allocator>::basic_string(
- initializer_list<_CharT> __il, const _Allocator& __a)
- : __r_(__second_tag(), __a)
-{
- __init(__il.begin(), __il.end());
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>::~basic_string()
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__erase_c(this);
-#endif
- if (__is_long())
- __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-void
-basic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace
- (size_type __old_cap, size_type __delta_cap, size_type __old_sz,
- size_type __n_copy, size_type __n_del, size_type __n_add, const value_type* __p_new_stuff)
-{
- size_type __ms = max_size();
- if (__delta_cap > __ms - __old_cap - 1)
- this->__throw_length_error();
- pointer __old_p = __get_pointer();
- size_type __cap = __old_cap < __ms / 2 - __alignment ?
- __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
- __ms - 1;
- pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
- __invalidate_all_iterators();
- if (__n_copy != 0)
- traits_type::copy(_VSTD::__to_raw_pointer(__p),
- _VSTD::__to_raw_pointer(__old_p), __n_copy);
- if (__n_add != 0)
- traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy, __p_new_stuff, __n_add);
- size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
- if (__sec_cp_sz != 0)
- traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy + __n_add,
- _VSTD::__to_raw_pointer(__old_p) + __n_copy + __n_del, __sec_cp_sz);
- if (__old_cap+1 != __min_cap)
- __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
- __set_long_pointer(__p);
- __set_long_cap(__cap+1);
- __old_sz = __n_copy + __n_add + __sec_cp_sz;
- __set_long_size(__old_sz);
- traits_type::assign(__p[__old_sz], value_type());
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-void
-basic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
- size_type __n_copy, size_type __n_del, size_type __n_add)
-{
- size_type __ms = max_size();
- if (__delta_cap > __ms - __old_cap)
- this->__throw_length_error();
- pointer __old_p = __get_pointer();
- size_type __cap = __old_cap < __ms / 2 - __alignment ?
- __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
- __ms - 1;
- pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
- __invalidate_all_iterators();
- if (__n_copy != 0)
- traits_type::copy(_VSTD::__to_raw_pointer(__p),
- _VSTD::__to_raw_pointer(__old_p), __n_copy);
- size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
- if (__sec_cp_sz != 0)
- traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy + __n_add,
- _VSTD::__to_raw_pointer(__old_p) + __n_copy + __n_del,
- __sec_cp_sz);
- if (__old_cap+1 != __min_cap)
- __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
- __set_long_pointer(__p);
- __set_long_cap(__cap+1);
-}
-
-// assign
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s, size_type __n)
-{
- _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::assign received nullptr");
- size_type __cap = capacity();
- if (__cap >= __n)
- {
- value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
- traits_type::move(__p, __s, __n);
- traits_type::assign(__p[__n], value_type());
- __set_size(__n);
- __invalidate_iterators_past(__n);
- }
- else
- {
- size_type __sz = size();
- __grow_by_and_replace(__cap, __n - __cap, __sz, 0, __sz, __n, __s);
- }
- return *this;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::assign(size_type __n, value_type __c)
-{
- size_type __cap = capacity();
- if (__cap < __n)
- {
- size_type __sz = size();
- __grow_by(__cap, __n - __cap, __sz, 0, __sz);
- }
- else
- __invalidate_iterators_past(__n);
- value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
- traits_type::assign(__p, __n, __c);
- traits_type::assign(__p[__n], value_type());
- __set_size(__n);
- return *this;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::operator=(value_type __c)
-{
- pointer __p;
- if (__is_long())
- {
- __p = __get_long_pointer();
- __set_long_size(1);
- }
- else
- {
- __p = __get_short_pointer();
- __set_short_size(1);
- }
- traits_type::assign(*__p, __c);
- traits_type::assign(*++__p, value_type());
- __invalidate_iterators_past(1);
- return *this;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::operator=(const basic_string& __str)
-{
- if (this != &__str)
- {
- __copy_assign_alloc(__str);
- assign(__str.data(), __str.size());
- }
- return *this;
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-void
-basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, false_type)
- _NOEXCEPT_(__alloc_traits::is_always_equal::value)
-{
- if (__alloc() != __str.__alloc())
- assign(__str);
- else
- __move_assign(__str, true_type());
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-void
-basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, true_type)
-#if _LIBCPP_STD_VER > 14
- _NOEXCEPT
-#else
- _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
-#endif
-{
- __clear_and_shrink();
- __r_.first() = __str.__r_.first();
- __move_assign_alloc(__str);
- __str.__zero();
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::operator=(basic_string&& __str)
- _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
-{
- __move_assign(__str, integral_constant<bool,
- __alloc_traits::propagate_on_container_move_assignment::value>());
- return *this;
-}
-
-#endif
-
-template <class _CharT, class _Traits, class _Allocator>
-template<class _InputIterator>
-typename enable_if
-<
- __is_exactly_input_iterator <_InputIterator>::value
- || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value,
- basic_string<_CharT, _Traits, _Allocator>&
->::type
-basic_string<_CharT, _Traits, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
-{
- const basic_string __temp(__first, __last, __alloc());
- assign(__temp.data(), __temp.size());
- return *this;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template<class _ForwardIterator>
-typename enable_if
-<
- __is_forward_iterator<_ForwardIterator>::value
- && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value,
- basic_string<_CharT, _Traits, _Allocator>&
->::type
-basic_string<_CharT, _Traits, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
-{
- size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
- size_type __cap = capacity();
- if (__cap < __n)
- {
- size_type __sz = size();
- __grow_by(__cap, __n - __cap, __sz, 0, __sz);
- }
- else
- __invalidate_iterators_past(__n);
- pointer __p = __get_pointer();
- for (; __first != __last; ++__first, ++__p)
- traits_type::assign(*__p, *__first);
- traits_type::assign(*__p, value_type());
- __set_size(__n);
- return *this;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str, size_type __pos, size_type __n)
-{
- size_type __sz = __str.size();
- if (__pos > __sz)
- this->__throw_out_of_range();
- return assign(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template <class _Tp>
-typename enable_if
-<
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- basic_string<_CharT, _Traits, _Allocator>&
->::type
-basic_string<_CharT, _Traits, _Allocator>::assign(const _Tp & __t, size_type __pos, size_type __n)
-{
- __self_view __sv = __t;
- size_type __sz = __sv.size();
- if (__pos > __sz)
- this->__throw_out_of_range();
- return assign(__sv.data() + __pos, _VSTD::min(__n, __sz - __pos));
-}
-
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s)
-{
- _LIBCPP_ASSERT(__s != nullptr, "string::assign received nullptr");
- return assign(__s, traits_type::length(__s));
-}
-
-// append
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s, size_type __n)
-{
- _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::append received nullptr");
- size_type __cap = capacity();
- size_type __sz = size();
- if (__cap - __sz >= __n)
- {
- if (__n)
- {
- value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
- traits_type::copy(__p + __sz, __s, __n);
- __sz += __n;
- __set_size(__sz);
- traits_type::assign(__p[__sz], value_type());
- }
- }
- else
- __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __sz, 0, __n, __s);
- return *this;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::append(size_type __n, value_type __c)
-{
- if (__n)
- {
- size_type __cap = capacity();
- size_type __sz = size();
- if (__cap - __sz < __n)
- __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
- pointer __p = __get_pointer();
- traits_type::assign(_VSTD::__to_raw_pointer(__p) + __sz, __n, __c);
- __sz += __n;
- __set_size(__sz);
- traits_type::assign(__p[__sz], value_type());
- }
- return *this;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline void
-basic_string<_CharT, _Traits, _Allocator>::__append_default_init(size_type __n)
-{
- if (__n)
- {
- size_type __cap = capacity();
- size_type __sz = size();
- if (__cap - __sz < __n)
- __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
- pointer __p = __get_pointer();
- __sz += __n;
- __set_size(__sz);
- traits_type::assign(__p[__sz], value_type());
- }
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-void
-basic_string<_CharT, _Traits, _Allocator>::push_back(value_type __c)
-{
- bool __is_short = !__is_long();
- size_type __cap;
- size_type __sz;
- if (__is_short)
- {
- __cap = __min_cap - 1;
- __sz = __get_short_size();
- }
- else
- {
- __cap = __get_long_cap() - 1;
- __sz = __get_long_size();
- }
- if (__sz == __cap)
- {
- __grow_by(__cap, 1, __sz, __sz, 0);
- __is_short = !__is_long();
- }
- pointer __p;
- if (__is_short)
- {
- __p = __get_short_pointer() + __sz;
- __set_short_size(__sz+1);
- }
- else
- {
- __p = __get_long_pointer() + __sz;
- __set_long_size(__sz+1);
- }
- traits_type::assign(*__p, __c);
- traits_type::assign(*++__p, value_type());
-}
-
-template <class _Tp>
-bool __ptr_in_range (const _Tp* __p, const _Tp* __first, const _Tp* __last)
-{
- return __first <= __p && __p < __last;
-}
-
-template <class _Tp1, class _Tp2>
-bool __ptr_in_range (const _Tp1*, const _Tp2*, const _Tp2*)
-{
- return false;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template<class _ForwardIterator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::__append_forward_unsafe(
- _ForwardIterator __first, _ForwardIterator __last)
-{
- static_assert(__is_forward_iterator<_ForwardIterator>::value,
- "function requires a ForwardIterator");
- size_type __sz = size();
- size_type __cap = capacity();
- size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
- if (__n)
- {
- typedef typename iterator_traits<_ForwardIterator>::reference _CharRef;
- _CharRef __tmp_ref = *__first;
- if (__ptr_in_range(_VSTD::addressof(__tmp_ref), data(), data() + size()))
- {
- const basic_string __temp (__first, __last, __alloc());
- append(__temp.data(), __temp.size());
- }
- else
- {
- if (__cap - __sz < __n)
- __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
- pointer __p = __get_pointer() + __sz;
- for (; __first != __last; ++__p, ++__first)
- traits_type::assign(*__p, *__first);
- traits_type::assign(*__p, value_type());
- __set_size(__sz + __n);
- }
- }
- return *this;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str)
-{
- return append(__str.data(), __str.size());
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str, size_type __pos, size_type __n)
-{
- size_type __sz = __str.size();
- if (__pos > __sz)
- this->__throw_out_of_range();
- return append(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template <class _Tp>
- typename enable_if
- <
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- basic_string<_CharT, _Traits, _Allocator>&
- >::type
-basic_string<_CharT, _Traits, _Allocator>::append(const _Tp & __t, size_type __pos, size_type __n)
-{
- __self_view __sv = __t;
- size_type __sz = __sv.size();
- if (__pos > __sz)
- this->__throw_out_of_range();
- return append(__sv.data() + __pos, _VSTD::min(__n, __sz - __pos));
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s)
-{
- _LIBCPP_ASSERT(__s != nullptr, "string::append received nullptr");
- return append(__s, traits_type::length(__s));
-}
-
-// insert
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s, size_type __n)
-{
- _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::insert received nullptr");
- size_type __sz = size();
- if (__pos > __sz)
- this->__throw_out_of_range();
- size_type __cap = capacity();
- if (__cap - __sz >= __n)
- {
- if (__n)
- {
- value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
- size_type __n_move = __sz - __pos;
- if (__n_move != 0)
- {
- if (__p + __pos <= __s && __s < __p + __sz)
- __s += __n;
- traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
- }
- traits_type::move(__p + __pos, __s, __n);
- __sz += __n;
- __set_size(__sz);
- traits_type::assign(__p[__sz], value_type());
- }
- }
- else
- __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s);
- return *this;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, size_type __n, value_type __c)
-{
- size_type __sz = size();
- if (__pos > __sz)
- this->__throw_out_of_range();
- if (__n)
- {
- size_type __cap = capacity();
- value_type* __p;
- if (__cap - __sz >= __n)
- {
- __p = _VSTD::__to_raw_pointer(__get_pointer());
- size_type __n_move = __sz - __pos;
- if (__n_move != 0)
- traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
- }
- else
- {
- __grow_by(__cap, __sz + __n - __cap, __sz, __pos, 0, __n);
- __p = _VSTD::__to_raw_pointer(__get_long_pointer());
- }
- traits_type::assign(__p + __pos, __n, __c);
- __sz += __n;
- __set_size(__sz);
- traits_type::assign(__p[__sz], value_type());
- }
- return *this;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template<class _InputIterator>
-typename enable_if
-<
- __is_exactly_input_iterator<_InputIterator>::value
- || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value,
- typename basic_string<_CharT, _Traits, _Allocator>::iterator
->::type
-basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _InputIterator __first, _InputIterator __last)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
- "string::insert(iterator, range) called with an iterator not"
- " referring to this string");
-#endif
- const basic_string __temp(__first, __last, __alloc());
- return insert(__pos, __temp.data(), __temp.data() + __temp.size());
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template<class _ForwardIterator>
-typename enable_if
-<
- __is_forward_iterator<_ForwardIterator>::value
- && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value,
- typename basic_string<_CharT, _Traits, _Allocator>::iterator
->::type
-basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
- "string::insert(iterator, range) called with an iterator not"
- " referring to this string");
-#endif
- size_type __ip = static_cast<size_type>(__pos - begin());
- size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
- if (__n)
- {
- typedef typename iterator_traits<_ForwardIterator>::reference _CharRef;
- _CharRef __tmp_char = *__first;
- if (__ptr_in_range(_VSTD::addressof(__tmp_char), data(), data() + size()))
- {
- const basic_string __temp(__first, __last, __alloc());
- return insert(__pos, __temp.data(), __temp.data() + __temp.size());
- }
-
- size_type __sz = size();
- size_type __cap = capacity();
- value_type* __p;
- if (__cap - __sz >= __n)
- {
- __p = _VSTD::__to_raw_pointer(__get_pointer());
- size_type __n_move = __sz - __ip;
- if (__n_move != 0)
- traits_type::move(__p + __ip + __n, __p + __ip, __n_move);
- }
- else
- {
- __grow_by(__cap, __sz + __n - __cap, __sz, __ip, 0, __n);
- __p = _VSTD::__to_raw_pointer(__get_long_pointer());
- }
- __sz += __n;
- __set_size(__sz);
- traits_type::assign(__p[__sz], value_type());
- for (__p += __ip; __first != __last; ++__p, ++__first)
- traits_type::assign(*__p, *__first);
- }
- return begin() + __ip;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str)
-{
- return insert(__pos1, __str.data(), __str.size());
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str,
- size_type __pos2, size_type __n)
-{
- size_type __str_sz = __str.size();
- if (__pos2 > __str_sz)
- this->__throw_out_of_range();
- return insert(__pos1, __str.data() + __pos2, _VSTD::min(__n, __str_sz - __pos2));
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template <class _Tp>
-typename enable_if
-<
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- basic_string<_CharT, _Traits, _Allocator>&
->::type
-basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const _Tp& __t,
- size_type __pos2, size_type __n)
-{
- __self_view __sv = __t;
- size_type __str_sz = __sv.size();
- if (__pos2 > __str_sz)
- this->__throw_out_of_range();
- return insert(__pos1, __sv.data() + __pos2, _VSTD::min(__n, __str_sz - __pos2));
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s)
-{
- _LIBCPP_ASSERT(__s != nullptr, "string::insert received nullptr");
- return insert(__pos, __s, traits_type::length(__s));
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-typename basic_string<_CharT, _Traits, _Allocator>::iterator
-basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, value_type __c)
-{
- size_type __ip = static_cast<size_type>(__pos - begin());
- size_type __sz = size();
- size_type __cap = capacity();
- value_type* __p;
- if (__cap == __sz)
- {
- __grow_by(__cap, 1, __sz, __ip, 0, 1);
- __p = _VSTD::__to_raw_pointer(__get_long_pointer());
- }
- else
- {
- __p = _VSTD::__to_raw_pointer(__get_pointer());
- size_type __n_move = __sz - __ip;
- if (__n_move != 0)
- traits_type::move(__p + __ip + 1, __p + __ip, __n_move);
- }
- traits_type::assign(__p[__ip], __c);
- traits_type::assign(__p[++__sz], value_type());
- __set_size(__sz);
- return begin() + static_cast<difference_type>(__ip);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::iterator
-basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, size_type __n, value_type __c)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
- "string::insert(iterator, n, value) called with an iterator not"
- " referring to this string");
-#endif
- difference_type __p = __pos - begin();
- insert(static_cast<size_type>(__p), __n, __c);
- return begin() + __p;
-}
-
-// replace
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2)
- _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
-{
- _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::replace received nullptr");
- size_type __sz = size();
- if (__pos > __sz)
- this->__throw_out_of_range();
- __n1 = _VSTD::min(__n1, __sz - __pos);
- size_type __cap = capacity();
- if (__cap - __sz + __n1 >= __n2)
- {
- value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
- if (__n1 != __n2)
- {
- size_type __n_move = __sz - __pos - __n1;
- if (__n_move != 0)
- {
- if (__n1 > __n2)
- {
- traits_type::move(__p + __pos, __s, __n2);
- traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
- goto __finish;
- }
- if (__p + __pos < __s && __s < __p + __sz)
- {
- if (__p + __pos + __n1 <= __s)
- __s += __n2 - __n1;
- else // __p + __pos < __s < __p + __pos + __n1
- {
- traits_type::move(__p + __pos, __s, __n1);
- __pos += __n1;
- __s += __n2;
- __n2 -= __n1;
- __n1 = 0;
- }
- }
- traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
- }
- }
- traits_type::move(__p + __pos, __s, __n2);
-__finish:
-// __sz += __n2 - __n1; in this and the below function below can cause unsigned integer overflow,
-// but this is a safe operation, so we disable the check.
- __sz += __n2 - __n1;
- __set_size(__sz);
- __invalidate_iterators_past(__sz);
- traits_type::assign(__p[__sz], value_type());
- }
- else
- __grow_by_and_replace(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2, __s);
- return *this;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, size_type __n2, value_type __c)
- _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
-{
- size_type __sz = size();
- if (__pos > __sz)
- this->__throw_out_of_range();
- __n1 = _VSTD::min(__n1, __sz - __pos);
- size_type __cap = capacity();
- value_type* __p;
- if (__cap - __sz + __n1 >= __n2)
- {
- __p = _VSTD::__to_raw_pointer(__get_pointer());
- if (__n1 != __n2)
- {
- size_type __n_move = __sz - __pos - __n1;
- if (__n_move != 0)
- traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
- }
- }
- else
- {
- __grow_by(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2);
- __p = _VSTD::__to_raw_pointer(__get_long_pointer());
- }
- traits_type::assign(__p + __pos, __n2, __c);
- __sz += __n2 - __n1;
- __set_size(__sz);
- __invalidate_iterators_past(__sz);
- traits_type::assign(__p[__sz], value_type());
- return *this;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template<class _InputIterator>
-typename enable_if
-<
- __is_input_iterator<_InputIterator>::value,
- basic_string<_CharT, _Traits, _Allocator>&
->::type
-basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2,
- _InputIterator __j1, _InputIterator __j2)
-{
- const basic_string __temp(__j1, __j2, __alloc());
- return this->replace(__i1, __i2, __temp);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str)
-{
- return replace(__pos1, __n1, __str.data(), __str.size());
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str,
- size_type __pos2, size_type __n2)
-{
- size_type __str_sz = __str.size();
- if (__pos2 > __str_sz)
- this->__throw_out_of_range();
- return replace(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2, __str_sz - __pos2));
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template <class _Tp>
-typename enable_if
-<
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- basic_string<_CharT, _Traits, _Allocator>&
->::type
-basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const _Tp& __t,
- size_type __pos2, size_type __n2)
-{
- __self_view __sv = __t;
- size_type __str_sz = __sv.size();
- if (__pos2 > __str_sz)
- this->__throw_out_of_range();
- return replace(__pos1, __n1, __sv.data() + __pos2, _VSTD::min(__n2, __str_sz - __pos2));
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s)
-{
- _LIBCPP_ASSERT(__s != nullptr, "string::replace received nullptr");
- return replace(__pos, __n1, __s, traits_type::length(__s));
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const basic_string& __str)
-{
- return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1),
- __str.data(), __str.size());
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n)
-{
- return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s, __n);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s)
-{
- return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c)
-{
- return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __n, __c);
-}
-
-// erase
-
-template <class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>&
-basic_string<_CharT, _Traits, _Allocator>::erase(size_type __pos, size_type __n)
-{
- size_type __sz = size();
- if (__pos > __sz)
- this->__throw_out_of_range();
- if (__n)
- {
- value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
- __n = _VSTD::min(__n, __sz - __pos);
- size_type __n_move = __sz - __pos - __n;
- if (__n_move != 0)
- traits_type::move(__p + __pos, __p + __pos + __n, __n_move);
- __sz -= __n;
- __set_size(__sz);
- __invalidate_iterators_past(__sz);
- traits_type::assign(__p[__sz], value_type());
- }
- return *this;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::iterator
-basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __pos)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
- "string::erase(iterator) called with an iterator not"
- " referring to this string");
-#endif
- _LIBCPP_ASSERT(__pos != end(),
- "string::erase(iterator) called with a non-dereferenceable iterator");
- iterator __b = begin();
- size_type __r = static_cast<size_type>(__pos - __b);
- erase(__r, 1);
- return __b + static_cast<difference_type>(__r);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::iterator
-basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __first, const_iterator __last)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
- "string::erase(iterator, iterator) called with an iterator not"
- " referring to this string");
-#endif
- _LIBCPP_ASSERT(__first <= __last, "string::erase(first, last) called with invalid range");
- iterator __b = begin();
- size_type __r = static_cast<size_type>(__first - __b);
- erase(__r, static_cast<size_type>(__last - __first));
- return __b + static_cast<difference_type>(__r);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-void
-basic_string<_CharT, _Traits, _Allocator>::pop_back()
-{
- _LIBCPP_ASSERT(!empty(), "string::pop_back(): string is already empty");
- size_type __sz;
- if (__is_long())
- {
- __sz = __get_long_size() - 1;
- __set_long_size(__sz);
- traits_type::assign(*(__get_long_pointer() + __sz), value_type());
- }
- else
- {
- __sz = __get_short_size() - 1;
- __set_short_size(__sz);
- traits_type::assign(*(__get_short_pointer() + __sz), value_type());
- }
- __invalidate_iterators_past(__sz);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-void
-basic_string<_CharT, _Traits, _Allocator>::clear() _NOEXCEPT
-{
- __invalidate_all_iterators();
- if (__is_long())
- {
- traits_type::assign(*__get_long_pointer(), value_type());
- __set_long_size(0);
- }
- else
- {
- traits_type::assign(*__get_short_pointer(), value_type());
- __set_short_size(0);
- }
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-void
-basic_string<_CharT, _Traits, _Allocator>::__erase_to_end(size_type __pos)
-{
- if (__is_long())
- {
- traits_type::assign(*(__get_long_pointer() + __pos), value_type());
- __set_long_size(__pos);
- }
- else
- {
- traits_type::assign(*(__get_short_pointer() + __pos), value_type());
- __set_short_size(__pos);
- }
- __invalidate_iterators_past(__pos);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-void
-basic_string<_CharT, _Traits, _Allocator>::resize(size_type __n, value_type __c)
-{
- size_type __sz = size();
- if (__n > __sz)
- append(__n - __sz, __c);
- else
- __erase_to_end(__n);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline void
-basic_string<_CharT, _Traits, _Allocator>::__resize_default_init(size_type __n)
-{
- size_type __sz = size();
- if (__n > __sz) {
- __append_default_init(__n - __sz);
- } else
- __erase_to_end(__n);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::max_size() const _NOEXCEPT
-{
- size_type __m = __alloc_traits::max_size(__alloc());
-#ifdef _LIBCPP_BIG_ENDIAN
- return (__m <= ~__long_mask ? __m : __m/2) - __alignment;
-#else
- return __m - __alignment;
-#endif
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-void
-basic_string<_CharT, _Traits, _Allocator>::reserve(size_type __res_arg)
-{
- if (__res_arg > max_size())
- this->__throw_length_error();
- size_type __cap = capacity();
- size_type __sz = size();
- __res_arg = _VSTD::max(__res_arg, __sz);
- __res_arg = __recommend(__res_arg);
- if (__res_arg != __cap)
- {
- pointer __new_data, __p;
- bool __was_long, __now_long;
- if (__res_arg == __min_cap - 1)
- {
- __was_long = true;
- __now_long = false;
- __new_data = __get_short_pointer();
- __p = __get_long_pointer();
- }
- else
- {
- if (__res_arg > __cap)
- __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1);
- else
- {
- #ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
- #endif // _LIBCPP_NO_EXCEPTIONS
- __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- return;
- }
- #else // _LIBCPP_NO_EXCEPTIONS
- if (__new_data == nullptr)
- return;
- #endif // _LIBCPP_NO_EXCEPTIONS
- }
- __now_long = true;
- __was_long = __is_long();
- __p = __get_pointer();
- }
- traits_type::copy(_VSTD::__to_raw_pointer(__new_data),
- _VSTD::__to_raw_pointer(__p), size()+1);
- if (__was_long)
- __alloc_traits::deallocate(__alloc(), __p, __cap+1);
- if (__now_long)
- {
- __set_long_cap(__res_arg+1);
- __set_long_size(__sz);
- __set_long_pointer(__new_data);
- }
- else
- __set_short_size(__sz);
- __invalidate_all_iterators();
- }
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::const_reference
-basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) const _NOEXCEPT
-{
- _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
- return *(data() + __pos);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::reference
-basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) _NOEXCEPT
-{
- _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
- return *(__get_pointer() + __pos);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-typename basic_string<_CharT, _Traits, _Allocator>::const_reference
-basic_string<_CharT, _Traits, _Allocator>::at(size_type __n) const
-{
- if (__n >= size())
- this->__throw_out_of_range();
- return (*this)[__n];
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-typename basic_string<_CharT, _Traits, _Allocator>::reference
-basic_string<_CharT, _Traits, _Allocator>::at(size_type __n)
-{
- if (__n >= size())
- this->__throw_out_of_range();
- return (*this)[__n];
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::reference
-basic_string<_CharT, _Traits, _Allocator>::front()
-{
- _LIBCPP_ASSERT(!empty(), "string::front(): string is empty");
- return *__get_pointer();
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::const_reference
-basic_string<_CharT, _Traits, _Allocator>::front() const
-{
- _LIBCPP_ASSERT(!empty(), "string::front(): string is empty");
- return *data();
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::reference
-basic_string<_CharT, _Traits, _Allocator>::back()
-{
- _LIBCPP_ASSERT(!empty(), "string::back(): string is empty");
- return *(__get_pointer() + size() - 1);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::const_reference
-basic_string<_CharT, _Traits, _Allocator>::back() const
-{
- _LIBCPP_ASSERT(!empty(), "string::back(): string is empty");
- return *(data() + size() - 1);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::copy(value_type* __s, size_type __n, size_type __pos) const
-{
- size_type __sz = size();
- if (__pos > __sz)
- this->__throw_out_of_range();
- size_type __rlen = _VSTD::min(__n, __sz - __pos);
- traits_type::copy(__s, data() + __pos, __rlen);
- return __rlen;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>
-basic_string<_CharT, _Traits, _Allocator>::substr(size_type __pos, size_type __n) const
-{
- return basic_string(*this, __pos, __n, __alloc());
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-void
-basic_string<_CharT, _Traits, _Allocator>::swap(basic_string& __str)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT_DEBUG
-#else
- _NOEXCEPT_DEBUG_(!__alloc_traits::propagate_on_container_swap::value ||
- __is_nothrow_swappable<allocator_type>::value)
-#endif
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- if (!__is_long())
- __get_db()->__invalidate_all(this);
- if (!__str.__is_long())
- __get_db()->__invalidate_all(&__str);
- __get_db()->swap(this, &__str);
-#endif
- _LIBCPP_ASSERT(
- __alloc_traits::propagate_on_container_swap::value ||
- __alloc_traits::is_always_equal::value ||
- __alloc() == __str.__alloc(), "swapping non-equal allocators");
- _VSTD::swap(__r_.first(), __str.__r_.first());
- __swap_allocator(__alloc(), __str.__alloc());
-}
-
-// find
-
-template <class _Traits>
-struct _LIBCPP_HIDDEN __traits_eq
-{
- typedef typename _Traits::char_type char_type;
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const char_type& __x, const char_type& __y) _NOEXCEPT
- {return _Traits::eq(__x, __y);}
-};
-
-template<class _CharT, class _Traits, class _Allocator>
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
- size_type __pos,
- size_type __n) const _NOEXCEPT
-{
- _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find(): received nullptr");
- return __str_find<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, __n);
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find(const basic_string& __str,
- size_type __pos) const _NOEXCEPT
-{
- return __str_find<value_type, size_type, traits_type, npos>
- (data(), size(), __str.data(), __pos, __str.size());
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-template <class _Tp>
-typename enable_if
-<
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- typename basic_string<_CharT, _Traits, _Allocator>::size_type
->::type
-basic_string<_CharT, _Traits, _Allocator>::find(const _Tp &__t,
- size_type __pos) const
-{
- __self_view __sv = __t;
- return __str_find<value_type, size_type, traits_type, npos>
- (data(), size(), __sv.data(), __pos, __sv.size());
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
- size_type __pos) const _NOEXCEPT
-{
- _LIBCPP_ASSERT(__s != nullptr, "string::find(): received nullptr");
- return __str_find<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, traits_type::length(__s));
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find(value_type __c,
- size_type __pos) const _NOEXCEPT
-{
- return __str_find<value_type, size_type, traits_type, npos>
- (data(), size(), __c, __pos);
-}
-
-// rfind
-
-template<class _CharT, class _Traits, class _Allocator>
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
- size_type __pos,
- size_type __n) const _NOEXCEPT
-{
- _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::rfind(): received nullptr");
- return __str_rfind<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, __n);
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::rfind(const basic_string& __str,
- size_type __pos) const _NOEXCEPT
-{
- return __str_rfind<value_type, size_type, traits_type, npos>
- (data(), size(), __str.data(), __pos, __str.size());
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-template <class _Tp>
-typename enable_if
-<
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- typename basic_string<_CharT, _Traits, _Allocator>::size_type
->::type
-basic_string<_CharT, _Traits, _Allocator>::rfind(const _Tp& __t,
- size_type __pos) const
-{
- __self_view __sv = __t;
- return __str_rfind<value_type, size_type, traits_type, npos>
- (data(), size(), __sv.data(), __pos, __sv.size());
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
- size_type __pos) const _NOEXCEPT
-{
- _LIBCPP_ASSERT(__s != nullptr, "string::rfind(): received nullptr");
- return __str_rfind<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, traits_type::length(__s));
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::rfind(value_type __c,
- size_type __pos) const _NOEXCEPT
-{
- return __str_rfind<value_type, size_type, traits_type, npos>
- (data(), size(), __c, __pos);
-}
-
-// find_first_of
-
-template<class _CharT, class _Traits, class _Allocator>
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
- size_type __pos,
- size_type __n) const _NOEXCEPT
-{
- _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_of(): received nullptr");
- return __str_find_first_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, __n);
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_first_of(const basic_string& __str,
- size_type __pos) const _NOEXCEPT
-{
- return __str_find_first_of<value_type, size_type, traits_type, npos>
- (data(), size(), __str.data(), __pos, __str.size());
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-template <class _Tp>
-typename enable_if
-<
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- typename basic_string<_CharT, _Traits, _Allocator>::size_type
->::type
-basic_string<_CharT, _Traits, _Allocator>::find_first_of(const _Tp& __t,
- size_type __pos) const
-{
- __self_view __sv = __t;
- return __str_find_first_of<value_type, size_type, traits_type, npos>
- (data(), size(), __sv.data(), __pos, __sv.size());
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
- size_type __pos) const _NOEXCEPT
-{
- _LIBCPP_ASSERT(__s != nullptr, "string::find_first_of(): received nullptr");
- return __str_find_first_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, traits_type::length(__s));
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_first_of(value_type __c,
- size_type __pos) const _NOEXCEPT
-{
- return find(__c, __pos);
-}
-
-// find_last_of
-
-template<class _CharT, class _Traits, class _Allocator>
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
- size_type __pos,
- size_type __n) const _NOEXCEPT
-{
- _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_of(): received nullptr");
- return __str_find_last_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, __n);
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_last_of(const basic_string& __str,
- size_type __pos) const _NOEXCEPT
-{
- return __str_find_last_of<value_type, size_type, traits_type, npos>
- (data(), size(), __str.data(), __pos, __str.size());
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-template <class _Tp>
-typename enable_if
-<
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- typename basic_string<_CharT, _Traits, _Allocator>::size_type
->::type
-basic_string<_CharT, _Traits, _Allocator>::find_last_of(const _Tp& __t,
- size_type __pos) const
-{
- __self_view __sv = __t;
- return __str_find_last_of<value_type, size_type, traits_type, npos>
- (data(), size(), __sv.data(), __pos, __sv.size());
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
- size_type __pos) const _NOEXCEPT
-{
- _LIBCPP_ASSERT(__s != nullptr, "string::find_last_of(): received nullptr");
- return __str_find_last_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, traits_type::length(__s));
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_last_of(value_type __c,
- size_type __pos) const _NOEXCEPT
-{
- return rfind(__c, __pos);
-}
-
-// find_first_not_of
-
-template<class _CharT, class _Traits, class _Allocator>
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
- size_type __pos,
- size_type __n) const _NOEXCEPT
-{
- _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_not_of(): received nullptr");
- return __str_find_first_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, __n);
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const basic_string& __str,
- size_type __pos) const _NOEXCEPT
-{
- return __str_find_first_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __str.data(), __pos, __str.size());
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-template <class _Tp>
-typename enable_if
-<
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- typename basic_string<_CharT, _Traits, _Allocator>::size_type
->::type
-basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const _Tp& __t,
- size_type __pos) const
-{
- __self_view __sv = __t;
- return __str_find_first_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __sv.data(), __pos, __sv.size());
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
- size_type __pos) const _NOEXCEPT
-{
- _LIBCPP_ASSERT(__s != nullptr, "string::find_first_not_of(): received nullptr");
- return __str_find_first_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, traits_type::length(__s));
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(value_type __c,
- size_type __pos) const _NOEXCEPT
-{
- return __str_find_first_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __c, __pos);
-}
-
-// find_last_not_of
-
-template<class _CharT, class _Traits, class _Allocator>
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
- size_type __pos,
- size_type __n) const _NOEXCEPT
-{
- _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_not_of(): received nullptr");
- return __str_find_last_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, __n);
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const basic_string& __str,
- size_type __pos) const _NOEXCEPT
-{
- return __str_find_last_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __str.data(), __pos, __str.size());
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-template <class _Tp>
-typename enable_if
-<
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- typename basic_string<_CharT, _Traits, _Allocator>::size_type
->::type
-basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const _Tp& __t,
- size_type __pos) const
-{
- __self_view __sv = __t;
- return __str_find_last_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __sv.data(), __pos, __sv.size());
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
- size_type __pos) const _NOEXCEPT
-{
- _LIBCPP_ASSERT(__s != nullptr, "string::find_last_not_of(): received nullptr");
- return __str_find_last_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, traits_type::length(__s));
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-typename basic_string<_CharT, _Traits, _Allocator>::size_type
-basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(value_type __c,
- size_type __pos) const _NOEXCEPT
-{
- return __str_find_last_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __c, __pos);
-}
-
-// compare
-
-template <class _CharT, class _Traits, class _Allocator>
-template <class _Tp>
-typename enable_if
-<
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- int
->::type
-basic_string<_CharT, _Traits, _Allocator>::compare(const _Tp& __t) const
-{
- __self_view __sv = __t;
- size_t __lhs_sz = size();
- size_t __rhs_sz = __sv.size();
- int __result = traits_type::compare(data(), __sv.data(),
- _VSTD::min(__lhs_sz, __rhs_sz));
- if (__result != 0)
- return __result;
- if (__lhs_sz < __rhs_sz)
- return -1;
- if (__lhs_sz > __rhs_sz)
- return 1;
- return 0;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-int
-basic_string<_CharT, _Traits, _Allocator>::compare(const basic_string& __str) const _NOEXCEPT
-{
- return compare(__self_view(__str));
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-int
-basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
- size_type __n1,
- const value_type* __s,
- size_type __n2) const
-{
- _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::compare(): received nullptr");
- size_type __sz = size();
- if (__pos1 > __sz || __n2 == npos)
- this->__throw_out_of_range();
- size_type __rlen = _VSTD::min(__n1, __sz - __pos1);
- int __r = traits_type::compare(data() + __pos1, __s, _VSTD::min(__rlen, __n2));
- if (__r == 0)
- {
- if (__rlen < __n2)
- __r = -1;
- else if (__rlen > __n2)
- __r = 1;
- }
- return __r;
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template <class _Tp>
-typename enable_if
-<
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- int
->::type
-basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
- size_type __n1,
- const _Tp& __t) const
-{
- __self_view __sv = __t;
- return compare(__pos1, __n1, __sv.data(), __sv.size());
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-inline
-int
-basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
- size_type __n1,
- const basic_string& __str) const
-{
- return compare(__pos1, __n1, __str.data(), __str.size());
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-template <class _Tp>
-typename enable_if
-<
- __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
- int
->::type
-basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
- size_type __n1,
- const _Tp& __t,
- size_type __pos2,
- size_type __n2) const
-{
- __self_view __sv = __t;
- return __self_view(*this).substr(__pos1, __n1).compare(__sv.substr(__pos2, __n2));
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-int
-basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
- size_type __n1,
- const basic_string& __str,
- size_type __pos2,
- size_type __n2) const
-{
- return compare(__pos1, __n1, __self_view(__str), __pos2, __n2);
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-int
-basic_string<_CharT, _Traits, _Allocator>::compare(const value_type* __s) const _NOEXCEPT
-{
- _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr");
- return compare(0, npos, __s, traits_type::length(__s));
-}
-
-template <class _CharT, class _Traits, class _Allocator>
-int
-basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
- size_type __n1,
- const value_type* __s) const
-{
- _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr");
- return compare(__pos1, __n1, __s, traits_type::length(__s));
-}
-
-// __invariants
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-bool
-basic_string<_CharT, _Traits, _Allocator>::__invariants() const
-{
- if (size() > capacity())
- return false;
- if (capacity() < __min_cap - 1)
- return false;
- if (data() == 0)
- return false;
- if (data()[size()] != value_type(0))
- return false;
- return true;
-}
-
-// __clear_and_shrink
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-void
-basic_string<_CharT, _Traits, _Allocator>::__clear_and_shrink() _NOEXCEPT
-{
- clear();
- if(__is_long())
- {
- __alloc_traits::deallocate(__alloc(), __get_long_pointer(), capacity() + 1);
- __set_long_cap(0);
- __set_short_size(0);
- }
-}
-
-// operator==
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
- const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
-{
- size_t __lhs_sz = __lhs.size();
- return __lhs_sz == __rhs.size() && _Traits::compare(__lhs.data(),
- __rhs.data(),
- __lhs_sz) == 0;
-}
-
-template<class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const basic_string<char, char_traits<char>, _Allocator>& __lhs,
- const basic_string<char, char_traits<char>, _Allocator>& __rhs) _NOEXCEPT
-{
- size_t __lhs_sz = __lhs.size();
- if (__lhs_sz != __rhs.size())
- return false;
- const char* __lp = __lhs.data();
- const char* __rp = __rhs.data();
- if (__lhs.__is_long())
- return char_traits<char>::compare(__lp, __rp, __lhs_sz) == 0;
- for (; __lhs_sz != 0; --__lhs_sz, ++__lp, ++__rp)
- if (*__lp != *__rp)
- return false;
- return true;
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const _CharT* __lhs,
- const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
-{
- typedef basic_string<_CharT, _Traits, _Allocator> _String;
- _LIBCPP_ASSERT(__lhs != nullptr, "operator==(char*, basic_string): received nullptr");
- size_t __lhs_len = _Traits::length(__lhs);
- if (__lhs_len != __rhs.size()) return false;
- return __rhs.compare(0, _String::npos, __lhs, __lhs_len) == 0;
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
- const _CharT* __rhs) _NOEXCEPT
-{
- typedef basic_string<_CharT, _Traits, _Allocator> _String;
- _LIBCPP_ASSERT(__rhs != nullptr, "operator==(basic_string, char*): received nullptr");
- size_t __rhs_len = _Traits::length(__rhs);
- if (__rhs_len != __lhs.size()) return false;
- return __lhs.compare(0, _String::npos, __rhs, __rhs_len) == 0;
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
- const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
-{
- return !(__lhs == __rhs);
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const _CharT* __lhs,
- const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
-{
- return !(__lhs == __rhs);
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
- const _CharT* __rhs) _NOEXCEPT
-{
- return !(__lhs == __rhs);
-}
-
-// operator<
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
- const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
-{
- return __lhs.compare(__rhs) < 0;
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
- const _CharT* __rhs) _NOEXCEPT
-{
- return __lhs.compare(__rhs) < 0;
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator< (const _CharT* __lhs,
- const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
-{
- return __rhs.compare(__lhs) > 0;
-}
-
-// operator>
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
- const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
-{
- return __rhs < __lhs;
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
- const _CharT* __rhs) _NOEXCEPT
-{
- return __rhs < __lhs;
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator> (const _CharT* __lhs,
- const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
-{
- return __rhs < __lhs;
-}
-
-// operator<=
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
- const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
-{
- return !(__rhs < __lhs);
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
- const _CharT* __rhs) _NOEXCEPT
-{
- return !(__rhs < __lhs);
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const _CharT* __lhs,
- const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
-{
- return !(__rhs < __lhs);
-}
-
-// operator>=
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
- const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
-{
- return !(__lhs < __rhs);
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
- const _CharT* __rhs) _NOEXCEPT
-{
- return !(__lhs < __rhs);
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const _CharT* __lhs,
- const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
-{
- return !(__lhs < __rhs);
-}
-
-// operator +
-
-template<class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>
-operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
- const basic_string<_CharT, _Traits, _Allocator>& __rhs)
-{
- basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
- typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
- typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
- __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
- __r.append(__rhs.data(), __rhs_sz);
- return __r;
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>
-operator+(const _CharT* __lhs , const basic_string<_CharT,_Traits,_Allocator>& __rhs)
-{
- basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
- typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = _Traits::length(__lhs);
- typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
- __r.__init(__lhs, __lhs_sz, __lhs_sz + __rhs_sz);
- __r.append(__rhs.data(), __rhs_sz);
- return __r;
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>
-operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Allocator>& __rhs)
-{
- basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
- typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
- __r.__init(&__lhs, 1, 1 + __rhs_sz);
- __r.append(__rhs.data(), __rhs_sz);
- return __r;
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline
-basic_string<_CharT, _Traits, _Allocator>
-operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* __rhs)
-{
- basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
- typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
- typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = _Traits::length(__rhs);
- __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
- __r.append(__rhs, __rhs_sz);
- return __r;
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-basic_string<_CharT, _Traits, _Allocator>
-operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, _CharT __rhs)
-{
- basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
- typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
- __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + 1);
- __r.push_back(__rhs);
- return __r;
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_string<_CharT, _Traits, _Allocator>
-operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs)
-{
- return _VSTD::move(__lhs.append(__rhs));
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_string<_CharT, _Traits, _Allocator>
-operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
-{
- return _VSTD::move(__rhs.insert(0, __lhs));
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_string<_CharT, _Traits, _Allocator>
-operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
-{
- return _VSTD::move(__lhs.append(__rhs));
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_string<_CharT, _Traits, _Allocator>
-operator+(const _CharT* __lhs , basic_string<_CharT,_Traits,_Allocator>&& __rhs)
-{
- return _VSTD::move(__rhs.insert(0, __lhs));
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_string<_CharT, _Traits, _Allocator>
-operator+(_CharT __lhs, basic_string<_CharT,_Traits,_Allocator>&& __rhs)
-{
- __rhs.insert(__rhs.begin(), __lhs);
- return _VSTD::move(__rhs);
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_string<_CharT, _Traits, _Allocator>
-operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const _CharT* __rhs)
-{
- return _VSTD::move(__lhs.append(__rhs));
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_string<_CharT, _Traits, _Allocator>
-operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, _CharT __rhs)
-{
- __lhs.push_back(__rhs);
- return _VSTD::move(__lhs);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-// swap
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(basic_string<_CharT, _Traits, _Allocator>& __lhs,
- basic_string<_CharT, _Traits, _Allocator>& __rhs)
- _NOEXCEPT_(_NOEXCEPT_(__lhs.swap(__rhs)))
-{
- __lhs.swap(__rhs);
-}
-
-#ifndef _LIBCPP_NO_HAS_CHAR8_T
-typedef basic_string<char8_t> u8string;
-#endif
-
-#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
-typedef basic_string<char16_t> u16string;
-typedef basic_string<char32_t> u32string;
-#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
-
-_LIBCPP_FUNC_VIS int stoi (const string& __str, size_t* __idx = 0, int __base = 10);
-_LIBCPP_FUNC_VIS long stol (const string& __str, size_t* __idx = 0, int __base = 10);
-_LIBCPP_FUNC_VIS unsigned long stoul (const string& __str, size_t* __idx = 0, int __base = 10);
-_LIBCPP_FUNC_VIS long long stoll (const string& __str, size_t* __idx = 0, int __base = 10);
-_LIBCPP_FUNC_VIS unsigned long long stoull(const string& __str, size_t* __idx = 0, int __base = 10);
-
-_LIBCPP_FUNC_VIS float stof (const string& __str, size_t* __idx = 0);
-_LIBCPP_FUNC_VIS double stod (const string& __str, size_t* __idx = 0);
-_LIBCPP_FUNC_VIS long double stold(const string& __str, size_t* __idx = 0);
-
-_LIBCPP_FUNC_VIS string to_string(int __val);
-_LIBCPP_FUNC_VIS string to_string(unsigned __val);
-_LIBCPP_FUNC_VIS string to_string(long __val);
-_LIBCPP_FUNC_VIS string to_string(unsigned long __val);
-_LIBCPP_FUNC_VIS string to_string(long long __val);
-_LIBCPP_FUNC_VIS string to_string(unsigned long long __val);
-_LIBCPP_FUNC_VIS string to_string(float __val);
-_LIBCPP_FUNC_VIS string to_string(double __val);
-_LIBCPP_FUNC_VIS string to_string(long double __val);
-
-_LIBCPP_FUNC_VIS int stoi (const wstring& __str, size_t* __idx = 0, int __base = 10);
-_LIBCPP_FUNC_VIS long stol (const wstring& __str, size_t* __idx = 0, int __base = 10);
-_LIBCPP_FUNC_VIS unsigned long stoul (const wstring& __str, size_t* __idx = 0, int __base = 10);
-_LIBCPP_FUNC_VIS long long stoll (const wstring& __str, size_t* __idx = 0, int __base = 10);
-_LIBCPP_FUNC_VIS unsigned long long stoull(const wstring& __str, size_t* __idx = 0, int __base = 10);
-
-_LIBCPP_FUNC_VIS float stof (const wstring& __str, size_t* __idx = 0);
-_LIBCPP_FUNC_VIS double stod (const wstring& __str, size_t* __idx = 0);
-_LIBCPP_FUNC_VIS long double stold(const wstring& __str, size_t* __idx = 0);
-
-_LIBCPP_FUNC_VIS wstring to_wstring(int __val);
-_LIBCPP_FUNC_VIS wstring to_wstring(unsigned __val);
-_LIBCPP_FUNC_VIS wstring to_wstring(long __val);
-_LIBCPP_FUNC_VIS wstring to_wstring(unsigned long __val);
-_LIBCPP_FUNC_VIS wstring to_wstring(long long __val);
-_LIBCPP_FUNC_VIS wstring to_wstring(unsigned long long __val);
-_LIBCPP_FUNC_VIS wstring to_wstring(float __val);
-_LIBCPP_FUNC_VIS wstring to_wstring(double __val);
-_LIBCPP_FUNC_VIS wstring to_wstring(long double __val);
-
-template<class _CharT, class _Traits, class _Allocator>
- const typename basic_string<_CharT, _Traits, _Allocator>::size_type
- basic_string<_CharT, _Traits, _Allocator>::npos;
-
-template<class _CharT, class _Traits, class _Allocator>
-struct _LIBCPP_TEMPLATE_VIS hash<basic_string<_CharT, _Traits, _Allocator> >
- : public unary_function<basic_string<_CharT, _Traits, _Allocator>, size_t>
-{
- size_t
- operator()(const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT;
-};
-
-template<class _CharT, class _Traits, class _Allocator>
-size_t
-hash<basic_string<_CharT, _Traits, _Allocator> >::operator()(
- const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT
-{
- return __do_string_hash(__val.data(), __val.data() + __val.size());
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-basic_ostream<_CharT, _Traits>&
-operator<<(basic_ostream<_CharT, _Traits>& __os,
- const basic_string<_CharT, _Traits, _Allocator>& __str);
-
-template<class _CharT, class _Traits, class _Allocator>
-basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>& __is,
- basic_string<_CharT, _Traits, _Allocator>& __str);
-
-template<class _CharT, class _Traits, class _Allocator>
-basic_istream<_CharT, _Traits>&
-getline(basic_istream<_CharT, _Traits>& __is,
- basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_istream<_CharT, _Traits>&
-getline(basic_istream<_CharT, _Traits>& __is,
- basic_string<_CharT, _Traits, _Allocator>& __str);
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_istream<_CharT, _Traits>&
-getline(basic_istream<_CharT, _Traits>&& __is,
- basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
-
-template<class _CharT, class _Traits, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-basic_istream<_CharT, _Traits>&
-getline(basic_istream<_CharT, _Traits>&& __is,
- basic_string<_CharT, _Traits, _Allocator>& __str);
-
-#endif // _LIBCPP_CXX03_LANG
-
-#if _LIBCPP_STD_VER > 17
-template<class _CharT, class _Traits, class _Allocator, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase(basic_string<_CharT, _Traits, _Allocator>& __str, const _Up& __v)
-{ __str.erase(_VSTD::remove(__str.begin(), __str.end(), __v), __str.end()); }
-
-template<class _CharT, class _Traits, class _Allocator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase_if(basic_string<_CharT, _Traits, _Allocator>& __str, _Predicate __pred)
-{ __str.erase(_VSTD::remove_if(__str.begin(), __str.end(), __pred), __str.end()); }
-#endif
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
-
-template<class _CharT, class _Traits, class _Allocator>
-bool
-basic_string<_CharT, _Traits, _Allocator>::__dereferenceable(const const_iterator* __i) const
-{
- return this->data() <= _VSTD::__to_raw_pointer(__i->base()) &&
- _VSTD::__to_raw_pointer(__i->base()) < this->data() + this->size();
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-bool
-basic_string<_CharT, _Traits, _Allocator>::__decrementable(const const_iterator* __i) const
-{
- return this->data() < _VSTD::__to_raw_pointer(__i->base()) &&
- _VSTD::__to_raw_pointer(__i->base()) <= this->data() + this->size();
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-bool
-basic_string<_CharT, _Traits, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
-{
- const value_type* __p = _VSTD::__to_raw_pointer(__i->base()) + __n;
- return this->data() <= __p && __p <= this->data() + this->size();
-}
-
-template<class _CharT, class _Traits, class _Allocator>
-bool
-basic_string<_CharT, _Traits, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
-{
- const value_type* __p = _VSTD::__to_raw_pointer(__i->base()) + __n;
- return this->data() <= __p && __p < this->data() + this->size();
-}
-
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-
-_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_string<char>)
-_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_string<wchar_t>)
-
-#if _LIBCPP_STD_VER > 11
-// Literal suffixes for basic_string [basic.string.literals]
-inline namespace literals
-{
- inline namespace string_literals
- {
- inline _LIBCPP_INLINE_VISIBILITY
- basic_string<char> operator "" s( const char *__str, size_t __len )
- {
- return basic_string<char> (__str, __len);
- }
-
- inline _LIBCPP_INLINE_VISIBILITY
- basic_string<wchar_t> operator "" s( const wchar_t *__str, size_t __len )
- {
- return basic_string<wchar_t> (__str, __len);
- }
-
-#ifndef _LIBCPP_NO_HAS_CHAR8_T
- inline _LIBCPP_INLINE_VISIBILITY
- basic_string<char8_t> operator "" s(const char8_t *__str, size_t __len) _NOEXCEPT
- {
- return basic_string<char8_t> (__str, __len);
- }
-#endif
-
- inline _LIBCPP_INLINE_VISIBILITY
- basic_string<char16_t> operator "" s( const char16_t *__str, size_t __len )
- {
- return basic_string<char16_t> (__str, __len);
- }
-
- inline _LIBCPP_INLINE_VISIBILITY
- basic_string<char32_t> operator "" s( const char32_t *__str, size_t __len )
- {
- return basic_string<char32_t> (__str, __len);
- }
- }
-}
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_STRING
diff --git a/lib/libcxx/include/string.h b/lib/libcxx/include/string.h
deleted file mode 100644
index a1ce56cbcd6..00000000000
--- a/lib/libcxx/include/string.h
+++ /dev/null
@@ -1,110 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- string.h ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_STRING_H
-#define _LIBCPP_STRING_H
-
-/*
- string.h synopsis
-
-Macros:
-
- NULL
-
-Types:
-
- size_t
-
-void* memcpy(void* restrict s1, const void* restrict s2, size_t n);
-void* memmove(void* s1, const void* s2, size_t n);
-char* strcpy (char* restrict s1, const char* restrict s2);
-char* strncpy(char* restrict s1, const char* restrict s2, size_t n);
-char* strcat (char* restrict s1, const char* restrict s2);
-char* strncat(char* restrict s1, const char* restrict s2, size_t n);
-int memcmp(const void* s1, const void* s2, size_t n);
-int strcmp (const char* s1, const char* s2);
-int strncmp(const char* s1, const char* s2, size_t n);
-int strcoll(const char* s1, const char* s2);
-size_t strxfrm(char* restrict s1, const char* restrict s2, size_t n);
-const void* memchr(const void* s, int c, size_t n);
- void* memchr( void* s, int c, size_t n);
-const char* strchr(const char* s, int c);
- char* strchr( char* s, int c);
-size_t strcspn(const char* s1, const char* s2);
-const char* strpbrk(const char* s1, const char* s2);
- char* strpbrk( char* s1, const char* s2);
-const char* strrchr(const char* s, int c);
- char* strrchr( char* s, int c);
-size_t strspn(const char* s1, const char* s2);
-const char* strstr(const char* s1, const char* s2);
- char* strstr( char* s1, const char* s2);
-char* strtok(char* restrict s1, const char* restrict s2);
-void* memset(void* s, int c, size_t n);
-char* strerror(int errnum);
-size_t strlen(const char* s);
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#include_next <string.h>
-
-// MSVCRT, GNU libc and its derivates may already have the correct prototype in
-// <string.h>. This macro can be defined by users if their C library provides
-// the right signature.
-#if defined(__CORRECT_ISO_CPP_STRING_H_PROTO) || defined(_LIBCPP_MSVCRT) || \
- defined(__sun__) || defined(_STRING_H_CPLUSPLUS_98_CONFORMANCE_)
-#define _LIBCPP_STRING_H_HAS_CONST_OVERLOADS
-#endif
-
-#if defined(__cplusplus) && !defined(_LIBCPP_STRING_H_HAS_CONST_OVERLOADS) && defined(_LIBCPP_PREFERRED_OVERLOAD)
-extern "C++" {
-inline _LIBCPP_INLINE_VISIBILITY
-char* __libcpp_strchr(const char* __s, int __c) {return (char*)strchr(__s, __c);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
-const char* strchr(const char* __s, int __c) {return __libcpp_strchr(__s, __c);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
- char* strchr( char* __s, int __c) {return __libcpp_strchr(__s, __c);}
-
-inline _LIBCPP_INLINE_VISIBILITY
-char* __libcpp_strpbrk(const char* __s1, const char* __s2) {return (char*)strpbrk(__s1, __s2);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
-const char* strpbrk(const char* __s1, const char* __s2) {return __libcpp_strpbrk(__s1, __s2);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
- char* strpbrk( char* __s1, const char* __s2) {return __libcpp_strpbrk(__s1, __s2);}
-
-inline _LIBCPP_INLINE_VISIBILITY
-char* __libcpp_strrchr(const char* __s, int __c) {return (char*)strrchr(__s, __c);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
-const char* strrchr(const char* __s, int __c) {return __libcpp_strrchr(__s, __c);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
- char* strrchr( char* __s, int __c) {return __libcpp_strrchr(__s, __c);}
-
-inline _LIBCPP_INLINE_VISIBILITY
-void* __libcpp_memchr(const void* __s, int __c, size_t __n) {return (void*)memchr(__s, __c, __n);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
-const void* memchr(const void* __s, int __c, size_t __n) {return __libcpp_memchr(__s, __c, __n);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
- void* memchr( void* __s, int __c, size_t __n) {return __libcpp_memchr(__s, __c, __n);}
-
-inline _LIBCPP_INLINE_VISIBILITY
-char* __libcpp_strstr(const char* __s1, const char* __s2) {return (char*)strstr(__s1, __s2);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
-const char* strstr(const char* __s1, const char* __s2) {return __libcpp_strstr(__s1, __s2);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
- char* strstr( char* __s1, const char* __s2) {return __libcpp_strstr(__s1, __s2);}
-}
-#endif
-
-#endif // _LIBCPP_STRING_H
diff --git a/lib/libcxx/include/string_view b/lib/libcxx/include/string_view
deleted file mode 100644
index 7d783122f12..00000000000
--- a/lib/libcxx/include/string_view
+++ /dev/null
@@ -1,834 +0,0 @@
-// -*- C++ -*-
-//===------------------------ string_view ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_STRING_VIEW
-#define _LIBCPP_STRING_VIEW
-
-/*
-string_view synopsis
-
-namespace std {
-
- // 7.2, Class template basic_string_view
- template<class charT, class traits = char_traits<charT>>
- class basic_string_view;
-
- // 7.9, basic_string_view non-member comparison functions
- template<class charT, class traits>
- constexpr bool operator==(basic_string_view<charT, traits> x,
- basic_string_view<charT, traits> y) noexcept;
- template<class charT, class traits>
- constexpr bool operator!=(basic_string_view<charT, traits> x,
- basic_string_view<charT, traits> y) noexcept;
- template<class charT, class traits>
- constexpr bool operator< (basic_string_view<charT, traits> x,
- basic_string_view<charT, traits> y) noexcept;
- template<class charT, class traits>
- constexpr bool operator> (basic_string_view<charT, traits> x,
- basic_string_view<charT, traits> y) noexcept;
- template<class charT, class traits>
- constexpr bool operator<=(basic_string_view<charT, traits> x,
- basic_string_view<charT, traits> y) noexcept;
- template<class charT, class traits>
- constexpr bool operator>=(basic_string_view<charT, traits> x,
- basic_string_view<charT, traits> y) noexcept;
- // see below, sufficient additional overloads of comparison functions
-
- // 7.10, Inserters and extractors
- template<class charT, class traits>
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os,
- basic_string_view<charT, traits> str);
-
- // basic_string_view typedef names
- typedef basic_string_view<char> string_view;
- typedef basic_string_view<char16_t> u16string_view;
- typedef basic_string_view<char32_t> u32string_view;
- typedef basic_string_view<wchar_t> wstring_view;
-
- template<class charT, class traits = char_traits<charT>>
- class basic_string_view {
- public:
- // types
- typedef traits traits_type;
- typedef charT value_type;
- typedef charT* pointer;
- typedef const charT* const_pointer;
- typedef charT& reference;
- typedef const charT& const_reference;
- typedef implementation-defined const_iterator;
- typedef const_iterator iterator;
- typedef reverse_iterator<const_iterator> const_reverse_iterator;
- typedef const_reverse_iterator reverse_iterator;
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- static constexpr size_type npos = size_type(-1);
-
- // 7.3, basic_string_view constructors and assignment operators
- constexpr basic_string_view() noexcept;
- constexpr basic_string_view(const basic_string_view&) noexcept = default;
- basic_string_view& operator=(const basic_string_view&) noexcept = default;
- template<class Allocator>
- constexpr basic_string_view(const charT* str);
- constexpr basic_string_view(const charT* str, size_type len);
-
- // 7.4, basic_string_view iterator support
- constexpr const_iterator begin() const noexcept;
- constexpr const_iterator end() const noexcept;
- constexpr const_iterator cbegin() const noexcept;
- constexpr const_iterator cend() const noexcept;
- const_reverse_iterator rbegin() const noexcept;
- const_reverse_iterator rend() const noexcept;
- const_reverse_iterator crbegin() const noexcept;
- const_reverse_iterator crend() const noexcept;
-
- // 7.5, basic_string_view capacity
- constexpr size_type size() const noexcept;
- constexpr size_type length() const noexcept;
- constexpr size_type max_size() const noexcept;
- constexpr bool empty() const noexcept;
-
- // 7.6, basic_string_view element access
- constexpr const_reference operator[](size_type pos) const;
- constexpr const_reference at(size_type pos) const;
- constexpr const_reference front() const;
- constexpr const_reference back() const;
- constexpr const_pointer data() const noexcept;
-
- // 7.7, basic_string_view modifiers
- constexpr void remove_prefix(size_type n);
- constexpr void remove_suffix(size_type n);
- constexpr void swap(basic_string_view& s) noexcept;
-
- size_type copy(charT* s, size_type n, size_type pos = 0) const;
-
- constexpr basic_string_view substr(size_type pos = 0, size_type n = npos) const;
- constexpr int compare(basic_string_view s) const noexcept;
- constexpr int compare(size_type pos1, size_type n1, basic_string_view s) const;
- constexpr int compare(size_type pos1, size_type n1,
- basic_string_view s, size_type pos2, size_type n2) const;
- constexpr int compare(const charT* s) const;
- constexpr int compare(size_type pos1, size_type n1, const charT* s) const;
- constexpr int compare(size_type pos1, size_type n1,
- const charT* s, size_type n2) const;
- constexpr size_type find(basic_string_view s, size_type pos = 0) const noexcept;
- constexpr size_type find(charT c, size_type pos = 0) const noexcept;
- constexpr size_type find(const charT* s, size_type pos, size_type n) const;
- constexpr size_type find(const charT* s, size_type pos = 0) const;
- constexpr size_type rfind(basic_string_view s, size_type pos = npos) const noexcept;
- constexpr size_type rfind(charT c, size_type pos = npos) const noexcept;
- constexpr size_type rfind(const charT* s, size_type pos, size_type n) const;
- constexpr size_type rfind(const charT* s, size_type pos = npos) const;
- constexpr size_type find_first_of(basic_string_view s, size_type pos = 0) const noexcept;
- constexpr size_type find_first_of(charT c, size_type pos = 0) const noexcept;
- constexpr size_type find_first_of(const charT* s, size_type pos, size_type n) const;
- constexpr size_type find_first_of(const charT* s, size_type pos = 0) const;
- constexpr size_type find_last_of(basic_string_view s, size_type pos = npos) const noexcept;
- constexpr size_type find_last_of(charT c, size_type pos = npos) const noexcept;
- constexpr size_type find_last_of(const charT* s, size_type pos, size_type n) const;
- constexpr size_type find_last_of(const charT* s, size_type pos = npos) const;
- constexpr size_type find_first_not_of(basic_string_view s, size_type pos = 0) const noexcept;
- constexpr size_type find_first_not_of(charT c, size_type pos = 0) const noexcept;
- constexpr size_type find_first_not_of(const charT* s, size_type pos, size_type n) const;
- constexpr size_type find_first_not_of(const charT* s, size_type pos = 0) const;
- constexpr size_type find_last_not_of(basic_string_view s, size_type pos = npos) const noexcept;
- constexpr size_type find_last_not_of(charT c, size_type pos = npos) const noexcept;
- constexpr size_type find_last_not_of(const charT* s, size_type pos, size_type n) const;
- constexpr size_type find_last_not_of(const charT* s, size_type pos = npos) const;
-
- constexpr bool starts_with(basic_string_view s) const noexcept; // C++2a
- constexpr bool starts_with(charT c) const noexcept; // C++2a
- constexpr bool starts_with(const charT* s) const; // C++2a
- constexpr bool ends_with(basic_string_view s) const noexcept; // C++2a
- constexpr bool ends_with(charT c) const noexcept; // C++2a
- constexpr bool ends_with(const charT* s) const; // C++2a
-
- private:
- const_pointer data_; // exposition only
- size_type size_; // exposition only
- };
-
- // 7.11, Hash support
- template <class T> struct hash;
- template <> struct hash<string_view>;
- template <> struct hash<u16string_view>;
- template <> struct hash<u32string_view>;
- template <> struct hash<wstring_view>;
-
- constexpr basic_string_view<char> operator "" sv( const char *str, size_t len ) noexcept;
- constexpr basic_string_view<wchar_t> operator "" sv( const wchar_t *str, size_t len ) noexcept;
- constexpr basic_string_view<char16_t> operator "" sv( const char16_t *str, size_t len ) noexcept;
- constexpr basic_string_view<char32_t> operator "" sv( const char32_t *str, size_t len ) noexcept;
-
-} // namespace std
-
-
-*/
-
-#include <__config>
-#include <__string>
-#include <algorithm>
-#include <iterator>
-#include <limits>
-#include <stdexcept>
-#include <version>
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template<class _CharT, class _Traits = char_traits<_CharT> >
-class _LIBCPP_TEMPLATE_VIS basic_string_view {
-public:
- // types
- typedef _Traits traits_type;
- typedef _CharT value_type;
- typedef _CharT* pointer;
- typedef const _CharT* const_pointer;
- typedef _CharT& reference;
- typedef const _CharT& const_reference;
- typedef const_pointer const_iterator; // See [string.view.iterators]
- typedef const_iterator iterator;
- typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
- typedef const_reverse_iterator reverse_iterator;
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- static _LIBCPP_CONSTEXPR const size_type npos = -1; // size_type(-1);
-
- static_assert((!is_array<value_type>::value), "Character type of basic_string_view must not be an array");
- static_assert(( is_standard_layout<value_type>::value), "Character type of basic_string_view must be standard-layout");
- static_assert(( is_trivial<value_type>::value), "Character type of basic_string_view must be trivial");
- static_assert((is_same<_CharT, typename traits_type::char_type>::value),
- "traits_type::char_type must be the same type as CharT");
-
- // [string.view.cons], construct/copy
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- basic_string_view() _NOEXCEPT : __data (nullptr), __size(0) {}
-
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- basic_string_view(const basic_string_view&) _NOEXCEPT = default;
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- basic_string_view& operator=(const basic_string_view&) _NOEXCEPT = default;
-
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- basic_string_view(const _CharT* __s, size_type __len) _NOEXCEPT
- : __data(__s), __size(__len)
- {
-// #if _LIBCPP_STD_VER > 11
-// _LIBCPP_ASSERT(__len == 0 || __s != nullptr, "string_view::string_view(_CharT *, size_t): received nullptr");
-// #endif
- }
-
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- basic_string_view(const _CharT* __s)
- : __data(__s), __size(_Traits::length(__s)) {}
-
- // [string.view.iterators], iterators
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT { return cbegin(); }
-
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT { return cend(); }
-
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const _NOEXCEPT { return __data; }
-
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const _NOEXCEPT { return __data + __size; }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX14 _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rbegin() const _NOEXCEPT { return const_reverse_iterator(cend()); }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX14 _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rend() const _NOEXCEPT { return const_reverse_iterator(cbegin()); }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX14 _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crbegin() const _NOEXCEPT { return const_reverse_iterator(cend()); }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX14 _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crend() const _NOEXCEPT { return const_reverse_iterator(cbegin()); }
-
- // [string.view.capacity], capacity
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT { return __size; }
-
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- size_type length() const _NOEXCEPT { return __size; }
-
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const _NOEXCEPT { return numeric_limits<size_type>::max(); }
-
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- bool empty() const _NOEXCEPT { return __size == 0; }
-
- // [string.view.access], element access
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- const_reference operator[](size_type __pos) const _NOEXCEPT { return __data[__pos]; }
-
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- const_reference at(size_type __pos) const
- {
- return __pos >= size()
- ? (__throw_out_of_range("string_view::at"), __data[0])
- : __data[__pos];
- }
-
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- const_reference front() const
- {
- return _LIBCPP_ASSERT(!empty(), "string_view::front(): string is empty"), __data[0];
- }
-
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- const_reference back() const
- {
- return _LIBCPP_ASSERT(!empty(), "string_view::back(): string is empty"), __data[__size-1];
- }
-
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- const_pointer data() const _NOEXCEPT { return __data; }
-
- // [string.view.modifiers], modifiers:
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- void remove_prefix(size_type __n) _NOEXCEPT
- {
- _LIBCPP_ASSERT(__n <= size(), "remove_prefix() can't remove more than size()");
- __data += __n;
- __size -= __n;
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- void remove_suffix(size_type __n) _NOEXCEPT
- {
- _LIBCPP_ASSERT(__n <= size(), "remove_suffix() can't remove more than size()");
- __size -= __n;
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- void swap(basic_string_view& __other) _NOEXCEPT
- {
- const value_type *__p = __data;
- __data = __other.__data;
- __other.__data = __p;
-
- size_type __sz = __size;
- __size = __other.__size;
- __other.__size = __sz;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- size_type copy(_CharT* __s, size_type __n, size_type __pos = 0) const
- {
- if (__pos > size())
- __throw_out_of_range("string_view::copy");
- size_type __rlen = _VSTD::min(__n, size() - __pos);
- _Traits::copy(__s, data() + __pos, __rlen);
- return __rlen;
- }
-
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- basic_string_view substr(size_type __pos = 0, size_type __n = npos) const
- {
- return __pos > size()
- ? (__throw_out_of_range("string_view::substr"), basic_string_view())
- : basic_string_view(data() + __pos, _VSTD::min(__n, size() - __pos));
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 int compare(basic_string_view __sv) const _NOEXCEPT
- {
- size_type __rlen = _VSTD::min( size(), __sv.size());
- int __retval = _Traits::compare(data(), __sv.data(), __rlen);
- if ( __retval == 0 ) // first __rlen chars matched
- __retval = size() == __sv.size() ? 0 : ( size() < __sv.size() ? -1 : 1 );
- return __retval;
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- int compare(size_type __pos1, size_type __n1, basic_string_view __sv) const
- {
- return substr(__pos1, __n1).compare(__sv);
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- int compare( size_type __pos1, size_type __n1,
- basic_string_view __sv, size_type __pos2, size_type __n2) const
- {
- return substr(__pos1, __n1).compare(__sv.substr(__pos2, __n2));
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- int compare(const _CharT* __s) const _NOEXCEPT
- {
- return compare(basic_string_view(__s));
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- int compare(size_type __pos1, size_type __n1, const _CharT* __s) const
- {
- return substr(__pos1, __n1).compare(basic_string_view(__s));
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- int compare(size_type __pos1, size_type __n1, const _CharT* __s, size_type __n2) const
- {
- return substr(__pos1, __n1).compare(basic_string_view(__s, __n2));
- }
-
- // find
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT
- {
- _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): received nullptr");
- return __str_find<value_type, size_type, traits_type, npos>
- (data(), size(), __s.data(), __pos, __s.size());
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find(_CharT __c, size_type __pos = 0) const _NOEXCEPT
- {
- return __str_find<value_type, size_type, traits_type, npos>
- (data(), size(), __c, __pos);
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find(const _CharT* __s, size_type __pos, size_type __n) const
- {
- _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find(): received nullptr");
- return __str_find<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, __n);
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find(const _CharT* __s, size_type __pos = 0) const
- {
- _LIBCPP_ASSERT(__s != nullptr, "string_view::find(): received nullptr");
- return __str_find<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, traits_type::length(__s));
- }
-
- // rfind
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type rfind(basic_string_view __s, size_type __pos = npos) const _NOEXCEPT
- {
- _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): received nullptr");
- return __str_rfind<value_type, size_type, traits_type, npos>
- (data(), size(), __s.data(), __pos, __s.size());
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type rfind(_CharT __c, size_type __pos = npos) const _NOEXCEPT
- {
- return __str_rfind<value_type, size_type, traits_type, npos>
- (data(), size(), __c, __pos);
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type rfind(const _CharT* __s, size_type __pos, size_type __n) const
- {
- _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::rfind(): received nullptr");
- return __str_rfind<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, __n);
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type rfind(const _CharT* __s, size_type __pos=npos) const
- {
- _LIBCPP_ASSERT(__s != nullptr, "string_view::rfind(): received nullptr");
- return __str_rfind<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, traits_type::length(__s));
- }
-
- // find_first_of
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find_first_of(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT
- {
- _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_first_of(): received nullptr");
- return __str_find_first_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s.data(), __pos, __s.size());
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find_first_of(_CharT __c, size_type __pos = 0) const _NOEXCEPT
- { return find(__c, __pos); }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
- {
- _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_first_of(): received nullptr");
- return __str_find_first_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, __n);
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find_first_of(const _CharT* __s, size_type __pos=0) const
- {
- _LIBCPP_ASSERT(__s != nullptr, "string_view::find_first_of(): received nullptr");
- return __str_find_first_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, traits_type::length(__s));
- }
-
- // find_last_of
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find_last_of(basic_string_view __s, size_type __pos=npos) const _NOEXCEPT
- {
- _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_last_of(): received nullptr");
- return __str_find_last_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s.data(), __pos, __s.size());
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find_last_of(_CharT __c, size_type __pos = npos) const _NOEXCEPT
- { return rfind(__c, __pos); }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
- {
- _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_last_of(): received nullptr");
- return __str_find_last_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, __n);
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find_last_of(const _CharT* __s, size_type __pos=npos) const
- {
- _LIBCPP_ASSERT(__s != nullptr, "string_view::find_last_of(): received nullptr");
- return __str_find_last_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, traits_type::length(__s));
- }
-
- // find_first_not_of
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find_first_not_of(basic_string_view __s, size_type __pos=0) const _NOEXCEPT
- {
- _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_first_not_of(): received nullptr");
- return __str_find_first_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s.data(), __pos, __s.size());
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find_first_not_of(_CharT __c, size_type __pos=0) const _NOEXCEPT
- {
- return __str_find_first_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __c, __pos);
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
- {
- _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_first_not_of(): received nullptr");
- return __str_find_first_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, __n);
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find_first_not_of(const _CharT* __s, size_type __pos=0) const
- {
- _LIBCPP_ASSERT(__s != nullptr, "string_view::find_first_not_of(): received nullptr");
- return __str_find_first_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, traits_type::length(__s));
- }
-
- // find_last_not_of
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find_last_not_of(basic_string_view __s, size_type __pos=npos) const _NOEXCEPT
- {
- _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_last_not_of(): received nullptr");
- return __str_find_last_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s.data(), __pos, __s.size());
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find_last_not_of(_CharT __c, size_type __pos=npos) const _NOEXCEPT
- {
- return __str_find_last_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __c, __pos);
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
- {
- _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_last_not_of(): received nullptr");
- return __str_find_last_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, __n);
- }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- size_type find_last_not_of(const _CharT* __s, size_type __pos=npos) const
- {
- _LIBCPP_ASSERT(__s != nullptr, "string_view::find_last_not_of(): received nullptr");
- return __str_find_last_not_of<value_type, size_type, traits_type, npos>
- (data(), size(), __s, __pos, traits_type::length(__s));
- }
-
-#if _LIBCPP_STD_VER > 17
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool starts_with(basic_string_view __s) const _NOEXCEPT
- { return size() >= __s.size() && compare(0, __s.size(), __s) == 0; }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool starts_with(value_type __c) const _NOEXCEPT
- { return !empty() && _Traits::eq(front(), __c); }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool starts_with(const value_type* __s) const _NOEXCEPT
- { return starts_with(basic_string_view(__s)); }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool ends_with(basic_string_view __s) const _NOEXCEPT
- { return size() >= __s.size() && compare(size() - __s.size(), npos, __s) == 0; }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool ends_with(value_type __c) const _NOEXCEPT
- { return !empty() && _Traits::eq(back(), __c); }
-
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool ends_with(const value_type* __s) const _NOEXCEPT
- { return ends_with(basic_string_view(__s)); }
-#endif
-
-private:
- const value_type* __data;
- size_type __size;
-};
-
-
-// [string.view.comparison]
-// operator ==
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator==(basic_string_view<_CharT, _Traits> __lhs,
- basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
-{
- if ( __lhs.size() != __rhs.size()) return false;
- return __lhs.compare(__rhs) == 0;
-}
-
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator==(basic_string_view<_CharT, _Traits> __lhs,
- typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
-{
- if ( __lhs.size() != __rhs.size()) return false;
- return __lhs.compare(__rhs) == 0;
-}
-
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator==(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs,
- basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
-{
- if ( __lhs.size() != __rhs.size()) return false;
- return __lhs.compare(__rhs) == 0;
-}
-
-
-// operator !=
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator!=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
-{
- if ( __lhs.size() != __rhs.size())
- return true;
- return __lhs.compare(__rhs) != 0;
-}
-
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator!=(basic_string_view<_CharT, _Traits> __lhs,
- typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
-{
- if ( __lhs.size() != __rhs.size())
- return true;
- return __lhs.compare(__rhs) != 0;
-}
-
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator!=(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs,
- basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
-{
- if ( __lhs.size() != __rhs.size())
- return true;
- return __lhs.compare(__rhs) != 0;
-}
-
-
-// operator <
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator<(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
-{
- return __lhs.compare(__rhs) < 0;
-}
-
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator<(basic_string_view<_CharT, _Traits> __lhs,
- typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
-{
- return __lhs.compare(__rhs) < 0;
-}
-
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator<(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs,
- basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
-{
- return __lhs.compare(__rhs) < 0;
-}
-
-
-// operator >
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator> (basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
-{
- return __lhs.compare(__rhs) > 0;
-}
-
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator>(basic_string_view<_CharT, _Traits> __lhs,
- typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
-{
- return __lhs.compare(__rhs) > 0;
-}
-
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator>(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs,
- basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
-{
- return __lhs.compare(__rhs) > 0;
-}
-
-
-// operator <=
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator<=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
-{
- return __lhs.compare(__rhs) <= 0;
-}
-
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator<=(basic_string_view<_CharT, _Traits> __lhs,
- typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
-{
- return __lhs.compare(__rhs) <= 0;
-}
-
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator<=(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs,
- basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
-{
- return __lhs.compare(__rhs) <= 0;
-}
-
-
-// operator >=
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator>=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
-{
- return __lhs.compare(__rhs) >= 0;
-}
-
-
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator>=(basic_string_view<_CharT, _Traits> __lhs,
- typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
-{
- return __lhs.compare(__rhs) >= 0;
-}
-
-template<class _CharT, class _Traits>
-_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-bool operator>=(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs,
- basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
-{
- return __lhs.compare(__rhs) >= 0;
-}
-
-typedef basic_string_view<char> string_view;
-#ifndef _LIBCPP_NO_HAS_CHAR8_T
-typedef basic_string_view<char8_t> u8string_view;
-#endif
-typedef basic_string_view<char16_t> u16string_view;
-typedef basic_string_view<char32_t> u32string_view;
-typedef basic_string_view<wchar_t> wstring_view;
-
-// [string.view.hash]
-template<class _CharT, class _Traits>
-struct _LIBCPP_TEMPLATE_VIS hash<basic_string_view<_CharT, _Traits> >
- : public unary_function<basic_string_view<_CharT, _Traits>, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(const basic_string_view<_CharT, _Traits> __val) const _NOEXCEPT {
- return __do_string_hash(__val.data(), __val.data() + __val.size());
- }
-};
-
-
-#if _LIBCPP_STD_VER > 11
-inline namespace literals
-{
- inline namespace string_view_literals
- {
- inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- basic_string_view<char> operator "" sv(const char *__str, size_t __len) _NOEXCEPT
- {
- return basic_string_view<char> (__str, __len);
- }
-
- inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- basic_string_view<wchar_t> operator "" sv(const wchar_t *__str, size_t __len) _NOEXCEPT
- {
- return basic_string_view<wchar_t> (__str, __len);
- }
-
-#ifndef _LIBCPP_NO_HAS_CHAR8_T
- inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- basic_string_view<char8_t> operator "" sv(const char8_t *__str, size_t __len) _NOEXCEPT
- {
- return basic_string_view<char8_t> (__str, __len);
- }
-#endif
-
- inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- basic_string_view<char16_t> operator "" sv(const char16_t *__str, size_t __len) _NOEXCEPT
- {
- return basic_string_view<char16_t> (__str, __len);
- }
-
- inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- basic_string_view<char32_t> operator "" sv(const char32_t *__str, size_t __len) _NOEXCEPT
- {
- return basic_string_view<char32_t> (__str, __len);
- }
- }
-}
-#endif
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_STRING_VIEW
diff --git a/lib/libcxx/include/strstream b/lib/libcxx/include/strstream
deleted file mode 100644
index b00b9d830df..00000000000
--- a/lib/libcxx/include/strstream
+++ /dev/null
@@ -1,400 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- strstream --------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_STRSTREAM
-#define _LIBCPP_STRSTREAM
-
-/*
- strstream synopsis
-
-class strstreambuf
- : public basic_streambuf<char>
-{
-public:
- explicit strstreambuf(streamsize alsize_arg = 0);
- strstreambuf(void* (*palloc_arg)(size_t), void (*pfree_arg)(void*));
- strstreambuf(char* gnext_arg, streamsize n, char* pbeg_arg = 0);
- strstreambuf(const char* gnext_arg, streamsize n);
-
- strstreambuf(signed char* gnext_arg, streamsize n, signed char* pbeg_arg = 0);
- strstreambuf(const signed char* gnext_arg, streamsize n);
- strstreambuf(unsigned char* gnext_arg, streamsize n, unsigned char* pbeg_arg = 0);
- strstreambuf(const unsigned char* gnext_arg, streamsize n);
-
- strstreambuf(strstreambuf&& rhs);
- strstreambuf& operator=(strstreambuf&& rhs);
-
- virtual ~strstreambuf();
-
- void swap(strstreambuf& rhs);
-
- void freeze(bool freezefl = true);
- char* str();
- int pcount() const;
-
-protected:
- virtual int_type overflow (int_type c = EOF);
- virtual int_type pbackfail(int_type c = EOF);
- virtual int_type underflow();
- virtual pos_type seekoff(off_type off, ios_base::seekdir way,
- ios_base::openmode which = ios_base::in | ios_base::out);
- virtual pos_type seekpos(pos_type sp,
- ios_base::openmode which = ios_base::in | ios_base::out);
- virtual streambuf* setbuf(char* s, streamsize n);
-
-private:
- typedef T1 strstate; // exposition only
- static const strstate allocated; // exposition only
- static const strstate constant; // exposition only
- static const strstate dynamic; // exposition only
- static const strstate frozen; // exposition only
- strstate strmode; // exposition only
- streamsize alsize; // exposition only
- void* (*palloc)(size_t); // exposition only
- void (*pfree)(void*); // exposition only
-};
-
-class istrstream
- : public basic_istream<char>
-{
-public:
- explicit istrstream(const char* s);
- explicit istrstream(char* s);
- istrstream(const char* s, streamsize n);
- istrstream(char* s, streamsize n);
-
- virtual ~istrstream();
-
- strstreambuf* rdbuf() const;
- char *str();
-
-private:
- strstreambuf sb; // exposition only
-};
-
-class ostrstream
- : public basic_ostream<char>
-{
-public:
- ostrstream();
- ostrstream(char* s, int n, ios_base::openmode mode = ios_base::out);
-
- virtual ~ostrstream();
-
- strstreambuf* rdbuf() const;
- void freeze(bool freezefl = true);
- char* str();
- int pcount() const;
-
-private:
- strstreambuf sb; // exposition only
-};
-
-class strstream
- : public basic_iostream<char>
-{
-public:
- // Types
- typedef char char_type;
- typedef char_traits<char>::int_type int_type;
- typedef char_traits<char>::pos_type pos_type;
- typedef char_traits<char>::off_type off_type;
-
- // constructors/destructor
- strstream();
- strstream(char* s, int n, ios_base::openmode mode = ios_base::in | ios_base::out);
-
- virtual ~strstream();
-
- // Members:
- strstreambuf* rdbuf() const;
- void freeze(bool freezefl = true);
- int pcount() const;
- char* str();
-
-private:
- strstreambuf sb; // exposition only
-};
-
-} // std
-
-*/
-
-#include <__config>
-#include <ostream>
-#include <istream>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-class _LIBCPP_TYPE_VIS strstreambuf
- : public streambuf
-{
-public:
- explicit strstreambuf(streamsize __alsize = 0);
- strstreambuf(void* (*__palloc)(size_t), void (*__pfree)(void*));
- strstreambuf(char* __gnext, streamsize __n, char* __pbeg = 0);
- strstreambuf(const char* __gnext, streamsize __n);
-
- strstreambuf(signed char* __gnext, streamsize __n, signed char* __pbeg = 0);
- strstreambuf(const signed char* __gnext, streamsize __n);
- strstreambuf(unsigned char* __gnext, streamsize __n, unsigned char* __pbeg = 0);
- strstreambuf(const unsigned char* __gnext, streamsize __n);
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- strstreambuf(strstreambuf&& __rhs);
- _LIBCPP_INLINE_VISIBILITY
- strstreambuf& operator=(strstreambuf&& __rhs);
-#endif // _LIBCPP_CXX03_LANG
-
- virtual ~strstreambuf();
-
- void swap(strstreambuf& __rhs);
-
- void freeze(bool __freezefl = true);
- char* str();
- int pcount() const;
-
-protected:
- virtual int_type overflow (int_type __c = EOF);
- virtual int_type pbackfail(int_type __c = EOF);
- virtual int_type underflow();
- virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
- ios_base::openmode __which = ios_base::in | ios_base::out);
- virtual pos_type seekpos(pos_type __sp,
- ios_base::openmode __which = ios_base::in | ios_base::out);
-
-private:
- typedef unsigned __mode_type;
- static const __mode_type __allocated = 0x01;
- static const __mode_type __constant = 0x02;
- static const __mode_type __dynamic = 0x04;
- static const __mode_type __frozen = 0x08;
- static const streamsize __default_alsize = 4096;
-
- __mode_type __strmode_;
- streamsize __alsize_;
- void* (*__palloc_)(size_t);
- void (*__pfree_)(void*);
-
- void __init(char* __gnext, streamsize __n, char* __pbeg);
-};
-
-#ifndef _LIBCPP_CXX03_LANG
-
-inline _LIBCPP_INLINE_VISIBILITY
-strstreambuf::strstreambuf(strstreambuf&& __rhs)
- : streambuf(__rhs),
- __strmode_(__rhs.__strmode_),
- __alsize_(__rhs.__alsize_),
- __palloc_(__rhs.__palloc_),
- __pfree_(__rhs.__pfree_)
-{
- __rhs.setg(nullptr, nullptr, nullptr);
- __rhs.setp(nullptr, nullptr);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-strstreambuf&
-strstreambuf::operator=(strstreambuf&& __rhs)
-{
- if (eback() && (__strmode_ & __allocated) != 0 && (__strmode_ & __frozen) == 0)
- {
- if (__pfree_)
- __pfree_(eback());
- else
- delete [] eback();
- }
- streambuf::operator=(__rhs);
- __strmode_ = __rhs.__strmode_;
- __alsize_ = __rhs.__alsize_;
- __palloc_ = __rhs.__palloc_;
- __pfree_ = __rhs.__pfree_;
- __rhs.setg(nullptr, nullptr, nullptr);
- __rhs.setp(nullptr, nullptr);
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-class _LIBCPP_TYPE_VIS istrstream
- : public istream
-{
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit istrstream(const char* __s)
- : istream(&__sb_), __sb_(__s, 0) {}
- _LIBCPP_INLINE_VISIBILITY
- explicit istrstream(char* __s)
- : istream(&__sb_), __sb_(__s, 0) {}
- _LIBCPP_INLINE_VISIBILITY
- istrstream(const char* __s, streamsize __n)
- : istream(&__sb_), __sb_(__s, __n) {}
- _LIBCPP_INLINE_VISIBILITY
- istrstream(char* __s, streamsize __n)
- : istream(&__sb_), __sb_(__s, __n) {}
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- istrstream(istrstream&& __rhs)
- : istream(_VSTD::move(__rhs)),
- __sb_(_VSTD::move(__rhs.__sb_))
- {
- istream::set_rdbuf(&__sb_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- istrstream& operator=(istrstream&& __rhs)
- {
- istream::operator=(_VSTD::move(__rhs));
- __sb_ = _VSTD::move(__rhs.__sb_);
- return *this;
- }
-#endif // _LIBCPP_CXX03_LANG
-
- virtual ~istrstream();
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(istrstream& __rhs)
- {
- istream::swap(__rhs);
- __sb_.swap(__rhs.__sb_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);}
- _LIBCPP_INLINE_VISIBILITY
- char *str() {return __sb_.str();}
-
-private:
- strstreambuf __sb_;
-};
-
-class _LIBCPP_TYPE_VIS ostrstream
- : public ostream
-{
-public:
- _LIBCPP_INLINE_VISIBILITY
- ostrstream()
- : ostream(&__sb_) {}
- _LIBCPP_INLINE_VISIBILITY
- ostrstream(char* __s, int __n, ios_base::openmode __mode = ios_base::out)
- : ostream(&__sb_),
- __sb_(__s, __n, __s + (__mode & ios::app ? strlen(__s) : 0))
- {}
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- ostrstream(ostrstream&& __rhs)
- : ostream(_VSTD::move(__rhs)),
- __sb_(_VSTD::move(__rhs.__sb_))
- {
- ostream::set_rdbuf(&__sb_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- ostrstream& operator=(ostrstream&& __rhs)
- {
- ostream::operator=(_VSTD::move(__rhs));
- __sb_ = _VSTD::move(__rhs.__sb_);
- return *this;
- }
-#endif // _LIBCPP_CXX03_LANG
-
- virtual ~ostrstream();
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(ostrstream& __rhs)
- {
- ostream::swap(__rhs);
- __sb_.swap(__rhs.__sb_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);}
- _LIBCPP_INLINE_VISIBILITY
- void freeze(bool __freezefl = true) {__sb_.freeze(__freezefl);}
- _LIBCPP_INLINE_VISIBILITY
- char* str() {return __sb_.str();}
- _LIBCPP_INLINE_VISIBILITY
- int pcount() const {return __sb_.pcount();}
-
-private:
- strstreambuf __sb_; // exposition only
-};
-
-class _LIBCPP_TYPE_VIS strstream
- : public iostream
-{
-public:
- // Types
- typedef char char_type;
- typedef char_traits<char>::int_type int_type;
- typedef char_traits<char>::pos_type pos_type;
- typedef char_traits<char>::off_type off_type;
-
- // constructors/destructor
- _LIBCPP_INLINE_VISIBILITY
- strstream()
- : iostream(&__sb_) {}
- _LIBCPP_INLINE_VISIBILITY
- strstream(char* __s, int __n, ios_base::openmode __mode = ios_base::in | ios_base::out)
- : iostream(&__sb_),
- __sb_(__s, __n, __s + (__mode & ios::app ? strlen(__s) : 0))
- {}
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- strstream(strstream&& __rhs)
- : iostream(_VSTD::move(__rhs)),
- __sb_(_VSTD::move(__rhs.__sb_))
- {
- iostream::set_rdbuf(&__sb_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- strstream& operator=(strstream&& __rhs)
- {
- iostream::operator=(_VSTD::move(__rhs));
- __sb_ = _VSTD::move(__rhs.__sb_);
- return *this;
- }
-#endif // _LIBCPP_CXX03_LANG
-
- virtual ~strstream();
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(strstream& __rhs)
- {
- iostream::swap(__rhs);
- __sb_.swap(__rhs.__sb_);
- }
-
- // Members:
- _LIBCPP_INLINE_VISIBILITY
- strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);}
- _LIBCPP_INLINE_VISIBILITY
- void freeze(bool __freezefl = true) {__sb_.freeze(__freezefl);}
- _LIBCPP_INLINE_VISIBILITY
- int pcount() const {return __sb_.pcount();}
- _LIBCPP_INLINE_VISIBILITY
- char* str() {return __sb_.str();}
-
-private:
- strstreambuf __sb_; // exposition only
-};
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_STRSTREAM
diff --git a/lib/libcxx/include/support/android/locale_bionic.h b/lib/libcxx/include/support/android/locale_bionic.h
deleted file mode 100644
index 50fcf5c36a7..00000000000
--- a/lib/libcxx/include/support/android/locale_bionic.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// -*- C++ -*-
-//===------------------- support/android/locale_bionic.h ------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SUPPORT_ANDROID_LOCALE_BIONIC_H
-#define _LIBCPP_SUPPORT_ANDROID_LOCALE_BIONIC_H
-
-#if defined(__BIONIC__)
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdlib.h>
-#include <xlocale.h>
-
-#ifdef __cplusplus
-}
-#endif
-
-#if defined(__ANDROID__)
-
-#include <android/api-level.h>
-#include <android/ndk-version.h>
-#include <support/xlocale/__posix_l_fallback.h>
-// In NDK versions later than 16, locale-aware functions are provided by
-// legacy_stdlib_inlines.h
-#if __NDK_MAJOR__ <= 16
-#if __ANDROID_API__ < 21
-#include <support/xlocale/__strtonum_fallback.h>
-#elif __ANDROID_API__ < 26
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-inline _LIBCPP_INLINE_VISIBILITY float strtof_l(const char* __nptr, char** __endptr,
- locale_t) {
- return ::strtof(__nptr, __endptr);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY double strtod_l(const char* __nptr,
- char** __endptr, locale_t) {
- return ::strtod(__nptr, __endptr);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY long strtol_l(const char* __nptr, char** __endptr,
- int __base, locale_t) {
- return ::strtol(__nptr, __endptr, __base);
-}
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif // __ANDROID_API__ < 26
-
-#endif // __NDK_MAJOR__ <= 16
-#endif // defined(__ANDROID__)
-
-#endif // defined(__BIONIC__)
-#endif // _LIBCPP_SUPPORT_ANDROID_LOCALE_BIONIC_H
diff --git a/lib/libcxx/include/support/fuchsia/xlocale.h b/lib/libcxx/include/support/fuchsia/xlocale.h
deleted file mode 100644
index 1de2fca28e2..00000000000
--- a/lib/libcxx/include/support/fuchsia/xlocale.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// -*- C++ -*-
-//===------------------- support/fuchsia/xlocale.h ------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SUPPORT_FUCHSIA_XLOCALE_H
-#define _LIBCPP_SUPPORT_FUCHSIA_XLOCALE_H
-
-#if defined(__Fuchsia__)
-
-#include <cstdlib>
-#include <cwchar>
-#include <support/xlocale/__posix_l_fallback.h>
-#include <support/xlocale/__strtonum_fallback.h>
-
-#endif // defined(__Fuchsia__)
-
-#endif // _LIBCPP_SUPPORT_FUCHSIA_XLOCALE_H
diff --git a/lib/libcxx/include/support/ibm/limits.h b/lib/libcxx/include/support/ibm/limits.h
deleted file mode 100644
index efdb3596596..00000000000
--- a/lib/libcxx/include/support/ibm/limits.h
+++ /dev/null
@@ -1,99 +0,0 @@
-// -*- C++ -*-
-//===--------------------- support/ibm/limits.h ---------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SUPPORT_IBM_LIMITS_H
-#define _LIBCPP_SUPPORT_IBM_LIMITS_H
-
-#if !defined(_AIX) // Linux
-#include <math.h> // for HUGE_VAL, HUGE_VALF, HUGE_VALL, and NAN
-
-static const unsigned int _QNAN_F = 0x7fc00000;
-#define NANF (*((float *)(&_QNAN_F)))
-static const unsigned int _QNAN_LDBL128[4] = {0x7ff80000, 0x0, 0x0, 0x0};
-#define NANL (*((long double *)(&_QNAN_LDBL128)))
-static const unsigned int _SNAN_F= 0x7f855555;
-#define NANSF (*((float *)(&_SNAN_F)))
-static const unsigned int _SNAN_D[2] = {0x7ff55555, 0x55555555};
-#define NANS (*((double *)(&_SNAN_D)))
-static const unsigned int _SNAN_LDBL128[4] = {0x7ff55555, 0x55555555, 0x0, 0x0};
-#define NANSL (*((long double *)(&_SNAN_LDBL128)))
-
-#define __builtin_huge_val() HUGE_VAL
-#define __builtin_huge_valf() HUGE_VALF
-#define __builtin_huge_vall() HUGE_VALL
-#define __builtin_nan(__dummy) NAN
-#define __builtin_nanf(__dummy) NANF
-#define __builtin_nanl(__dummy) NANL
-#define __builtin_nans(__dummy) NANS
-#define __builtin_nansf(__dummy) NANSF
-#define __builtin_nansl(__dummy) NANSL
-
-#else
-
-#include <math.h>
-#include <float.h> // limit constants
-
-#define __builtin_huge_val() HUGE_VAL //0x7ff0000000000000
-#define __builtin_huge_valf() HUGE_VALF //0x7f800000
-#define __builtin_huge_vall() HUGE_VALL //0x7ff0000000000000
-#define __builtin_nan(__dummy) nan(__dummy) //0x7ff8000000000000
-#define __builtin_nanf(__dummy) nanf(__dummy) // 0x7ff80000
-#define __builtin_nanl(__dummy) nanl(__dummy) //0x7ff8000000000000
-#define __builtin_nans(__dummy) DBL_SNAN //0x7ff5555555555555
-#define __builtin_nansf(__dummy) FLT_SNAN //0x7f855555
-#define __builtin_nansl(__dummy) DBL_SNAN //0x7ff5555555555555
-
-#define __FLT_MANT_DIG__ FLT_MANT_DIG
-#define __FLT_DIG__ FLT_DIG
-#define __FLT_RADIX__ FLT_RADIX
-#define __FLT_MIN_EXP__ FLT_MIN_EXP
-#define __FLT_MIN_10_EXP__ FLT_MIN_10_EXP
-#define __FLT_MAX_EXP__ FLT_MAX_EXP
-#define __FLT_MAX_10_EXP__ FLT_MAX_10_EXP
-#define __FLT_MIN__ FLT_MIN
-#define __FLT_MAX__ FLT_MAX
-#define __FLT_EPSILON__ FLT_EPSILON
-// predefined by XLC on LoP
-#define __FLT_DENORM_MIN__ 1.40129846e-45F
-
-#define __DBL_MANT_DIG__ DBL_MANT_DIG
-#define __DBL_DIG__ DBL_DIG
-#define __DBL_MIN_EXP__ DBL_MIN_EXP
-#define __DBL_MIN_10_EXP__ DBL_MIN_10_EXP
-#define __DBL_MAX_EXP__ DBL_MAX_EXP
-#define __DBL_MAX_10_EXP__ DBL_MAX_10_EXP
-#define __DBL_MIN__ DBL_MIN
-#define __DBL_MAX__ DBL_MAX
-#define __DBL_EPSILON__ DBL_EPSILON
-// predefined by XLC on LoP
-#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
-
-#define __LDBL_MANT_DIG__ LDBL_MANT_DIG
-#define __LDBL_DIG__ LDBL_DIG
-#define __LDBL_MIN_EXP__ LDBL_MIN_EXP
-#define __LDBL_MIN_10_EXP__ LDBL_MIN_10_EXP
-#define __LDBL_MAX_EXP__ LDBL_MAX_EXP
-#define __LDBL_MAX_10_EXP__ LDBL_MAX_10_EXP
-#define __LDBL_MIN__ LDBL_MIN
-#define __LDBL_MAX__ LDBL_MAX
-#define __LDBL_EPSILON__ LDBL_EPSILON
-// predefined by XLC on LoP
-#if __LONGDOUBLE128
-#define __LDBL_DENORM_MIN__ 4.94065645841246544176568792868221e-324L
-#else
-#define __LDBL_DENORM_MIN__ 4.9406564584124654e-324L
-#endif
-
-// predefined by XLC on LoP
-#define __CHAR_BIT__ 8
-
-#endif // _AIX
-
-#endif // _LIBCPP_SUPPORT_IBM_LIMITS_H
diff --git a/lib/libcxx/include/support/ibm/locale_mgmt_aix.h b/lib/libcxx/include/support/ibm/locale_mgmt_aix.h
deleted file mode 100644
index e3b7a78c45a..00000000000
--- a/lib/libcxx/include/support/ibm/locale_mgmt_aix.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// -*- C++ -*-
-//===------------------- support/ibm/locale_mgmt_aix.h --------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SUPPORT_IBM_LOCALE_MGMT_AIX_H
-#define _LIBCPP_SUPPORT_IBM_LOCALE_MGMT_AIX_H
-
-#if defined(_AIX)
-#include "cstdlib"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if !defined(_AIX71)
-// AIX 7.1 and higher has these definitions. Definitions and stubs
-// are provied here as a temporary workaround on AIX 6.1.
-
-#define LC_COLLATE_MASK 1
-#define LC_CTYPE_MASK 2
-#define LC_MESSAGES_MASK 4
-#define LC_MONETARY_MASK 8
-#define LC_NUMERIC_MASK 16
-#define LC_TIME_MASK 32
-#define LC_ALL_MASK (LC_COLLATE_MASK | LC_CTYPE_MASK | \
- LC_MESSAGES_MASK | LC_MONETARY_MASK |\
- LC_NUMERIC_MASK | LC_TIME_MASK)
-
-typedef void* locale_t;
-
-// The following are stubs. They are not supported on AIX 6.1.
-static inline
-locale_t newlocale(int category_mask, const char *locale, locale_t base)
-{
- _LC_locale_t *newloc, *loc;
- if ((loc = (_LC_locale_t *)__xopen_locale(locale)) == NULL)
- {
- errno = EINVAL;
- return (locale_t)0;
- }
- if ((newloc = (_LC_locale_t *)calloc(1, sizeof(_LC_locale_t))) == NULL)
- {
- errno = ENOMEM;
- return (locale_t)0;
- }
- if (!base)
- base = (_LC_locale_t *)__xopen_locale("C");
- memcpy(newloc, base, sizeof (_LC_locale_t));
- if (category_mask & LC_COLLATE_MASK)
- newloc->lc_collate = loc->lc_collate;
- if (category_mask & LC_CTYPE_MASK)
- newloc->lc_ctype = loc->lc_ctype;
- //if (category_mask & LC_MESSAGES_MASK)
- // newloc->lc_messages = loc->lc_messages;
- if (category_mask & LC_MONETARY_MASK)
- newloc->lc_monetary = loc->lc_monetary;
- if (category_mask & LC_TIME_MASK)
- newloc->lc_time = loc->lc_time;
- if (category_mask & LC_NUMERIC_MASK)
- newloc->lc_numeric = loc->lc_numeric;
- return (locale_t)newloc;
-}
-static inline
-void freelocale(locale_t locobj)
-{
- free(locobj);
-}
-static inline
-locale_t uselocale(locale_t newloc)
-{
- return (locale_t)0;
-}
-#endif // !defined(_AIX71)
-
-#ifdef __cplusplus
-}
-#endif
-#endif // defined(_AIX)
-#endif // _LIBCPP_SUPPORT_IBM_LOCALE_MGMT_AIX_H
diff --git a/lib/libcxx/include/support/ibm/support.h b/lib/libcxx/include/support/ibm/support.h
deleted file mode 100644
index 0abfa7f95a6..00000000000
--- a/lib/libcxx/include/support/ibm/support.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// -*- C++ -*-
-//===----------------------- support/ibm/support.h ----------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SUPPORT_IBM_SUPPORT_H
-#define _LIBCPP_SUPPORT_IBM_SUPPORT_H
-
-extern "builtin" int __popcnt4(unsigned int);
-extern "builtin" int __popcnt8(unsigned long long);
-extern "builtin" unsigned int __cnttz4(unsigned int);
-extern "builtin" unsigned int __cnttz8(unsigned long long);
-extern "builtin" unsigned int __cntlz4(unsigned int);
-extern "builtin" unsigned int __cntlz8(unsigned long long);
-
-// Builtin functions for counting population
-#define __builtin_popcount(x) __popcnt4(x)
-#define __builtin_popcountll(x) __popcnt8(x)
-#if defined(__64BIT__)
-#define __builtin_popcountl(x) __builtin_popcountll(x)
-#else
-#define __builtin_popcountl(x) __builtin_popcount(x)
-#endif
-
-// Builtin functions for counting trailing zeros
-#define __builtin_ctz(x) __cnttz4(x)
-#define __builtin_ctzll(x) __cnttz8(x)
-#if defined(__64BIT__)
-#define __builtin_ctzl(x) __builtin_ctzll(x)
-#else
-#define __builtin_ctzl(x) __builtin_ctz(x)
-#endif
-
-// Builtin functions for counting leading zeros
-#define __builtin_clz(x) __cntlz4(x)
-#define __builtin_clzll(x) __cntlz8(x)
-#if defined(__64BIT__)
-#define __builtin_clzl(x) __builtin_clzll(x)
-#else
-#define __builtin_clzl(x) __builtin_clz(x)
-#endif
-
-#if defined(__64BIT__)
-#define __SIZE_WIDTH__ 64
-#else
-#define __SIZE_WIDTH__ 32
-#endif
-
-#endif // _LIBCPP_SUPPORT_IBM_SUPPORT_H
diff --git a/lib/libcxx/include/support/ibm/xlocale.h b/lib/libcxx/include/support/ibm/xlocale.h
deleted file mode 100644
index f39c0ba95d9..00000000000
--- a/lib/libcxx/include/support/ibm/xlocale.h
+++ /dev/null
@@ -1,271 +0,0 @@
-// -*- C++ -*-
-//===--------------------- support/ibm/xlocale.h -------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SUPPORT_IBM_XLOCALE_H
-#define _LIBCPP_SUPPORT_IBM_XLOCALE_H
-#include <support/ibm/locale_mgmt_aix.h>
-
-#if defined(_AIX)
-#include "cstdlib"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if !defined(_AIX71)
-// AIX 7.1 and higher has these definitions. Definitions and stubs
-// are provied here as a temporary workaround on AIX 6.1.
-static inline
-int isalnum_l(int c, locale_t locale)
-{
- return __xisalnum(locale, c);
-}
-static inline
-int isalpha_l(int c, locale_t locale)
-{
- return __xisalpha(locale, c);
-}
-static inline
-int isblank_l(int c, locale_t locale)
-{
- return __xisblank(locale, c);
-}
-static inline
-int iscntrl_l(int c, locale_t locale)
-{
- return __xiscntrl(locale, c);
-}
-static inline
-int isdigit_l(int c, locale_t locale)
-{
- return __xisdigit(locale, c);
-}
-static inline
-int isgraph_l(int c, locale_t locale)
-{
- return __xisgraph(locale, c);
-}
-static inline
-int islower_l(int c, locale_t locale)
-{
- return __xislower(locale, c);
-}
-static inline
-int isprint_l(int c, locale_t locale)
-{
- return __xisprint(locale, c);
-}
-
-static inline
-int ispunct_l(int c, locale_t locale)
-{
- return __xispunct(locale, c);
-}
-static inline
-int isspace_l(int c, locale_t locale)
-{
- return __xisspace(locale, c);
-}
-static inline
-int isupper_l(int c, locale_t locale)
-{
- return __xisupper(locale, c);
-}
-
-static inline
-int isxdigit_l(int c, locale_t locale)
-{
- return __xisxdigit(locale, c);
-}
-
-static inline
-int iswalnum_l(wchar_t wc, locale_t locale)
-{
- return __xiswalnum(locale, wc);
-}
-
-static inline
-int iswalpha_l(wchar_t wc, locale_t locale)
-{
- return __xiswalpha(locale, wc);
-}
-
-static inline
-int iswblank_l(wchar_t wc, locale_t locale)
-{
- return __xiswblank(locale, wc);
-}
-
-static inline
-int iswcntrl_l(wchar_t wc, locale_t locale)
-{
- return __xiswcntrl(locale, wc);
-}
-
-static inline
-int iswdigit_l(wchar_t wc, locale_t locale)
-{
- return __xiswdigit(locale, wc);
-}
-
-static inline
-int iswgraph_l(wchar_t wc, locale_t locale)
-{
- return __xiswgraph(locale, wc);
-}
-
-static inline
-int iswlower_l(wchar_t wc, locale_t locale)
-{
- return __xiswlower(locale, wc);
-}
-
-static inline
-int iswprint_l(wchar_t wc, locale_t locale)
-{
- return __xiswprint(locale, wc);
-}
-
-static inline
-int iswpunct_l(wchar_t wc, locale_t locale)
-{
- return __xiswpunct(locale, wc);
-}
-
-static inline
-int iswspace_l(wchar_t wc, locale_t locale)
-{
- return __xiswspace(locale, wc);
-}
-
-static inline
-int iswupper_l(wchar_t wc, locale_t locale)
-{
- return __xiswupper(locale, wc);
-}
-
-static inline
-int iswxdigit_l(wchar_t wc, locale_t locale)
-{
- return __xiswxdigit(locale, wc);
-}
-
-static inline
-int iswctype_l(wint_t wc, wctype_t desc, locale_t locale)
-{
- return __xiswctype(locale, wc, desc);
-}
-
-static inline
-int toupper_l(int c, locale_t locale)
-{
- return __xtoupper(locale, c);
-}
-static inline
-int tolower_l(int c, locale_t locale)
-{
- return __xtolower(locale, c);
-}
-static inline
-wint_t towupper_l(wint_t wc, locale_t locale)
-{
- return __xtowupper(locale, wc);
-}
-static inline
-wint_t towlower_l(wint_t wc, locale_t locale)
-{
- return __xtowlower(locale, wc);
-}
-
-static inline
-int strcoll_l(const char *__s1, const char *__s2, locale_t locale)
-{
- return __xstrcoll(locale, __s1, __s2);
-}
-static inline
-int wcscoll_l(const wchar_t *__s1, const wchar_t *__s2, locale_t locale)
-{
- return __xwcscoll(locale, __s1, __s2);
-}
-static inline
-size_t strxfrm_l(char *__s1, const char *__s2, size_t __n, locale_t locale)
-{
- return __xstrxfrm(locale, __s1, __s2, __n);
-}
-
-static inline
-size_t wcsxfrm_l(wchar_t *__ws1, const wchar_t *__ws2, size_t __n,
- locale_t locale)
-{
- return __xwcsxfrm(locale, __ws1, __ws2, __n);
-}
-#endif // !defined(_AIX71)
-
-// strftime_l() is defined by POSIX. However, AIX 7.1 does not have it
-// implemented yet.
-static inline
-size_t strftime_l(char *__s, size_t __size, const char *__fmt,
- const struct tm *__tm, locale_t locale) {
- return __xstrftime(locale, __s, __size, __fmt, __tm);
-}
-
-// The following are not POSIX routines. These are quick-and-dirty hacks
-// to make things pretend to work
-static inline
-long long strtoll_l(const char *__nptr, char **__endptr,
- int __base, locale_t locale) {
- return strtoll(__nptr, __endptr, __base);
-}
-static inline
-long strtol_l(const char *__nptr, char **__endptr,
- int __base, locale_t locale) {
- return strtol(__nptr, __endptr, __base);
-}
-static inline
-long double strtold_l(const char *__nptr, char **__endptr,
- locale_t locale) {
- return strtold(__nptr, __endptr);
-}
-static inline
-unsigned long long strtoull_l(const char *__nptr, char **__endptr,
- int __base, locale_t locale) {
- return strtoull(__nptr, __endptr, __base);
-}
-static inline
-unsigned long strtoul_l(const char *__nptr, char **__endptr,
- int __base, locale_t locale) {
- return strtoul(__nptr, __endptr, __base);
-}
-
-static inline
-int vasprintf(char **strp, const char *fmt, va_list ap)
-{
- const size_t buff_size = 256;
- int str_size;
- if ((*strp = (char *)malloc(buff_size)) == NULL)
- {
- return -1;
- }
- if ((str_size = vsnprintf(*strp, buff_size, fmt, ap)) >= buff_size)
- {
- if ((*strp = (char *)realloc(*strp, str_size + 1)) == NULL)
- {
- return -1;
- }
- str_size = vsnprintf(*strp, str_size + 1, fmt, ap);
- }
- return str_size;
-}
-
-#ifdef __cplusplus
-}
-#endif
-#endif // defined(_AIX)
-#endif // _LIBCPP_SUPPORT_IBM_XLOCALE_H
diff --git a/lib/libcxx/include/support/musl/xlocale.h b/lib/libcxx/include/support/musl/xlocale.h
deleted file mode 100644
index 3e31c99596c..00000000000
--- a/lib/libcxx/include/support/musl/xlocale.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// -*- C++ -*-
-//===------------------- support/musl/xlocale.h ------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-// This adds support for the extended locale functions that are currently
-// missing from the Musl C library.
-//
-// This only works when the specified locale is "C" or "POSIX", but that's
-// about as good as we can do without implementing full xlocale support
-// in Musl.
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SUPPORT_MUSL_XLOCALE_H
-#define _LIBCPP_SUPPORT_MUSL_XLOCALE_H
-
-#include <cstdlib>
-#include <cwchar>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-static inline long long strtoll_l(const char *nptr, char **endptr, int base,
- locale_t) {
- return strtoll(nptr, endptr, base);
-}
-
-static inline unsigned long long strtoull_l(const char *nptr, char **endptr,
- int base, locale_t) {
- return strtoull(nptr, endptr, base);
-}
-
-static inline long long wcstoll_l(const wchar_t *nptr, wchar_t **endptr,
- int base, locale_t) {
- return wcstoll(nptr, endptr, base);
-}
-
-static inline unsigned long long wcstoull_l(const wchar_t *nptr,
- wchar_t **endptr, int base,
- locale_t) {
- return wcstoull(nptr, endptr, base);
-}
-
-static inline long double wcstold_l(const wchar_t *nptr, wchar_t **endptr,
- locale_t) {
- return wcstold(nptr, endptr);
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // _LIBCPP_SUPPORT_MUSL_XLOCALE_H
diff --git a/lib/libcxx/include/support/newlib/xlocale.h b/lib/libcxx/include/support/newlib/xlocale.h
deleted file mode 100644
index 2ce6438b556..00000000000
--- a/lib/libcxx/include/support/newlib/xlocale.h
+++ /dev/null
@@ -1,30 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SUPPORT_NEWLIB_XLOCALE_H
-#define _LIBCPP_SUPPORT_NEWLIB_XLOCALE_H
-
-#if defined(_NEWLIB_VERSION) || defined(__OpenBSD__)
-
-#include <cstdlib>
-#include <clocale>
-#include <cwctype>
-#include <ctype.h>
-#if !defined(__OpenBSD__)
-#if !defined(__NEWLIB__) || __NEWLIB__ < 2 || \
- __NEWLIB__ == 2 && __NEWLIB_MINOR__ < 5
-#include <support/xlocale/__nop_locale_mgmt.h>
-#include <support/xlocale/__posix_l_fallback.h>
-#endif
-#endif
-#include <support/xlocale/__strtonum_fallback.h>
-
-#endif // _NEWLIB_VERSION
-
-#endif
diff --git a/lib/libcxx/include/support/solaris/floatingpoint.h b/lib/libcxx/include/support/solaris/floatingpoint.h
deleted file mode 100644
index 999d144b1f2..00000000000
--- a/lib/libcxx/include/support/solaris/floatingpoint.h
+++ /dev/null
@@ -1,14 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#define atof sun_atof
-#define strtod sun_strtod
-#include_next "floatingpoint.h"
-#undef atof
-#undef strtod
diff --git a/lib/libcxx/include/support/solaris/wchar.h b/lib/libcxx/include/support/solaris/wchar.h
deleted file mode 100644
index 0e8e660c8bd..00000000000
--- a/lib/libcxx/include/support/solaris/wchar.h
+++ /dev/null
@@ -1,47 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#define iswalpha sun_iswalpha
-#define iswupper sun_iswupper
-#define iswlower sun_iswlower
-#define iswdigit sun_iswdigit
-#define iswxdigit sun_iswxdigit
-#define iswalnum sun_iswalnum
-#define iswspace sun_iswspace
-#define iswpunct sun_iswpunct
-#define iswprint sun_iswprint
-#define iswgraph sun_iswgraph
-#define iswcntrl sun_iswcntrl
-#define iswctype sun_iswctype
-#define towlower sun_towlower
-#define towupper sun_towupper
-#define wcswcs sun_wcswcs
-#define wcswidth sun_wcswidth
-#define wcwidth sun_wcwidth
-#define wctype sun_wctype
-#define _WCHAR_T 1
-#include_next "wchar.h"
-#undef iswalpha
-#undef iswupper
-#undef iswlower
-#undef iswdigit
-#undef iswxdigit
-#undef iswalnum
-#undef iswspace
-#undef iswpunct
-#undef iswprint
-#undef iswgraph
-#undef iswcntrl
-#undef iswctype
-#undef towlower
-#undef towupper
-#undef wcswcs
-#undef wcswidth
-#undef wcwidth
-#undef wctype
diff --git a/lib/libcxx/include/support/solaris/xlocale.h b/lib/libcxx/include/support/solaris/xlocale.h
deleted file mode 100644
index e20ef7a6e53..00000000000
--- a/lib/libcxx/include/support/solaris/xlocale.h
+++ /dev/null
@@ -1,77 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-////////////////////////////////////////////////////////////////////////////////
-// Minimal xlocale implementation for Solaris. This implements the subset of
-// the xlocale APIs that libc++ depends on.
-////////////////////////////////////////////////////////////////////////////////
-#ifndef __XLOCALE_H_INCLUDED
-#define __XLOCALE_H_INCLUDED
-
-#include <stdlib.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-int snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...);
-int asprintf_l(char **__s, locale_t __l, const char *__format, ...);
-
-int sscanf_l(const char *__s, locale_t __l, const char *__format, ...);
-
-int toupper_l(int __c, locale_t __l);
-int tolower_l(int __c, locale_t __l);
-
-struct lconv *localeconv(void);
-struct lconv *localeconv_l(locale_t __l);
-
-// FIXME: These are quick-and-dirty hacks to make things pretend to work
-static inline
-long long strtoll_l(const char *__nptr, char **__endptr,
- int __base, locale_t __loc) {
- return strtoll(__nptr, __endptr, __base);
-}
-static inline
-long strtol_l(const char *__nptr, char **__endptr,
- int __base, locale_t __loc) {
- return strtol(__nptr, __endptr, __base);
-}
-static inline
-unsigned long long strtoull_l(const char *__nptr, char **__endptr,
- int __base, locale_t __loc) {
- return strtoull(__nptr, __endptr, __base);
-}
-static inline
-unsigned long strtoul_l(const char *__nptr, char **__endptr,
- int __base, locale_t __loc) {
- return strtoul(__nptr, __endptr, __base);
-}
-static inline
-float strtof_l(const char *__nptr, char **__endptr,
- locale_t __loc) {
- return strtof(__nptr, __endptr);
-}
-static inline
-double strtod_l(const char *__nptr, char **__endptr,
- locale_t __loc) {
- return strtod(__nptr, __endptr);
-}
-static inline
-long double strtold_l(const char *__nptr, char **__endptr,
- locale_t __loc) {
- return strtold(__nptr, __endptr);
-}
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/lib/libcxx/include/support/win32/limits_msvc_win32.h b/lib/libcxx/include/support/win32/limits_msvc_win32.h
deleted file mode 100644
index 1ab2e0b6dc1..00000000000
--- a/lib/libcxx/include/support/win32/limits_msvc_win32.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// -*- C++ -*-
-//===------------------ support/win32/limits_msvc_win32.h -----------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SUPPORT_WIN32_LIMITS_MSVC_WIN32_H
-#define _LIBCPP_SUPPORT_WIN32_LIMITS_MSVC_WIN32_H
-
-#if !defined(_LIBCPP_MSVCRT)
-#error "This header complements the Microsoft C Runtime library, and should not be included otherwise."
-#endif
-#if defined(__clang__)
-#error "This header should only be included when using Microsofts C1XX frontend"
-#endif
-
-#include <limits.h> // CHAR_BIT
-#include <float.h> // limit constants
-#include <math.h> // HUGE_VAL
-#include <ymath.h> // internal MSVC header providing the needed functionality
-
-#define __CHAR_BIT__ CHAR_BIT
-
-#define __FLT_MANT_DIG__ FLT_MANT_DIG
-#define __FLT_DIG__ FLT_DIG
-#define __FLT_RADIX__ FLT_RADIX
-#define __FLT_MIN_EXP__ FLT_MIN_EXP
-#define __FLT_MIN_10_EXP__ FLT_MIN_10_EXP
-#define __FLT_MAX_EXP__ FLT_MAX_EXP
-#define __FLT_MAX_10_EXP__ FLT_MAX_10_EXP
-#define __FLT_MIN__ FLT_MIN
-#define __FLT_MAX__ FLT_MAX
-#define __FLT_EPSILON__ FLT_EPSILON
-// predefined by MinGW GCC
-#define __FLT_DENORM_MIN__ 1.40129846432481707092e-45F
-
-#define __DBL_MANT_DIG__ DBL_MANT_DIG
-#define __DBL_DIG__ DBL_DIG
-#define __DBL_RADIX__ DBL_RADIX
-#define __DBL_MIN_EXP__ DBL_MIN_EXP
-#define __DBL_MIN_10_EXP__ DBL_MIN_10_EXP
-#define __DBL_MAX_EXP__ DBL_MAX_EXP
-#define __DBL_MAX_10_EXP__ DBL_MAX_10_EXP
-#define __DBL_MIN__ DBL_MIN
-#define __DBL_MAX__ DBL_MAX
-#define __DBL_EPSILON__ DBL_EPSILON
-// predefined by MinGW GCC
-#define __DBL_DENORM_MIN__ double(4.94065645841246544177e-324L)
-
-#define __LDBL_MANT_DIG__ LDBL_MANT_DIG
-#define __LDBL_DIG__ LDBL_DIG
-#define __LDBL_RADIX__ LDBL_RADIX
-#define __LDBL_MIN_EXP__ LDBL_MIN_EXP
-#define __LDBL_MIN_10_EXP__ LDBL_MIN_10_EXP
-#define __LDBL_MAX_EXP__ LDBL_MAX_EXP
-#define __LDBL_MAX_10_EXP__ LDBL_MAX_10_EXP
-#define __LDBL_MIN__ LDBL_MIN
-#define __LDBL_MAX__ LDBL_MAX
-#define __LDBL_EPSILON__ LDBL_EPSILON
-// predefined by MinGW GCC
-#define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
-
-// __builtin replacements/workarounds
-#define __builtin_huge_vall() _LInf._Long_double
-#define __builtin_nanl(__dummmy) _LNan._Long_double
-#define __builtin_nansl(__dummy) _LSnan._Long_double
-
-#endif // _LIBCPP_SUPPORT_WIN32_LIMITS_MSVC_WIN32_H
diff --git a/lib/libcxx/include/support/win32/locale_win32.h b/lib/libcxx/include/support/win32/locale_win32.h
deleted file mode 100644
index c7c6d786cb8..00000000000
--- a/lib/libcxx/include/support/win32/locale_win32.h
+++ /dev/null
@@ -1,199 +0,0 @@
-// -*- C++ -*-
-//===--------------------- support/win32/locale_win32.h -------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SUPPORT_WIN32_LOCALE_WIN32_H
-#define _LIBCPP_SUPPORT_WIN32_LOCALE_WIN32_H
-
-#include <__config>
-#include <stdio.h>
-#include <xlocinfo.h> // _locale_t
-#include <__nullptr>
-
-#define LC_COLLATE_MASK _M_COLLATE
-#define LC_CTYPE_MASK _M_CTYPE
-#define LC_MONETARY_MASK _M_MONETARY
-#define LC_NUMERIC_MASK _M_NUMERIC
-#define LC_TIME_MASK _M_TIME
-#define LC_MESSAGES_MASK _M_MESSAGES
-#define LC_ALL_MASK ( LC_COLLATE_MASK \
- | LC_CTYPE_MASK \
- | LC_MESSAGES_MASK \
- | LC_MONETARY_MASK \
- | LC_NUMERIC_MASK \
- | LC_TIME_MASK )
-
-class locale_t {
-public:
- locale_t()
- : __locale(nullptr), __locale_str(nullptr) {}
- locale_t(std::nullptr_t)
- : __locale(nullptr), __locale_str(nullptr) {}
- locale_t(_locale_t __xlocale, const char* __xlocale_str)
- : __locale(__xlocale), __locale_str(__xlocale_str) {}
-
- friend bool operator==(const locale_t& __left, const locale_t& __right) {
- return __left.__locale == __right.__locale;
- }
-
- friend bool operator==(const locale_t& __left, int __right) {
- return __left.__locale == nullptr && __right == 0;
- }
-
- friend bool operator==(const locale_t& __left, long long __right) {
- return __left.__locale == nullptr && __right == 0;
- }
-
- friend bool operator==(const locale_t& __left, std::nullptr_t) {
- return __left.__locale == nullptr;
- }
-
- friend bool operator==(int __left, const locale_t& __right) {
- return __left == 0 && nullptr == __right.__locale;
- }
-
- friend bool operator==(std::nullptr_t, const locale_t& __right) {
- return nullptr == __right.__locale;
- }
-
- friend bool operator!=(const locale_t& __left, const locale_t& __right) {
- return !(__left == __right);
- }
-
- friend bool operator!=(const locale_t& __left, int __right) {
- return !(__left == __right);
- }
-
- friend bool operator!=(const locale_t& __left, long long __right) {
- return !(__left == __right);
- }
-
- friend bool operator!=(const locale_t& __left, std::nullptr_t __right) {
- return !(__left == __right);
- }
-
- friend bool operator!=(int __left, const locale_t& __right) {
- return !(__left == __right);
- }
-
- friend bool operator!=(std::nullptr_t __left, const locale_t& __right) {
- return !(__left == __right);
- }
-
- operator bool() const {
- return __locale != nullptr;
- }
-
- const char* __get_locale() const { return __locale_str; }
-
- operator _locale_t() const {
- return __locale;
- }
-private:
- _locale_t __locale;
- const char* __locale_str;
-};
-
-// Locale management functions
-#define freelocale _free_locale
-// FIXME: base currently unused. Needs manual work to construct the new locale
-locale_t newlocale( int mask, const char * locale, locale_t base );
-// uselocale can't be implemented on Windows because Windows allows partial modification
-// of thread-local locale and so _get_current_locale() returns a copy while uselocale does
-// not create any copies.
-// We can still implement raii even without uselocale though.
-
-
-lconv *localeconv_l( locale_t loc );
-size_t mbrlen_l( const char *__restrict s, size_t n,
- mbstate_t *__restrict ps, locale_t loc);
-size_t mbsrtowcs_l( wchar_t *__restrict dst, const char **__restrict src,
- size_t len, mbstate_t *__restrict ps, locale_t loc );
-size_t wcrtomb_l( char *__restrict s, wchar_t wc, mbstate_t *__restrict ps,
- locale_t loc);
-size_t mbrtowc_l( wchar_t *__restrict pwc, const char *__restrict s,
- size_t n, mbstate_t *__restrict ps, locale_t loc);
-size_t mbsnrtowcs_l( wchar_t *__restrict dst, const char **__restrict src,
- size_t nms, size_t len, mbstate_t *__restrict ps, locale_t loc);
-size_t wcsnrtombs_l( char *__restrict dst, const wchar_t **__restrict src,
- size_t nwc, size_t len, mbstate_t *__restrict ps, locale_t loc);
-wint_t btowc_l( int c, locale_t loc );
-int wctob_l( wint_t c, locale_t loc );
-
-decltype(MB_CUR_MAX) MB_CUR_MAX_L( locale_t __l );
-
-// the *_l functions are prefixed on Windows, only available for msvcr80+, VS2005+
-#define mbtowc_l _mbtowc_l
-#define strtoll_l _strtoi64_l
-#define strtoull_l _strtoui64_l
-#define strtod_l _strtod_l
-#if defined(_LIBCPP_MSVCRT)
-#define strtof_l _strtof_l
-#define strtold_l _strtold_l
-#else
-float strtof_l(const char*, char**, locale_t);
-long double strtold_l(const char*, char**, locale_t);
-#endif
-inline _LIBCPP_INLINE_VISIBILITY
-int
-islower_l(int c, _locale_t loc)
-{
- return _islower_l((int)c, loc);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-int
-isupper_l(int c, _locale_t loc)
-{
- return _isupper_l((int)c, loc);
-}
-
-#define isdigit_l _isdigit_l
-#define isxdigit_l _isxdigit_l
-#define strcoll_l _strcoll_l
-#define strxfrm_l _strxfrm_l
-#define wcscoll_l _wcscoll_l
-#define wcsxfrm_l _wcsxfrm_l
-#define toupper_l _toupper_l
-#define tolower_l _tolower_l
-#define iswspace_l _iswspace_l
-#define iswprint_l _iswprint_l
-#define iswcntrl_l _iswcntrl_l
-#define iswupper_l _iswupper_l
-#define iswlower_l _iswlower_l
-#define iswalpha_l _iswalpha_l
-#define iswdigit_l _iswdigit_l
-#define iswpunct_l _iswpunct_l
-#define iswxdigit_l _iswxdigit_l
-#define towupper_l _towupper_l
-#define towlower_l _towlower_l
-#if defined(__MINGW32__) && __MSVCRT_VERSION__ < 0x0800
-#define strftime_l( __s, __l, __f, __tm, __loc ) strftime( __s, __l, __f, __tm )
-#else
-#define strftime_l _strftime_l
-#endif
-#define sscanf_l( __s, __l, __f, ...) _sscanf_l( __s, __f, __l, __VA_ARGS__ )
-#define sprintf_l( __s, __l, __f, ... ) _sprintf_l( __s, __f, __l, __VA_ARGS__ )
-#define vsprintf_l( __s, __l, __f, ... ) _vsprintf_l( __s, __f, __l, __VA_ARGS__ )
-#define vsnprintf_l( __s, __n, __l, __f, ... ) _vsnprintf_l( __s, __n, __f, __l, __VA_ARGS__ )
-_LIBCPP_FUNC_VIS int snprintf_l(char *ret, size_t n, locale_t loc, const char *format, ...);
-_LIBCPP_FUNC_VIS int asprintf_l( char **ret, locale_t loc, const char *format, ... );
-_LIBCPP_FUNC_VIS int vasprintf_l( char **ret, locale_t loc, const char *format, va_list ap );
-
-// not-so-pressing FIXME: use locale to determine blank characters
-inline int isblank_l( int c, locale_t /*loc*/ )
-{
- return ( c == ' ' || c == '\t' );
-}
-inline int iswblank_l( wint_t c, locale_t /*loc*/ )
-{
- return ( c == L' ' || c == L'\t' );
-}
-
-#endif // _LIBCPP_SUPPORT_WIN32_LOCALE_WIN32_H
diff --git a/lib/libcxx/include/support/xlocale/__nop_locale_mgmt.h b/lib/libcxx/include/support/xlocale/__nop_locale_mgmt.h
deleted file mode 100644
index 0d3f23a2c96..00000000000
--- a/lib/libcxx/include/support/xlocale/__nop_locale_mgmt.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// -*- C++ -*-
-//===------------ support/xlocale/__nop_locale_mgmt.h -----------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SUPPORT_XLOCALE_NOP_LOCALE_MGMT_H
-#define _LIBCPP_SUPPORT_XLOCALE_NOP_LOCALE_MGMT_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Patch over lack of extended locale support
-typedef void *locale_t;
-static inline locale_t duplocale(locale_t) {
- return NULL;
-}
-
-static inline void freelocale(locale_t) {
-}
-
-static inline locale_t newlocale(int, const char *, locale_t) {
- return NULL;
-}
-
-static inline locale_t uselocale(locale_t) {
- return NULL;
-}
-
-#define LC_COLLATE_MASK (1 << LC_COLLATE)
-#define LC_CTYPE_MASK (1 << LC_CTYPE)
-#define LC_MESSAGES_MASK (1 << LC_MESSAGES)
-#define LC_MONETARY_MASK (1 << LC_MONETARY)
-#define LC_NUMERIC_MASK (1 << LC_NUMERIC)
-#define LC_TIME_MASK (1 << LC_TIME)
-#define LC_ALL_MASK (LC_COLLATE_MASK|\
- LC_CTYPE_MASK|\
- LC_MONETARY_MASK|\
- LC_NUMERIC_MASK|\
- LC_TIME_MASK|\
- LC_MESSAGES_MASK)
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // _LIBCPP_SUPPORT_XLOCALE_NOP_LOCALE_MGMT_H
diff --git a/lib/libcxx/include/support/xlocale/__posix_l_fallback.h b/lib/libcxx/include/support/xlocale/__posix_l_fallback.h
deleted file mode 100644
index b9a0939f8fa..00000000000
--- a/lib/libcxx/include/support/xlocale/__posix_l_fallback.h
+++ /dev/null
@@ -1,165 +0,0 @@
-// -*- C++ -*-
-//===--------------- support/xlocale/__posix_l_fallback.h -----------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-// These are reimplementations of some extended locale functions ( *_l ) that
-// are normally part of POSIX. This shared implementation provides parts of the
-// extended locale support for libc's that normally don't have any (like
-// Android's bionic and Newlib).
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SUPPORT_XLOCALE_POSIX_L_FALLBACK_H
-#define _LIBCPP_SUPPORT_XLOCALE_POSIX_L_FALLBACK_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-inline _LIBCPP_INLINE_VISIBILITY int isalnum_l(int c, locale_t) {
- return ::isalnum(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int isalpha_l(int c, locale_t) {
- return ::isalpha(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int isblank_l(int c, locale_t) {
- return ::isblank(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int iscntrl_l(int c, locale_t) {
- return ::iscntrl(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int isdigit_l(int c, locale_t) {
- return ::isdigit(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int isgraph_l(int c, locale_t) {
- return ::isgraph(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int islower_l(int c, locale_t) {
- return ::islower(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int isprint_l(int c, locale_t) {
- return ::isprint(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int ispunct_l(int c, locale_t) {
- return ::ispunct(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int isspace_l(int c, locale_t) {
- return ::isspace(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int isupper_l(int c, locale_t) {
- return ::isupper(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int isxdigit_l(int c, locale_t) {
- return ::isxdigit(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int iswalnum_l(wint_t c, locale_t) {
- return ::iswalnum(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int iswalpha_l(wint_t c, locale_t) {
- return ::iswalpha(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int iswblank_l(wint_t c, locale_t) {
- return ::iswblank(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int iswcntrl_l(wint_t c, locale_t) {
- return ::iswcntrl(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int iswdigit_l(wint_t c, locale_t) {
- return ::iswdigit(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int iswgraph_l(wint_t c, locale_t) {
- return ::iswgraph(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int iswlower_l(wint_t c, locale_t) {
- return ::iswlower(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int iswprint_l(wint_t c, locale_t) {
- return ::iswprint(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int iswpunct_l(wint_t c, locale_t) {
- return ::iswpunct(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int iswspace_l(wint_t c, locale_t) {
- return ::iswspace(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int iswupper_l(wint_t c, locale_t) {
- return ::iswupper(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int iswxdigit_l(wint_t c, locale_t) {
- return ::iswxdigit(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int toupper_l(int c, locale_t) {
- return ::toupper(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int tolower_l(int c, locale_t) {
- return ::tolower(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY wint_t towupper_l(wint_t c, locale_t) {
- return ::towupper(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY wint_t towlower_l(wint_t c, locale_t) {
- return ::towlower(c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int strcoll_l(const char *s1, const char *s2,
- locale_t) {
- return ::strcoll(s1, s2);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY size_t strxfrm_l(char *dest, const char *src,
- size_t n, locale_t) {
- return ::strxfrm(dest, src, n);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY size_t strftime_l(char *s, size_t max,
- const char *format,
- const struct tm *tm, locale_t) {
- return ::strftime(s, max, format, tm);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY int wcscoll_l(const wchar_t *ws1,
- const wchar_t *ws2, locale_t) {
- return ::wcscoll(ws1, ws2);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY size_t wcsxfrm_l(wchar_t *dest, const wchar_t *src,
- size_t n, locale_t) {
- return ::wcsxfrm(dest, src, n);
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // _LIBCPP_SUPPORT_XLOCALE_POSIX_L_FALLBACK_H
diff --git a/lib/libcxx/include/support/xlocale/__strtonum_fallback.h b/lib/libcxx/include/support/xlocale/__strtonum_fallback.h
deleted file mode 100644
index 50b4db35427..00000000000
--- a/lib/libcxx/include/support/xlocale/__strtonum_fallback.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// -*- C++ -*-
-//===-------------- support/xlocale/__strtonum_fallback.h -----------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-// These are reimplementations of some extended locale functions ( *_l ) that
-// aren't part of POSIX. They are widely available though (GLIBC, BSD, maybe
-// others). The unifying aspect in this case is that all of these functions
-// convert strings to some numeric type.
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SUPPORT_XLOCALE_STRTONUM_FALLBACK_H
-#define _LIBCPP_SUPPORT_XLOCALE_STRTONUM_FALLBACK_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-inline _LIBCPP_INLINE_VISIBILITY float strtof_l(const char *nptr,
- char **endptr, locale_t) {
- return ::strtof(nptr, endptr);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY double strtod_l(const char *nptr,
- char **endptr, locale_t) {
- return ::strtod(nptr, endptr);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY long double strtold_l(const char *nptr,
- char **endptr, locale_t) {
- return ::strtold(nptr, endptr);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY long long
-strtoll_l(const char *nptr, char **endptr, int base, locale_t) {
- return ::strtoll(nptr, endptr, base);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY unsigned long long
-strtoull_l(const char *nptr, char **endptr, int base, locale_t) {
- return ::strtoull(nptr, endptr, base);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY long long
-wcstoll_l(const wchar_t *nptr, wchar_t **endptr, int base, locale_t) {
- return ::wcstoll(nptr, endptr, base);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY unsigned long long
-wcstoull_l(const wchar_t *nptr, wchar_t **endptr, int base, locale_t) {
- return ::wcstoull(nptr, endptr, base);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY long double wcstold_l(const wchar_t *nptr,
- wchar_t **endptr, locale_t) {
- return ::wcstold(nptr, endptr);
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // _LIBCPP_SUPPORT_XLOCALE_STRTONUM_FALLBACK_H
diff --git a/lib/libcxx/include/support/xlocale/xlocale.h b/lib/libcxx/include/support/xlocale/xlocale.h
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/lib/libcxx/include/support/xlocale/xlocale.h
+++ /dev/null
diff --git a/lib/libcxx/include/system_error b/lib/libcxx/include/system_error
deleted file mode 100644
index 6e2c8388f17..00000000000
--- a/lib/libcxx/include/system_error
+++ /dev/null
@@ -1,487 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- system_error ----------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_SYSTEM_ERROR
-#define _LIBCPP_SYSTEM_ERROR
-
-/*
- system_error synopsis
-
-namespace std
-{
-
-class error_category
-{
-public:
- virtual ~error_category() noexcept;
-
- constexpr error_category();
- error_category(const error_category&) = delete;
- error_category& operator=(const error_category&) = delete;
-
- virtual const char* name() const noexcept = 0;
- virtual error_condition default_error_condition(int ev) const noexcept;
- virtual bool equivalent(int code, const error_condition& condition) const noexcept;
- virtual bool equivalent(const error_code& code, int condition) const noexcept;
- virtual string message(int ev) const = 0;
-
- bool operator==(const error_category& rhs) const noexcept;
- bool operator!=(const error_category& rhs) const noexcept;
- bool operator<(const error_category& rhs) const noexcept;
-};
-
-const error_category& generic_category() noexcept;
-const error_category& system_category() noexcept;
-
-template <class T> struct is_error_code_enum
- : public false_type {};
-
-template <class T> struct is_error_condition_enum
- : public false_type {};
-
-template <class _Tp>
-inline constexpr size_t is_error_condition_enum_v = is_error_condition_enum<_Tp>::value; // C++17
-
-template <class _Tp>
-inline constexpr size_t is_error_code_enum_v = is_error_code_enum<_Tp>::value; // C++17
-
-class error_code
-{
-public:
- // constructors:
- error_code() noexcept;
- error_code(int val, const error_category& cat) noexcept;
- template <class ErrorCodeEnum>
- error_code(ErrorCodeEnum e) noexcept;
-
- // modifiers:
- void assign(int val, const error_category& cat) noexcept;
- template <class ErrorCodeEnum>
- error_code& operator=(ErrorCodeEnum e) noexcept;
- void clear() noexcept;
-
- // observers:
- int value() const noexcept;
- const error_category& category() const noexcept;
- error_condition default_error_condition() const noexcept;
- string message() const;
- explicit operator bool() const noexcept;
-};
-
-// non-member functions:
-bool operator<(const error_code& lhs, const error_code& rhs) noexcept;
-template <class charT, class traits>
- basic_ostream<charT,traits>&
- operator<<(basic_ostream<charT,traits>& os, const error_code& ec);
-
-class error_condition
-{
-public:
- // constructors:
- error_condition() noexcept;
- error_condition(int val, const error_category& cat) noexcept;
- template <class ErrorConditionEnum>
- error_condition(ErrorConditionEnum e) noexcept;
-
- // modifiers:
- void assign(int val, const error_category& cat) noexcept;
- template <class ErrorConditionEnum>
- error_condition& operator=(ErrorConditionEnum e) noexcept;
- void clear() noexcept;
-
- // observers:
- int value() const noexcept;
- const error_category& category() const noexcept;
- string message() const noexcept;
- explicit operator bool() const noexcept;
-};
-
-bool operator<(const error_condition& lhs, const error_condition& rhs) noexcept;
-
-class system_error
- : public runtime_error
-{
-public:
- system_error(error_code ec, const string& what_arg);
- system_error(error_code ec, const char* what_arg);
- system_error(error_code ec);
- system_error(int ev, const error_category& ecat, const string& what_arg);
- system_error(int ev, const error_category& ecat, const char* what_arg);
- system_error(int ev, const error_category& ecat);
-
- const error_code& code() const noexcept;
- const char* what() const noexcept;
-};
-
-template <> struct is_error_condition_enum<errc>
- : true_type { }
-
-error_code make_error_code(errc e) noexcept;
-error_condition make_error_condition(errc e) noexcept;
-
-// Comparison operators:
-bool operator==(const error_code& lhs, const error_code& rhs) noexcept;
-bool operator==(const error_code& lhs, const error_condition& rhs) noexcept;
-bool operator==(const error_condition& lhs, const error_code& rhs) noexcept;
-bool operator==(const error_condition& lhs, const error_condition& rhs) noexcept;
-bool operator!=(const error_code& lhs, const error_code& rhs) noexcept;
-bool operator!=(const error_code& lhs, const error_condition& rhs) noexcept;
-bool operator!=(const error_condition& lhs, const error_code& rhs) noexcept;
-bool operator!=(const error_condition& lhs, const error_condition& rhs) noexcept;
-
-template <> struct hash<std::error_code>;
-template <> struct hash<std::error_condition>;
-
-} // std
-
-*/
-
-#include <__errc>
-#include <type_traits>
-#include <stdexcept>
-#include <__functional_base>
-#include <string>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-// is_error_code_enum
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_error_code_enum
- : public false_type {};
-
-#if _LIBCPP_STD_VER > 14
-template <class _Tp>
-_LIBCPP_INLINE_VAR constexpr size_t is_error_code_enum_v = is_error_code_enum<_Tp>::value;
-#endif
-
-// is_error_condition_enum
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_error_condition_enum
- : public false_type {};
-
-#if _LIBCPP_STD_VER > 14
-template <class _Tp>
-_LIBCPP_INLINE_VAR constexpr size_t is_error_condition_enum_v = is_error_condition_enum<_Tp>::value;
-#endif
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS is_error_condition_enum<errc>
- : true_type { };
-
-#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
-template <>
-struct _LIBCPP_TEMPLATE_VIS is_error_condition_enum<errc::__lx>
- : true_type { };
-#endif
-
-class _LIBCPP_TYPE_VIS error_condition;
-class _LIBCPP_TYPE_VIS error_code;
-
-// class error_category
-
-class _LIBCPP_HIDDEN __do_message;
-
-class _LIBCPP_TYPE_VIS error_category
-{
-public:
- virtual ~error_category() _NOEXCEPT;
-
-#if defined(_LIBCPP_BUILDING_LIBRARY) && \
- defined(_LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS)
- error_category() _NOEXCEPT;
-#else
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR_AFTER_CXX11 error_category() _NOEXCEPT _LIBCPP_DEFAULT
-#endif
-private:
- error_category(const error_category&);// = delete;
- error_category& operator=(const error_category&);// = delete;
-
-public:
- virtual const char* name() const _NOEXCEPT = 0;
- virtual error_condition default_error_condition(int __ev) const _NOEXCEPT;
- virtual bool equivalent(int __code, const error_condition& __condition) const _NOEXCEPT;
- virtual bool equivalent(const error_code& __code, int __condition) const _NOEXCEPT;
- virtual string message(int __ev) const = 0;
-
- _LIBCPP_INLINE_VISIBILITY
- bool operator==(const error_category& __rhs) const _NOEXCEPT {return this == &__rhs;}
-
- _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const error_category& __rhs) const _NOEXCEPT {return !(*this == __rhs);}
-
- _LIBCPP_INLINE_VISIBILITY
- bool operator< (const error_category& __rhs) const _NOEXCEPT {return this < &__rhs;}
-
- friend class _LIBCPP_HIDDEN __do_message;
-};
-
-class _LIBCPP_HIDDEN __do_message
- : public error_category
-{
-public:
- virtual string message(int ev) const;
-};
-
-_LIBCPP_FUNC_VIS const error_category& generic_category() _NOEXCEPT;
-_LIBCPP_FUNC_VIS const error_category& system_category() _NOEXCEPT;
-
-class _LIBCPP_TYPE_VIS error_condition
-{
- int __val_;
- const error_category* __cat_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- error_condition() _NOEXCEPT : __val_(0), __cat_(&generic_category()) {}
-
- _LIBCPP_INLINE_VISIBILITY
- error_condition(int __val, const error_category& __cat) _NOEXCEPT
- : __val_(__val), __cat_(&__cat) {}
-
- template <class _Ep>
- _LIBCPP_INLINE_VISIBILITY
- error_condition(_Ep __e,
- typename enable_if<is_error_condition_enum<_Ep>::value>::type* = 0
- ) _NOEXCEPT
- {*this = make_error_condition(__e);}
-
- _LIBCPP_INLINE_VISIBILITY
- void assign(int __val, const error_category& __cat) _NOEXCEPT
- {
- __val_ = __val;
- __cat_ = &__cat;
- }
-
- template <class _Ep>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- is_error_condition_enum<_Ep>::value,
- error_condition&
- >::type
- operator=(_Ep __e) _NOEXCEPT
- {*this = make_error_condition(__e); return *this;}
-
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT
- {
- __val_ = 0;
- __cat_ = &generic_category();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- int value() const _NOEXCEPT {return __val_;}
-
- _LIBCPP_INLINE_VISIBILITY
- const error_category& category() const _NOEXCEPT {return *__cat_;}
- string message() const;
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_EXPLICIT
- operator bool() const _NOEXCEPT {return __val_ != 0;}
-};
-
-inline _LIBCPP_INLINE_VISIBILITY
-error_condition
-make_error_condition(errc __e) _NOEXCEPT
-{
- return error_condition(static_cast<int>(__e), generic_category());
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<(const error_condition& __x, const error_condition& __y) _NOEXCEPT
-{
- return __x.category() < __y.category()
- || (__x.category() == __y.category() && __x.value() < __y.value());
-}
-
-// error_code
-
-class _LIBCPP_TYPE_VIS error_code
-{
- int __val_;
- const error_category* __cat_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- error_code() _NOEXCEPT : __val_(0), __cat_(&system_category()) {}
-
- _LIBCPP_INLINE_VISIBILITY
- error_code(int __val, const error_category& __cat) _NOEXCEPT
- : __val_(__val), __cat_(&__cat) {}
-
- template <class _Ep>
- _LIBCPP_INLINE_VISIBILITY
- error_code(_Ep __e,
- typename enable_if<is_error_code_enum<_Ep>::value>::type* = 0
- ) _NOEXCEPT
- {*this = make_error_code(__e);}
-
- _LIBCPP_INLINE_VISIBILITY
- void assign(int __val, const error_category& __cat) _NOEXCEPT
- {
- __val_ = __val;
- __cat_ = &__cat;
- }
-
- template <class _Ep>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- is_error_code_enum<_Ep>::value,
- error_code&
- >::type
- operator=(_Ep __e) _NOEXCEPT
- {*this = make_error_code(__e); return *this;}
-
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT
- {
- __val_ = 0;
- __cat_ = &system_category();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- int value() const _NOEXCEPT {return __val_;}
-
- _LIBCPP_INLINE_VISIBILITY
- const error_category& category() const _NOEXCEPT {return *__cat_;}
-
- _LIBCPP_INLINE_VISIBILITY
- error_condition default_error_condition() const _NOEXCEPT
- {return __cat_->default_error_condition(__val_);}
-
- string message() const;
-
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_EXPLICIT
- operator bool() const _NOEXCEPT {return __val_ != 0;}
-};
-
-inline _LIBCPP_INLINE_VISIBILITY
-error_code
-make_error_code(errc __e) _NOEXCEPT
-{
- return error_code(static_cast<int>(__e), generic_category());
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<(const error_code& __x, const error_code& __y) _NOEXCEPT
-{
- return __x.category() < __y.category()
- || (__x.category() == __y.category() && __x.value() < __y.value());
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const error_code& __x, const error_code& __y) _NOEXCEPT
-{
- return __x.category() == __y.category() && __x.value() == __y.value();
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const error_code& __x, const error_condition& __y) _NOEXCEPT
-{
- return __x.category().equivalent(__x.value(), __y)
- || __y.category().equivalent(__x, __y.value());
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const error_condition& __x, const error_code& __y) _NOEXCEPT
-{
- return __y == __x;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const error_condition& __x, const error_condition& __y) _NOEXCEPT
-{
- return __x.category() == __y.category() && __x.value() == __y.value();
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const error_code& __x, const error_code& __y) _NOEXCEPT
-{return !(__x == __y);}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const error_code& __x, const error_condition& __y) _NOEXCEPT
-{return !(__x == __y);}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const error_condition& __x, const error_code& __y) _NOEXCEPT
-{return !(__x == __y);}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const error_condition& __x, const error_condition& __y) _NOEXCEPT
-{return !(__x == __y);}
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<error_code>
- : public unary_function<error_code, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(const error_code& __ec) const _NOEXCEPT
- {
- return static_cast<size_t>(__ec.value());
- }
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<error_condition>
- : public unary_function<error_condition, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(const error_condition& __ec) const _NOEXCEPT
- {
- return static_cast<size_t>(__ec.value());
- }
-};
-
-// system_error
-
-class _LIBCPP_TYPE_VIS system_error
- : public runtime_error
-{
- error_code __ec_;
-public:
- system_error(error_code __ec, const string& __what_arg);
- system_error(error_code __ec, const char* __what_arg);
- system_error(error_code __ec);
- system_error(int __ev, const error_category& __ecat, const string& __what_arg);
- system_error(int __ev, const error_category& __ecat, const char* __what_arg);
- system_error(int __ev, const error_category& __ecat);
- ~system_error() _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- const error_code& code() const _NOEXCEPT {return __ec_;}
-
-private:
- static string __init(const error_code&, string);
-};
-
-_LIBCPP_NORETURN _LIBCPP_FUNC_VIS
-void __throw_system_error(int ev, const char* what_arg);
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_SYSTEM_ERROR
diff --git a/lib/libcxx/include/tgmath.h b/lib/libcxx/include/tgmath.h
deleted file mode 100644
index aba87499c29..00000000000
--- a/lib/libcxx/include/tgmath.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- tgmath.h ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_TGMATH_H
-#define _LIBCPP_TGMATH_H
-
-/*
- tgmath.h synopsis
-
-#include <ctgmath>
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#ifdef __cplusplus
-
-#include <ctgmath>
-
-#else // __cplusplus
-
-#include_next <tgmath.h>
-
-#endif // __cplusplus
-
-#endif // _LIBCPP_TGMATH_H
diff --git a/lib/libcxx/include/thread b/lib/libcxx/include/thread
deleted file mode 100644
index 8c0115f8708..00000000000
--- a/lib/libcxx/include/thread
+++ /dev/null
@@ -1,484 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- thread -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_THREAD
-#define _LIBCPP_THREAD
-
-/*
-
- thread synopsis
-
-#define __STDCPP_THREADS__ __cplusplus
-
-namespace std
-{
-
-class thread
-{
-public:
- class id;
- typedef pthread_t native_handle_type;
-
- thread() noexcept;
- template <class F, class ...Args> explicit thread(F&& f, Args&&... args);
- ~thread();
-
- thread(const thread&) = delete;
- thread(thread&& t) noexcept;
-
- thread& operator=(const thread&) = delete;
- thread& operator=(thread&& t) noexcept;
-
- void swap(thread& t) noexcept;
-
- bool joinable() const noexcept;
- void join();
- void detach();
- id get_id() const noexcept;
- native_handle_type native_handle();
-
- static unsigned hardware_concurrency() noexcept;
-};
-
-void swap(thread& x, thread& y) noexcept;
-
-class thread::id
-{
-public:
- id() noexcept;
-};
-
-bool operator==(thread::id x, thread::id y) noexcept;
-bool operator!=(thread::id x, thread::id y) noexcept;
-bool operator< (thread::id x, thread::id y) noexcept;
-bool operator<=(thread::id x, thread::id y) noexcept;
-bool operator> (thread::id x, thread::id y) noexcept;
-bool operator>=(thread::id x, thread::id y) noexcept;
-
-template<class charT, class traits>
-basic_ostream<charT, traits>&
-operator<<(basic_ostream<charT, traits>& out, thread::id id);
-
-namespace this_thread
-{
-
-thread::id get_id() noexcept;
-
-void yield() noexcept;
-
-template <class Clock, class Duration>
-void sleep_until(const chrono::time_point<Clock, Duration>& abs_time);
-
-template <class Rep, class Period>
-void sleep_for(const chrono::duration<Rep, Period>& rel_time);
-
-} // this_thread
-
-} // std
-
-*/
-
-#include <__config>
-#include <iosfwd>
-#include <__functional_base>
-#include <type_traits>
-#include <cstddef>
-#include <functional>
-#include <memory>
-#include <system_error>
-#include <chrono>
-#include <__mutex_base>
-#ifndef _LIBCPP_CXX03_LANG
-#include <tuple>
-#endif
-#include <__threading_support>
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-#define __STDCPP_THREADS__ __cplusplus
-
-#ifdef _LIBCPP_HAS_NO_THREADS
-#error <thread> is not supported on this single threaded system
-#else // !_LIBCPP_HAS_NO_THREADS
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Tp> class __thread_specific_ptr;
-class _LIBCPP_TYPE_VIS __thread_struct;
-class _LIBCPP_HIDDEN __thread_struct_imp;
-class __assoc_sub_state;
-
-_LIBCPP_FUNC_VIS __thread_specific_ptr<__thread_struct>& __thread_local_data();
-
-class _LIBCPP_TYPE_VIS __thread_struct
-{
- __thread_struct_imp* __p_;
-
- __thread_struct(const __thread_struct&);
- __thread_struct& operator=(const __thread_struct&);
-public:
- __thread_struct();
- ~__thread_struct();
-
- void notify_all_at_thread_exit(condition_variable*, mutex*);
- void __make_ready_at_thread_exit(__assoc_sub_state*);
-};
-
-template <class _Tp>
-class __thread_specific_ptr
-{
- __libcpp_tls_key __key_;
-
- // Only __thread_local_data() may construct a __thread_specific_ptr
- // and only with _Tp == __thread_struct.
- static_assert((is_same<_Tp, __thread_struct>::value), "");
- __thread_specific_ptr();
- friend _LIBCPP_FUNC_VIS __thread_specific_ptr<__thread_struct>& __thread_local_data();
-
- __thread_specific_ptr(const __thread_specific_ptr&);
- __thread_specific_ptr& operator=(const __thread_specific_ptr&);
-
- _LIBCPP_HIDDEN static void _LIBCPP_TLS_DESTRUCTOR_CC __at_thread_exit(void*);
-
-public:
- typedef _Tp* pointer;
-
- ~__thread_specific_ptr();
-
- _LIBCPP_INLINE_VISIBILITY
- pointer get() const {return static_cast<_Tp*>(__libcpp_tls_get(__key_));}
- _LIBCPP_INLINE_VISIBILITY
- pointer operator*() const {return *get();}
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return get();}
- void set_pointer(pointer __p);
-};
-
-template <class _Tp>
-void _LIBCPP_TLS_DESTRUCTOR_CC
-__thread_specific_ptr<_Tp>::__at_thread_exit(void* __p)
-{
- delete static_cast<pointer>(__p);
-}
-
-template <class _Tp>
-__thread_specific_ptr<_Tp>::__thread_specific_ptr()
-{
- int __ec =
- __libcpp_tls_create(&__key_, &__thread_specific_ptr::__at_thread_exit);
- if (__ec)
- __throw_system_error(__ec, "__thread_specific_ptr construction failed");
-}
-
-template <class _Tp>
-__thread_specific_ptr<_Tp>::~__thread_specific_ptr()
-{
- // __thread_specific_ptr is only created with a static storage duration
- // so this destructor is only invoked during program termination. Invoking
- // pthread_key_delete(__key_) may prevent other threads from deleting their
- // thread local data. For this reason we leak the key.
-}
-
-template <class _Tp>
-void
-__thread_specific_ptr<_Tp>::set_pointer(pointer __p)
-{
- _LIBCPP_ASSERT(get() == nullptr,
- "Attempting to overwrite thread local data");
- __libcpp_tls_set(__key_, __p);
-}
-
-class _LIBCPP_TYPE_VIS thread;
-class _LIBCPP_TYPE_VIS __thread_id;
-
-namespace this_thread
-{
-
-_LIBCPP_INLINE_VISIBILITY __thread_id get_id() _NOEXCEPT;
-
-} // this_thread
-
-template<> struct hash<__thread_id>;
-
-class _LIBCPP_TEMPLATE_VIS __thread_id
-{
- // FIXME: pthread_t is a pointer on Darwin but a long on Linux.
- // NULL is the no-thread value on Darwin. Someone needs to check
- // on other platforms. We assume 0 works everywhere for now.
- __libcpp_thread_id __id_;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- __thread_id() _NOEXCEPT : __id_(0) {}
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(__thread_id __x, __thread_id __y) _NOEXCEPT
- {return __libcpp_thread_id_equal(__x.__id_, __y.__id_);}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(__thread_id __x, __thread_id __y) _NOEXCEPT
- {return !(__x == __y);}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator< (__thread_id __x, __thread_id __y) _NOEXCEPT
- {return __libcpp_thread_id_less(__x.__id_, __y.__id_);}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator<=(__thread_id __x, __thread_id __y) _NOEXCEPT
- {return !(__y < __x);}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator> (__thread_id __x, __thread_id __y) _NOEXCEPT
- {return __y < __x ;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator>=(__thread_id __x, __thread_id __y) _NOEXCEPT
- {return !(__x < __y);}
-
- template<class _CharT, class _Traits>
- friend
- _LIBCPP_INLINE_VISIBILITY
- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os, __thread_id __id)
- {return __os << __id.__id_;}
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- __thread_id(__libcpp_thread_id __id) : __id_(__id) {}
-
- friend __thread_id this_thread::get_id() _NOEXCEPT;
- friend class _LIBCPP_TYPE_VIS thread;
- friend struct _LIBCPP_TEMPLATE_VIS hash<__thread_id>;
-};
-
-template<>
-struct _LIBCPP_TEMPLATE_VIS hash<__thread_id>
- : public unary_function<__thread_id, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(__thread_id __v) const _NOEXCEPT
- {
- return hash<__libcpp_thread_id>()(__v.__id_);
- }
-};
-
-namespace this_thread
-{
-
-inline _LIBCPP_INLINE_VISIBILITY
-__thread_id
-get_id() _NOEXCEPT
-{
- return __libcpp_thread_get_current_id();
-}
-
-} // this_thread
-
-class _LIBCPP_TYPE_VIS thread
-{
- __libcpp_thread_t __t_;
-
- thread(const thread&);
- thread& operator=(const thread&);
-public:
- typedef __thread_id id;
- typedef __libcpp_thread_t native_handle_type;
-
- _LIBCPP_INLINE_VISIBILITY
- thread() _NOEXCEPT : __t_(_LIBCPP_NULL_THREAD) {}
-#ifndef _LIBCPP_CXX03_LANG
- template <class _Fp, class ..._Args,
- class = typename enable_if
- <
- !is_same<typename __uncvref<_Fp>::type, thread>::value
- >::type
- >
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- explicit thread(_Fp&& __f, _Args&&... __args);
-#else // _LIBCPP_CXX03_LANG
- template <class _Fp>
- _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
- explicit thread(_Fp __f);
-#endif
- ~thread();
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- thread(thread&& __t) _NOEXCEPT : __t_(__t.__t_) {__t.__t_ = _LIBCPP_NULL_THREAD;}
- _LIBCPP_INLINE_VISIBILITY
- thread& operator=(thread&& __t) _NOEXCEPT;
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(thread& __t) _NOEXCEPT {_VSTD::swap(__t_, __t.__t_);}
-
- _LIBCPP_INLINE_VISIBILITY
- bool joinable() const _NOEXCEPT {return !__libcpp_thread_isnull(&__t_);}
- void join();
- void detach();
- _LIBCPP_INLINE_VISIBILITY
- id get_id() const _NOEXCEPT {return __libcpp_thread_get_id(&__t_);}
- _LIBCPP_INLINE_VISIBILITY
- native_handle_type native_handle() _NOEXCEPT {return __t_;}
-
- static unsigned hardware_concurrency() _NOEXCEPT;
-};
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _TSp, class _Fp, class ..._Args, size_t ..._Indices>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-__thread_execute(tuple<_TSp, _Fp, _Args...>& __t, __tuple_indices<_Indices...>)
-{
- __invoke(_VSTD::move(_VSTD::get<1>(__t)), _VSTD::move(_VSTD::get<_Indices>(__t))...);
-}
-
-template <class _Fp>
-void* __thread_proxy(void* __vp)
-{
- // _Fp = std::tuple< unique_ptr<__thread_struct>, Functor, Args...>
- std::unique_ptr<_Fp> __p(static_cast<_Fp*>(__vp));
- __thread_local_data().set_pointer(_VSTD::get<0>(*__p).release());
- typedef typename __make_tuple_indices<tuple_size<_Fp>::value, 2>::type _Index;
- __thread_execute(*__p, _Index());
- return nullptr;
-}
-
-template <class _Fp, class ..._Args,
- class
- >
-thread::thread(_Fp&& __f, _Args&&... __args)
-{
- typedef unique_ptr<__thread_struct> _TSPtr;
- _TSPtr __tsp(new __thread_struct);
- typedef tuple<_TSPtr, typename decay<_Fp>::type, typename decay<_Args>::type...> _Gp;
- _VSTD::unique_ptr<_Gp> __p(
- new _Gp(std::move(__tsp),
- __decay_copy(_VSTD::forward<_Fp>(__f)),
- __decay_copy(_VSTD::forward<_Args>(__args))...));
- int __ec = __libcpp_thread_create(&__t_, &__thread_proxy<_Gp>, __p.get());
- if (__ec == 0)
- __p.release();
- else
- __throw_system_error(__ec, "thread constructor failed");
-}
-
-inline
-thread&
-thread::operator=(thread&& __t) _NOEXCEPT
-{
- if (!__libcpp_thread_isnull(&__t_))
- terminate();
- __t_ = __t.__t_;
- __t.__t_ = _LIBCPP_NULL_THREAD;
- return *this;
-}
-
-#else // _LIBCPP_CXX03_LANG
-
-template <class _Fp>
-struct __thread_invoke_pair {
- // This type is used to pass memory for thread local storage and a functor
- // to a newly created thread because std::pair doesn't work with
- // std::unique_ptr in C++03.
- __thread_invoke_pair(_Fp& __f) : __tsp_(new __thread_struct), __fn_(__f) {}
- unique_ptr<__thread_struct> __tsp_;
- _Fp __fn_;
-};
-
-template <class _Fp>
-void* __thread_proxy_cxx03(void* __vp)
-{
- std::unique_ptr<_Fp> __p(static_cast<_Fp*>(__vp));
- __thread_local_data().set_pointer(__p->__tsp_.release());
- (__p->__fn_)();
- return nullptr;
-}
-
-template <class _Fp>
-thread::thread(_Fp __f)
-{
-
- typedef __thread_invoke_pair<_Fp> _InvokePair;
- typedef std::unique_ptr<_InvokePair> _PairPtr;
- _PairPtr __pp(new _InvokePair(__f));
- int __ec = __libcpp_thread_create(&__t_, &__thread_proxy_cxx03<_InvokePair>, __pp.get());
- if (__ec == 0)
- __pp.release();
- else
- __throw_system_error(__ec, "thread constructor failed");
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-inline _LIBCPP_INLINE_VISIBILITY
-void swap(thread& __x, thread& __y) _NOEXCEPT {__x.swap(__y);}
-
-namespace this_thread
-{
-
-_LIBCPP_FUNC_VIS void sleep_for(const chrono::nanoseconds& __ns);
-
-template <class _Rep, class _Period>
-void
-sleep_for(const chrono::duration<_Rep, _Period>& __d)
-{
- using namespace chrono;
- if (__d > duration<_Rep, _Period>::zero())
- {
- _LIBCPP_CONSTEXPR duration<long double> _Max = nanoseconds::max();
- nanoseconds __ns;
- if (__d < _Max)
- {
- __ns = duration_cast<nanoseconds>(__d);
- if (__ns < __d)
- ++__ns;
- }
- else
- __ns = nanoseconds::max();
- sleep_for(__ns);
- }
-}
-
-template <class _Clock, class _Duration>
-void
-sleep_until(const chrono::time_point<_Clock, _Duration>& __t)
-{
- using namespace chrono;
- mutex __mut;
- condition_variable __cv;
- unique_lock<mutex> __lk(__mut);
- while (_Clock::now() < __t)
- __cv.wait_until(__lk, __t);
-}
-
-template <class _Duration>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-sleep_until(const chrono::time_point<chrono::steady_clock, _Duration>& __t)
-{
- using namespace chrono;
- sleep_for(__t - steady_clock::now());
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-void yield() _NOEXCEPT {__libcpp_thread_yield();}
-
-} // this_thread
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // !_LIBCPP_HAS_NO_THREADS
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_THREAD
diff --git a/lib/libcxx/include/tuple b/lib/libcxx/include/tuple
deleted file mode 100644
index 4cc69030b9a..00000000000
--- a/lib/libcxx/include/tuple
+++ /dev/null
@@ -1,1395 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- tuple ------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_TUPLE
-#define _LIBCPP_TUPLE
-
-/*
- tuple synopsis
-
-namespace std
-{
-
-template <class... T>
-class tuple {
-public:
- constexpr tuple();
- explicit tuple(const T&...); // constexpr in C++14
- template <class... U>
- explicit tuple(U&&...); // constexpr in C++14
- tuple(const tuple&) = default;
- tuple(tuple&&) = default;
- template <class... U>
- tuple(const tuple<U...>&); // constexpr in C++14
- template <class... U>
- tuple(tuple<U...>&&); // constexpr in C++14
- template <class U1, class U2>
- tuple(const pair<U1, U2>&); // iff sizeof...(T) == 2 // constexpr in C++14
- template <class U1, class U2>
- tuple(pair<U1, U2>&&); // iff sizeof...(T) == 2 // constexpr in C++14
-
- // allocator-extended constructors
- template <class Alloc>
- tuple(allocator_arg_t, const Alloc& a);
- template <class Alloc>
- tuple(allocator_arg_t, const Alloc& a, const T&...);
- template <class Alloc, class... U>
- tuple(allocator_arg_t, const Alloc& a, U&&...);
- template <class Alloc>
- tuple(allocator_arg_t, const Alloc& a, const tuple&);
- template <class Alloc>
- tuple(allocator_arg_t, const Alloc& a, tuple&&);
- template <class Alloc, class... U>
- tuple(allocator_arg_t, const Alloc& a, const tuple<U...>&);
- template <class Alloc, class... U>
- tuple(allocator_arg_t, const Alloc& a, tuple<U...>&&);
- template <class Alloc, class U1, class U2>
- tuple(allocator_arg_t, const Alloc& a, const pair<U1, U2>&);
- template <class Alloc, class U1, class U2>
- tuple(allocator_arg_t, const Alloc& a, pair<U1, U2>&&);
-
- tuple& operator=(const tuple&);
- tuple&
- operator=(tuple&&) noexcept(AND(is_nothrow_move_assignable<T>::value ...));
- template <class... U>
- tuple& operator=(const tuple<U...>&);
- template <class... U>
- tuple& operator=(tuple<U...>&&);
- template <class U1, class U2>
- tuple& operator=(const pair<U1, U2>&); // iff sizeof...(T) == 2
- template <class U1, class U2>
- tuple& operator=(pair<U1, U2>&&); // iff sizeof...(T) == 2
-
- void swap(tuple&) noexcept(AND(swap(declval<T&>(), declval<T&>())...));
-};
-
-inline constexpr unspecified ignore;
-
-template <class... T> tuple<V...> make_tuple(T&&...); // constexpr in C++14
-template <class... T> tuple<ATypes...> forward_as_tuple(T&&...) noexcept; // constexpr in C++14
-template <class... T> tuple<T&...> tie(T&...) noexcept; // constexpr in C++14
-template <class... Tuples> tuple<CTypes...> tuple_cat(Tuples&&... tpls); // constexpr in C++14
-
-// [tuple.apply], calling a function with a tuple of arguments:
-template <class F, class Tuple>
- constexpr decltype(auto) apply(F&& f, Tuple&& t); // C++17
-template <class T, class Tuple>
- constexpr T make_from_tuple(Tuple&& t); // C++17
-
-// 20.4.1.4, tuple helper classes:
-template <class T> struct tuple_size; // undefined
-template <class... T> struct tuple_size<tuple<T...>>;
-template <class T>
- inline constexpr size_t tuple_size_v = tuple_size<T>::value; // C++17
-template <size_t I, class T> class tuple_element; // undefined
-template <size_t I, class... T> class tuple_element<I, tuple<T...>>;
-template <size_t I, class T>
- using tuple_element_t = typename tuple_element <I, T>::type; // C++14
-
-// 20.4.1.5, element access:
-template <size_t I, class... T>
- typename tuple_element<I, tuple<T...>>::type&
- get(tuple<T...>&) noexcept; // constexpr in C++14
-template <size_t I, class... T>
- const typename tuple_element<I, tuple<T...>>::type&
- get(const tuple<T...>&) noexcept; // constexpr in C++14
-template <size_t I, class... T>
- typename tuple_element<I, tuple<T...>>::type&&
- get(tuple<T...>&&) noexcept; // constexpr in C++14
-template <size_t I, class... T>
- const typename tuple_element<I, tuple<T...>>::type&&
- get(const tuple<T...>&&) noexcept; // constexpr in C++14
-
-template <class T1, class... T>
- constexpr T1& get(tuple<T...>&) noexcept; // C++14
-template <class T1, class... T>
- constexpr const T1& get(const tuple<T...>&) noexcept; // C++14
-template <class T1, class... T>
- constexpr T1&& get(tuple<T...>&&) noexcept; // C++14
-template <class T1, class... T>
- constexpr const T1&& get(const tuple<T...>&&) noexcept; // C++14
-
-// 20.4.1.6, relational operators:
-template<class... T, class... U> bool operator==(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
-template<class... T, class... U> bool operator<(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
-template<class... T, class... U> bool operator!=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
-template<class... T, class... U> bool operator>(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
-template<class... T, class... U> bool operator<=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
-template<class... T, class... U> bool operator>=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
-
-template <class... Types, class Alloc>
- struct uses_allocator<tuple<Types...>, Alloc>;
-
-template <class... Types>
- void
- swap(tuple<Types...>& x, tuple<Types...>& y) noexcept(noexcept(x.swap(y)));
-
-} // std
-
-*/
-
-#include <__config>
-#include <__tuple>
-#include <cstddef>
-#include <type_traits>
-#include <__functional_base>
-#include <utility>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-#ifndef _LIBCPP_CXX03_LANG
-
-
-// __tuple_leaf
-
-template <size_t _Ip, class _Hp,
- bool=is_empty<_Hp>::value && !__libcpp_is_final<_Hp>::value
- >
-class __tuple_leaf;
-
-template <size_t _Ip, class _Hp, bool _Ep>
-inline _LIBCPP_INLINE_VISIBILITY
-void swap(__tuple_leaf<_Ip, _Hp, _Ep>& __x, __tuple_leaf<_Ip, _Hp, _Ep>& __y)
- _NOEXCEPT_(__is_nothrow_swappable<_Hp>::value)
-{
- swap(__x.get(), __y.get());
-}
-
-template <size_t _Ip, class _Hp, bool>
-class __tuple_leaf
-{
- _Hp __value_;
-
- template <class _Tp>
- static constexpr bool __can_bind_reference() {
-#if __has_keyword(__reference_binds_to_temporary)
- return !__reference_binds_to_temporary(_Hp, _Tp);
-#else
- return true;
-#endif
- }
-
- __tuple_leaf& operator=(const __tuple_leaf&);
-public:
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR __tuple_leaf()
- _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) : __value_()
- {static_assert(!is_reference<_Hp>::value,
- "Attempted to default construct a reference element in a tuple");}
-
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- __tuple_leaf(integral_constant<int, 0>, const _Alloc&)
- : __value_()
- {static_assert(!is_reference<_Hp>::value,
- "Attempted to default construct a reference element in a tuple");}
-
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a)
- : __value_(allocator_arg_t(), __a)
- {static_assert(!is_reference<_Hp>::value,
- "Attempted to default construct a reference element in a tuple");}
-
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a)
- : __value_(__a)
- {static_assert(!is_reference<_Hp>::value,
- "Attempted to default construct a reference element in a tuple");}
-
- template <class _Tp,
- class = typename enable_if<
- __lazy_and<
- __lazy_not<is_same<typename __uncvref<_Tp>::type, __tuple_leaf>>
- , is_constructible<_Hp, _Tp>
- >::value
- >::type
- >
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value))
- : __value_(_VSTD::forward<_Tp>(__t))
- {static_assert(__can_bind_reference<_Tp&&>(),
- "Attempted construction of reference element binds to a temporary whose lifetime has ended");}
-
- template <class _Tp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t)
- : __value_(_VSTD::forward<_Tp>(__t))
- {static_assert(__can_bind_reference<_Tp&&>(),
- "Attempted construction of reference element binds to a temporary whose lifetime has ended");}
-
- template <class _Tp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t)
- : __value_(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t))
- {static_assert(!is_reference<_Hp>::value,
- "Attempted to uses-allocator construct a reference element in a tuple");}
-
- template <class _Tp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t)
- : __value_(_VSTD::forward<_Tp>(__t), __a)
- {static_assert(!is_reference<_Hp>::value,
- "Attempted to uses-allocator construct a reference element in a tuple");}
-
- __tuple_leaf(const __tuple_leaf& __t) = default;
- __tuple_leaf(__tuple_leaf&& __t) = default;
-
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY
- __tuple_leaf&
- operator=(_Tp&& __t) _NOEXCEPT_((is_nothrow_assignable<_Hp&, _Tp>::value))
- {
- __value_ = _VSTD::forward<_Tp>(__t);
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- int swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value)
- {
- _VSTD::swap(*this, __t);
- return 0;
- }
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 _Hp& get() _NOEXCEPT {return __value_;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return __value_;}
-};
-
-template <size_t _Ip, class _Hp>
-class __tuple_leaf<_Ip, _Hp, true>
- : private _Hp
-{
-
- __tuple_leaf& operator=(const __tuple_leaf&);
-public:
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR __tuple_leaf()
- _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) {}
-
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- __tuple_leaf(integral_constant<int, 0>, const _Alloc&) {}
-
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a)
- : _Hp(allocator_arg_t(), __a) {}
-
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a)
- : _Hp(__a) {}
-
- template <class _Tp,
- class = typename enable_if<
- __lazy_and<
- __lazy_not<is_same<typename __uncvref<_Tp>::type, __tuple_leaf>>
- , is_constructible<_Hp, _Tp>
- >::value
- >::type
- >
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value))
- : _Hp(_VSTD::forward<_Tp>(__t)) {}
-
- template <class _Tp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t)
- : _Hp(_VSTD::forward<_Tp>(__t)) {}
-
- template <class _Tp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t)
- : _Hp(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t)) {}
-
- template <class _Tp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t)
- : _Hp(_VSTD::forward<_Tp>(__t), __a) {}
-
- __tuple_leaf(__tuple_leaf const &) = default;
- __tuple_leaf(__tuple_leaf &&) = default;
-
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY
- __tuple_leaf&
- operator=(_Tp&& __t) _NOEXCEPT_((is_nothrow_assignable<_Hp&, _Tp>::value))
- {
- _Hp::operator=(_VSTD::forward<_Tp>(__t));
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- int
- swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value)
- {
- _VSTD::swap(*this, __t);
- return 0;
- }
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 _Hp& get() _NOEXCEPT {return static_cast<_Hp&>(*this);}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return static_cast<const _Hp&>(*this);}
-};
-
-template <class ..._Tp>
-_LIBCPP_INLINE_VISIBILITY
-void __swallow(_Tp&&...) _NOEXCEPT {}
-
-template <class ..._Tp>
-struct __lazy_all : __all<_Tp::value...> {};
-
-template <class _Tp>
-struct __all_default_constructible;
-
-template <class ..._Tp>
-struct __all_default_constructible<__tuple_types<_Tp...>>
- : __all<is_default_constructible<_Tp>::value...>
-{ };
-
-// __tuple_impl
-
-template<class _Indx, class ..._Tp> struct __tuple_impl;
-
-template<size_t ..._Indx, class ..._Tp>
-struct _LIBCPP_DECLSPEC_EMPTY_BASES __tuple_impl<__tuple_indices<_Indx...>, _Tp...>
- : public __tuple_leaf<_Indx, _Tp>...
-{
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR __tuple_impl()
- _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {}
-
- template <size_t ..._Uf, class ..._Tf,
- size_t ..._Ul, class ..._Tl, class ..._Up>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- explicit
- __tuple_impl(__tuple_indices<_Uf...>, __tuple_types<_Tf...>,
- __tuple_indices<_Ul...>, __tuple_types<_Tl...>,
- _Up&&... __u)
- _NOEXCEPT_((__all<is_nothrow_constructible<_Tf, _Up>::value...>::value &&
- __all<is_nothrow_default_constructible<_Tl>::value...>::value)) :
- __tuple_leaf<_Uf, _Tf>(_VSTD::forward<_Up>(__u))...,
- __tuple_leaf<_Ul, _Tl>()...
- {}
-
- template <class _Alloc, size_t ..._Uf, class ..._Tf,
- size_t ..._Ul, class ..._Tl, class ..._Up>
- _LIBCPP_INLINE_VISIBILITY
- explicit
- __tuple_impl(allocator_arg_t, const _Alloc& __a,
- __tuple_indices<_Uf...>, __tuple_types<_Tf...>,
- __tuple_indices<_Ul...>, __tuple_types<_Tl...>,
- _Up&&... __u) :
- __tuple_leaf<_Uf, _Tf>(__uses_alloc_ctor<_Tf, _Alloc, _Up>(), __a,
- _VSTD::forward<_Up>(__u))...,
- __tuple_leaf<_Ul, _Tl>(__uses_alloc_ctor<_Tl, _Alloc>(), __a)...
- {}
-
- template <class _Tuple,
- class = typename enable_if
- <
- __tuple_constructible<_Tuple, tuple<_Tp...> >::value
- >::type
- >
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- __tuple_impl(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_constructible<_Tp, typename tuple_element<_Indx,
- typename __make_tuple_types<_Tuple>::type>::type>::value...>::value))
- : __tuple_leaf<_Indx, _Tp>(_VSTD::forward<typename tuple_element<_Indx,
- typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))...
- {}
-
- template <class _Alloc, class _Tuple,
- class = typename enable_if
- <
- __tuple_constructible<_Tuple, tuple<_Tp...> >::value
- >::type
- >
- _LIBCPP_INLINE_VISIBILITY
- __tuple_impl(allocator_arg_t, const _Alloc& __a, _Tuple&& __t)
- : __tuple_leaf<_Indx, _Tp>(__uses_alloc_ctor<_Tp, _Alloc, typename tuple_element<_Indx,
- typename __make_tuple_types<_Tuple>::type>::type>(), __a,
- _VSTD::forward<typename tuple_element<_Indx,
- typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))...
- {}
-
- template <class _Tuple>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __tuple_assignable<_Tuple, tuple<_Tp...> >::value,
- __tuple_impl&
- >::type
- operator=(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_assignable<_Tp&, typename tuple_element<_Indx,
- typename __make_tuple_types<_Tuple>::type>::type>::value...>::value))
- {
- __swallow(__tuple_leaf<_Indx, _Tp>::operator=(_VSTD::forward<typename tuple_element<_Indx,
- typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))...);
- return *this;
- }
-
- __tuple_impl(const __tuple_impl&) = default;
- __tuple_impl(__tuple_impl&&) = default;
-
- _LIBCPP_INLINE_VISIBILITY
- __tuple_impl&
- operator=(const __tuple_impl& __t) _NOEXCEPT_((__all<is_nothrow_copy_assignable<_Tp>::value...>::value))
- {
- __swallow(__tuple_leaf<_Indx, _Tp>::operator=(static_cast<const __tuple_leaf<_Indx, _Tp>&>(__t).get())...);
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __tuple_impl&
- operator=(__tuple_impl&& __t) _NOEXCEPT_((__all<is_nothrow_move_assignable<_Tp>::value...>::value))
- {
- __swallow(__tuple_leaf<_Indx, _Tp>::operator=(_VSTD::forward<_Tp>(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t).get()))...);
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(__tuple_impl& __t)
- _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value)
- {
- __swallow(__tuple_leaf<_Indx, _Tp>::swap(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t))...);
- }
-};
-
-
-
-template <class ..._Tp>
-class _LIBCPP_TEMPLATE_VIS tuple
-{
- typedef __tuple_impl<typename __make_tuple_indices<sizeof...(_Tp)>::type, _Tp...> _BaseT;
-
- _BaseT __base_;
-
-#if defined(_LIBCPP_ENABLE_TUPLE_IMPLICIT_REDUCED_ARITY_EXTENSION)
- static constexpr bool _EnableImplicitReducedArityExtension = true;
-#else
- static constexpr bool _EnableImplicitReducedArityExtension = false;
-#endif
-
- template <class ..._Args>
- struct _PackExpandsToThisTuple : false_type {};
-
- template <class _Arg>
- struct _PackExpandsToThisTuple<_Arg>
- : is_same<typename __uncvref<_Arg>::type, tuple> {};
-
- template <bool _MaybeEnable, class _Dummy = void>
- struct _CheckArgsConstructor : __check_tuple_constructor_fail {};
-
- template <class _Dummy>
- struct _CheckArgsConstructor<true, _Dummy>
- {
- template <class ..._Args>
- static constexpr bool __enable_default() {
- return __all<is_default_constructible<_Args>::value...>::value;
- }
-
- template <class ..._Args>
- static constexpr bool __enable_explicit() {
- return
- __tuple_constructible<
- tuple<_Args...>,
- typename __make_tuple_types<tuple,
- sizeof...(_Args) < sizeof...(_Tp) ?
- sizeof...(_Args) :
- sizeof...(_Tp)>::type
- >::value &&
- !__tuple_convertible<
- tuple<_Args...>,
- typename __make_tuple_types<tuple,
- sizeof...(_Args) < sizeof...(_Tp) ?
- sizeof...(_Args) :
- sizeof...(_Tp)>::type
- >::value &&
- __all_default_constructible<
- typename __make_tuple_types<tuple, sizeof...(_Tp),
- sizeof...(_Args) < sizeof...(_Tp) ?
- sizeof...(_Args) :
- sizeof...(_Tp)>::type
- >::value;
- }
-
- template <class ..._Args>
- static constexpr bool __enable_implicit() {
- return
- __tuple_convertible<
- tuple<_Args...>,
- typename __make_tuple_types<tuple,
- sizeof...(_Args) < sizeof...(_Tp) ?
- sizeof...(_Args) :
- sizeof...(_Tp)>::type
- >::value &&
- __all_default_constructible<
- typename __make_tuple_types<tuple, sizeof...(_Tp),
- sizeof...(_Args) < sizeof...(_Tp) ?
- sizeof...(_Args) :
- sizeof...(_Tp)>::type
- >::value;
- }
- };
-
- template <bool _MaybeEnable,
- bool = sizeof...(_Tp) == 1,
- class _Dummy = void>
- struct _CheckTupleLikeConstructor : __check_tuple_constructor_fail {};
-
- template <class _Dummy>
- struct _CheckTupleLikeConstructor<true, false, _Dummy>
- {
- template <class _Tuple>
- static constexpr bool __enable_implicit() {
- return __tuple_convertible<_Tuple, tuple>::value;
- }
-
- template <class _Tuple>
- static constexpr bool __enable_explicit() {
- return __tuple_constructible<_Tuple, tuple>::value
- && !__tuple_convertible<_Tuple, tuple>::value;
- }
- };
-
- template <class _Dummy>
- struct _CheckTupleLikeConstructor<true, true, _Dummy>
- {
- // This trait is used to disable the tuple-like constructor when
- // the UTypes... constructor should be selected instead.
- // See LWG issue #2549.
- template <class _Tuple>
- using _PreferTupleLikeConstructor = __lazy_or<
- // Don't attempt the two checks below if the tuple we are given
- // has the same type as this tuple.
- is_same<typename __uncvref<_Tuple>::type, tuple>,
- __lazy_and<
- __lazy_not<is_constructible<_Tp..., _Tuple>>,
- __lazy_not<is_convertible<_Tuple, _Tp...>>
- >
- >;
-
- template <class _Tuple>
- static constexpr bool __enable_implicit() {
- return __lazy_and<
- __tuple_convertible<_Tuple, tuple>,
- _PreferTupleLikeConstructor<_Tuple>
- >::value;
- }
-
- template <class _Tuple>
- static constexpr bool __enable_explicit() {
- return __lazy_and<
- __tuple_constructible<_Tuple, tuple>,
- _PreferTupleLikeConstructor<_Tuple>,
- __lazy_not<__tuple_convertible<_Tuple, tuple>>
- >::value;
- }
- };
-
- template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
- typename tuple_element<_Jp, tuple<_Up...> >::type& get(tuple<_Up...>&) _NOEXCEPT;
- template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
- const typename tuple_element<_Jp, tuple<_Up...> >::type& get(const tuple<_Up...>&) _NOEXCEPT;
- template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
- typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&) _NOEXCEPT;
- template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
- const typename tuple_element<_Jp, tuple<_Up...> >::type&& get(const tuple<_Up...>&&) _NOEXCEPT;
-public:
-
- template <bool _Dummy = true, class = typename enable_if<
- _CheckArgsConstructor<_Dummy>::template __enable_default<_Tp...>()
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR tuple()
- _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {}
-
- tuple(tuple const&) = default;
- tuple(tuple&&) = default;
-
- template <class _AllocArgT, class _Alloc, bool _Dummy = true, class = typename enable_if<
- __lazy_and<
- is_same<allocator_arg_t, _AllocArgT>,
- __lazy_all<__dependent_type<is_default_constructible<_Tp>, _Dummy>...>
- >::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- tuple(_AllocArgT, _Alloc const& __a)
- : __base_(allocator_arg_t(), __a,
- __tuple_indices<>(), __tuple_types<>(),
- typename __make_tuple_indices<sizeof...(_Tp), 0>::type(),
- __tuple_types<_Tp...>()) {}
-
- template <bool _Dummy = true,
- typename enable_if
- <
- _CheckArgsConstructor<
- _Dummy
- >::template __enable_implicit<_Tp const&...>(),
- bool
- >::type = false
- >
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- tuple(const _Tp& ... __t) _NOEXCEPT_((__all<is_nothrow_copy_constructible<_Tp>::value...>::value))
- : __base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(),
- typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
- typename __make_tuple_indices<0>::type(),
- typename __make_tuple_types<tuple, 0>::type(),
- __t...
- ) {}
-
- template <bool _Dummy = true,
- typename enable_if
- <
- _CheckArgsConstructor<
- _Dummy
- >::template __enable_explicit<_Tp const&...>(),
- bool
- >::type = false
- >
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- explicit tuple(const _Tp& ... __t) _NOEXCEPT_((__all<is_nothrow_copy_constructible<_Tp>::value...>::value))
- : __base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(),
- typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
- typename __make_tuple_indices<0>::type(),
- typename __make_tuple_types<tuple, 0>::type(),
- __t...
- ) {}
-
- template <class _Alloc, bool _Dummy = true,
- typename enable_if
- <
- _CheckArgsConstructor<
- _Dummy
- >::template __enable_implicit<_Tp const&...>(),
- bool
- >::type = false
- >
- _LIBCPP_INLINE_VISIBILITY
- tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t)
- : __base_(allocator_arg_t(), __a,
- typename __make_tuple_indices<sizeof...(_Tp)>::type(),
- typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
- typename __make_tuple_indices<0>::type(),
- typename __make_tuple_types<tuple, 0>::type(),
- __t...
- ) {}
-
- template <class _Alloc, bool _Dummy = true,
- typename enable_if
- <
- _CheckArgsConstructor<
- _Dummy
- >::template __enable_explicit<_Tp const&...>(),
- bool
- >::type = false
- >
- _LIBCPP_INLINE_VISIBILITY
- explicit
- tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t)
- : __base_(allocator_arg_t(), __a,
- typename __make_tuple_indices<sizeof...(_Tp)>::type(),
- typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
- typename __make_tuple_indices<0>::type(),
- typename __make_tuple_types<tuple, 0>::type(),
- __t...
- ) {}
-
- template <class ..._Up,
- bool _PackIsTuple = _PackExpandsToThisTuple<_Up...>::value,
- typename enable_if
- <
- _CheckArgsConstructor<
- sizeof...(_Up) == sizeof...(_Tp)
- && !_PackIsTuple
- >::template __enable_implicit<_Up...>() ||
- _CheckArgsConstructor<
- _EnableImplicitReducedArityExtension
- && sizeof...(_Up) < sizeof...(_Tp)
- && !_PackIsTuple
- >::template __enable_implicit<_Up...>(),
- bool
- >::type = false
- >
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- tuple(_Up&&... __u)
- _NOEXCEPT_((
- is_nothrow_constructible<_BaseT,
- typename __make_tuple_indices<sizeof...(_Up)>::type,
- typename __make_tuple_types<tuple, sizeof...(_Up)>::type,
- typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type,
- typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type,
- _Up...
- >::value
- ))
- : __base_(typename __make_tuple_indices<sizeof...(_Up)>::type(),
- typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
- typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
- typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
- _VSTD::forward<_Up>(__u)...) {}
-
- template <class ..._Up,
- typename enable_if
- <
- _CheckArgsConstructor<
- sizeof...(_Up) <= sizeof...(_Tp)
- && !_PackExpandsToThisTuple<_Up...>::value
- >::template __enable_explicit<_Up...>() ||
- _CheckArgsConstructor<
- !_EnableImplicitReducedArityExtension
- && sizeof...(_Up) < sizeof...(_Tp)
- && !_PackExpandsToThisTuple<_Up...>::value
- >::template __enable_implicit<_Up...>(),
- bool
- >::type = false
- >
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- explicit
- tuple(_Up&&... __u)
- _NOEXCEPT_((
- is_nothrow_constructible<_BaseT,
- typename __make_tuple_indices<sizeof...(_Up)>::type,
- typename __make_tuple_types<tuple, sizeof...(_Up)>::type,
- typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type,
- typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type,
- _Up...
- >::value
- ))
- : __base_(typename __make_tuple_indices<sizeof...(_Up)>::type(),
- typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
- typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
- typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
- _VSTD::forward<_Up>(__u)...) {}
-
- template <class _Alloc, class ..._Up,
- typename enable_if
- <
- _CheckArgsConstructor<
- sizeof...(_Up) == sizeof...(_Tp) &&
- !_PackExpandsToThisTuple<_Up...>::value
- >::template __enable_implicit<_Up...>(),
- bool
- >::type = false
- >
- _LIBCPP_INLINE_VISIBILITY
- tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u)
- : __base_(allocator_arg_t(), __a,
- typename __make_tuple_indices<sizeof...(_Up)>::type(),
- typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
- typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
- typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
- _VSTD::forward<_Up>(__u)...) {}
-
- template <class _Alloc, class ..._Up,
- typename enable_if
- <
- _CheckArgsConstructor<
- sizeof...(_Up) == sizeof...(_Tp) &&
- !_PackExpandsToThisTuple<_Up...>::value
- >::template __enable_explicit<_Up...>(),
- bool
- >::type = false
- >
- _LIBCPP_INLINE_VISIBILITY
- explicit
- tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u)
- : __base_(allocator_arg_t(), __a,
- typename __make_tuple_indices<sizeof...(_Up)>::type(),
- typename __make_tuple_types<tuple, sizeof...(_Up)>::type(),
- typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(),
- typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(),
- _VSTD::forward<_Up>(__u)...) {}
-
- template <class _Tuple,
- typename enable_if
- <
- _CheckTupleLikeConstructor<
- __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value
- && !_PackExpandsToThisTuple<_Tuple>::value
- >::template __enable_implicit<_Tuple>(),
- bool
- >::type = false
- >
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- tuple(_Tuple&& __t) _NOEXCEPT_((is_nothrow_constructible<_BaseT, _Tuple>::value))
- : __base_(_VSTD::forward<_Tuple>(__t)) {}
-
- template <class _Tuple,
- typename enable_if
- <
- _CheckTupleLikeConstructor<
- __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value
- && !_PackExpandsToThisTuple<_Tuple>::value
- >::template __enable_explicit<_Tuple>(),
- bool
- >::type = false
- >
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- explicit
- tuple(_Tuple&& __t) _NOEXCEPT_((is_nothrow_constructible<_BaseT, _Tuple>::value))
- : __base_(_VSTD::forward<_Tuple>(__t)) {}
-
- template <class _Alloc, class _Tuple,
- typename enable_if
- <
- _CheckTupleLikeConstructor<
- __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value
- >::template __enable_implicit<_Tuple>(),
- bool
- >::type = false
- >
- _LIBCPP_INLINE_VISIBILITY
- tuple(allocator_arg_t, const _Alloc& __a, _Tuple&& __t)
- : __base_(allocator_arg_t(), __a, _VSTD::forward<_Tuple>(__t)) {}
-
- template <class _Alloc, class _Tuple,
- typename enable_if
- <
- _CheckTupleLikeConstructor<
- __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value
- >::template __enable_explicit<_Tuple>(),
- bool
- >::type = false
- >
- _LIBCPP_INLINE_VISIBILITY
- explicit
- tuple(allocator_arg_t, const _Alloc& __a, _Tuple&& __t)
- : __base_(allocator_arg_t(), __a, _VSTD::forward<_Tuple>(__t)) {}
-
- using _CanCopyAssign = __all<is_copy_assignable<_Tp>::value...>;
- using _CanMoveAssign = __all<is_move_assignable<_Tp>::value...>;
-
- _LIBCPP_INLINE_VISIBILITY
- tuple& operator=(typename conditional<_CanCopyAssign::value, tuple, __nat>::type const& __t)
- _NOEXCEPT_((__all<is_nothrow_copy_assignable<_Tp>::value...>::value))
- {
- __base_.operator=(__t.__base_);
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- tuple& operator=(typename conditional<_CanMoveAssign::value, tuple, __nat>::type&& __t)
- _NOEXCEPT_((__all<is_nothrow_move_assignable<_Tp>::value...>::value))
- {
- __base_.operator=(static_cast<_BaseT&&>(__t.__base_));
- return *this;
- }
-
- template <class _Tuple,
- class = typename enable_if
- <
- __tuple_assignable<_Tuple, tuple>::value
- >::type
- >
- _LIBCPP_INLINE_VISIBILITY
- tuple&
- operator=(_Tuple&& __t) _NOEXCEPT_((is_nothrow_assignable<_BaseT&, _Tuple>::value))
- {
- __base_.operator=(_VSTD::forward<_Tuple>(__t));
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(tuple& __t) _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value)
- {__base_.swap(__t.__base_);}
-};
-
-template <>
-class _LIBCPP_TEMPLATE_VIS tuple<>
-{
-public:
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR tuple() _NOEXCEPT {}
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- tuple(allocator_arg_t, const _Alloc&) _NOEXCEPT {}
- template <class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- tuple(allocator_arg_t, const _Alloc&, const tuple&) _NOEXCEPT {}
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- tuple(array<_Up, 0>) _NOEXCEPT {}
- template <class _Alloc, class _Up>
- _LIBCPP_INLINE_VISIBILITY
- tuple(allocator_arg_t, const _Alloc&, array<_Up, 0>) _NOEXCEPT {}
- _LIBCPP_INLINE_VISIBILITY
- void swap(tuple&) _NOEXCEPT {}
-};
-
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-// NOTE: These are not yet standardized, but are required to simulate the
-// implicit deduction guide that should be generated had libc++ declared the
-// tuple-like constructors "correctly"
-template <class _Alloc, class ..._Args>
-tuple(allocator_arg_t, const _Alloc&, tuple<_Args...> const&) -> tuple<_Args...>;
-template <class _Alloc, class ..._Args>
-tuple(allocator_arg_t, const _Alloc&, tuple<_Args...>&&) -> tuple<_Args...>;
-#endif
-
-template <class ..._Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __all<__is_swappable<_Tp>::value...>::value,
- void
->::type
-swap(tuple<_Tp...>& __t, tuple<_Tp...>& __u)
- _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value)
- {__t.swap(__u);}
-
-// get
-
-template <size_t _Ip, class ..._Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-typename tuple_element<_Ip, tuple<_Tp...> >::type&
-get(tuple<_Tp...>& __t) _NOEXCEPT
-{
- typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type;
- return static_cast<__tuple_leaf<_Ip, type>&>(__t.__base_).get();
-}
-
-template <size_t _Ip, class ..._Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-const typename tuple_element<_Ip, tuple<_Tp...> >::type&
-get(const tuple<_Tp...>& __t) _NOEXCEPT
-{
- typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type;
- return static_cast<const __tuple_leaf<_Ip, type>&>(__t.__base_).get();
-}
-
-template <size_t _Ip, class ..._Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-typename tuple_element<_Ip, tuple<_Tp...> >::type&&
-get(tuple<_Tp...>&& __t) _NOEXCEPT
-{
- typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type;
- return static_cast<type&&>(
- static_cast<__tuple_leaf<_Ip, type>&&>(__t.__base_).get());
-}
-
-template <size_t _Ip, class ..._Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-const typename tuple_element<_Ip, tuple<_Tp...> >::type&&
-get(const tuple<_Tp...>&& __t) _NOEXCEPT
-{
- typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type;
- return static_cast<const type&&>(
- static_cast<const __tuple_leaf<_Ip, type>&&>(__t.__base_).get());
-}
-
-#if _LIBCPP_STD_VER > 11
-
-namespace __find_detail {
-
-static constexpr size_t __not_found = -1;
-static constexpr size_t __ambiguous = __not_found - 1;
-
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr size_t __find_idx_return(size_t __curr_i, size_t __res, bool __matches) {
- return !__matches ? __res :
- (__res == __not_found ? __curr_i : __ambiguous);
-}
-
-template <size_t _Nx>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr size_t __find_idx(size_t __i, const bool (&__matches)[_Nx]) {
- return __i == _Nx ? __not_found :
- __find_idx_return(__i, __find_idx(__i + 1, __matches), __matches[__i]);
-}
-
-template <class _T1, class ..._Args>
-struct __find_exactly_one_checked {
- static constexpr bool __matches[sizeof...(_Args)] = {is_same<_T1, _Args>::value...};
- static constexpr size_t value = __find_detail::__find_idx(0, __matches);
- static_assert(value != __not_found, "type not found in type list" );
- static_assert(value != __ambiguous, "type occurs more than once in type list");
-};
-
-template <class _T1>
-struct __find_exactly_one_checked<_T1> {
- static_assert(!is_same<_T1, _T1>::value, "type not in empty type list");
-};
-
-} // namespace __find_detail;
-
-template <typename _T1, typename... _Args>
-struct __find_exactly_one_t
- : public __find_detail::__find_exactly_one_checked<_T1, _Args...> {
-};
-
-template <class _T1, class... _Args>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr _T1& get(tuple<_Args...>& __tup) noexcept
-{
- return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup);
-}
-
-template <class _T1, class... _Args>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr _T1 const& get(tuple<_Args...> const& __tup) noexcept
-{
- return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup);
-}
-
-template <class _T1, class... _Args>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr _T1&& get(tuple<_Args...>&& __tup) noexcept
-{
- return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup));
-}
-
-template <class _T1, class... _Args>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr _T1 const&& get(tuple<_Args...> const&& __tup) noexcept
-{
- return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup));
-}
-
-#endif
-
-// tie
-
-template <class ..._Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-tuple<_Tp&...>
-tie(_Tp&... __t) _NOEXCEPT
-{
- return tuple<_Tp&...>(__t...);
-}
-
-template <class _Up>
-struct __ignore_t
-{
- template <class _Tp>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- const __ignore_t& operator=(_Tp&&) const {return *this;}
-};
-
-namespace {
- _LIBCPP_INLINE_VAR constexpr __ignore_t<unsigned char> ignore = __ignore_t<unsigned char>();
-}
-
-template <class... _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-tuple<typename __unwrap_ref_decay<_Tp>::type...>
-make_tuple(_Tp&&... __t)
-{
- return tuple<typename __unwrap_ref_decay<_Tp>::type...>(_VSTD::forward<_Tp>(__t)...);
-}
-
-template <class... _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-tuple<_Tp&&...>
-forward_as_tuple(_Tp&&... __t) _NOEXCEPT
-{
- return tuple<_Tp&&...>(_VSTD::forward<_Tp>(__t)...);
-}
-
-template <size_t _Ip>
-struct __tuple_equal
-{
- template <class _Tp, class _Up>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- bool operator()(const _Tp& __x, const _Up& __y)
- {
- return __tuple_equal<_Ip - 1>()(__x, __y) && _VSTD::get<_Ip-1>(__x) == _VSTD::get<_Ip-1>(__y);
- }
-};
-
-template <>
-struct __tuple_equal<0>
-{
- template <class _Tp, class _Up>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- bool operator()(const _Tp&, const _Up&)
- {
- return true;
- }
-};
-
-template <class ..._Tp, class ..._Up>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator==(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
-{
- return __tuple_equal<sizeof...(_Tp)>()(__x, __y);
-}
-
-template <class ..._Tp, class ..._Up>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator!=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
-{
- return !(__x == __y);
-}
-
-template <size_t _Ip>
-struct __tuple_less
-{
- template <class _Tp, class _Up>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- bool operator()(const _Tp& __x, const _Up& __y)
- {
- const size_t __idx = tuple_size<_Tp>::value - _Ip;
- if (_VSTD::get<__idx>(__x) < _VSTD::get<__idx>(__y))
- return true;
- if (_VSTD::get<__idx>(__y) < _VSTD::get<__idx>(__x))
- return false;
- return __tuple_less<_Ip-1>()(__x, __y);
- }
-};
-
-template <>
-struct __tuple_less<0>
-{
- template <class _Tp, class _Up>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- bool operator()(const _Tp&, const _Up&)
- {
- return false;
- }
-};
-
-template <class ..._Tp, class ..._Up>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator<(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
-{
- return __tuple_less<sizeof...(_Tp)>()(__x, __y);
-}
-
-template <class ..._Tp, class ..._Up>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
-{
- return __y < __x;
-}
-
-template <class ..._Tp, class ..._Up>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator>=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
-{
- return !(__x < __y);
-}
-
-template <class ..._Tp, class ..._Up>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator<=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
-{
- return !(__y < __x);
-}
-
-// tuple_cat
-
-template <class _Tp, class _Up> struct __tuple_cat_type;
-
-template <class ..._Ttypes, class ..._Utypes>
-struct __tuple_cat_type<tuple<_Ttypes...>, __tuple_types<_Utypes...> >
-{
- typedef tuple<_Ttypes..., _Utypes...> type;
-};
-
-template <class _ResultTuple, bool _Is_Tuple0TupleLike, class ..._Tuples>
-struct __tuple_cat_return_1
-{
-};
-
-template <class ..._Types, class _Tuple0>
-struct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0>
-{
- typedef typename __tuple_cat_type<tuple<_Types...>,
- typename __make_tuple_types<typename remove_reference<_Tuple0>::type>::type>::type
- type;
-};
-
-template <class ..._Types, class _Tuple0, class _Tuple1, class ..._Tuples>
-struct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0, _Tuple1, _Tuples...>
- : public __tuple_cat_return_1<
- typename __tuple_cat_type<
- tuple<_Types...>,
- typename __make_tuple_types<typename remove_reference<_Tuple0>::type>::type
- >::type,
- __tuple_like<typename remove_reference<_Tuple1>::type>::value,
- _Tuple1, _Tuples...>
-{
-};
-
-template <class ..._Tuples> struct __tuple_cat_return;
-
-template <class _Tuple0, class ..._Tuples>
-struct __tuple_cat_return<_Tuple0, _Tuples...>
- : public __tuple_cat_return_1<tuple<>,
- __tuple_like<typename remove_reference<_Tuple0>::type>::value, _Tuple0,
- _Tuples...>
-{
-};
-
-template <>
-struct __tuple_cat_return<>
-{
- typedef tuple<> type;
-};
-
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-tuple<>
-tuple_cat()
-{
- return tuple<>();
-}
-
-template <class _Rp, class _Indices, class _Tuple0, class ..._Tuples>
-struct __tuple_cat_return_ref_imp;
-
-template <class ..._Types, size_t ..._I0, class _Tuple0>
-struct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>, _Tuple0>
-{
- typedef typename remove_reference<_Tuple0>::type _T0;
- typedef tuple<_Types..., typename __apply_cv<_Tuple0,
- typename tuple_element<_I0, _T0>::type>::type&&...> type;
-};
-
-template <class ..._Types, size_t ..._I0, class _Tuple0, class _Tuple1, class ..._Tuples>
-struct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>,
- _Tuple0, _Tuple1, _Tuples...>
- : public __tuple_cat_return_ref_imp<
- tuple<_Types..., typename __apply_cv<_Tuple0,
- typename tuple_element<_I0,
- typename remove_reference<_Tuple0>::type>::type>::type&&...>,
- typename __make_tuple_indices<tuple_size<typename
- remove_reference<_Tuple1>::type>::value>::type,
- _Tuple1, _Tuples...>
-{
-};
-
-template <class _Tuple0, class ..._Tuples>
-struct __tuple_cat_return_ref
- : public __tuple_cat_return_ref_imp<tuple<>,
- typename __make_tuple_indices<
- tuple_size<typename remove_reference<_Tuple0>::type>::value
- >::type, _Tuple0, _Tuples...>
-{
-};
-
-template <class _Types, class _I0, class _J0>
-struct __tuple_cat;
-
-template <class ..._Types, size_t ..._I0, size_t ..._J0>
-struct __tuple_cat<tuple<_Types...>, __tuple_indices<_I0...>, __tuple_indices<_J0...> >
-{
- template <class _Tuple0>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&>::type
- operator()(tuple<_Types...> __t, _Tuple0&& __t0)
- {
- return forward_as_tuple(_VSTD::forward<_Types>(_VSTD::get<_I0>(__t))...,
- _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...);
- }
-
- template <class _Tuple0, class _Tuple1, class ..._Tuples>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&, _Tuple1&&, _Tuples&&...>::type
- operator()(tuple<_Types...> __t, _Tuple0&& __t0, _Tuple1&& __t1, _Tuples&& ...__tpls)
- {
- typedef typename remove_reference<_Tuple0>::type _T0;
- typedef typename remove_reference<_Tuple1>::type _T1;
- return __tuple_cat<
- tuple<_Types..., typename __apply_cv<_Tuple0, typename tuple_element<_J0, _T0>::type>::type&&...>,
- typename __make_tuple_indices<sizeof ...(_Types) + tuple_size<_T0>::value>::type,
- typename __make_tuple_indices<tuple_size<_T1>::value>::type>()
- (forward_as_tuple(
- _VSTD::forward<_Types>(_VSTD::get<_I0>(__t))...,
- _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...
- ),
- _VSTD::forward<_Tuple1>(__t1),
- _VSTD::forward<_Tuples>(__tpls)...);
- }
-};
-
-template <class _Tuple0, class... _Tuples>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-typename __tuple_cat_return<_Tuple0, _Tuples...>::type
-tuple_cat(_Tuple0&& __t0, _Tuples&&... __tpls)
-{
- typedef typename remove_reference<_Tuple0>::type _T0;
- return __tuple_cat<tuple<>, __tuple_indices<>,
- typename __make_tuple_indices<tuple_size<_T0>::value>::type>()
- (tuple<>(), _VSTD::forward<_Tuple0>(__t0),
- _VSTD::forward<_Tuples>(__tpls)...);
-}
-
-template <class ..._Tp, class _Alloc>
-struct _LIBCPP_TEMPLATE_VIS uses_allocator<tuple<_Tp...>, _Alloc>
- : true_type {};
-
-template <class _T1, class _T2>
-template <class... _Args1, class... _Args2, size_t ..._I1, size_t ..._I2>
-inline _LIBCPP_INLINE_VISIBILITY
-pair<_T1, _T2>::pair(piecewise_construct_t,
- tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args,
- __tuple_indices<_I1...>, __tuple_indices<_I2...>)
- : first(_VSTD::forward<_Args1>(_VSTD::get<_I1>( __first_args))...),
- second(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...)
-{
-}
-
-#if _LIBCPP_STD_VER > 14
-template <class _Tp>
-_LIBCPP_INLINE_VAR constexpr size_t tuple_size_v = tuple_size<_Tp>::value;
-
-#define _LIBCPP_NOEXCEPT_RETURN(...) noexcept(noexcept(__VA_ARGS__)) { return __VA_ARGS__; }
-
-template <class _Fn, class _Tuple, size_t ..._Id>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr decltype(auto) __apply_tuple_impl(_Fn && __f, _Tuple && __t,
- __tuple_indices<_Id...>)
-_LIBCPP_NOEXCEPT_RETURN(
- _VSTD::__invoke_constexpr(
- _VSTD::forward<_Fn>(__f),
- _VSTD::get<_Id>(_VSTD::forward<_Tuple>(__t))...)
-)
-
-template <class _Fn, class _Tuple>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr decltype(auto) apply(_Fn && __f, _Tuple && __t)
-_LIBCPP_NOEXCEPT_RETURN(
- _VSTD::__apply_tuple_impl(
- _VSTD::forward<_Fn>(__f), _VSTD::forward<_Tuple>(__t),
- typename __make_tuple_indices<tuple_size_v<remove_reference_t<_Tuple>>>::type{})
-)
-
-template <class _Tp, class _Tuple, size_t... _Idx>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr _Tp __make_from_tuple_impl(_Tuple&& __t, __tuple_indices<_Idx...>)
-_LIBCPP_NOEXCEPT_RETURN(
- _Tp(_VSTD::get<_Idx>(_VSTD::forward<_Tuple>(__t))...)
-)
-
-template <class _Tp, class _Tuple>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr _Tp make_from_tuple(_Tuple&& __t)
-_LIBCPP_NOEXCEPT_RETURN(
- _VSTD::__make_from_tuple_impl<_Tp>(_VSTD::forward<_Tuple>(__t),
- typename __make_tuple_indices<tuple_size_v<remove_reference_t<_Tuple>>>::type{})
-)
-
-#undef _LIBCPP_NOEXCEPT_RETURN
-
-#endif // _LIBCPP_STD_VER > 14
-
-#endif // !defined(_LIBCPP_CXX03_LANG)
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_TUPLE
diff --git a/lib/libcxx/include/type_traits b/lib/libcxx/include/type_traits
deleted file mode 100644
index 8b30511a4ec..00000000000
--- a/lib/libcxx/include/type_traits
+++ /dev/null
@@ -1,4863 +0,0 @@
-// -*- C++ -*-
-//===------------------------ type_traits ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_TYPE_TRAITS
-#define _LIBCPP_TYPE_TRAITS
-
-/*
- type_traits synopsis
-
-namespace std
-{
-
- // helper class:
- template <class T, T v> struct integral_constant;
- typedef integral_constant<bool, true> true_type; // C++11
- typedef integral_constant<bool, false> false_type; // C++11
-
- template <bool B> // C++14
- using bool_constant = integral_constant<bool, B>; // C++14
- typedef bool_constant<true> true_type; // C++14
- typedef bool_constant<false> false_type; // C++14
-
- // helper traits
- template <bool, class T = void> struct enable_if;
- template <bool, class T, class F> struct conditional;
-
- // Primary classification traits:
- template <class T> struct is_void;
- template <class T> struct is_null_pointer; // C++14
- template <class T> struct is_integral;
- template <class T> struct is_floating_point;
- template <class T> struct is_array;
- template <class T> struct is_pointer;
- template <class T> struct is_lvalue_reference;
- template <class T> struct is_rvalue_reference;
- template <class T> struct is_member_object_pointer;
- template <class T> struct is_member_function_pointer;
- template <class T> struct is_enum;
- template <class T> struct is_union;
- template <class T> struct is_class;
- template <class T> struct is_function;
-
- // Secondary classification traits:
- template <class T> struct is_reference;
- template <class T> struct is_arithmetic;
- template <class T> struct is_fundamental;
- template <class T> struct is_member_pointer;
- template <class T> struct is_scalar;
- template <class T> struct is_object;
- template <class T> struct is_compound;
-
- // Const-volatile properties and transformations:
- template <class T> struct is_const;
- template <class T> struct is_volatile;
- template <class T> struct remove_const;
- template <class T> struct remove_volatile;
- template <class T> struct remove_cv;
- template <class T> struct add_const;
- template <class T> struct add_volatile;
- template <class T> struct add_cv;
-
- // Reference transformations:
- template <class T> struct remove_reference;
- template <class T> struct add_lvalue_reference;
- template <class T> struct add_rvalue_reference;
-
- // Pointer transformations:
- template <class T> struct remove_pointer;
- template <class T> struct add_pointer;
-
- template<class T> struct type_identity; // C++20
- template<class T>
- using type_identity_t = typename type_identity<T>::type; // C++20
-
- // Integral properties:
- template <class T> struct is_signed;
- template <class T> struct is_unsigned;
- template <class T> struct make_signed;
- template <class T> struct make_unsigned;
-
- // Array properties and transformations:
- template <class T> struct rank;
- template <class T, unsigned I = 0> struct extent;
- template <class T> struct remove_extent;
- template <class T> struct remove_all_extents;
-
- // Member introspection:
- template <class T> struct is_pod;
- template <class T> struct is_trivial;
- template <class T> struct is_trivially_copyable;
- template <class T> struct is_standard_layout;
- template <class T> struct is_literal_type;
- template <class T> struct is_empty;
- template <class T> struct is_polymorphic;
- template <class T> struct is_abstract;
- template <class T> struct is_final; // C++14
- template <class T> struct is_aggregate; // C++17
-
- template <class T, class... Args> struct is_constructible;
- template <class T> struct is_default_constructible;
- template <class T> struct is_copy_constructible;
- template <class T> struct is_move_constructible;
- template <class T, class U> struct is_assignable;
- template <class T> struct is_copy_assignable;
- template <class T> struct is_move_assignable;
- template <class T, class U> struct is_swappable_with; // C++17
- template <class T> struct is_swappable; // C++17
- template <class T> struct is_destructible;
-
- template <class T, class... Args> struct is_trivially_constructible;
- template <class T> struct is_trivially_default_constructible;
- template <class T> struct is_trivially_copy_constructible;
- template <class T> struct is_trivially_move_constructible;
- template <class T, class U> struct is_trivially_assignable;
- template <class T> struct is_trivially_copy_assignable;
- template <class T> struct is_trivially_move_assignable;
- template <class T> struct is_trivially_destructible;
-
- template <class T, class... Args> struct is_nothrow_constructible;
- template <class T> struct is_nothrow_default_constructible;
- template <class T> struct is_nothrow_copy_constructible;
- template <class T> struct is_nothrow_move_constructible;
- template <class T, class U> struct is_nothrow_assignable;
- template <class T> struct is_nothrow_copy_assignable;
- template <class T> struct is_nothrow_move_assignable;
- template <class T, class U> struct is_nothrow_swappable_with; // C++17
- template <class T> struct is_nothrow_swappable; // C++17
- template <class T> struct is_nothrow_destructible;
-
- template <class T> struct has_virtual_destructor;
-
- template<class T> struct has_unique_object_representations; // C++17
-
- // Relationships between types:
- template <class T, class U> struct is_same;
- template <class Base, class Derived> struct is_base_of;
- template <class From, class To> struct is_convertible;
-
- template <class Fn, class... ArgTypes> struct is_invocable;
- template <class R, class Fn, class... ArgTypes> struct is_invocable_r;
-
- template <class Fn, class... ArgTypes> struct is_nothrow_invocable;
- template <class R, class Fn, class... ArgTypes> struct is_nothrow_invocable_r;
-
- // Alignment properties and transformations:
- template <class T> struct alignment_of;
- template <size_t Len, size_t Align = most_stringent_alignment_requirement>
- struct aligned_storage;
- template <size_t Len, class... Types> struct aligned_union;
- template <class T> struct remove_cvref; // C++20
-
- template <class T> struct decay;
- template <class... T> struct common_type;
- template <class T> struct underlying_type;
- template <class> class result_of; // undefined
- template <class Fn, class... ArgTypes> class result_of<Fn(ArgTypes...)>;
- template <class Fn, class... ArgTypes> struct invoke_result; // C++17
-
- // const-volatile modifications:
- template <class T>
- using remove_const_t = typename remove_const<T>::type; // C++14
- template <class T>
- using remove_volatile_t = typename remove_volatile<T>::type; // C++14
- template <class T>
- using remove_cv_t = typename remove_cv<T>::type; // C++14
- template <class T>
- using add_const_t = typename add_const<T>::type; // C++14
- template <class T>
- using add_volatile_t = typename add_volatile<T>::type; // C++14
- template <class T>
- using add_cv_t = typename add_cv<T>::type; // C++14
-
- // reference modifications:
- template <class T>
- using remove_reference_t = typename remove_reference<T>::type; // C++14
- template <class T>
- using add_lvalue_reference_t = typename add_lvalue_reference<T>::type; // C++14
- template <class T>
- using add_rvalue_reference_t = typename add_rvalue_reference<T>::type; // C++14
-
- // sign modifications:
- template <class T>
- using make_signed_t = typename make_signed<T>::type; // C++14
- template <class T>
- using make_unsigned_t = typename make_unsigned<T>::type; // C++14
-
- // array modifications:
- template <class T>
- using remove_extent_t = typename remove_extent<T>::type; // C++14
- template <class T>
- using remove_all_extents_t = typename remove_all_extents<T>::type; // C++14
-
- // pointer modifications:
- template <class T>
- using remove_pointer_t = typename remove_pointer<T>::type; // C++14
- template <class T>
- using add_pointer_t = typename add_pointer<T>::type; // C++14
-
- // other transformations:
- template <size_t Len, std::size_t Align=default-alignment>
- using aligned_storage_t = typename aligned_storage<Len,Align>::type; // C++14
- template <std::size_t Len, class... Types>
- using aligned_union_t = typename aligned_union<Len,Types...>::type; // C++14
- template <class T>
- using remove_cvref_t = typename remove_cvref<T>::type; // C++20
- template <class T>
- using decay_t = typename decay<T>::type; // C++14
- template <bool b, class T=void>
- using enable_if_t = typename enable_if<b,T>::type; // C++14
- template <bool b, class T, class F>
- using conditional_t = typename conditional<b,T,F>::type; // C++14
- template <class... T>
- using common_type_t = typename common_type<T...>::type; // C++14
- template <class T>
- using underlying_type_t = typename underlying_type<T>::type; // C++14
- template <class T>
- using result_of_t = typename result_of<T>::type; // C++14
- template <class Fn, class... ArgTypes>
- using invoke_result_t = typename invoke_result<Fn, ArgTypes...>::type; // C++17
-
- template <class...>
- using void_t = void; // C++17
-
- // See C++14 20.10.4.1, primary type categories
- template <class T> inline constexpr bool is_void_v
- = is_void<T>::value; // C++17
- template <class T> inline constexpr bool is_null_pointer_v
- = is_null_pointer<T>::value; // C++17
- template <class T> inline constexpr bool is_integral_v
- = is_integral<T>::value; // C++17
- template <class T> inline constexpr bool is_floating_point_v
- = is_floating_point<T>::value; // C++17
- template <class T> inline constexpr bool is_array_v
- = is_array<T>::value; // C++17
- template <class T> inline constexpr bool is_pointer_v
- = is_pointer<T>::value; // C++17
- template <class T> inline constexpr bool is_lvalue_reference_v
- = is_lvalue_reference<T>::value; // C++17
- template <class T> inline constexpr bool is_rvalue_reference_v
- = is_rvalue_reference<T>::value; // C++17
- template <class T> inline constexpr bool is_member_object_pointer_v
- = is_member_object_pointer<T>::value; // C++17
- template <class T> inline constexpr bool is_member_function_pointer_v
- = is_member_function_pointer<T>::value; // C++17
- template <class T> inline constexpr bool is_enum_v
- = is_enum<T>::value; // C++17
- template <class T> inline constexpr bool is_union_v
- = is_union<T>::value; // C++17
- template <class T> inline constexpr bool is_class_v
- = is_class<T>::value; // C++17
- template <class T> inline constexpr bool is_function_v
- = is_function<T>::value; // C++17
-
- // See C++14 20.10.4.2, composite type categories
- template <class T> inline constexpr bool is_reference_v
- = is_reference<T>::value; // C++17
- template <class T> inline constexpr bool is_arithmetic_v
- = is_arithmetic<T>::value; // C++17
- template <class T> inline constexpr bool is_fundamental_v
- = is_fundamental<T>::value; // C++17
- template <class T> inline constexpr bool is_object_v
- = is_object<T>::value; // C++17
- template <class T> inline constexpr bool is_scalar_v
- = is_scalar<T>::value; // C++17
- template <class T> inline constexpr bool is_compound_v
- = is_compound<T>::value; // C++17
- template <class T> inline constexpr bool is_member_pointer_v
- = is_member_pointer<T>::value; // C++17
-
- // See C++14 20.10.4.3, type properties
- template <class T> inline constexpr bool is_const_v
- = is_const<T>::value; // C++17
- template <class T> inline constexpr bool is_volatile_v
- = is_volatile<T>::value; // C++17
- template <class T> inline constexpr bool is_trivial_v
- = is_trivial<T>::value; // C++17
- template <class T> inline constexpr bool is_trivially_copyable_v
- = is_trivially_copyable<T>::value; // C++17
- template <class T> inline constexpr bool is_standard_layout_v
- = is_standard_layout<T>::value; // C++17
- template <class T> inline constexpr bool is_pod_v
- = is_pod<T>::value; // C++17
- template <class T> inline constexpr bool is_literal_type_v
- = is_literal_type<T>::value; // C++17
- template <class T> inline constexpr bool is_empty_v
- = is_empty<T>::value; // C++17
- template <class T> inline constexpr bool is_polymorphic_v
- = is_polymorphic<T>::value; // C++17
- template <class T> inline constexpr bool is_abstract_v
- = is_abstract<T>::value; // C++17
- template <class T> inline constexpr bool is_final_v
- = is_final<T>::value; // C++17
- template <class T> inline constexpr bool is_aggregate_v
- = is_aggregate<T>::value; // C++17
- template <class T> inline constexpr bool is_signed_v
- = is_signed<T>::value; // C++17
- template <class T> inline constexpr bool is_unsigned_v
- = is_unsigned<T>::value; // C++17
- template <class T, class... Args> inline constexpr bool is_constructible_v
- = is_constructible<T, Args...>::value; // C++17
- template <class T> inline constexpr bool is_default_constructible_v
- = is_default_constructible<T>::value; // C++17
- template <class T> inline constexpr bool is_copy_constructible_v
- = is_copy_constructible<T>::value; // C++17
- template <class T> inline constexpr bool is_move_constructible_v
- = is_move_constructible<T>::value; // C++17
- template <class T, class U> inline constexpr bool is_assignable_v
- = is_assignable<T, U>::value; // C++17
- template <class T> inline constexpr bool is_copy_assignable_v
- = is_copy_assignable<T>::value; // C++17
- template <class T> inline constexpr bool is_move_assignable_v
- = is_move_assignable<T>::value; // C++17
- template <class T, class U> inline constexpr bool is_swappable_with_v
- = is_swappable_with<T, U>::value; // C++17
- template <class T> inline constexpr bool is_swappable_v
- = is_swappable<T>::value; // C++17
- template <class T> inline constexpr bool is_destructible_v
- = is_destructible<T>::value; // C++17
- template <class T, class... Args> inline constexpr bool is_trivially_constructible_v
- = is_trivially_constructible<T, Args...>::value; // C++17
- template <class T> inline constexpr bool is_trivially_default_constructible_v
- = is_trivially_default_constructible<T>::value; // C++17
- template <class T> inline constexpr bool is_trivially_copy_constructible_v
- = is_trivially_copy_constructible<T>::value; // C++17
- template <class T> inline constexpr bool is_trivially_move_constructible_v
- = is_trivially_move_constructible<T>::value; // C++17
- template <class T, class U> inline constexpr bool is_trivially_assignable_v
- = is_trivially_assignable<T, U>::value; // C++17
- template <class T> inline constexpr bool is_trivially_copy_assignable_v
- = is_trivially_copy_assignable<T>::value; // C++17
- template <class T> inline constexpr bool is_trivially_move_assignable_v
- = is_trivially_move_assignable<T>::value; // C++17
- template <class T> inline constexpr bool is_trivially_destructible_v
- = is_trivially_destructible<T>::value; // C++17
- template <class T, class... Args> inline constexpr bool is_nothrow_constructible_v
- = is_nothrow_constructible<T, Args...>::value; // C++17
- template <class T> inline constexpr bool is_nothrow_default_constructible_v
- = is_nothrow_default_constructible<T>::value; // C++17
- template <class T> inline constexpr bool is_nothrow_copy_constructible_v
- = is_nothrow_copy_constructible<T>::value; // C++17
- template <class T> inline constexpr bool is_nothrow_move_constructible_v
- = is_nothrow_move_constructible<T>::value; // C++17
- template <class T, class U> inline constexpr bool is_nothrow_assignable_v
- = is_nothrow_assignable<T, U>::value; // C++17
- template <class T> inline constexpr bool is_nothrow_copy_assignable_v
- = is_nothrow_copy_assignable<T>::value; // C++17
- template <class T> inline constexpr bool is_nothrow_move_assignable_v
- = is_nothrow_move_assignable<T>::value; // C++17
- template <class T, class U> inline constexpr bool is_nothrow_swappable_with_v
- = is_nothrow_swappable_with<T, U>::value; // C++17
- template <class T> inline constexpr bool is_nothrow_swappable_v
- = is_nothrow_swappable<T>::value; // C++17
- template <class T> inline constexpr bool is_nothrow_destructible_v
- = is_nothrow_destructible<T>::value; // C++17
- template <class T> inline constexpr bool has_virtual_destructor_v
- = has_virtual_destructor<T>::value; // C++17
- template<class T> inline constexpr bool has_unique_object_representations_v // C++17
- = has_unique_object_representations<T>::value;
-
- // See C++14 20.10.5, type property queries
- template <class T> inline constexpr size_t alignment_of_v
- = alignment_of<T>::value; // C++17
- template <class T> inline constexpr size_t rank_v
- = rank<T>::value; // C++17
- template <class T, unsigned I = 0> inline constexpr size_t extent_v
- = extent<T, I>::value; // C++17
-
- // See C++14 20.10.6, type relations
- template <class T, class U> inline constexpr bool is_same_v
- = is_same<T, U>::value; // C++17
- template <class Base, class Derived> inline constexpr bool is_base_of_v
- = is_base_of<Base, Derived>::value; // C++17
- template <class From, class To> inline constexpr bool is_convertible_v
- = is_convertible<From, To>::value; // C++17
- template <class Fn, class... ArgTypes> inline constexpr bool is_invocable_v
- = is_invocable<Fn, ArgTypes...>::value; // C++17
- template <class R, class Fn, class... ArgTypes> inline constexpr bool is_invocable_r_v
- = is_invocable_r<R, Fn, ArgTypes...>::value; // C++17
- template <class Fn, class... ArgTypes> inline constexpr bool is_nothrow_invocable_v
- = is_nothrow_invocable<Fn, ArgTypes...>::value; // C++17
- template <class R, class Fn, class... ArgTypes> inline constexpr bool is_nothrow_invocable_r_v
- = is_nothrow_invocable_r<R, Fn, ArgTypes...>::value; // C++17
-
- // [meta.logical], logical operator traits:
- template<class... B> struct conjunction; // C++17
- template<class... B>
- inline constexpr bool conjunction_v = conjunction<B...>::value; // C++17
- template<class... B> struct disjunction; // C++17
- template<class... B>
- inline constexpr bool disjunction_v = disjunction<B...>::value; // C++17
- template<class B> struct negation; // C++17
- template<class B>
- inline constexpr bool negation_v = negation<B>::value; // C++17
-
-}
-
-*/
-#include <__config>
-#include <cstddef>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _T1, class _T2> struct _LIBCPP_TEMPLATE_VIS pair;
-template <class _Tp> class _LIBCPP_TEMPLATE_VIS reference_wrapper;
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS hash;
-
-template <class>
-struct __void_t { typedef void type; };
-
-template <class _Tp>
-struct __identity { typedef _Tp type; };
-
-template <class _Tp, bool>
-struct _LIBCPP_TEMPLATE_VIS __dependent_type : public _Tp {};
-
-template <bool _Bp, class _If, class _Then>
- struct _LIBCPP_TEMPLATE_VIS conditional {typedef _If type;};
-template <class _If, class _Then>
- struct _LIBCPP_TEMPLATE_VIS conditional<false, _If, _Then> {typedef _Then type;};
-
-#if _LIBCPP_STD_VER > 11
-template <bool _Bp, class _If, class _Then> using conditional_t = typename conditional<_Bp, _If, _Then>::type;
-#endif
-
-template <bool, class _Tp> struct _LIBCPP_TEMPLATE_VIS __lazy_enable_if {};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS __lazy_enable_if<true, _Tp> {typedef typename _Tp::type type;};
-
-template <bool, class _Tp = void> struct _LIBCPP_TEMPLATE_VIS enable_if {};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS enable_if<true, _Tp> {typedef _Tp type;};
-
-#if _LIBCPP_STD_VER > 11
-template <bool _Bp, class _Tp = void> using enable_if_t = typename enable_if<_Bp, _Tp>::type;
-#endif
-
-// addressof
-#ifndef _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF
-
-template <class _Tp>
-inline _LIBCPP_CONSTEXPR_AFTER_CXX14
-_LIBCPP_NO_CFI _LIBCPP_INLINE_VISIBILITY
-_Tp*
-addressof(_Tp& __x) _NOEXCEPT
-{
- return __builtin_addressof(__x);
-}
-
-#else
-
-template <class _Tp>
-inline _LIBCPP_NO_CFI _LIBCPP_INLINE_VISIBILITY
-_Tp*
-addressof(_Tp& __x) _NOEXCEPT
-{
- return reinterpret_cast<_Tp *>(
- const_cast<char *>(&reinterpret_cast<const volatile char &>(__x)));
-}
-
-#endif // _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF
-
-#if defined(_LIBCPP_HAS_OBJC_ARC) && !defined(_LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF)
-// Objective-C++ Automatic Reference Counting uses qualified pointers
-// that require special addressof() signatures. When
-// _LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF is defined, the compiler
-// itself is providing these definitions. Otherwise, we provide them.
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-__strong _Tp*
-addressof(__strong _Tp& __x) _NOEXCEPT
-{
- return &__x;
-}
-
-#ifdef _LIBCPP_HAS_OBJC_ARC_WEAK
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-__weak _Tp*
-addressof(__weak _Tp& __x) _NOEXCEPT
-{
- return &__x;
-}
-#endif
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-__autoreleasing _Tp*
-addressof(__autoreleasing _Tp& __x) _NOEXCEPT
-{
- return &__x;
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-__unsafe_unretained _Tp*
-addressof(__unsafe_unretained _Tp& __x) _NOEXCEPT
-{
- return &__x;
-}
-#endif
-
-#if !defined(_LIBCPP_CXX03_LANG)
-template <class _Tp> _Tp* addressof(const _Tp&&) noexcept = delete;
-#endif
-
-struct __two {char __lx[2];};
-
-// helper class:
-
-template <class _Tp, _Tp __v>
-struct _LIBCPP_TEMPLATE_VIS integral_constant
-{
- static _LIBCPP_CONSTEXPR const _Tp value = __v;
- typedef _Tp value_type;
- typedef integral_constant type;
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR operator value_type() const _NOEXCEPT {return value;}
-#if _LIBCPP_STD_VER > 11
- _LIBCPP_INLINE_VISIBILITY
- constexpr value_type operator ()() const _NOEXCEPT {return value;}
-#endif
-};
-
-template <class _Tp, _Tp __v>
-_LIBCPP_CONSTEXPR const _Tp integral_constant<_Tp, __v>::value;
-
-#if _LIBCPP_STD_VER > 14
-template <bool __b>
-using bool_constant = integral_constant<bool, __b>;
-#define _LIBCPP_BOOL_CONSTANT(__b) bool_constant<(__b)>
-#else
-#define _LIBCPP_BOOL_CONSTANT(__b) integral_constant<bool,(__b)>
-#endif
-
-typedef _LIBCPP_BOOL_CONSTANT(true) true_type;
-typedef _LIBCPP_BOOL_CONSTANT(false) false_type;
-
-#if !defined(_LIBCPP_CXX03_LANG)
-
-// __lazy_and
-
-template <bool _Last, class ..._Preds>
-struct __lazy_and_impl;
-
-template <class ..._Preds>
-struct __lazy_and_impl<false, _Preds...> : false_type {};
-
-template <>
-struct __lazy_and_impl<true> : true_type {};
-
-template <class _Pred>
-struct __lazy_and_impl<true, _Pred> : integral_constant<bool, _Pred::type::value> {};
-
-template <class _Hp, class ..._Tp>
-struct __lazy_and_impl<true, _Hp, _Tp...> : __lazy_and_impl<_Hp::type::value, _Tp...> {};
-
-template <class _P1, class ..._Pr>
-struct __lazy_and : __lazy_and_impl<_P1::type::value, _Pr...> {};
-
-// __lazy_or
-
-template <bool _List, class ..._Preds>
-struct __lazy_or_impl;
-
-template <class ..._Preds>
-struct __lazy_or_impl<true, _Preds...> : true_type {};
-
-template <>
-struct __lazy_or_impl<false> : false_type {};
-
-template <class _Hp, class ..._Tp>
-struct __lazy_or_impl<false, _Hp, _Tp...>
- : __lazy_or_impl<_Hp::type::value, _Tp...> {};
-
-template <class _P1, class ..._Pr>
-struct __lazy_or : __lazy_or_impl<_P1::type::value, _Pr...> {};
-
-// __lazy_not
-
-template <class _Pred>
-struct __lazy_not : integral_constant<bool, !_Pred::type::value> {};
-
-// __and_
-template<class...> struct __and_;
-template<> struct __and_<> : true_type {};
-
-template<class _B0> struct __and_<_B0> : _B0 {};
-
-template<class _B0, class _B1>
-struct __and_<_B0, _B1> : conditional<_B0::value, _B1, _B0>::type {};
-
-template<class _B0, class _B1, class _B2, class... _Bn>
-struct __and_<_B0, _B1, _B2, _Bn...>
- : conditional<_B0::value, __and_<_B1, _B2, _Bn...>, _B0>::type {};
-
-// __or_
-template<class...> struct __or_;
-template<> struct __or_<> : false_type {};
-
-template<class _B0> struct __or_<_B0> : _B0 {};
-
-template<class _B0, class _B1>
-struct __or_<_B0, _B1> : conditional<_B0::value, _B0, _B1>::type {};
-
-template<class _B0, class _B1, class _B2, class... _Bn>
-struct __or_<_B0, _B1, _B2, _Bn...>
- : conditional<_B0::value, _B0, __or_<_B1, _B2, _Bn...> >::type {};
-
-// __not_
-template<class _Tp>
-struct __not_ : conditional<_Tp::value, false_type, true_type>::type {};
-
-#endif // !defined(_LIBCPP_CXX03_LANG)
-
-// is_const
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_const : public false_type {};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_const<_Tp const> : public true_type {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_const_v
- = is_const<_Tp>::value;
-#endif
-
-// is_volatile
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_volatile : public false_type {};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_volatile<_Tp volatile> : public true_type {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_volatile_v
- = is_volatile<_Tp>::value;
-#endif
-
-// remove_const
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_const {typedef _Tp type;};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_const<const _Tp> {typedef _Tp type;};
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using remove_const_t = typename remove_const<_Tp>::type;
-#endif
-
-// remove_volatile
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_volatile {typedef _Tp type;};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_volatile<volatile _Tp> {typedef _Tp type;};
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using remove_volatile_t = typename remove_volatile<_Tp>::type;
-#endif
-
-// remove_cv
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_cv
-{typedef typename remove_volatile<typename remove_const<_Tp>::type>::type type;};
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using remove_cv_t = typename remove_cv<_Tp>::type;
-#endif
-
-// is_void
-
-template <class _Tp> struct __libcpp_is_void : public false_type {};
-template <> struct __libcpp_is_void<void> : public true_type {};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_void
- : public __libcpp_is_void<typename remove_cv<_Tp>::type> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_void_v
- = is_void<_Tp>::value;
-#endif
-
-// __is_nullptr_t
-
-template <class _Tp> struct __is_nullptr_t_impl : public false_type {};
-template <> struct __is_nullptr_t_impl<nullptr_t> : public true_type {};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS __is_nullptr_t
- : public __is_nullptr_t_impl<typename remove_cv<_Tp>::type> {};
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_null_pointer
- : public __is_nullptr_t_impl<typename remove_cv<_Tp>::type> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_null_pointer_v
- = is_null_pointer<_Tp>::value;
-#endif
-#endif
-
-// is_integral
-
-template <class _Tp> struct __libcpp_is_integral : public false_type {};
-template <> struct __libcpp_is_integral<bool> : public true_type {};
-template <> struct __libcpp_is_integral<char> : public true_type {};
-template <> struct __libcpp_is_integral<signed char> : public true_type {};
-template <> struct __libcpp_is_integral<unsigned char> : public true_type {};
-template <> struct __libcpp_is_integral<wchar_t> : public true_type {};
-#ifndef _LIBCPP_NO_HAS_CHAR8_T
-template <> struct __libcpp_is_integral<char8_t> : public true_type {};
-#endif
-#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
-template <> struct __libcpp_is_integral<char16_t> : public true_type {};
-template <> struct __libcpp_is_integral<char32_t> : public true_type {};
-#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
-template <> struct __libcpp_is_integral<short> : public true_type {};
-template <> struct __libcpp_is_integral<unsigned short> : public true_type {};
-template <> struct __libcpp_is_integral<int> : public true_type {};
-template <> struct __libcpp_is_integral<unsigned int> : public true_type {};
-template <> struct __libcpp_is_integral<long> : public true_type {};
-template <> struct __libcpp_is_integral<unsigned long> : public true_type {};
-template <> struct __libcpp_is_integral<long long> : public true_type {};
-template <> struct __libcpp_is_integral<unsigned long long> : public true_type {};
-#ifndef _LIBCPP_HAS_NO_INT128
-template <> struct __libcpp_is_integral<__int128_t> : public true_type {};
-template <> struct __libcpp_is_integral<__uint128_t> : public true_type {};
-#endif
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_integral
- : public __libcpp_is_integral<typename remove_cv<_Tp>::type> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_integral_v
- = is_integral<_Tp>::value;
-#endif
-
-// is_floating_point
-
-template <class _Tp> struct __libcpp_is_floating_point : public false_type {};
-template <> struct __libcpp_is_floating_point<float> : public true_type {};
-template <> struct __libcpp_is_floating_point<double> : public true_type {};
-template <> struct __libcpp_is_floating_point<long double> : public true_type {};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_floating_point
- : public __libcpp_is_floating_point<typename remove_cv<_Tp>::type> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_floating_point_v
- = is_floating_point<_Tp>::value;
-#endif
-
-// is_array
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_array
- : public false_type {};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_array<_Tp[]>
- : public true_type {};
-template <class _Tp, size_t _Np> struct _LIBCPP_TEMPLATE_VIS is_array<_Tp[_Np]>
- : public true_type {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_array_v
- = is_array<_Tp>::value;
-#endif
-
-// is_pointer
-
-template <class _Tp> struct __libcpp_is_pointer : public false_type {};
-template <class _Tp> struct __libcpp_is_pointer<_Tp*> : public true_type {};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_pointer
- : public __libcpp_is_pointer<typename remove_cv<_Tp>::type> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_pointer_v
- = is_pointer<_Tp>::value;
-#endif
-
-// is_reference
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_lvalue_reference : public false_type {};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_lvalue_reference<_Tp&> : public true_type {};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_rvalue_reference : public false_type {};
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_rvalue_reference<_Tp&&> : public true_type {};
-#endif
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_reference : public false_type {};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_reference<_Tp&> : public true_type {};
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_reference<_Tp&&> : public true_type {};
-#endif
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_reference_v
- = is_reference<_Tp>::value;
-
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_lvalue_reference_v
- = is_lvalue_reference<_Tp>::value;
-
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_rvalue_reference_v
- = is_rvalue_reference<_Tp>::value;
-#endif
-// is_union
-
-#if __has_feature(is_union) || (_GNUC_VER >= 403)
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_union
- : public integral_constant<bool, __is_union(_Tp)> {};
-
-#else
-
-template <class _Tp> struct __libcpp_union : public false_type {};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_union
- : public __libcpp_union<typename remove_cv<_Tp>::type> {};
-
-#endif
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_union_v
- = is_union<_Tp>::value;
-#endif
-
-// is_class
-
-#if __has_feature(is_class) || (_GNUC_VER >= 403)
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_class
- : public integral_constant<bool, __is_class(_Tp)> {};
-
-#else
-
-namespace __is_class_imp
-{
-template <class _Tp> char __test(int _Tp::*);
-template <class _Tp> __two __test(...);
-}
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_class
- : public integral_constant<bool, sizeof(__is_class_imp::__test<_Tp>(0)) == 1 && !is_union<_Tp>::value> {};
-
-#endif
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_class_v
- = is_class<_Tp>::value;
-#endif
-
-// is_same
-
-template <class _Tp, class _Up> struct _LIBCPP_TEMPLATE_VIS is_same : public false_type {};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_same<_Tp, _Tp> : public true_type {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_same_v
- = is_same<_Tp, _Up>::value;
-#endif
-
-// is_function
-
-namespace __libcpp_is_function_imp
-{
-struct __dummy_type {};
-template <class _Tp> char __test(_Tp*);
-template <class _Tp> char __test(__dummy_type);
-template <class _Tp> __two __test(...);
-template <class _Tp> _Tp& __source(int);
-template <class _Tp> __dummy_type __source(...);
-}
-
-template <class _Tp, bool = is_class<_Tp>::value ||
- is_union<_Tp>::value ||
- is_void<_Tp>::value ||
- is_reference<_Tp>::value ||
- __is_nullptr_t<_Tp>::value >
-struct __libcpp_is_function
- : public integral_constant<bool, sizeof(__libcpp_is_function_imp::__test<_Tp>(__libcpp_is_function_imp::__source<_Tp>(0))) == 1>
- {};
-template <class _Tp> struct __libcpp_is_function<_Tp, true> : public false_type {};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_function
- : public __libcpp_is_function<_Tp> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_function_v
- = is_function<_Tp>::value;
-#endif
-
-// is_member_function_pointer
-
-// template <class _Tp> struct __libcpp_is_member_function_pointer : public false_type {};
-// template <class _Tp, class _Up> struct __libcpp_is_member_function_pointer<_Tp _Up::*> : public is_function<_Tp> {};
-//
-
-template <class _MP, bool _IsMemberFunctionPtr, bool _IsMemberObjectPtr>
-struct __member_pointer_traits_imp
-{ // forward declaration; specializations later
-};
-
-
-template <class _Tp> struct __libcpp_is_member_function_pointer
- : public false_type {};
-
-template <class _Ret, class _Class>
-struct __libcpp_is_member_function_pointer<_Ret _Class::*>
- : public is_function<_Ret> {};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_member_function_pointer
- : public __libcpp_is_member_function_pointer<typename remove_cv<_Tp>::type>::type {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_member_function_pointer_v
- = is_member_function_pointer<_Tp>::value;
-#endif
-
-// is_member_pointer
-
-template <class _Tp> struct __libcpp_is_member_pointer : public false_type {};
-template <class _Tp, class _Up> struct __libcpp_is_member_pointer<_Tp _Up::*> : public true_type {};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_member_pointer
- : public __libcpp_is_member_pointer<typename remove_cv<_Tp>::type> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_member_pointer_v
- = is_member_pointer<_Tp>::value;
-#endif
-
-// is_member_object_pointer
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_member_object_pointer
- : public integral_constant<bool, is_member_pointer<_Tp>::value &&
- !is_member_function_pointer<_Tp>::value> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_member_object_pointer_v
- = is_member_object_pointer<_Tp>::value;
-#endif
-
-// is_enum
-
-#if __has_feature(is_enum) || (_GNUC_VER >= 403)
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_enum
- : public integral_constant<bool, __is_enum(_Tp)> {};
-
-#else
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_enum
- : public integral_constant<bool, !is_void<_Tp>::value &&
- !is_integral<_Tp>::value &&
- !is_floating_point<_Tp>::value &&
- !is_array<_Tp>::value &&
- !is_pointer<_Tp>::value &&
- !is_reference<_Tp>::value &&
- !is_member_pointer<_Tp>::value &&
- !is_union<_Tp>::value &&
- !is_class<_Tp>::value &&
- !is_function<_Tp>::value > {};
-
-#endif
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_enum_v
- = is_enum<_Tp>::value;
-#endif
-
-// is_arithmetic
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_arithmetic
- : public integral_constant<bool, is_integral<_Tp>::value ||
- is_floating_point<_Tp>::value> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_arithmetic_v
- = is_arithmetic<_Tp>::value;
-#endif
-
-// is_fundamental
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_fundamental
- : public integral_constant<bool, is_void<_Tp>::value ||
- __is_nullptr_t<_Tp>::value ||
- is_arithmetic<_Tp>::value> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_fundamental_v
- = is_fundamental<_Tp>::value;
-#endif
-
-// is_scalar
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_scalar
- : public integral_constant<bool, is_arithmetic<_Tp>::value ||
- is_member_pointer<_Tp>::value ||
- is_pointer<_Tp>::value ||
- __is_nullptr_t<_Tp>::value ||
- is_enum<_Tp>::value > {};
-
-template <> struct _LIBCPP_TEMPLATE_VIS is_scalar<nullptr_t> : public true_type {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_scalar_v
- = is_scalar<_Tp>::value;
-#endif
-
-// is_object
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_object
- : public integral_constant<bool, is_scalar<_Tp>::value ||
- is_array<_Tp>::value ||
- is_union<_Tp>::value ||
- is_class<_Tp>::value > {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_object_v
- = is_object<_Tp>::value;
-#endif
-
-// is_compound
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_compound
- : public integral_constant<bool, !is_fundamental<_Tp>::value> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_compound_v
- = is_compound<_Tp>::value;
-#endif
-
-
-// __is_referenceable [defns.referenceable]
-
-struct __is_referenceable_impl {
- template <class _Tp> static _Tp& __test(int);
- template <class _Tp> static __two __test(...);
-};
-
-template <class _Tp>
-struct __is_referenceable : integral_constant<bool,
- !is_same<decltype(__is_referenceable_impl::__test<_Tp>(0)), __two>::value> {};
-
-
-// add_const
-
-template <class _Tp, bool = is_reference<_Tp>::value ||
- is_function<_Tp>::value ||
- is_const<_Tp>::value >
-struct __add_const {typedef _Tp type;};
-
-template <class _Tp>
-struct __add_const<_Tp, false> {typedef const _Tp type;};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS add_const
- {typedef typename __add_const<_Tp>::type type;};
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using add_const_t = typename add_const<_Tp>::type;
-#endif
-
-// add_volatile
-
-template <class _Tp, bool = is_reference<_Tp>::value ||
- is_function<_Tp>::value ||
- is_volatile<_Tp>::value >
-struct __add_volatile {typedef _Tp type;};
-
-template <class _Tp>
-struct __add_volatile<_Tp, false> {typedef volatile _Tp type;};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS add_volatile
- {typedef typename __add_volatile<_Tp>::type type;};
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using add_volatile_t = typename add_volatile<_Tp>::type;
-#endif
-
-// add_cv
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS add_cv
- {typedef typename add_const<typename add_volatile<_Tp>::type>::type type;};
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using add_cv_t = typename add_cv<_Tp>::type;
-#endif
-
-// remove_reference
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_reference {typedef _Tp type;};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_reference<_Tp&> {typedef _Tp type;};
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_reference<_Tp&&> {typedef _Tp type;};
-#endif
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using remove_reference_t = typename remove_reference<_Tp>::type;
-#endif
-
-// add_lvalue_reference
-
-template <class _Tp, bool = __is_referenceable<_Tp>::value> struct __add_lvalue_reference_impl { typedef _Tp type; };
-template <class _Tp > struct __add_lvalue_reference_impl<_Tp, true> { typedef _Tp& type; };
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS add_lvalue_reference
-{typedef typename __add_lvalue_reference_impl<_Tp>::type type;};
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using add_lvalue_reference_t = typename add_lvalue_reference<_Tp>::type;
-#endif
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Tp, bool = __is_referenceable<_Tp>::value> struct __add_rvalue_reference_impl { typedef _Tp type; };
-template <class _Tp > struct __add_rvalue_reference_impl<_Tp, true> { typedef _Tp&& type; };
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS add_rvalue_reference
-{typedef typename __add_rvalue_reference_impl<_Tp>::type type;};
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using add_rvalue_reference_t = typename add_rvalue_reference<_Tp>::type;
-#endif
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Tp> _Tp&& __declval(int);
-template <class _Tp> _Tp __declval(long);
-
-template <class _Tp>
-decltype(_VSTD::__declval<_Tp>(0))
-declval() _NOEXCEPT;
-
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Tp>
-typename add_lvalue_reference<_Tp>::type
-declval();
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-// __uncvref
-
-template <class _Tp>
-struct __uncvref {
- typedef typename remove_cv<typename remove_reference<_Tp>::type>::type type;
-};
-
-template <class _Tp>
-struct __unconstref {
- typedef typename remove_const<typename remove_reference<_Tp>::type>::type type;
-};
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Tp>
-using __uncvref_t = typename __uncvref<_Tp>::type;
-#endif
-
-// __is_same_uncvref
-
-template <class _Tp, class _Up>
-struct __is_same_uncvref : is_same<typename __uncvref<_Tp>::type,
- typename __uncvref<_Up>::type> {};
-
-#if _LIBCPP_STD_VER > 17
-// remove_cvref - same as __uncvref
-template <class _Tp>
-struct remove_cvref : public __uncvref<_Tp> {};
-
-template <class _Tp> using remove_cvref_t = typename remove_cvref<_Tp>::type;
-#endif
-
-
-struct __any
-{
- __any(...);
-};
-
-// remove_pointer
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_pointer {typedef _Tp type;};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_pointer<_Tp*> {typedef _Tp type;};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_pointer<_Tp* const> {typedef _Tp type;};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_pointer<_Tp* volatile> {typedef _Tp type;};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_pointer<_Tp* const volatile> {typedef _Tp type;};
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using remove_pointer_t = typename remove_pointer<_Tp>::type;
-#endif
-
-// add_pointer
-
-template <class _Tp,
- bool = __is_referenceable<_Tp>::value ||
- is_same<typename remove_cv<_Tp>::type, void>::value>
-struct __add_pointer_impl
- {typedef typename remove_reference<_Tp>::type* type;};
-template <class _Tp> struct __add_pointer_impl<_Tp, false>
- {typedef _Tp type;};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS add_pointer
- {typedef typename __add_pointer_impl<_Tp>::type type;};
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using add_pointer_t = typename add_pointer<_Tp>::type;
-#endif
-
-// type_identity
-#if _LIBCPP_STD_VER > 17
-template<class _Tp> struct type_identity { typedef _Tp type; };
-template<class _Tp> using type_identity_t = typename type_identity<_Tp>::type;
-#endif
-
-// is_signed
-
-template <class _Tp, bool = is_integral<_Tp>::value>
-struct __libcpp_is_signed_impl : public _LIBCPP_BOOL_CONSTANT(_Tp(-1) < _Tp(0)) {};
-
-template <class _Tp>
-struct __libcpp_is_signed_impl<_Tp, false> : public true_type {}; // floating point
-
-template <class _Tp, bool = is_arithmetic<_Tp>::value>
-struct __libcpp_is_signed : public __libcpp_is_signed_impl<_Tp> {};
-
-template <class _Tp> struct __libcpp_is_signed<_Tp, false> : public false_type {};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_signed : public __libcpp_is_signed<_Tp> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_signed_v
- = is_signed<_Tp>::value;
-#endif
-
-// is_unsigned
-
-template <class _Tp, bool = is_integral<_Tp>::value>
-struct __libcpp_is_unsigned_impl : public _LIBCPP_BOOL_CONSTANT(_Tp(0) < _Tp(-1)) {};
-
-template <class _Tp>
-struct __libcpp_is_unsigned_impl<_Tp, false> : public false_type {}; // floating point
-
-template <class _Tp, bool = is_arithmetic<_Tp>::value>
-struct __libcpp_is_unsigned : public __libcpp_is_unsigned_impl<_Tp> {};
-
-template <class _Tp> struct __libcpp_is_unsigned<_Tp, false> : public false_type {};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_unsigned : public __libcpp_is_unsigned<_Tp> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_unsigned_v
- = is_unsigned<_Tp>::value;
-#endif
-
-// rank
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS rank
- : public integral_constant<size_t, 0> {};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS rank<_Tp[]>
- : public integral_constant<size_t, rank<_Tp>::value + 1> {};
-template <class _Tp, size_t _Np> struct _LIBCPP_TEMPLATE_VIS rank<_Tp[_Np]>
- : public integral_constant<size_t, rank<_Tp>::value + 1> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR size_t rank_v
- = rank<_Tp>::value;
-#endif
-
-// extent
-
-template <class _Tp, unsigned _Ip = 0> struct _LIBCPP_TEMPLATE_VIS extent
- : public integral_constant<size_t, 0> {};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS extent<_Tp[], 0>
- : public integral_constant<size_t, 0> {};
-template <class _Tp, unsigned _Ip> struct _LIBCPP_TEMPLATE_VIS extent<_Tp[], _Ip>
- : public integral_constant<size_t, extent<_Tp, _Ip-1>::value> {};
-template <class _Tp, size_t _Np> struct _LIBCPP_TEMPLATE_VIS extent<_Tp[_Np], 0>
- : public integral_constant<size_t, _Np> {};
-template <class _Tp, size_t _Np, unsigned _Ip> struct _LIBCPP_TEMPLATE_VIS extent<_Tp[_Np], _Ip>
- : public integral_constant<size_t, extent<_Tp, _Ip-1>::value> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp, unsigned _Ip = 0>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR size_t extent_v
- = extent<_Tp, _Ip>::value;
-#endif
-
-// remove_extent
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_extent
- {typedef _Tp type;};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_extent<_Tp[]>
- {typedef _Tp type;};
-template <class _Tp, size_t _Np> struct _LIBCPP_TEMPLATE_VIS remove_extent<_Tp[_Np]>
- {typedef _Tp type;};
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using remove_extent_t = typename remove_extent<_Tp>::type;
-#endif
-
-// remove_all_extents
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_all_extents
- {typedef _Tp type;};
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_all_extents<_Tp[]>
- {typedef typename remove_all_extents<_Tp>::type type;};
-template <class _Tp, size_t _Np> struct _LIBCPP_TEMPLATE_VIS remove_all_extents<_Tp[_Np]>
- {typedef typename remove_all_extents<_Tp>::type type;};
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using remove_all_extents_t = typename remove_all_extents<_Tp>::type;
-#endif
-
-// decay
-
-template <class _Up, bool>
-struct __decay {
- typedef typename remove_cv<_Up>::type type;
-};
-
-template <class _Up>
-struct __decay<_Up, true> {
-public:
- typedef typename conditional
- <
- is_array<_Up>::value,
- typename remove_extent<_Up>::type*,
- typename conditional
- <
- is_function<_Up>::value,
- typename add_pointer<_Up>::type,
- typename remove_cv<_Up>::type
- >::type
- >::type type;
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS decay
-{
-private:
- typedef typename remove_reference<_Tp>::type _Up;
-public:
- typedef typename __decay<_Up, __is_referenceable<_Up>::value>::type type;
-};
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using decay_t = typename decay<_Tp>::type;
-#endif
-
-// is_abstract
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_abstract
- : public integral_constant<bool, __is_abstract(_Tp)> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_abstract_v
- = is_abstract<_Tp>::value;
-#endif
-
-// is_final
-
-#if defined(_LIBCPP_HAS_IS_FINAL)
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS
-__libcpp_is_final : public integral_constant<bool, __is_final(_Tp)> {};
-#else
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS
-__libcpp_is_final : public false_type {};
-#endif
-
-#if defined(_LIBCPP_HAS_IS_FINAL) && _LIBCPP_STD_VER > 11
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS
-is_final : public integral_constant<bool, __is_final(_Tp)> {};
-#endif
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_final_v
- = is_final<_Tp>::value;
-#endif
-
-// is_aggregate
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_IS_AGGREGATE)
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS
-is_aggregate : public integral_constant<bool, __is_aggregate(_Tp)> {};
-
-#if !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR constexpr bool is_aggregate_v
- = is_aggregate<_Tp>::value;
-#endif
-
-#endif // _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_IS_AGGREGATE)
-
-// is_base_of
-
-#ifdef _LIBCPP_HAS_IS_BASE_OF
-
-template <class _Bp, class _Dp>
-struct _LIBCPP_TEMPLATE_VIS is_base_of
- : public integral_constant<bool, __is_base_of(_Bp, _Dp)> {};
-
-#else // _LIBCPP_HAS_IS_BASE_OF
-
-namespace __is_base_of_imp
-{
-template <class _Tp>
-struct _Dst
-{
- _Dst(const volatile _Tp &);
-};
-template <class _Tp>
-struct _Src
-{
- operator const volatile _Tp &();
- template <class _Up> operator const _Dst<_Up> &();
-};
-template <size_t> struct __one { typedef char type; };
-template <class _Bp, class _Dp> typename __one<sizeof(_Dst<_Bp>(declval<_Src<_Dp> >()))>::type __test(int);
-template <class _Bp, class _Dp> __two __test(...);
-}
-
-template <class _Bp, class _Dp>
-struct _LIBCPP_TEMPLATE_VIS is_base_of
- : public integral_constant<bool, is_class<_Bp>::value &&
- sizeof(__is_base_of_imp::__test<_Bp, _Dp>(0)) == 2> {};
-
-#endif // _LIBCPP_HAS_IS_BASE_OF
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Bp, class _Dp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_base_of_v
- = is_base_of<_Bp, _Dp>::value;
-#endif
-
-// is_convertible
-
-#if __has_feature(is_convertible_to) && !defined(_LIBCPP_USE_IS_CONVERTIBLE_FALLBACK)
-
-template <class _T1, class _T2> struct _LIBCPP_TEMPLATE_VIS is_convertible
- : public integral_constant<bool, __is_convertible_to(_T1, _T2) &&
- !is_abstract<_T2>::value> {};
-
-#else // __has_feature(is_convertible_to)
-
-namespace __is_convertible_imp
-{
-template <class _Tp> void __test_convert(_Tp);
-
-template <class _From, class _To, class = void>
-struct __is_convertible_test : public false_type {};
-
-template <class _From, class _To>
-struct __is_convertible_test<_From, _To,
- decltype(_VSTD::__is_convertible_imp::__test_convert<_To>(_VSTD::declval<_From>()))> : public true_type
-{};
-
-template <class _Tp, bool _IsArray = is_array<_Tp>::value,
- bool _IsFunction = is_function<_Tp>::value,
- bool _IsVoid = is_void<_Tp>::value>
- struct __is_array_function_or_void {enum {value = 0};};
-template <class _Tp> struct __is_array_function_or_void<_Tp, true, false, false> {enum {value = 1};};
-template <class _Tp> struct __is_array_function_or_void<_Tp, false, true, false> {enum {value = 2};};
-template <class _Tp> struct __is_array_function_or_void<_Tp, false, false, true> {enum {value = 3};};
-}
-
-template <class _Tp,
- unsigned = __is_convertible_imp::__is_array_function_or_void<typename remove_reference<_Tp>::type>::value>
-struct __is_convertible_check
-{
- static const size_t __v = 0;
-};
-
-template <class _Tp>
-struct __is_convertible_check<_Tp, 0>
-{
- static const size_t __v = sizeof(_Tp);
-};
-
-template <class _T1, class _T2,
- unsigned _T1_is_array_function_or_void = __is_convertible_imp::__is_array_function_or_void<_T1>::value,
- unsigned _T2_is_array_function_or_void = __is_convertible_imp::__is_array_function_or_void<_T2>::value>
-struct __is_convertible
- : public integral_constant<bool,
- __is_convertible_imp::__is_convertible_test<_T1, _T2>::value
-#if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
- && !(!is_function<_T1>::value && !is_reference<_T1>::value && is_reference<_T2>::value
- && (!is_const<typename remove_reference<_T2>::type>::value
- || is_volatile<typename remove_reference<_T2>::type>::value)
- && (is_same<typename remove_cv<_T1>::type,
- typename remove_cv<typename remove_reference<_T2>::type>::type>::value
- || is_base_of<typename remove_reference<_T2>::type, _T1>::value))
-#endif
- >
-{};
-
-template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 0, 1> : public false_type {};
-template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 1> : public false_type {};
-template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 1> : public false_type {};
-template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 1> : public false_type {};
-
-template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 0, 2> : public false_type {};
-template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 2> : public false_type {};
-template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 2> : public false_type {};
-template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 2> : public false_type {};
-
-template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 0, 3> : public false_type {};
-template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 3> : public false_type {};
-template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 3> : public false_type {};
-template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 3> : public true_type {};
-
-template <class _T1, class _T2> struct _LIBCPP_TEMPLATE_VIS is_convertible
- : public __is_convertible<_T1, _T2>
-{
- static const size_t __complete_check1 = __is_convertible_check<_T1>::__v;
- static const size_t __complete_check2 = __is_convertible_check<_T2>::__v;
-};
-
-#endif // __has_feature(is_convertible_to)
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _From, class _To>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_convertible_v
- = is_convertible<_From, _To>::value;
-#endif
-
-// is_empty
-
-#if __has_feature(is_empty) || (_GNUC_VER >= 407)
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_empty
- : public integral_constant<bool, __is_empty(_Tp)> {};
-
-#else // __has_feature(is_empty)
-
-template <class _Tp>
-struct __is_empty1
- : public _Tp
-{
- double __lx;
-};
-
-struct __is_empty2
-{
- double __lx;
-};
-
-template <class _Tp, bool = is_class<_Tp>::value>
-struct __libcpp_empty : public integral_constant<bool, sizeof(__is_empty1<_Tp>) == sizeof(__is_empty2)> {};
-
-template <class _Tp> struct __libcpp_empty<_Tp, false> : public false_type {};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_empty : public __libcpp_empty<_Tp> {};
-
-#endif // __has_feature(is_empty)
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_empty_v
- = is_empty<_Tp>::value;
-#endif
-
-// is_polymorphic
-
-#if __has_feature(is_polymorphic) || defined(_LIBCPP_COMPILER_MSVC)
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_polymorphic
- : public integral_constant<bool, __is_polymorphic(_Tp)> {};
-
-#else
-
-template<typename _Tp> char &__is_polymorphic_impl(
- typename enable_if<sizeof((_Tp*)dynamic_cast<const volatile void*>(declval<_Tp*>())) != 0,
- int>::type);
-template<typename _Tp> __two &__is_polymorphic_impl(...);
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_polymorphic
- : public integral_constant<bool, sizeof(__is_polymorphic_impl<_Tp>(0)) == 1> {};
-
-#endif // __has_feature(is_polymorphic)
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_polymorphic_v
- = is_polymorphic<_Tp>::value;
-#endif
-
-// has_virtual_destructor
-
-#if __has_feature(has_virtual_destructor) || (_GNUC_VER >= 403)
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS has_virtual_destructor
- : public integral_constant<bool, __has_virtual_destructor(_Tp)> {};
-
-#else
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS has_virtual_destructor
- : public false_type {};
-
-#endif
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool has_virtual_destructor_v
- = has_virtual_destructor<_Tp>::value;
-#endif
-
-// has_unique_object_representations
-
-#if _LIBCPP_STD_VER > 14 && defined(_LIBCPP_HAS_UNIQUE_OBJECT_REPRESENTATIONS)
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS has_unique_object_representations
- : public integral_constant<bool,
- __has_unique_object_representations(remove_cv_t<remove_all_extents_t<_Tp>>)> {};
-
-#if !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool has_unique_object_representations_v
- = has_unique_object_representations<_Tp>::value;
-#endif
-
-#endif
-
-// alignment_of
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS alignment_of
- : public integral_constant<size_t, _LIBCPP_ALIGNOF(_Tp)> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR size_t alignment_of_v
- = alignment_of<_Tp>::value;
-#endif
-
-// aligned_storage
-
-template <class _Hp, class _Tp>
-struct __type_list
-{
- typedef _Hp _Head;
- typedef _Tp _Tail;
-};
-
-struct __nat
-{
-#ifndef _LIBCPP_CXX03_LANG
- __nat() = delete;
- __nat(const __nat&) = delete;
- __nat& operator=(const __nat&) = delete;
- ~__nat() = delete;
-#endif
-};
-
-template <class _Tp>
-struct __align_type
-{
- static const size_t value = _LIBCPP_PREFERRED_ALIGNOF(_Tp);
- typedef _Tp type;
-};
-
-struct __struct_double {long double __lx;};
-struct __struct_double4 {double __lx[4];};
-
-typedef
- __type_list<__align_type<unsigned char>,
- __type_list<__align_type<unsigned short>,
- __type_list<__align_type<unsigned int>,
- __type_list<__align_type<unsigned long>,
- __type_list<__align_type<unsigned long long>,
- __type_list<__align_type<double>,
- __type_list<__align_type<long double>,
- __type_list<__align_type<__struct_double>,
- __type_list<__align_type<__struct_double4>,
- __type_list<__align_type<int*>,
- __nat
- > > > > > > > > > > __all_types;
-
-template <class _TL, size_t _Align> struct __find_pod;
-
-template <class _Hp, size_t _Align>
-struct __find_pod<__type_list<_Hp, __nat>, _Align>
-{
- typedef typename conditional<
- _Align == _Hp::value,
- typename _Hp::type,
- void
- >::type type;
-};
-
-template <class _Hp, class _Tp, size_t _Align>
-struct __find_pod<__type_list<_Hp, _Tp>, _Align>
-{
- typedef typename conditional<
- _Align == _Hp::value,
- typename _Hp::type,
- typename __find_pod<_Tp, _Align>::type
- >::type type;
-};
-
-template <class _TL, size_t _Len> struct __find_max_align;
-
-template <class _Hp, size_t _Len>
-struct __find_max_align<__type_list<_Hp, __nat>, _Len> : public integral_constant<size_t, _Hp::value> {};
-
-template <size_t _Len, size_t _A1, size_t _A2>
-struct __select_align
-{
-private:
- static const size_t __min = _A2 < _A1 ? _A2 : _A1;
- static const size_t __max = _A1 < _A2 ? _A2 : _A1;
-public:
- static const size_t value = _Len < __max ? __min : __max;
-};
-
-template <class _Hp, class _Tp, size_t _Len>
-struct __find_max_align<__type_list<_Hp, _Tp>, _Len>
- : public integral_constant<size_t, __select_align<_Len, _Hp::value, __find_max_align<_Tp, _Len>::value>::value> {};
-
-template <size_t _Len, size_t _Align = __find_max_align<__all_types, _Len>::value>
-struct _LIBCPP_TEMPLATE_VIS aligned_storage
-{
- typedef typename __find_pod<__all_types, _Align>::type _Aligner;
- static_assert(!is_void<_Aligner>::value, "");
- union type
- {
- _Aligner __align;
- unsigned char __data[(_Len + _Align - 1)/_Align * _Align];
- };
-};
-
-#if _LIBCPP_STD_VER > 11
-template <size_t _Len, size_t _Align = __find_max_align<__all_types, _Len>::value>
- using aligned_storage_t = typename aligned_storage<_Len, _Align>::type;
-#endif
-
-#define _CREATE_ALIGNED_STORAGE_SPECIALIZATION(n) \
-template <size_t _Len>\
-struct _LIBCPP_TEMPLATE_VIS aligned_storage<_Len, n>\
-{\
- struct _ALIGNAS(n) type\
- {\
- unsigned char __lx[(_Len + n - 1)/n * n];\
- };\
-}
-
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x1);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x2);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x4);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x8);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x10);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x20);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x40);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x80);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x100);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x200);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x400);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x800);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x1000);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x2000);
-// PE/COFF does not support alignment beyond 8192 (=0x2000)
-#if !defined(_LIBCPP_OBJECT_FORMAT_COFF)
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x4000);
-#endif // !defined(_LIBCPP_OBJECT_FORMAT_COFF)
-
-#undef _CREATE_ALIGNED_STORAGE_SPECIALIZATION
-
-#ifndef _LIBCPP_HAS_NO_VARIADICS
-
-// aligned_union
-
-template <size_t _I0, size_t ..._In>
-struct __static_max;
-
-template <size_t _I0>
-struct __static_max<_I0>
-{
- static const size_t value = _I0;
-};
-
-template <size_t _I0, size_t _I1, size_t ..._In>
-struct __static_max<_I0, _I1, _In...>
-{
- static const size_t value = _I0 >= _I1 ? __static_max<_I0, _In...>::value :
- __static_max<_I1, _In...>::value;
-};
-
-template <size_t _Len, class _Type0, class ..._Types>
-struct aligned_union
-{
- static const size_t alignment_value = __static_max<_LIBCPP_PREFERRED_ALIGNOF(_Type0),
- _LIBCPP_PREFERRED_ALIGNOF(_Types)...>::value;
- static const size_t __len = __static_max<_Len, sizeof(_Type0),
- sizeof(_Types)...>::value;
- typedef typename aligned_storage<__len, alignment_value>::type type;
-};
-
-#if _LIBCPP_STD_VER > 11
-template <size_t _Len, class ..._Types> using aligned_union_t = typename aligned_union<_Len, _Types...>::type;
-#endif
-
-#endif // _LIBCPP_HAS_NO_VARIADICS
-
-template <class _Tp>
-struct __numeric_type
-{
- static void __test(...);
- static float __test(float);
- static double __test(char);
- static double __test(int);
- static double __test(unsigned);
- static double __test(long);
- static double __test(unsigned long);
- static double __test(long long);
- static double __test(unsigned long long);
- static double __test(double);
- static long double __test(long double);
-
- typedef decltype(__test(declval<_Tp>())) type;
- static const bool value = !is_same<type, void>::value;
-};
-
-template <>
-struct __numeric_type<void>
-{
- static const bool value = true;
-};
-
-// __promote
-
-template <class _A1, class _A2 = void, class _A3 = void,
- bool = __numeric_type<_A1>::value &&
- __numeric_type<_A2>::value &&
- __numeric_type<_A3>::value>
-class __promote_imp
-{
-public:
- static const bool value = false;
-};
-
-template <class _A1, class _A2, class _A3>
-class __promote_imp<_A1, _A2, _A3, true>
-{
-private:
- typedef typename __promote_imp<_A1>::type __type1;
- typedef typename __promote_imp<_A2>::type __type2;
- typedef typename __promote_imp<_A3>::type __type3;
-public:
- typedef decltype(__type1() + __type2() + __type3()) type;
- static const bool value = true;
-};
-
-template <class _A1, class _A2>
-class __promote_imp<_A1, _A2, void, true>
-{
-private:
- typedef typename __promote_imp<_A1>::type __type1;
- typedef typename __promote_imp<_A2>::type __type2;
-public:
- typedef decltype(__type1() + __type2()) type;
- static const bool value = true;
-};
-
-template <class _A1>
-class __promote_imp<_A1, void, void, true>
-{
-public:
- typedef typename __numeric_type<_A1>::type type;
- static const bool value = true;
-};
-
-template <class _A1, class _A2 = void, class _A3 = void>
-class __promote : public __promote_imp<_A1, _A2, _A3> {};
-
-// make_signed / make_unsigned
-
-typedef
- __type_list<signed char,
- __type_list<signed short,
- __type_list<signed int,
- __type_list<signed long,
- __type_list<signed long long,
-#ifndef _LIBCPP_HAS_NO_INT128
- __type_list<__int128_t,
-#endif
- __nat
-#ifndef _LIBCPP_HAS_NO_INT128
- >
-#endif
- > > > > > __signed_types;
-
-typedef
- __type_list<unsigned char,
- __type_list<unsigned short,
- __type_list<unsigned int,
- __type_list<unsigned long,
- __type_list<unsigned long long,
-#ifndef _LIBCPP_HAS_NO_INT128
- __type_list<__uint128_t,
-#endif
- __nat
-#ifndef _LIBCPP_HAS_NO_INT128
- >
-#endif
- > > > > > __unsigned_types;
-
-template <class _TypeList, size_t _Size, bool = _Size <= sizeof(typename _TypeList::_Head)> struct __find_first;
-
-template <class _Hp, class _Tp, size_t _Size>
-struct __find_first<__type_list<_Hp, _Tp>, _Size, true>
-{
- typedef _Hp type;
-};
-
-template <class _Hp, class _Tp, size_t _Size>
-struct __find_first<__type_list<_Hp, _Tp>, _Size, false>
-{
- typedef typename __find_first<_Tp, _Size>::type type;
-};
-
-template <class _Tp, class _Up, bool = is_const<typename remove_reference<_Tp>::type>::value,
- bool = is_volatile<typename remove_reference<_Tp>::type>::value>
-struct __apply_cv
-{
- typedef _Up type;
-};
-
-template <class _Tp, class _Up>
-struct __apply_cv<_Tp, _Up, true, false>
-{
- typedef const _Up type;
-};
-
-template <class _Tp, class _Up>
-struct __apply_cv<_Tp, _Up, false, true>
-{
- typedef volatile _Up type;
-};
-
-template <class _Tp, class _Up>
-struct __apply_cv<_Tp, _Up, true, true>
-{
- typedef const volatile _Up type;
-};
-
-template <class _Tp, class _Up>
-struct __apply_cv<_Tp&, _Up, false, false>
-{
- typedef _Up& type;
-};
-
-template <class _Tp, class _Up>
-struct __apply_cv<_Tp&, _Up, true, false>
-{
- typedef const _Up& type;
-};
-
-template <class _Tp, class _Up>
-struct __apply_cv<_Tp&, _Up, false, true>
-{
- typedef volatile _Up& type;
-};
-
-template <class _Tp, class _Up>
-struct __apply_cv<_Tp&, _Up, true, true>
-{
- typedef const volatile _Up& type;
-};
-
-template <class _Tp, bool = is_integral<_Tp>::value || is_enum<_Tp>::value>
-struct __make_signed {};
-
-template <class _Tp>
-struct __make_signed<_Tp, true>
-{
- typedef typename __find_first<__signed_types, sizeof(_Tp)>::type type;
-};
-
-template <> struct __make_signed<bool, true> {};
-template <> struct __make_signed< signed short, true> {typedef short type;};
-template <> struct __make_signed<unsigned short, true> {typedef short type;};
-template <> struct __make_signed< signed int, true> {typedef int type;};
-template <> struct __make_signed<unsigned int, true> {typedef int type;};
-template <> struct __make_signed< signed long, true> {typedef long type;};
-template <> struct __make_signed<unsigned long, true> {typedef long type;};
-template <> struct __make_signed< signed long long, true> {typedef long long type;};
-template <> struct __make_signed<unsigned long long, true> {typedef long long type;};
-#ifndef _LIBCPP_HAS_NO_INT128
-template <> struct __make_signed<__int128_t, true> {typedef __int128_t type;};
-template <> struct __make_signed<__uint128_t, true> {typedef __int128_t type;};
-#endif
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS make_signed
-{
- typedef typename __apply_cv<_Tp, typename __make_signed<typename remove_cv<_Tp>::type>::type>::type type;
-};
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using make_signed_t = typename make_signed<_Tp>::type;
-#endif
-
-template <class _Tp, bool = is_integral<_Tp>::value || is_enum<_Tp>::value>
-struct __make_unsigned {};
-
-template <class _Tp>
-struct __make_unsigned<_Tp, true>
-{
- typedef typename __find_first<__unsigned_types, sizeof(_Tp)>::type type;
-};
-
-template <> struct __make_unsigned<bool, true> {};
-template <> struct __make_unsigned< signed short, true> {typedef unsigned short type;};
-template <> struct __make_unsigned<unsigned short, true> {typedef unsigned short type;};
-template <> struct __make_unsigned< signed int, true> {typedef unsigned int type;};
-template <> struct __make_unsigned<unsigned int, true> {typedef unsigned int type;};
-template <> struct __make_unsigned< signed long, true> {typedef unsigned long type;};
-template <> struct __make_unsigned<unsigned long, true> {typedef unsigned long type;};
-template <> struct __make_unsigned< signed long long, true> {typedef unsigned long long type;};
-template <> struct __make_unsigned<unsigned long long, true> {typedef unsigned long long type;};
-#ifndef _LIBCPP_HAS_NO_INT128
-template <> struct __make_unsigned<__int128_t, true> {typedef __uint128_t type;};
-template <> struct __make_unsigned<__uint128_t, true> {typedef __uint128_t type;};
-#endif
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS make_unsigned
-{
- typedef typename __apply_cv<_Tp, typename __make_unsigned<typename remove_cv<_Tp>::type>::type>::type type;
-};
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using make_unsigned_t = typename make_unsigned<_Tp>::type;
-#endif
-
-#ifdef _LIBCPP_HAS_NO_VARIADICS
-
-template <class _Tp, class _Up = void, class _Vp = void>
-struct _LIBCPP_TEMPLATE_VIS common_type
-{
-public:
- typedef typename common_type<typename common_type<_Tp, _Up>::type, _Vp>::type type;
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS common_type<void, void, void>
-{
-public:
- typedef void type;
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS common_type<_Tp, void, void>
-{
-public:
- typedef typename common_type<_Tp, _Tp>::type type;
-};
-
-template <class _Tp, class _Up>
-struct _LIBCPP_TEMPLATE_VIS common_type<_Tp, _Up, void>
-{
- typedef typename decay<decltype(
- true ? _VSTD::declval<_Tp>() : _VSTD::declval<_Up>()
- )>::type type;
-};
-
-#else // _LIBCPP_HAS_NO_VARIADICS
-
-// bullet 1 - sizeof...(Tp) == 0
-
-template <class ..._Tp>
-struct _LIBCPP_TEMPLATE_VIS common_type {};
-
-// bullet 2 - sizeof...(Tp) == 1
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS common_type<_Tp>
- : public common_type<_Tp, _Tp> {};
-
-// bullet 3 - sizeof...(Tp) == 2
-
-template <class _Tp, class _Up, class = void>
-struct __common_type2_imp {};
-
-template <class _Tp, class _Up>
-struct __common_type2_imp<_Tp, _Up,
- typename __void_t<decltype(
- true ? _VSTD::declval<_Tp>() : _VSTD::declval<_Up>()
- )>::type>
-{
- typedef typename decay<decltype(
- true ? _VSTD::declval<_Tp>() : _VSTD::declval<_Up>()
- )>::type type;
-};
-
-template <class _Tp, class _Up,
- class _DTp = typename decay<_Tp>::type,
- class _DUp = typename decay<_Up>::type>
-using __common_type2 =
- typename conditional<
- is_same<_Tp, _DTp>::value && is_same<_Up, _DUp>::value,
- __common_type2_imp<_Tp, _Up>,
- common_type<_DTp, _DUp>
- >::type;
-
-template <class _Tp, class _Up>
-struct _LIBCPP_TEMPLATE_VIS common_type<_Tp, _Up>
- : __common_type2<_Tp, _Up> {};
-
-// bullet 4 - sizeof...(Tp) > 2
-
-template <class ...Tp> struct __common_types;
-
-template <class, class = void>
-struct __common_type_impl {};
-
-template <class _Tp, class _Up>
-struct __common_type_impl<
- __common_types<_Tp, _Up>,
- typename __void_t<typename common_type<_Tp, _Up>::type>::type>
-{
- typedef typename common_type<_Tp, _Up>::type type;
-};
-
-template <class _Tp, class _Up, class ..._Vp>
-struct __common_type_impl<__common_types<_Tp, _Up, _Vp...>,
- typename __void_t<typename common_type<_Tp, _Up>::type>::type>
- : __common_type_impl<
- __common_types<typename common_type<_Tp, _Up>::type, _Vp...> >
-{
-
-};
-
-template <class _Tp, class _Up, class ..._Vp>
-struct _LIBCPP_TEMPLATE_VIS common_type<_Tp, _Up, _Vp...>
- : __common_type_impl<__common_types<_Tp, _Up, _Vp...> > {};
-
-#if _LIBCPP_STD_VER > 11
-template <class ..._Tp> using common_type_t = typename common_type<_Tp...>::type;
-#endif
-
-#endif // _LIBCPP_HAS_NO_VARIADICS
-
-// is_assignable
-
-template<typename, typename _Tp> struct __select_2nd { typedef _Tp type; };
-
-template <class _Tp, class _Arg>
-typename __select_2nd<decltype((_VSTD::declval<_Tp>() = _VSTD::declval<_Arg>())), true_type>::type
-__is_assignable_test(int);
-
-template <class, class>
-false_type __is_assignable_test(...);
-
-
-template <class _Tp, class _Arg, bool = is_void<_Tp>::value || is_void<_Arg>::value>
-struct __is_assignable_imp
- : public decltype((_VSTD::__is_assignable_test<_Tp, _Arg>(0))) {};
-
-template <class _Tp, class _Arg>
-struct __is_assignable_imp<_Tp, _Arg, true>
- : public false_type
-{
-};
-
-template <class _Tp, class _Arg>
-struct is_assignable
- : public __is_assignable_imp<_Tp, _Arg> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp, class _Arg>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_assignable_v
- = is_assignable<_Tp, _Arg>::value;
-#endif
-
-// is_copy_assignable
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_copy_assignable
- : public is_assignable<typename add_lvalue_reference<_Tp>::type,
- typename add_lvalue_reference<typename add_const<_Tp>::type>::type> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_copy_assignable_v
- = is_copy_assignable<_Tp>::value;
-#endif
-
-// is_move_assignable
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_move_assignable
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- : public is_assignable<typename add_lvalue_reference<_Tp>::type,
- typename add_rvalue_reference<_Tp>::type> {};
-#else
- : public is_copy_assignable<_Tp> {};
-#endif
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_move_assignable_v
- = is_move_assignable<_Tp>::value;
-#endif
-
-// is_destructible
-
-// if it's a reference, return true
-// if it's a function, return false
-// if it's void, return false
-// if it's an array of unknown bound, return false
-// Otherwise, return "std::declval<_Up&>().~_Up()" is well-formed
-// where _Up is remove_all_extents<_Tp>::type
-
-template <class>
-struct __is_destructible_apply { typedef int type; };
-
-template <typename _Tp>
-struct __is_destructor_wellformed {
- template <typename _Tp1>
- static char __test (
- typename __is_destructible_apply<decltype(_VSTD::declval<_Tp1&>().~_Tp1())>::type
- );
-
- template <typename _Tp1>
- static __two __test (...);
-
- static const bool value = sizeof(__test<_Tp>(12)) == sizeof(char);
-};
-
-template <class _Tp, bool>
-struct __destructible_imp;
-
-template <class _Tp>
-struct __destructible_imp<_Tp, false>
- : public _VSTD::integral_constant<bool,
- __is_destructor_wellformed<typename _VSTD::remove_all_extents<_Tp>::type>::value> {};
-
-template <class _Tp>
-struct __destructible_imp<_Tp, true>
- : public _VSTD::true_type {};
-
-template <class _Tp, bool>
-struct __destructible_false;
-
-template <class _Tp>
-struct __destructible_false<_Tp, false> : public __destructible_imp<_Tp, _VSTD::is_reference<_Tp>::value> {};
-
-template <class _Tp>
-struct __destructible_false<_Tp, true> : public _VSTD::false_type {};
-
-template <class _Tp>
-struct is_destructible
- : public __destructible_false<_Tp, _VSTD::is_function<_Tp>::value> {};
-
-template <class _Tp>
-struct is_destructible<_Tp[]>
- : public _VSTD::false_type {};
-
-template <>
-struct is_destructible<void>
- : public _VSTD::false_type {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_destructible_v
- = is_destructible<_Tp>::value;
-#endif
-
-// move
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-typename remove_reference<_Tp>::type&&
-move(_Tp&& __t) _NOEXCEPT
-{
- typedef typename remove_reference<_Tp>::type _Up;
- return static_cast<_Up&&>(__t);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-_Tp&&
-forward(typename remove_reference<_Tp>::type& __t) _NOEXCEPT
-{
- return static_cast<_Tp&&>(__t);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-_Tp&&
-forward(typename remove_reference<_Tp>::type&& __t) _NOEXCEPT
-{
- static_assert(!is_lvalue_reference<_Tp>::value,
- "can not forward an rvalue as an lvalue");
- return static_cast<_Tp&&>(__t);
-}
-
-#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp&
-move(_Tp& __t)
-{
- return __t;
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-const _Tp&
-move(const _Tp& __t)
-{
- return __t;
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp&
-forward(typename remove_reference<_Tp>::type& __t) _NOEXCEPT
-{
- return __t;
-}
-
-
-template <class _Tp>
-class __rv
-{
- typedef typename remove_reference<_Tp>::type _Trr;
- _Trr& t_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- _Trr* operator->() {return &t_;}
- _LIBCPP_INLINE_VISIBILITY
- explicit __rv(_Trr& __t) : t_(__t) {}
-};
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename decay<_Tp>::type
-__decay_copy(_Tp&& __t)
-{
- return _VSTD::forward<_Tp>(__t);
-}
-
-#else
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename decay<_Tp>::type
-__decay_copy(const _Tp& __t)
-{
- return _VSTD::forward<_Tp>(__t);
-}
-
-#endif
-
-#ifndef _LIBCPP_HAS_NO_VARIADICS
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...), true, false>
-{
- typedef _Class _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...), true, false>
-{
- typedef _Class _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param..., ...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const, true, false>
-{
- typedef _Class const _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const, true, false>
-{
- typedef _Class const _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param..., ...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile, true, false>
-{
- typedef _Class volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) volatile, true, false>
-{
- typedef _Class volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param..., ...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile, true, false>
-{
- typedef _Class const volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const volatile, true, false>
-{
- typedef _Class const volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param..., ...);
-};
-
-#if __has_feature(cxx_reference_qualified_functions) || \
- (defined(_GNUC_VER) && _GNUC_VER >= 409)
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) &, true, false>
-{
- typedef _Class& _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) &, true, false>
-{
- typedef _Class& _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param..., ...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&, true, false>
-{
- typedef _Class const& _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const&, true, false>
-{
- typedef _Class const& _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param..., ...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&, true, false>
-{
- typedef _Class volatile& _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) volatile&, true, false>
-{
- typedef _Class volatile& _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param..., ...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&, true, false>
-{
- typedef _Class const volatile& _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const volatile&, true, false>
-{
- typedef _Class const volatile& _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param..., ...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) &&, true, false>
-{
- typedef _Class&& _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) &&, true, false>
-{
- typedef _Class&& _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param..., ...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&&, true, false>
-{
- typedef _Class const&& _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const&&, true, false>
-{
- typedef _Class const&& _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param..., ...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&&, true, false>
-{
- typedef _Class volatile&& _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) volatile&&, true, false>
-{
- typedef _Class volatile&& _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param..., ...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&&, true, false>
-{
- typedef _Class const volatile&& _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param...);
-};
-
-template <class _Rp, class _Class, class ..._Param>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const volatile&&, true, false>
-{
- typedef _Class const volatile&& _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_Param..., ...);
-};
-
-#endif // __has_feature(cxx_reference_qualified_functions) || _GNUC_VER >= 409
-
-#else // _LIBCPP_HAS_NO_VARIADICS
-
-template <class _Rp, class _Class>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(), true, false>
-{
- typedef _Class _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) ();
-};
-
-template <class _Rp, class _Class>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(...), true, false>
-{
- typedef _Class _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (...);
-};
-
-template <class _Rp, class _Class, class _P0>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0), true, false>
-{
- typedef _Class _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0);
-};
-
-template <class _Rp, class _Class, class _P0>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, ...), true, false>
-{
- typedef _Class _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, ...);
-};
-
-template <class _Rp, class _Class, class _P0, class _P1>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1), true, false>
-{
- typedef _Class _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, _P1);
-};
-
-template <class _Rp, class _Class, class _P0, class _P1>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, ...), true, false>
-{
- typedef _Class _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, _P1, ...);
-};
-
-template <class _Rp, class _Class, class _P0, class _P1, class _P2>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2), true, false>
-{
- typedef _Class _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, _P1, _P2);
-};
-
-template <class _Rp, class _Class, class _P0, class _P1, class _P2>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2, ...), true, false>
-{
- typedef _Class _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, _P1, _P2, ...);
-};
-
-template <class _Rp, class _Class>
-struct __member_pointer_traits_imp<_Rp (_Class::*)() const, true, false>
-{
- typedef _Class const _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) ();
-};
-
-template <class _Rp, class _Class>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(...) const, true, false>
-{
- typedef _Class const _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (...);
-};
-
-template <class _Rp, class _Class, class _P0>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) const, true, false>
-{
- typedef _Class const _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0);
-};
-
-template <class _Rp, class _Class, class _P0>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, ...) const, true, false>
-{
- typedef _Class const _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, ...);
-};
-
-template <class _Rp, class _Class, class _P0, class _P1>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) const, true, false>
-{
- typedef _Class const _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, _P1);
-};
-
-template <class _Rp, class _Class, class _P0, class _P1>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, ...) const, true, false>
-{
- typedef _Class const _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, _P1, ...);
-};
-
-template <class _Rp, class _Class, class _P0, class _P1, class _P2>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) const, true, false>
-{
- typedef _Class const _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, _P1, _P2);
-};
-
-template <class _Rp, class _Class, class _P0, class _P1, class _P2>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2, ...) const, true, false>
-{
- typedef _Class const _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, _P1, _P2, ...);
-};
-
-template <class _Rp, class _Class>
-struct __member_pointer_traits_imp<_Rp (_Class::*)() volatile, true, false>
-{
- typedef _Class volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) ();
-};
-
-template <class _Rp, class _Class>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(...) volatile, true, false>
-{
- typedef _Class volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (...);
-};
-
-template <class _Rp, class _Class, class _P0>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) volatile, true, false>
-{
- typedef _Class volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0);
-};
-
-template <class _Rp, class _Class, class _P0>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, ...) volatile, true, false>
-{
- typedef _Class volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, ...);
-};
-
-template <class _Rp, class _Class, class _P0, class _P1>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) volatile, true, false>
-{
- typedef _Class volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, _P1);
-};
-
-template <class _Rp, class _Class, class _P0, class _P1>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, ...) volatile, true, false>
-{
- typedef _Class volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, _P1, ...);
-};
-
-template <class _Rp, class _Class, class _P0, class _P1, class _P2>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) volatile, true, false>
-{
- typedef _Class volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, _P1, _P2);
-};
-
-template <class _Rp, class _Class, class _P0, class _P1, class _P2>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2, ...) volatile, true, false>
-{
- typedef _Class volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, _P1, _P2, ...);
-};
-
-template <class _Rp, class _Class>
-struct __member_pointer_traits_imp<_Rp (_Class::*)() const volatile, true, false>
-{
- typedef _Class const volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) ();
-};
-
-template <class _Rp, class _Class>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(...) const volatile, true, false>
-{
- typedef _Class const volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (...);
-};
-
-template <class _Rp, class _Class, class _P0>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) const volatile, true, false>
-{
- typedef _Class const volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0);
-};
-
-template <class _Rp, class _Class, class _P0>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, ...) const volatile, true, false>
-{
- typedef _Class const volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, ...);
-};
-
-template <class _Rp, class _Class, class _P0, class _P1>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) const volatile, true, false>
-{
- typedef _Class const volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, _P1);
-};
-
-template <class _Rp, class _Class, class _P0, class _P1>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, ...) const volatile, true, false>
-{
- typedef _Class const volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, _P1, ...);
-};
-
-template <class _Rp, class _Class, class _P0, class _P1, class _P2>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) const volatile, true, false>
-{
- typedef _Class const volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, _P1, _P2);
-};
-
-template <class _Rp, class _Class, class _P0, class _P1, class _P2>
-struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2, ...) const volatile, true, false>
-{
- typedef _Class const volatile _ClassType;
- typedef _Rp _ReturnType;
- typedef _Rp (_FnType) (_P0, _P1, _P2, ...);
-};
-
-#endif // _LIBCPP_HAS_NO_VARIADICS
-
-template <class _Rp, class _Class>
-struct __member_pointer_traits_imp<_Rp _Class::*, false, true>
-{
- typedef _Class _ClassType;
- typedef _Rp _ReturnType;
-};
-
-template <class _MP>
-struct __member_pointer_traits
- : public __member_pointer_traits_imp<typename remove_cv<_MP>::type,
- is_member_function_pointer<_MP>::value,
- is_member_object_pointer<_MP>::value>
-{
-// typedef ... _ClassType;
-// typedef ... _ReturnType;
-// typedef ... _FnType;
-};
-
-
-template <class _DecayedFp>
-struct __member_pointer_class_type {};
-
-template <class _Ret, class _ClassType>
-struct __member_pointer_class_type<_Ret _ClassType::*> {
- typedef _ClassType type;
-};
-
-// result_of
-
-template <class _Callable> class result_of;
-
-#ifdef _LIBCPP_HAS_NO_VARIADICS
-
-template <class _Fn, bool, bool>
-class __result_of
-{
-};
-
-template <class _Fn>
-class __result_of<_Fn(), true, false>
-{
-public:
- typedef decltype(declval<_Fn>()()) type;
-};
-
-template <class _Fn, class _A0>
-class __result_of<_Fn(_A0), true, false>
-{
-public:
- typedef decltype(declval<_Fn>()(declval<_A0>())) type;
-};
-
-template <class _Fn, class _A0, class _A1>
-class __result_of<_Fn(_A0, _A1), true, false>
-{
-public:
- typedef decltype(declval<_Fn>()(declval<_A0>(), declval<_A1>())) type;
-};
-
-template <class _Fn, class _A0, class _A1, class _A2>
-class __result_of<_Fn(_A0, _A1, _A2), true, false>
-{
-public:
- typedef decltype(declval<_Fn>()(declval<_A0>(), declval<_A1>(), declval<_A2>())) type;
-};
-
-template <class _MP, class _Tp, bool _IsMemberFunctionPtr>
-struct __result_of_mp;
-
-// member function pointer
-
-template <class _MP, class _Tp>
-struct __result_of_mp<_MP, _Tp, true>
- : public __identity<typename __member_pointer_traits<_MP>::_ReturnType>
-{
-};
-
-// member data pointer
-
-template <class _MP, class _Tp, bool>
-struct __result_of_mdp;
-
-template <class _Rp, class _Class, class _Tp>
-struct __result_of_mdp<_Rp _Class::*, _Tp, false>
-{
- typedef typename __apply_cv<decltype(*_VSTD::declval<_Tp>()), _Rp>::type& type;
-};
-
-template <class _Rp, class _Class, class _Tp>
-struct __result_of_mdp<_Rp _Class::*, _Tp, true>
-{
- typedef typename __apply_cv<_Tp, _Rp>::type& type;
-};
-
-template <class _Rp, class _Class, class _Tp>
-struct __result_of_mp<_Rp _Class::*, _Tp, false>
- : public __result_of_mdp<_Rp _Class::*, _Tp,
- is_base_of<_Class, typename remove_reference<_Tp>::type>::value>
-{
-};
-
-
-
-template <class _Fn, class _Tp>
-class __result_of<_Fn(_Tp), false, true> // _Fn must be member pointer
- : public __result_of_mp<typename remove_reference<_Fn>::type,
- _Tp,
- is_member_function_pointer<typename remove_reference<_Fn>::type>::value>
-{
-};
-
-template <class _Fn, class _Tp, class _A0>
-class __result_of<_Fn(_Tp, _A0), false, true> // _Fn must be member pointer
- : public __result_of_mp<typename remove_reference<_Fn>::type,
- _Tp,
- is_member_function_pointer<typename remove_reference<_Fn>::type>::value>
-{
-};
-
-template <class _Fn, class _Tp, class _A0, class _A1>
-class __result_of<_Fn(_Tp, _A0, _A1), false, true> // _Fn must be member pointer
- : public __result_of_mp<typename remove_reference<_Fn>::type,
- _Tp,
- is_member_function_pointer<typename remove_reference<_Fn>::type>::value>
-{
-};
-
-template <class _Fn, class _Tp, class _A0, class _A1, class _A2>
-class __result_of<_Fn(_Tp, _A0, _A1, _A2), false, true> // _Fn must be member pointer
- : public __result_of_mp<typename remove_reference<_Fn>::type,
- _Tp,
- is_member_function_pointer<typename remove_reference<_Fn>::type>::value>
-{
-};
-
-// result_of
-
-template <class _Fn>
-class _LIBCPP_TEMPLATE_VIS result_of<_Fn()>
- : public __result_of<_Fn(),
- is_class<typename remove_reference<_Fn>::type>::value ||
- is_function<typename remove_pointer<typename remove_reference<_Fn>::type>::type>::value,
- is_member_pointer<typename remove_reference<_Fn>::type>::value
- >
-{
-};
-
-template <class _Fn, class _A0>
-class _LIBCPP_TEMPLATE_VIS result_of<_Fn(_A0)>
- : public __result_of<_Fn(_A0),
- is_class<typename remove_reference<_Fn>::type>::value ||
- is_function<typename remove_pointer<typename remove_reference<_Fn>::type>::type>::value,
- is_member_pointer<typename remove_reference<_Fn>::type>::value
- >
-{
-};
-
-template <class _Fn, class _A0, class _A1>
-class _LIBCPP_TEMPLATE_VIS result_of<_Fn(_A0, _A1)>
- : public __result_of<_Fn(_A0, _A1),
- is_class<typename remove_reference<_Fn>::type>::value ||
- is_function<typename remove_pointer<typename remove_reference<_Fn>::type>::type>::value,
- is_member_pointer<typename remove_reference<_Fn>::type>::value
- >
-{
-};
-
-template <class _Fn, class _A0, class _A1, class _A2>
-class _LIBCPP_TEMPLATE_VIS result_of<_Fn(_A0, _A1, _A2)>
- : public __result_of<_Fn(_A0, _A1, _A2),
- is_class<typename remove_reference<_Fn>::type>::value ||
- is_function<typename remove_pointer<typename remove_reference<_Fn>::type>::type>::value,
- is_member_pointer<typename remove_reference<_Fn>::type>::value
- >
-{
-};
-
-#endif // _LIBCPP_HAS_NO_VARIADICS
-
-// template <class T, class... Args> struct is_constructible;
-
-namespace __is_construct
-{
-struct __nat {};
-}
-
-#if !defined(_LIBCPP_CXX03_LANG) && (!__has_feature(is_constructible) || \
- defined(_LIBCPP_TESTING_FALLBACK_IS_CONSTRUCTIBLE))
-
-template <class _Tp, class... _Args>
-struct __libcpp_is_constructible;
-
-template <class _To, class _From>
-struct __is_invalid_base_to_derived_cast {
- static_assert(is_reference<_To>::value, "Wrong specialization");
- using _RawFrom = __uncvref_t<_From>;
- using _RawTo = __uncvref_t<_To>;
- static const bool value = __lazy_and<
- __lazy_not<is_same<_RawFrom, _RawTo>>,
- is_base_of<_RawFrom, _RawTo>,
- __lazy_not<__libcpp_is_constructible<_RawTo, _From>>
- >::value;
-};
-
-template <class _To, class _From>
-struct __is_invalid_lvalue_to_rvalue_cast : false_type {
- static_assert(is_reference<_To>::value, "Wrong specialization");
-};
-
-template <class _ToRef, class _FromRef>
-struct __is_invalid_lvalue_to_rvalue_cast<_ToRef&&, _FromRef&> {
- using _RawFrom = __uncvref_t<_FromRef>;
- using _RawTo = __uncvref_t<_ToRef>;
- static const bool value = __lazy_and<
- __lazy_not<is_function<_RawTo>>,
- __lazy_or<
- is_same<_RawFrom, _RawTo>,
- is_base_of<_RawTo, _RawFrom>>
- >::value;
-};
-
-struct __is_constructible_helper
-{
- template <class _To>
- static void __eat(_To);
-
- // This overload is needed to work around a Clang bug that disallows
- // static_cast<T&&>(e) for non-reference-compatible types.
- // Example: static_cast<int&&>(declval<double>());
- // NOTE: The static_cast implementation below is required to support
- // classes with explicit conversion operators.
- template <class _To, class _From,
- class = decltype(__eat<_To>(_VSTD::declval<_From>()))>
- static true_type __test_cast(int);
-
- template <class _To, class _From,
- class = decltype(static_cast<_To>(_VSTD::declval<_From>()))>
- static integral_constant<bool,
- !__is_invalid_base_to_derived_cast<_To, _From>::value &&
- !__is_invalid_lvalue_to_rvalue_cast<_To, _From>::value
- > __test_cast(long);
-
- template <class, class>
- static false_type __test_cast(...);
-
- template <class _Tp, class ..._Args,
- class = decltype(_Tp(_VSTD::declval<_Args>()...))>
- static true_type __test_nary(int);
- template <class _Tp, class...>
- static false_type __test_nary(...);
-
- template <class _Tp, class _A0, class = decltype(::new _Tp(_VSTD::declval<_A0>()))>
- static is_destructible<_Tp> __test_unary(int);
- template <class, class>
- static false_type __test_unary(...);
-};
-
-template <class _Tp, bool = is_void<_Tp>::value>
-struct __is_default_constructible
- : decltype(__is_constructible_helper::__test_nary<_Tp>(0))
-{};
-
-template <class _Tp>
-struct __is_default_constructible<_Tp, true> : false_type {};
-
-template <class _Tp>
-struct __is_default_constructible<_Tp[], false> : false_type {};
-
-template <class _Tp, size_t _Nx>
-struct __is_default_constructible<_Tp[_Nx], false>
- : __is_default_constructible<typename remove_all_extents<_Tp>::type> {};
-
-template <class _Tp, class... _Args>
-struct __libcpp_is_constructible
-{
- static_assert(sizeof...(_Args) > 1, "Wrong specialization");
- typedef decltype(__is_constructible_helper::__test_nary<_Tp, _Args...>(0))
- type;
-};
-
-template <class _Tp>
-struct __libcpp_is_constructible<_Tp> : __is_default_constructible<_Tp> {};
-
-template <class _Tp, class _A0>
-struct __libcpp_is_constructible<_Tp, _A0>
- : public decltype(__is_constructible_helper::__test_unary<_Tp, _A0>(0))
-{};
-
-template <class _Tp, class _A0>
-struct __libcpp_is_constructible<_Tp&, _A0>
- : public decltype(__is_constructible_helper::
- __test_cast<_Tp&, _A0>(0))
-{};
-
-template <class _Tp, class _A0>
-struct __libcpp_is_constructible<_Tp&&, _A0>
- : public decltype(__is_constructible_helper::
- __test_cast<_Tp&&, _A0>(0))
-{};
-
-#endif
-
-#if __has_feature(is_constructible)
-template <class _Tp, class ..._Args>
-struct _LIBCPP_TEMPLATE_VIS is_constructible
- : public integral_constant<bool, __is_constructible(_Tp, _Args...)>
- {};
-#elif !defined(_LIBCPP_CXX03_LANG)
-template <class _Tp, class... _Args>
-struct _LIBCPP_TEMPLATE_VIS is_constructible
- : public __libcpp_is_constructible<_Tp, _Args...>::type {};
-#else
-// template <class T> struct is_constructible0;
-
-// main is_constructible0 test
-
-template <class _Tp>
-decltype((_Tp(), true_type()))
-__is_constructible0_test(_Tp&);
-
-false_type
-__is_constructible0_test(__any);
-
-template <class _Tp, class _A0>
-decltype((_Tp(_VSTD::declval<_A0>()), true_type()))
-__is_constructible1_test(_Tp&, _A0&);
-
-template <class _A0>
-false_type
-__is_constructible1_test(__any, _A0&);
-
-template <class _Tp, class _A0, class _A1>
-decltype((_Tp(_VSTD::declval<_A0>(), _VSTD::declval<_A1>()), true_type()))
-__is_constructible2_test(_Tp&, _A0&, _A1&);
-
-template <class _A0, class _A1>
-false_type
-__is_constructible2_test(__any, _A0&, _A1&);
-
-template <class _Tp, class _A0, class _A1, class _A2>
-decltype((_Tp(_VSTD::declval<_A0>(), _VSTD::declval<_A1>(), _VSTD::declval<_A2>()), true_type()))
-__is_constructible3_test(_Tp&, _A0&, _A1&, _A2&);
-
-template <class _A0, class _A1, class _A2>
-false_type
-__is_constructible3_test(__any, _A0&, _A1&, _A2&);
-
-template <bool, class _Tp>
-struct __is_constructible0_imp // false, _Tp is not a scalar
- : public common_type
- <
- decltype(__is_constructible0_test(declval<_Tp&>()))
- >::type
- {};
-
-template <bool, class _Tp, class _A0>
-struct __is_constructible1_imp // false, _Tp is not a scalar
- : public common_type
- <
- decltype(__is_constructible1_test(declval<_Tp&>(), declval<_A0&>()))
- >::type
- {};
-
-template <bool, class _Tp, class _A0, class _A1>
-struct __is_constructible2_imp // false, _Tp is not a scalar
- : public common_type
- <
- decltype(__is_constructible2_test(declval<_Tp&>(), declval<_A0>(), declval<_A1>()))
- >::type
- {};
-
-template <bool, class _Tp, class _A0, class _A1, class _A2>
-struct __is_constructible3_imp // false, _Tp is not a scalar
- : public common_type
- <
- decltype(__is_constructible3_test(declval<_Tp&>(), declval<_A0>(), declval<_A1>(), declval<_A2>()))
- >::type
- {};
-
-// handle scalars and reference types
-
-// Scalars are default constructible, references are not
-
-template <class _Tp>
-struct __is_constructible0_imp<true, _Tp>
- : public is_scalar<_Tp>
- {};
-
-template <class _Tp, class _A0>
-struct __is_constructible1_imp<true, _Tp, _A0>
- : public is_convertible<_A0, _Tp>
- {};
-
-template <class _Tp, class _A0, class _A1>
-struct __is_constructible2_imp<true, _Tp, _A0, _A1>
- : public false_type
- {};
-
-template <class _Tp, class _A0, class _A1, class _A2>
-struct __is_constructible3_imp<true, _Tp, _A0, _A1, _A2>
- : public false_type
- {};
-
-// Treat scalars and reference types separately
-
-template <bool, class _Tp>
-struct __is_constructible0_void_check
- : public __is_constructible0_imp<is_scalar<_Tp>::value || is_reference<_Tp>::value,
- _Tp>
- {};
-
-template <bool, class _Tp, class _A0>
-struct __is_constructible1_void_check
- : public __is_constructible1_imp<is_scalar<_Tp>::value || is_reference<_Tp>::value,
- _Tp, _A0>
- {};
-
-template <bool, class _Tp, class _A0, class _A1>
-struct __is_constructible2_void_check
- : public __is_constructible2_imp<is_scalar<_Tp>::value || is_reference<_Tp>::value,
- _Tp, _A0, _A1>
- {};
-
-template <bool, class _Tp, class _A0, class _A1, class _A2>
-struct __is_constructible3_void_check
- : public __is_constructible3_imp<is_scalar<_Tp>::value || is_reference<_Tp>::value,
- _Tp, _A0, _A1, _A2>
- {};
-
-// If any of T or Args is void, is_constructible should be false
-
-template <class _Tp>
-struct __is_constructible0_void_check<true, _Tp>
- : public false_type
- {};
-
-template <class _Tp, class _A0>
-struct __is_constructible1_void_check<true, _Tp, _A0>
- : public false_type
- {};
-
-template <class _Tp, class _A0, class _A1>
-struct __is_constructible2_void_check<true, _Tp, _A0, _A1>
- : public false_type
- {};
-
-template <class _Tp, class _A0, class _A1, class _A2>
-struct __is_constructible3_void_check<true, _Tp, _A0, _A1, _A2>
- : public false_type
- {};
-
-// is_constructible entry point
-
-template <class _Tp, class _A0 = __is_construct::__nat,
- class _A1 = __is_construct::__nat,
- class _A2 = __is_construct::__nat>
-struct _LIBCPP_TEMPLATE_VIS is_constructible
- : public __is_constructible3_void_check<is_void<_Tp>::value
- || is_abstract<_Tp>::value
- || is_function<_Tp>::value
- || is_void<_A0>::value
- || is_void<_A1>::value
- || is_void<_A2>::value,
- _Tp, _A0, _A1, _A2>
- {};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_constructible<_Tp, __is_construct::__nat, __is_construct::__nat>
- : public __is_constructible0_void_check<is_void<_Tp>::value
- || is_abstract<_Tp>::value
- || is_function<_Tp>::value,
- _Tp>
- {};
-
-template <class _Tp, class _A0>
-struct _LIBCPP_TEMPLATE_VIS is_constructible<_Tp, _A0, __is_construct::__nat>
- : public __is_constructible1_void_check<is_void<_Tp>::value
- || is_abstract<_Tp>::value
- || is_function<_Tp>::value
- || is_void<_A0>::value,
- _Tp, _A0>
- {};
-
-template <class _Tp, class _A0, class _A1>
-struct _LIBCPP_TEMPLATE_VIS is_constructible<_Tp, _A0, _A1, __is_construct::__nat>
- : public __is_constructible2_void_check<is_void<_Tp>::value
- || is_abstract<_Tp>::value
- || is_function<_Tp>::value
- || is_void<_A0>::value
- || is_void<_A1>::value,
- _Tp, _A0, _A1>
- {};
-
-// Array types are default constructible if their element type
-// is default constructible
-
-template <class _Ap, size_t _Np>
-struct __is_constructible0_imp<false, _Ap[_Np]>
- : public is_constructible<typename remove_all_extents<_Ap>::type>
- {};
-
-template <class _Ap, size_t _Np, class _A0>
-struct __is_constructible1_imp<false, _Ap[_Np], _A0>
- : public false_type
- {};
-
-template <class _Ap, size_t _Np, class _A0, class _A1>
-struct __is_constructible2_imp<false, _Ap[_Np], _A0, _A1>
- : public false_type
- {};
-
-template <class _Ap, size_t _Np, class _A0, class _A1, class _A2>
-struct __is_constructible3_imp<false, _Ap[_Np], _A0, _A1, _A2>
- : public false_type
- {};
-
-// Incomplete array types are not constructible
-
-template <class _Ap>
-struct __is_constructible0_imp<false, _Ap[]>
- : public false_type
- {};
-
-template <class _Ap, class _A0>
-struct __is_constructible1_imp<false, _Ap[], _A0>
- : public false_type
- {};
-
-template <class _Ap, class _A0, class _A1>
-struct __is_constructible2_imp<false, _Ap[], _A0, _A1>
- : public false_type
- {};
-
-template <class _Ap, class _A0, class _A1, class _A2>
-struct __is_constructible3_imp<false, _Ap[], _A0, _A1, _A2>
- : public false_type
- {};
-
-#endif // __has_feature(is_constructible)
-
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
-template <class _Tp, class ..._Args>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_constructible_v
- = is_constructible<_Tp, _Args...>::value;
-#endif
-
-// is_default_constructible
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_default_constructible
- : public is_constructible<_Tp>
- {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_default_constructible_v
- = is_default_constructible<_Tp>::value;
-#endif
-
-// is_copy_constructible
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_copy_constructible
- : public is_constructible<_Tp,
- typename add_lvalue_reference<typename add_const<_Tp>::type>::type> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_copy_constructible_v
- = is_copy_constructible<_Tp>::value;
-#endif
-
-// is_move_constructible
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_move_constructible
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- : public is_constructible<_Tp, typename add_rvalue_reference<_Tp>::type>
-#else
- : public is_copy_constructible<_Tp>
-#endif
- {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_move_constructible_v
- = is_move_constructible<_Tp>::value;
-#endif
-
-// is_trivially_constructible
-
-#ifndef _LIBCPP_HAS_NO_VARIADICS
-
-#if __has_feature(is_trivially_constructible) || _GNUC_VER >= 501
-
-template <class _Tp, class... _Args>
-struct _LIBCPP_TEMPLATE_VIS is_trivially_constructible
- : integral_constant<bool, __is_trivially_constructible(_Tp, _Args...)>
-{
-};
-
-#else // !__has_feature(is_trivially_constructible)
-
-template <class _Tp, class... _Args>
-struct _LIBCPP_TEMPLATE_VIS is_trivially_constructible
- : false_type
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp>
-#if __has_feature(has_trivial_constructor) || (_GNUC_VER >= 403)
- : integral_constant<bool, __has_trivial_constructor(_Tp)>
-#else
- : integral_constant<bool, is_scalar<_Tp>::value>
-#endif
-{
-};
-
-template <class _Tp>
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-struct _LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, _Tp&&>
-#else
-struct _LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, _Tp>
-#endif
- : integral_constant<bool, is_scalar<_Tp>::value>
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, const _Tp&>
- : integral_constant<bool, is_scalar<_Tp>::value>
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, _Tp&>
- : integral_constant<bool, is_scalar<_Tp>::value>
-{
-};
-
-#endif // !__has_feature(is_trivially_constructible)
-
-#else // _LIBCPP_HAS_NO_VARIADICS
-
-template <class _Tp, class _A0 = __is_construct::__nat,
- class _A1 = __is_construct::__nat>
-struct _LIBCPP_TEMPLATE_VIS is_trivially_constructible
- : false_type
-{
-};
-
-#if __has_feature(is_trivially_constructible) || _GNUC_VER >= 501
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, __is_construct::__nat,
- __is_construct::__nat>
- : integral_constant<bool, __is_trivially_constructible(_Tp)>
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, _Tp,
- __is_construct::__nat>
- : integral_constant<bool, __is_trivially_constructible(_Tp, _Tp)>
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, const _Tp&,
- __is_construct::__nat>
- : integral_constant<bool, __is_trivially_constructible(_Tp, const _Tp&)>
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, _Tp&,
- __is_construct::__nat>
- : integral_constant<bool, __is_trivially_constructible(_Tp, _Tp&)>
-{
-};
-
-#else // !__has_feature(is_trivially_constructible)
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, __is_construct::__nat,
- __is_construct::__nat>
- : integral_constant<bool, is_scalar<_Tp>::value>
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, _Tp,
- __is_construct::__nat>
- : integral_constant<bool, is_scalar<_Tp>::value>
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, const _Tp&,
- __is_construct::__nat>
- : integral_constant<bool, is_scalar<_Tp>::value>
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_trivially_constructible<_Tp, _Tp&,
- __is_construct::__nat>
- : integral_constant<bool, is_scalar<_Tp>::value>
-{
-};
-
-#endif // !__has_feature(is_trivially_constructible)
-
-#endif // _LIBCPP_HAS_NO_VARIADICS
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
-template <class _Tp, class... _Args>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_trivially_constructible_v
- = is_trivially_constructible<_Tp, _Args...>::value;
-#endif
-
-// is_trivially_default_constructible
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_trivially_default_constructible
- : public is_trivially_constructible<_Tp>
- {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_trivially_default_constructible_v
- = is_trivially_default_constructible<_Tp>::value;
-#endif
-
-// is_trivially_copy_constructible
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_trivially_copy_constructible
- : public is_trivially_constructible<_Tp, typename add_lvalue_reference<const _Tp>::type>
- {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_trivially_copy_constructible_v
- = is_trivially_copy_constructible<_Tp>::value;
-#endif
-
-// is_trivially_move_constructible
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_trivially_move_constructible
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- : public is_trivially_constructible<_Tp, typename add_rvalue_reference<_Tp>::type>
-#else
- : public is_trivially_copy_constructible<_Tp>
-#endif
- {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_trivially_move_constructible_v
- = is_trivially_move_constructible<_Tp>::value;
-#endif
-
-// is_trivially_assignable
-
-#if __has_feature(is_trivially_assignable) || _GNUC_VER >= 501
-
-template <class _Tp, class _Arg>
-struct is_trivially_assignable
- : integral_constant<bool, __is_trivially_assignable(_Tp, _Arg)>
-{
-};
-
-#else // !__has_feature(is_trivially_assignable)
-
-template <class _Tp, class _Arg>
-struct is_trivially_assignable
- : public false_type {};
-
-template <class _Tp>
-struct is_trivially_assignable<_Tp&, _Tp>
- : integral_constant<bool, is_scalar<_Tp>::value> {};
-
-template <class _Tp>
-struct is_trivially_assignable<_Tp&, _Tp&>
- : integral_constant<bool, is_scalar<_Tp>::value> {};
-
-template <class _Tp>
-struct is_trivially_assignable<_Tp&, const _Tp&>
- : integral_constant<bool, is_scalar<_Tp>::value> {};
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Tp>
-struct is_trivially_assignable<_Tp&, _Tp&&>
- : integral_constant<bool, is_scalar<_Tp>::value> {};
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-#endif // !__has_feature(is_trivially_assignable)
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp, class _Arg>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_trivially_assignable_v
- = is_trivially_assignable<_Tp, _Arg>::value;
-#endif
-
-// is_trivially_copy_assignable
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_trivially_copy_assignable
- : public is_trivially_assignable<typename add_lvalue_reference<_Tp>::type,
- typename add_lvalue_reference<typename add_const<_Tp>::type>::type> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_trivially_copy_assignable_v
- = is_trivially_copy_assignable<_Tp>::value;
-#endif
-
-// is_trivially_move_assignable
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_trivially_move_assignable
- : public is_trivially_assignable<typename add_lvalue_reference<_Tp>::type,
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- typename add_rvalue_reference<_Tp>::type>
-#else
- typename add_lvalue_reference<_Tp>::type>
-#endif
- {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_trivially_move_assignable_v
- = is_trivially_move_assignable<_Tp>::value;
-#endif
-
-// is_trivially_destructible
-
-#if __has_feature(has_trivial_destructor) || (_GNUC_VER >= 403)
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_trivially_destructible
- : public integral_constant<bool, is_destructible<_Tp>::value && __has_trivial_destructor(_Tp)> {};
-
-#else
-
-template <class _Tp> struct __libcpp_trivial_destructor
- : public integral_constant<bool, is_scalar<_Tp>::value ||
- is_reference<_Tp>::value> {};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_trivially_destructible
- : public __libcpp_trivial_destructor<typename remove_all_extents<_Tp>::type> {};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_trivially_destructible<_Tp[]>
- : public false_type {};
-
-#endif
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_trivially_destructible_v
- = is_trivially_destructible<_Tp>::value;
-#endif
-
-// is_nothrow_constructible
-
-#if 0
-template <class _Tp, class... _Args>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible
- : public integral_constant<bool, __is_nothrow_constructible(_Tp(_Args...))>
-{
-};
-
-#else
-
-#ifndef _LIBCPP_HAS_NO_VARIADICS
-
-#if __has_feature(cxx_noexcept) || (_GNUC_VER >= 407 && __cplusplus >= 201103L)
-
-template <bool, bool, class _Tp, class... _Args> struct __libcpp_is_nothrow_constructible;
-
-template <class _Tp, class... _Args>
-struct __libcpp_is_nothrow_constructible</*is constructible*/true, /*is reference*/false, _Tp, _Args...>
- : public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))>
-{
-};
-
-template <class _Tp>
-void __implicit_conversion_to(_Tp) noexcept { }
-
-template <class _Tp, class _Arg>
-struct __libcpp_is_nothrow_constructible</*is constructible*/true, /*is reference*/true, _Tp, _Arg>
- : public integral_constant<bool, noexcept(__implicit_conversion_to<_Tp>(declval<_Arg>()))>
-{
-};
-
-template <class _Tp, bool _IsReference, class... _Args>
-struct __libcpp_is_nothrow_constructible</*is constructible*/false, _IsReference, _Tp, _Args...>
- : public false_type
-{
-};
-
-template <class _Tp, class... _Args>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible
- : __libcpp_is_nothrow_constructible<is_constructible<_Tp, _Args...>::value, is_reference<_Tp>::value, _Tp, _Args...>
-{
-};
-
-template <class _Tp, size_t _Ns>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp[_Ns]>
- : __libcpp_is_nothrow_constructible<is_constructible<_Tp>::value, is_reference<_Tp>::value, _Tp>
-{
-};
-
-#else // __has_feature(cxx_noexcept)
-
-template <class _Tp, class... _Args>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible
- : false_type
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp>
-#if __has_feature(has_nothrow_constructor) || (_GNUC_VER >= 403)
- : integral_constant<bool, __has_nothrow_constructor(_Tp)>
-#else
- : integral_constant<bool, is_scalar<_Tp>::value>
-#endif
-{
-};
-
-template <class _Tp>
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, _Tp&&>
-#else
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, _Tp>
-#endif
-#if __has_feature(has_nothrow_copy) || (_GNUC_VER >= 403)
- : integral_constant<bool, __has_nothrow_copy(_Tp)>
-#else
- : integral_constant<bool, is_scalar<_Tp>::value>
-#endif
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, const _Tp&>
-#if __has_feature(has_nothrow_copy) || (_GNUC_VER >= 403)
- : integral_constant<bool, __has_nothrow_copy(_Tp)>
-#else
- : integral_constant<bool, is_scalar<_Tp>::value>
-#endif
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, _Tp&>
-#if __has_feature(has_nothrow_copy) || (_GNUC_VER >= 403)
- : integral_constant<bool, __has_nothrow_copy(_Tp)>
-#else
- : integral_constant<bool, is_scalar<_Tp>::value>
-#endif
-{
-};
-
-#endif // __has_feature(cxx_noexcept)
-
-#else // _LIBCPP_HAS_NO_VARIADICS
-
-template <class _Tp, class _A0 = __is_construct::__nat,
- class _A1 = __is_construct::__nat>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible
- : false_type
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, __is_construct::__nat,
- __is_construct::__nat>
-#if __has_feature(has_nothrow_constructor) || (_GNUC_VER >= 403)
- : integral_constant<bool, __has_nothrow_constructor(_Tp)>
-#else
- : integral_constant<bool, is_scalar<_Tp>::value>
-#endif
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, _Tp,
- __is_construct::__nat>
-#if __has_feature(has_nothrow_copy) || (_GNUC_VER >= 403)
- : integral_constant<bool, __has_nothrow_copy(_Tp)>
-#else
- : integral_constant<bool, is_scalar<_Tp>::value>
-#endif
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, const _Tp&,
- __is_construct::__nat>
-#if __has_feature(has_nothrow_copy) || (_GNUC_VER >= 403)
- : integral_constant<bool, __has_nothrow_copy(_Tp)>
-#else
- : integral_constant<bool, is_scalar<_Tp>::value>
-#endif
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_constructible<_Tp, _Tp&,
- __is_construct::__nat>
-#if __has_feature(has_nothrow_copy) || (_GNUC_VER >= 403)
- : integral_constant<bool, __has_nothrow_copy(_Tp)>
-#else
- : integral_constant<bool, is_scalar<_Tp>::value>
-#endif
-{
-};
-
-#endif // _LIBCPP_HAS_NO_VARIADICS
-#endif // __has_feature(is_nothrow_constructible)
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
-template <class _Tp, class ..._Args>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_nothrow_constructible_v
- = is_nothrow_constructible<_Tp, _Args...>::value;
-#endif
-
-// is_nothrow_default_constructible
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_nothrow_default_constructible
- : public is_nothrow_constructible<_Tp>
- {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_nothrow_default_constructible_v
- = is_nothrow_default_constructible<_Tp>::value;
-#endif
-
-// is_nothrow_copy_constructible
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_nothrow_copy_constructible
- : public is_nothrow_constructible<_Tp,
- typename add_lvalue_reference<typename add_const<_Tp>::type>::type> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_nothrow_copy_constructible_v
- = is_nothrow_copy_constructible<_Tp>::value;
-#endif
-
-// is_nothrow_move_constructible
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_nothrow_move_constructible
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- : public is_nothrow_constructible<_Tp, typename add_rvalue_reference<_Tp>::type>
-#else
- : public is_nothrow_copy_constructible<_Tp>
-#endif
- {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_nothrow_move_constructible_v
- = is_nothrow_move_constructible<_Tp>::value;
-#endif
-
-// is_nothrow_assignable
-
-#if __has_feature(cxx_noexcept) || (_GNUC_VER >= 407 && __cplusplus >= 201103L)
-
-template <bool, class _Tp, class _Arg> struct __libcpp_is_nothrow_assignable;
-
-template <class _Tp, class _Arg>
-struct __libcpp_is_nothrow_assignable<false, _Tp, _Arg>
- : public false_type
-{
-};
-
-template <class _Tp, class _Arg>
-struct __libcpp_is_nothrow_assignable<true, _Tp, _Arg>
- : public integral_constant<bool, noexcept(_VSTD::declval<_Tp>() = _VSTD::declval<_Arg>()) >
-{
-};
-
-template <class _Tp, class _Arg>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_assignable
- : public __libcpp_is_nothrow_assignable<is_assignable<_Tp, _Arg>::value, _Tp, _Arg>
-{
-};
-
-#else // __has_feature(cxx_noexcept)
-
-template <class _Tp, class _Arg>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_assignable
- : public false_type {};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_assignable<_Tp&, _Tp>
-#if __has_feature(has_nothrow_assign) || (_GNUC_VER >= 403)
- : integral_constant<bool, __has_nothrow_assign(_Tp)> {};
-#else
- : integral_constant<bool, is_scalar<_Tp>::value> {};
-#endif
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_assignable<_Tp&, _Tp&>
-#if __has_feature(has_nothrow_assign) || (_GNUC_VER >= 403)
- : integral_constant<bool, __has_nothrow_assign(_Tp)> {};
-#else
- : integral_constant<bool, is_scalar<_Tp>::value> {};
-#endif
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_assignable<_Tp&, const _Tp&>
-#if __has_feature(has_nothrow_assign) || (_GNUC_VER >= 403)
- : integral_constant<bool, __has_nothrow_assign(_Tp)> {};
-#else
- : integral_constant<bool, is_scalar<_Tp>::value> {};
-#endif
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Tp>
-struct is_nothrow_assignable<_Tp&, _Tp&&>
-#if __has_feature(has_nothrow_assign) || (_GNUC_VER >= 403)
- : integral_constant<bool, __has_nothrow_assign(_Tp)> {};
-#else
- : integral_constant<bool, is_scalar<_Tp>::value> {};
-#endif
-
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-#endif // __has_feature(cxx_noexcept)
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp, class _Arg>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_nothrow_assignable_v
- = is_nothrow_assignable<_Tp, _Arg>::value;
-#endif
-
-// is_nothrow_copy_assignable
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_nothrow_copy_assignable
- : public is_nothrow_assignable<typename add_lvalue_reference<_Tp>::type,
- typename add_lvalue_reference<typename add_const<_Tp>::type>::type> {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_nothrow_copy_assignable_v
- = is_nothrow_copy_assignable<_Tp>::value;
-#endif
-
-// is_nothrow_move_assignable
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_nothrow_move_assignable
- : public is_nothrow_assignable<typename add_lvalue_reference<_Tp>::type,
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- typename add_rvalue_reference<_Tp>::type>
-#else
- typename add_lvalue_reference<_Tp>::type>
-#endif
- {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_nothrow_move_assignable_v
- = is_nothrow_move_assignable<_Tp>::value;
-#endif
-
-// is_nothrow_destructible
-
-#if __has_feature(cxx_noexcept) || (_GNUC_VER >= 407 && __cplusplus >= 201103L)
-
-template <bool, class _Tp> struct __libcpp_is_nothrow_destructible;
-
-template <class _Tp>
-struct __libcpp_is_nothrow_destructible<false, _Tp>
- : public false_type
-{
-};
-
-template <class _Tp>
-struct __libcpp_is_nothrow_destructible<true, _Tp>
- : public integral_constant<bool, noexcept(_VSTD::declval<_Tp>().~_Tp()) >
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_destructible
- : public __libcpp_is_nothrow_destructible<is_destructible<_Tp>::value, _Tp>
-{
-};
-
-template <class _Tp, size_t _Ns>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_destructible<_Tp[_Ns]>
- : public is_nothrow_destructible<_Tp>
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_destructible<_Tp&>
- : public true_type
-{
-};
-
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_destructible<_Tp&&>
- : public true_type
-{
-};
-
-#endif
-
-#else
-
-template <class _Tp> struct __libcpp_nothrow_destructor
- : public integral_constant<bool, is_scalar<_Tp>::value ||
- is_reference<_Tp>::value> {};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_nothrow_destructible
- : public __libcpp_nothrow_destructor<typename remove_all_extents<_Tp>::type> {};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_destructible<_Tp[]>
- : public false_type {};
-
-#endif
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_nothrow_destructible_v
- = is_nothrow_destructible<_Tp>::value;
-#endif
-
-// is_pod
-
-#if __has_feature(is_pod) || (_GNUC_VER >= 403)
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_pod
- : public integral_constant<bool, __is_pod(_Tp)> {};
-
-#else
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_pod
- : public integral_constant<bool, is_trivially_default_constructible<_Tp>::value &&
- is_trivially_copy_constructible<_Tp>::value &&
- is_trivially_copy_assignable<_Tp>::value &&
- is_trivially_destructible<_Tp>::value> {};
-
-#endif
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_pod_v
- = is_pod<_Tp>::value;
-#endif
-
-// is_literal_type;
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_literal_type
-#ifdef _LIBCPP_IS_LITERAL
- : public integral_constant<bool, _LIBCPP_IS_LITERAL(_Tp)>
-#else
- : integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value ||
- is_reference<typename remove_all_extents<_Tp>::type>::value>
-#endif
- {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_literal_type_v
- = is_literal_type<_Tp>::value;
-#endif
-
-// is_standard_layout;
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_standard_layout
-#if __has_feature(is_standard_layout) || (_GNUC_VER >= 407)
- : public integral_constant<bool, __is_standard_layout(_Tp)>
-#else
- : integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value>
-#endif
- {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_standard_layout_v
- = is_standard_layout<_Tp>::value;
-#endif
-
-// is_trivially_copyable;
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_trivially_copyable
-#if __has_feature(is_trivially_copyable)
- : public integral_constant<bool, __is_trivially_copyable(_Tp)>
-#elif _GNUC_VER >= 501
- : public integral_constant<bool, !is_volatile<_Tp>::value && __is_trivially_copyable(_Tp)>
-#else
- : integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value>
-#endif
- {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_trivially_copyable_v
- = is_trivially_copyable<_Tp>::value;
-#endif
-
-// is_trivial;
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_trivial
-#if __has_feature(is_trivial) || _GNUC_VER >= 407
- : public integral_constant<bool, __is_trivial(_Tp)>
-#else
- : integral_constant<bool, is_trivially_copyable<_Tp>::value &&
- is_trivially_default_constructible<_Tp>::value>
-#endif
- {};
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
-template <class _Tp>
-_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_trivial_v
- = is_trivial<_Tp>::value;
-#endif
-
-template <class _Tp> struct __is_reference_wrapper_impl : public false_type {};
-template <class _Tp> struct __is_reference_wrapper_impl<reference_wrapper<_Tp> > : public true_type {};
-template <class _Tp> struct __is_reference_wrapper
- : public __is_reference_wrapper_impl<typename remove_cv<_Tp>::type> {};
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Fp, class _A0,
- class _DecayFp = typename decay<_Fp>::type,
- class _DecayA0 = typename decay<_A0>::type,
- class _ClassT = typename __member_pointer_class_type<_DecayFp>::type>
-using __enable_if_bullet1 = typename enable_if
- <
- is_member_function_pointer<_DecayFp>::value
- && is_base_of<_ClassT, _DecayA0>::value
- >::type;
-
-template <class _Fp, class _A0,
- class _DecayFp = typename decay<_Fp>::type,
- class _DecayA0 = typename decay<_A0>::type>
-using __enable_if_bullet2 = typename enable_if
- <
- is_member_function_pointer<_DecayFp>::value
- && __is_reference_wrapper<_DecayA0>::value
- >::type;
-
-template <class _Fp, class _A0,
- class _DecayFp = typename decay<_Fp>::type,
- class _DecayA0 = typename decay<_A0>::type,
- class _ClassT = typename __member_pointer_class_type<_DecayFp>::type>
-using __enable_if_bullet3 = typename enable_if
- <
- is_member_function_pointer<_DecayFp>::value
- && !is_base_of<_ClassT, _DecayA0>::value
- && !__is_reference_wrapper<_DecayA0>::value
- >::type;
-
-template <class _Fp, class _A0,
- class _DecayFp = typename decay<_Fp>::type,
- class _DecayA0 = typename decay<_A0>::type,
- class _ClassT = typename __member_pointer_class_type<_DecayFp>::type>
-using __enable_if_bullet4 = typename enable_if
- <
- is_member_object_pointer<_DecayFp>::value
- && is_base_of<_ClassT, _DecayA0>::value
- >::type;
-
-template <class _Fp, class _A0,
- class _DecayFp = typename decay<_Fp>::type,
- class _DecayA0 = typename decay<_A0>::type>
-using __enable_if_bullet5 = typename enable_if
- <
- is_member_object_pointer<_DecayFp>::value
- && __is_reference_wrapper<_DecayA0>::value
- >::type;
-
-template <class _Fp, class _A0,
- class _DecayFp = typename decay<_Fp>::type,
- class _DecayA0 = typename decay<_A0>::type,
- class _ClassT = typename __member_pointer_class_type<_DecayFp>::type>
-using __enable_if_bullet6 = typename enable_if
- <
- is_member_object_pointer<_DecayFp>::value
- && !is_base_of<_ClassT, _DecayA0>::value
- && !__is_reference_wrapper<_DecayA0>::value
- >::type;
-
-// __invoke forward declarations
-
-// fall back - none of the bullets
-
-#define _LIBCPP_INVOKE_RETURN(...) \
- noexcept(noexcept(__VA_ARGS__)) -> decltype(__VA_ARGS__) \
- { return __VA_ARGS__; }
-
-template <class ..._Args>
-auto __invoke(__any, _Args&& ...__args) -> __nat;
-
-template <class ..._Args>
-auto __invoke_constexpr(__any, _Args&& ...__args) -> __nat;
-
-// bullets 1, 2 and 3
-
-template <class _Fp, class _A0, class ..._Args,
- class = __enable_if_bullet1<_Fp, _A0>>
-inline _LIBCPP_INLINE_VISIBILITY
-auto
-__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
-_LIBCPP_INVOKE_RETURN((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...))
-
-template <class _Fp, class _A0, class ..._Args,
- class = __enable_if_bullet1<_Fp, _A0>>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR auto
-__invoke_constexpr(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
-_LIBCPP_INVOKE_RETURN((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...))
-
-template <class _Fp, class _A0, class ..._Args,
- class = __enable_if_bullet2<_Fp, _A0>>
-inline _LIBCPP_INLINE_VISIBILITY
-auto
-__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
-_LIBCPP_INVOKE_RETURN((__a0.get().*__f)(_VSTD::forward<_Args>(__args)...))
-
-template <class _Fp, class _A0, class ..._Args,
- class = __enable_if_bullet2<_Fp, _A0>>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR auto
-__invoke_constexpr(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
-_LIBCPP_INVOKE_RETURN((__a0.get().*__f)(_VSTD::forward<_Args>(__args)...))
-
-template <class _Fp, class _A0, class ..._Args,
- class = __enable_if_bullet3<_Fp, _A0>>
-inline _LIBCPP_INLINE_VISIBILITY
-auto
-__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
-_LIBCPP_INVOKE_RETURN(((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...))
-
-template <class _Fp, class _A0, class ..._Args,
- class = __enable_if_bullet3<_Fp, _A0>>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR auto
-__invoke_constexpr(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
-_LIBCPP_INVOKE_RETURN(((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...))
-
-// bullets 4, 5 and 6
-
-template <class _Fp, class _A0,
- class = __enable_if_bullet4<_Fp, _A0>>
-inline _LIBCPP_INLINE_VISIBILITY
-auto
-__invoke(_Fp&& __f, _A0&& __a0)
-_LIBCPP_INVOKE_RETURN(_VSTD::forward<_A0>(__a0).*__f)
-
-template <class _Fp, class _A0,
- class = __enable_if_bullet4<_Fp, _A0>>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR auto
-__invoke_constexpr(_Fp&& __f, _A0&& __a0)
-_LIBCPP_INVOKE_RETURN(_VSTD::forward<_A0>(__a0).*__f)
-
-template <class _Fp, class _A0,
- class = __enable_if_bullet5<_Fp, _A0>>
-inline _LIBCPP_INLINE_VISIBILITY
-auto
-__invoke(_Fp&& __f, _A0&& __a0)
-_LIBCPP_INVOKE_RETURN(__a0.get().*__f)
-
-template <class _Fp, class _A0,
- class = __enable_if_bullet5<_Fp, _A0>>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR auto
-__invoke_constexpr(_Fp&& __f, _A0&& __a0)
-_LIBCPP_INVOKE_RETURN(__a0.get().*__f)
-
-template <class _Fp, class _A0,
- class = __enable_if_bullet6<_Fp, _A0>>
-inline _LIBCPP_INLINE_VISIBILITY
-auto
-__invoke(_Fp&& __f, _A0&& __a0)
-_LIBCPP_INVOKE_RETURN((*_VSTD::forward<_A0>(__a0)).*__f)
-
-template <class _Fp, class _A0,
- class = __enable_if_bullet6<_Fp, _A0>>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR auto
-__invoke_constexpr(_Fp&& __f, _A0&& __a0)
-_LIBCPP_INVOKE_RETURN((*_VSTD::forward<_A0>(__a0)).*__f)
-
-// bullet 7
-
-template <class _Fp, class ..._Args>
-inline _LIBCPP_INLINE_VISIBILITY
-auto
-__invoke(_Fp&& __f, _Args&& ...__args)
-_LIBCPP_INVOKE_RETURN(_VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...))
-
-template <class _Fp, class ..._Args>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_CONSTEXPR auto
-__invoke_constexpr(_Fp&& __f, _Args&& ...__args)
-_LIBCPP_INVOKE_RETURN(_VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...))
-
-#undef _LIBCPP_INVOKE_RETURN
-
-// __invokable
-
-template <class _Ret, class _Fp, class ..._Args>
-struct __invokable_r
-{
- // FIXME: Check that _Ret, _Fp, and _Args... are all complete types, cv void,
- // or incomplete array types as required by the standard.
- using _Result = decltype(
- _VSTD::__invoke(_VSTD::declval<_Fp>(), _VSTD::declval<_Args>()...));
-
- using type =
- typename conditional<
- !is_same<_Result, __nat>::value,
- typename conditional<
- is_void<_Ret>::value,
- true_type,
- is_convertible<_Result, _Ret>
- >::type,
- false_type
- >::type;
- static const bool value = type::value;
-};
-
-template <class _Fp, class ..._Args>
-using __invokable = __invokable_r<void, _Fp, _Args...>;
-
-template <bool _IsInvokable, bool _IsCVVoid, class _Ret, class _Fp, class ..._Args>
-struct __nothrow_invokable_r_imp {
- static const bool value = false;
-};
-
-template <class _Ret, class _Fp, class ..._Args>
-struct __nothrow_invokable_r_imp<true, false, _Ret, _Fp, _Args...>
-{
- typedef __nothrow_invokable_r_imp _ThisT;
-
- template <class _Tp>
- static void __test_noexcept(_Tp) noexcept;
-
- static const bool value = noexcept(_ThisT::__test_noexcept<_Ret>(
- _VSTD::__invoke(_VSTD::declval<_Fp>(), _VSTD::declval<_Args>()...)));
-};
-
-template <class _Ret, class _Fp, class ..._Args>
-struct __nothrow_invokable_r_imp<true, true, _Ret, _Fp, _Args...>
-{
- static const bool value = noexcept(
- _VSTD::__invoke(_VSTD::declval<_Fp>(), _VSTD::declval<_Args>()...));
-};
-
-template <class _Ret, class _Fp, class ..._Args>
-using __nothrow_invokable_r =
- __nothrow_invokable_r_imp<
- __invokable_r<_Ret, _Fp, _Args...>::value,
- is_void<_Ret>::value,
- _Ret, _Fp, _Args...
- >;
-
-template <class _Fp, class ..._Args>
-using __nothrow_invokable =
- __nothrow_invokable_r_imp<
- __invokable<_Fp, _Args...>::value,
- true, void, _Fp, _Args...
- >;
-
-template <class _Fp, class ..._Args>
-struct __invoke_of
- : public enable_if<
- __invokable<_Fp, _Args...>::value,
- typename __invokable_r<void, _Fp, _Args...>::_Result>
-{
-};
-
-// result_of
-
-template <class _Fp, class ..._Args>
-class _LIBCPP_TEMPLATE_VIS result_of<_Fp(_Args...)>
- : public __invoke_of<_Fp, _Args...>
-{
-};
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using result_of_t = typename result_of<_Tp>::type;
-#endif
-
-#if _LIBCPP_STD_VER > 14
-
-// invoke_result
-
-template <class _Fn, class... _Args>
-struct _LIBCPP_TEMPLATE_VIS invoke_result
- : __invoke_of<_Fn, _Args...>
-{
-};
-
-template <class _Fn, class... _Args>
-using invoke_result_t = typename invoke_result<_Fn, _Args...>::type;
-
-// is_invocable
-
-template <class _Fn, class ..._Args>
-struct _LIBCPP_TEMPLATE_VIS is_invocable
- : integral_constant<bool, __invokable<_Fn, _Args...>::value> {};
-
-template <class _Ret, class _Fn, class ..._Args>
-struct _LIBCPP_TEMPLATE_VIS is_invocable_r
- : integral_constant<bool, __invokable_r<_Ret, _Fn, _Args...>::value> {};
-
-template <class _Fn, class ..._Args>
-_LIBCPP_INLINE_VAR constexpr bool is_invocable_v
- = is_invocable<_Fn, _Args...>::value;
-
-template <class _Ret, class _Fn, class ..._Args>
-_LIBCPP_INLINE_VAR constexpr bool is_invocable_r_v
- = is_invocable_r<_Ret, _Fn, _Args...>::value;
-
-// is_nothrow_invocable
-
-template <class _Fn, class ..._Args>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_invocable
- : integral_constant<bool, __nothrow_invokable<_Fn, _Args...>::value> {};
-
-template <class _Ret, class _Fn, class ..._Args>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_invocable_r
- : integral_constant<bool, __nothrow_invokable_r<_Ret, _Fn, _Args...>::value> {};
-
-template <class _Fn, class ..._Args>
-_LIBCPP_INLINE_VAR constexpr bool is_nothrow_invocable_v
- = is_nothrow_invocable<_Fn, _Args...>::value;
-
-template <class _Ret, class _Fn, class ..._Args>
-_LIBCPP_INLINE_VAR constexpr bool is_nothrow_invocable_r_v
- = is_nothrow_invocable_r<_Ret, _Fn, _Args...>::value;
-
-#endif // _LIBCPP_STD_VER > 14
-
-#endif // !defined(_LIBCPP_CXX03_LANG)
-
-template <class _Tp> struct __is_swappable;
-template <class _Tp> struct __is_nothrow_swappable;
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-#ifndef _LIBCPP_CXX03_LANG
-typename enable_if
-<
- is_move_constructible<_Tp>::value &&
- is_move_assignable<_Tp>::value
->::type
-#else
-void
-#endif
-swap(_Tp& __x, _Tp& __y) _NOEXCEPT_(is_nothrow_move_constructible<_Tp>::value &&
- is_nothrow_move_assignable<_Tp>::value)
-{
- _Tp __t(_VSTD::move(__x));
- __x = _VSTD::move(__y);
- __y = _VSTD::move(__t);
-}
-
-template<class _Tp, size_t _Np>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if<
- __is_swappable<_Tp>::value
->::type
-swap(_Tp (&__a)[_Np], _Tp (&__b)[_Np]) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value);
-
-template <class _ForwardIterator1, class _ForwardIterator2>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
- // _NOEXCEPT_(_NOEXCEPT_(swap(*__a, *__b)))
- _NOEXCEPT_(_NOEXCEPT_(swap(*_VSTD::declval<_ForwardIterator1>(),
- *_VSTD::declval<_ForwardIterator2>())))
-{
- swap(*__a, *__b);
-}
-
-// __swappable
-
-namespace __detail
-{
-// ALL generic swap overloads MUST already have a declaration available at this point.
-
-template <class _Tp, class _Up = _Tp,
- bool _NotVoid = !is_void<_Tp>::value && !is_void<_Up>::value>
-struct __swappable_with
-{
- template <class _LHS, class _RHS>
- static decltype(swap(_VSTD::declval<_LHS>(), _VSTD::declval<_RHS>()))
- __test_swap(int);
- template <class, class>
- static __nat __test_swap(long);
-
- // Extra parens are needed for the C++03 definition of decltype.
- typedef decltype((__test_swap<_Tp, _Up>(0))) __swap1;
- typedef decltype((__test_swap<_Up, _Tp>(0))) __swap2;
-
- static const bool value = !is_same<__swap1, __nat>::value
- && !is_same<__swap2, __nat>::value;
-};
-
-template <class _Tp, class _Up>
-struct __swappable_with<_Tp, _Up, false> : false_type {};
-
-template <class _Tp, class _Up = _Tp, bool _Swappable = __swappable_with<_Tp, _Up>::value>
-struct __nothrow_swappable_with {
- static const bool value =
-#ifndef _LIBCPP_HAS_NO_NOEXCEPT
- noexcept(swap(_VSTD::declval<_Tp>(), _VSTD::declval<_Up>()))
- && noexcept(swap(_VSTD::declval<_Up>(), _VSTD::declval<_Tp>()));
-#else
- false;
-#endif
-};
-
-template <class _Tp, class _Up>
-struct __nothrow_swappable_with<_Tp, _Up, false> : false_type {};
-
-} // __detail
-
-template <class _Tp>
-struct __is_swappable
- : public integral_constant<bool, __detail::__swappable_with<_Tp&>::value>
-{
-};
-
-template <class _Tp>
-struct __is_nothrow_swappable
- : public integral_constant<bool, __detail::__nothrow_swappable_with<_Tp&>::value>
-{
-};
-
-#if _LIBCPP_STD_VER > 14
-
-template <class _Tp, class _Up>
-struct _LIBCPP_TEMPLATE_VIS is_swappable_with
- : public integral_constant<bool, __detail::__swappable_with<_Tp, _Up>::value>
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_swappable
- : public conditional<
- __is_referenceable<_Tp>::value,
- is_swappable_with<
- typename add_lvalue_reference<_Tp>::type,
- typename add_lvalue_reference<_Tp>::type>,
- false_type
- >::type
-{
-};
-
-template <class _Tp, class _Up>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_swappable_with
- : public integral_constant<bool, __detail::__nothrow_swappable_with<_Tp, _Up>::value>
-{
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS is_nothrow_swappable
- : public conditional<
- __is_referenceable<_Tp>::value,
- is_nothrow_swappable_with<
- typename add_lvalue_reference<_Tp>::type,
- typename add_lvalue_reference<_Tp>::type>,
- false_type
- >::type
-{
-};
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VAR constexpr bool is_swappable_with_v
- = is_swappable_with<_Tp, _Up>::value;
-
-template <class _Tp>
-_LIBCPP_INLINE_VAR constexpr bool is_swappable_v
- = is_swappable<_Tp>::value;
-
-template <class _Tp, class _Up>
-_LIBCPP_INLINE_VAR constexpr bool is_nothrow_swappable_with_v
- = is_nothrow_swappable_with<_Tp, _Up>::value;
-
-template <class _Tp>
-_LIBCPP_INLINE_VAR constexpr bool is_nothrow_swappable_v
- = is_nothrow_swappable<_Tp>::value;
-
-#endif // _LIBCPP_STD_VER > 14
-
-#ifdef _LIBCPP_UNDERLYING_TYPE
-
-template <class _Tp>
-struct underlying_type
-{
- typedef _LIBCPP_UNDERLYING_TYPE(_Tp) type;
-};
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp> using underlying_type_t = typename underlying_type<_Tp>::type;
-#endif
-
-#else // _LIBCPP_UNDERLYING_TYPE
-
-template <class _Tp, bool _Support = false>
-struct underlying_type
-{
- static_assert(_Support, "The underyling_type trait requires compiler "
- "support. Either no such support exists or "
- "libc++ does not know how to use it.");
-};
-
-#endif // _LIBCPP_UNDERLYING_TYPE
-
-
-template <class _Tp, bool = is_enum<_Tp>::value>
-struct __sfinae_underlying_type
-{
- typedef typename underlying_type<_Tp>::type type;
- typedef decltype(((type)1) + 0) __promoted_type;
-};
-
-template <class _Tp>
-struct __sfinae_underlying_type<_Tp, false> {};
-
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-int __convert_to_integral(int __val) { return __val; }
-
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-unsigned __convert_to_integral(unsigned __val) { return __val; }
-
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-long __convert_to_integral(long __val) { return __val; }
-
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-unsigned long __convert_to_integral(unsigned long __val) { return __val; }
-
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-long long __convert_to_integral(long long __val) { return __val; }
-
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-unsigned long long __convert_to_integral(unsigned long long __val) {return __val; }
-
-template<typename _Fp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-typename enable_if<is_floating_point<_Fp>::value, long long>::type
- __convert_to_integral(_Fp __val) { return __val; }
-
-#ifndef _LIBCPP_HAS_NO_INT128
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-__int128_t __convert_to_integral(__int128_t __val) { return __val; }
-
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-__uint128_t __convert_to_integral(__uint128_t __val) { return __val; }
-#endif
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-typename __sfinae_underlying_type<_Tp>::__promoted_type
-__convert_to_integral(_Tp __val) { return __val; }
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp>
-struct __has_operator_addressof_member_imp
-{
- template <class _Up>
- static auto __test(int)
- -> typename __select_2nd<decltype(_VSTD::declval<_Up>().operator&()), true_type>::type;
- template <class>
- static auto __test(long) -> false_type;
-
- static const bool value = decltype(__test<_Tp>(0))::value;
-};
-
-template <class _Tp>
-struct __has_operator_addressof_free_imp
-{
- template <class _Up>
- static auto __test(int)
- -> typename __select_2nd<decltype(operator&(_VSTD::declval<_Up>())), true_type>::type;
- template <class>
- static auto __test(long) -> false_type;
-
- static const bool value = decltype(__test<_Tp>(0))::value;
-};
-
-template <class _Tp>
-struct __has_operator_addressof
- : public integral_constant<bool, __has_operator_addressof_member_imp<_Tp>::value
- || __has_operator_addressof_free_imp<_Tp>::value>
-{};
-
-#endif // _LIBCPP_CXX03_LANG
-
-#if _LIBCPP_STD_VER > 14
-
-template <class...> using void_t = void;
-
-# ifndef _LIBCPP_HAS_NO_VARIADICS
-template <class... _Args>
-struct conjunction : __and_<_Args...> {};
-template<class... _Args>
-_LIBCPP_INLINE_VAR constexpr bool conjunction_v
- = conjunction<_Args...>::value;
-
-template <class... _Args>
-struct disjunction : __or_<_Args...> {};
-template<class... _Args>
-_LIBCPP_INLINE_VAR constexpr bool disjunction_v
- = disjunction<_Args...>::value;
-
-template <class _Tp>
-struct negation : __not_<_Tp> {};
-template<class _Tp>
-_LIBCPP_INLINE_VAR constexpr bool negation_v
- = negation<_Tp>::value;
-# endif // _LIBCPP_HAS_NO_VARIADICS
-#endif // _LIBCPP_STD_VER > 14
-
-// These traits are used in __tree and __hash_table
-#ifndef _LIBCPP_CXX03_LANG
-struct __extract_key_fail_tag {};
-struct __extract_key_self_tag {};
-struct __extract_key_first_tag {};
-
-template <class _ValTy, class _Key,
- class _RawValTy = typename __unconstref<_ValTy>::type>
-struct __can_extract_key
- : conditional<is_same<_RawValTy, _Key>::value, __extract_key_self_tag,
- __extract_key_fail_tag>::type {};
-
-template <class _Pair, class _Key, class _First, class _Second>
-struct __can_extract_key<_Pair, _Key, pair<_First, _Second>>
- : conditional<is_same<typename remove_const<_First>::type, _Key>::value,
- __extract_key_first_tag, __extract_key_fail_tag>::type {};
-
-// __can_extract_map_key uses true_type/false_type instead of the tags.
-// It returns true if _Key != _ContainerValueTy (the container is a map not a set)
-// and _ValTy == _Key.
-template <class _ValTy, class _Key, class _ContainerValueTy,
- class _RawValTy = typename __unconstref<_ValTy>::type>
-struct __can_extract_map_key
- : integral_constant<bool, is_same<_RawValTy, _Key>::value> {};
-
-// This specialization returns __extract_key_fail_tag for non-map containers
-// because _Key == _ContainerValueTy
-template <class _ValTy, class _Key, class _RawValTy>
-struct __can_extract_map_key<_ValTy, _Key, _Key, _RawValTy>
- : false_type {};
-
-#endif
-
-#if _LIBCPP_STD_VER > 17
-enum class endian
-{
- little = 0xDEAD,
- big = 0xFACE,
-#if defined(_LIBCPP_LITTLE_ENDIAN)
- native = little
-#elif defined(_LIBCPP_BIG_ENDIAN)
- native = big
-#else
- native = 0xCAFE
-#endif
-};
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-#if _LIBCPP_STD_VER > 14
-// std::byte
-namespace std // purposefully not versioned
-{
-template <class _Integer>
- constexpr typename enable_if<is_integral_v<_Integer>, byte>::type &
- operator<<=(byte& __lhs, _Integer __shift) noexcept
- { return __lhs = __lhs << __shift; }
-
-template <class _Integer>
- constexpr typename enable_if<is_integral_v<_Integer>, byte>::type
- operator<< (byte __lhs, _Integer __shift) noexcept
- { return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) << __shift)); }
-
-template <class _Integer>
- constexpr typename enable_if<is_integral_v<_Integer>, byte>::type &
- operator>>=(byte& __lhs, _Integer __shift) noexcept
- { return __lhs = __lhs >> __shift; }
-
-template <class _Integer>
- constexpr typename enable_if<is_integral_v<_Integer>, byte>::type
- operator>> (byte __lhs, _Integer __shift) noexcept
- { return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) >> __shift)); }
-
-template <class _Integer>
- constexpr typename enable_if<is_integral_v<_Integer>, _Integer>::type
- to_integer(byte __b) noexcept { return static_cast<_Integer>(__b); }
-
-}
-#endif
-
-#endif // _LIBCPP_TYPE_TRAITS
diff --git a/lib/libcxx/include/typeindex b/lib/libcxx/include/typeindex
deleted file mode 100644
index 0565ca913e3..00000000000
--- a/lib/libcxx/include/typeindex
+++ /dev/null
@@ -1,103 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- typeindex ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_TYPEINDEX
-#define _LIBCPP_TYPEINDEX
-
-/*
-
- typeindex synopsis
-
-namespace std
-{
-
-class type_index
-{
-public:
- type_index(const type_info& rhs) noexcept;
-
- bool operator==(const type_index& rhs) const noexcept;
- bool operator!=(const type_index& rhs) const noexcept;
- bool operator< (const type_index& rhs) const noexcept;
- bool operator<=(const type_index& rhs) const noexcept;
- bool operator> (const type_index& rhs) const noexcept;
- bool operator>=(const type_index& rhs) const noexcept;
-
- size_t hash_code() const noexcept;
- const char* name() const noexcept;
-};
-
-template <>
-struct hash<type_index>
- : public unary_function<type_index, size_t>
-{
- size_t operator()(type_index index) const noexcept;
-};
-
-} // std
-
-*/
-
-#include <__config>
-#include <typeinfo>
-#include <__functional_base>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-class _LIBCPP_TEMPLATE_VIS type_index
-{
- const type_info* __t_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- type_index(const type_info& __y) _NOEXCEPT : __t_(&__y) {}
-
- _LIBCPP_INLINE_VISIBILITY
- bool operator==(const type_index& __y) const _NOEXCEPT
- {return *__t_ == *__y.__t_;}
- _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const type_index& __y) const _NOEXCEPT
- {return *__t_ != *__y.__t_;}
- _LIBCPP_INLINE_VISIBILITY
- bool operator< (const type_index& __y) const _NOEXCEPT
- {return __t_->before(*__y.__t_);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator<=(const type_index& __y) const _NOEXCEPT
- {return !__y.__t_->before(*__t_);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator> (const type_index& __y) const _NOEXCEPT
- {return __y.__t_->before(*__t_);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator>=(const type_index& __y) const _NOEXCEPT
- {return !__t_->before(*__y.__t_);}
-
- _LIBCPP_INLINE_VISIBILITY
- size_t hash_code() const _NOEXCEPT {return __t_->hash_code();}
- _LIBCPP_INLINE_VISIBILITY
- const char* name() const _NOEXCEPT {return __t_->name();}
-};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS hash;
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<type_index>
- : public unary_function<type_index, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(type_index __index) const _NOEXCEPT
- {return __index.hash_code();}
-};
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_TYPEINDEX
diff --git a/lib/libcxx/include/typeinfo b/lib/libcxx/include/typeinfo
deleted file mode 100644
index 8411532860b..00000000000
--- a/lib/libcxx/include/typeinfo
+++ /dev/null
@@ -1,236 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- typeinfo ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef __LIBCPP_TYPEINFO
-#define __LIBCPP_TYPEINFO
-
-/*
-
- typeinfo synopsis
-
-namespace std {
-
-class type_info
-{
-public:
- virtual ~type_info();
-
- bool operator==(const type_info& rhs) const noexcept;
- bool operator!=(const type_info& rhs) const noexcept;
-
- bool before(const type_info& rhs) const noexcept;
- size_t hash_code() const noexcept;
- const char* name() const noexcept;
-
- type_info(const type_info& rhs) = delete;
- type_info& operator=(const type_info& rhs) = delete;
-};
-
-class bad_cast
- : public exception
-{
-public:
- bad_cast() noexcept;
- bad_cast(const bad_cast&) noexcept;
- bad_cast& operator=(const bad_cast&) noexcept;
- virtual const char* what() const noexcept;
-};
-
-class bad_typeid
- : public exception
-{
-public:
- bad_typeid() noexcept;
- bad_typeid(const bad_typeid&) noexcept;
- bad_typeid& operator=(const bad_typeid&) noexcept;
- virtual const char* what() const noexcept;
-};
-
-} // std
-
-*/
-
-#include <__config>
-#include <exception>
-#include <cstddef>
-#include <cstdint>
-#ifdef _LIBCPP_NO_EXCEPTIONS
-#include <cstdlib>
-#endif
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#if defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_NO_VCRUNTIME)
-#include <vcruntime_typeinfo.h>
-#else
-
-#if defined(_LIBCPP_NONUNIQUE_RTTI_BIT) && !defined(_LIBCPP_ABI_MICROSOFT)
-# define _LIBCPP_HAS_NONUNIQUE_TYPEINFO
-#endif
-
-namespace std // purposefully not using versioning namespace
-{
-
-class _LIBCPP_EXCEPTION_ABI type_info
-{
- type_info& operator=(const type_info&);
- type_info(const type_info&);
-
-#if defined(_LIBCPP_HAS_NONUNIQUE_TYPEINFO)
- _LIBCPP_INLINE_VISIBILITY
- int __compare_nonunique_names(const type_info &__arg) const _NOEXCEPT
- { return __builtin_strcmp(name(), __arg.name()); }
-#endif
-
-#if defined(_LIBCPP_ABI_MICROSOFT)
- mutable struct {
- const char *__undecorated_name;
- const char __decorated_name[1];
- } __data;
-
- int __compare(const type_info &__rhs) const _NOEXCEPT;
-#endif // _LIBCPP_ABI_MICROSOFT
-
-protected:
-#if !defined(_LIBCPP_ABI_MICROSOFT)
-#if defined(_LIBCPP_HAS_NONUNIQUE_TYPEINFO)
- // A const char* with the non-unique RTTI bit possibly set.
- uintptr_t __type_name;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit type_info(const char* __n)
- : __type_name(reinterpret_cast<uintptr_t>(__n)) {}
-#else
- const char *__type_name;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit type_info(const char* __n) : __type_name(__n) {}
-#endif
-#endif // ! _LIBCPP_ABI_MICROSOFT
-
-public:
- _LIBCPP_AVAILABILITY_TYPEINFO_VTABLE
- virtual ~type_info();
-
-#if defined(_LIBCPP_ABI_MICROSOFT)
- const char *name() const _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- bool before(const type_info& __arg) const _NOEXCEPT {
- return __compare(__arg) < 0;
- }
-
- size_t hash_code() const _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- bool operator==(const type_info& __arg) const _NOEXCEPT {
- return __compare(__arg) == 0;
- }
-#else
-#if defined(_LIBCPP_HAS_NONUNIQUE_TYPEINFO)
- _LIBCPP_INLINE_VISIBILITY
- const char* name() const _NOEXCEPT
- {
- return reinterpret_cast<const char*>(__type_name &
- ~_LIBCPP_NONUNIQUE_RTTI_BIT);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool before(const type_info& __arg) const _NOEXCEPT
- {
- if (!((__type_name & __arg.__type_name) & _LIBCPP_NONUNIQUE_RTTI_BIT))
- return __type_name < __arg.__type_name;
- return __compare_nonunique_names(__arg) < 0;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- size_t hash_code() const _NOEXCEPT
- {
- if (!(__type_name & _LIBCPP_NONUNIQUE_RTTI_BIT))
- return __type_name;
-
- const char* __ptr = name();
- size_t __hash = 5381;
- while (unsigned char __c = static_cast<unsigned char>(*__ptr++))
- __hash = (__hash * 33) ^ __c;
- return __hash;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- bool operator==(const type_info& __arg) const _NOEXCEPT
- {
- if (__type_name == __arg.__type_name)
- return true;
-
- if (!((__type_name & __arg.__type_name) & _LIBCPP_NONUNIQUE_RTTI_BIT))
- return false;
- return __compare_nonunique_names(__arg) == 0;
- }
-#else
- _LIBCPP_INLINE_VISIBILITY
- const char* name() const _NOEXCEPT
- { return __type_name; }
-
- _LIBCPP_INLINE_VISIBILITY
- bool before(const type_info& __arg) const _NOEXCEPT
- { return __type_name < __arg.__type_name; }
-
- _LIBCPP_INLINE_VISIBILITY
- size_t hash_code() const _NOEXCEPT
- { return reinterpret_cast<size_t>(__type_name); }
-
- _LIBCPP_INLINE_VISIBILITY
- bool operator==(const type_info& __arg) const _NOEXCEPT
- { return __type_name == __arg.__type_name; }
-#endif
-#endif // _LIBCPP_ABI_MICROSOFT
-
- _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const type_info& __arg) const _NOEXCEPT
- { return !operator==(__arg); }
-};
-
-class _LIBCPP_EXCEPTION_ABI bad_cast
- : public exception
-{
-public:
- bad_cast() _NOEXCEPT;
- virtual ~bad_cast() _NOEXCEPT;
- virtual const char* what() const _NOEXCEPT;
-};
-
-class _LIBCPP_EXCEPTION_ABI bad_typeid
- : public exception
-{
-public:
- bad_typeid() _NOEXCEPT;
- virtual ~bad_typeid() _NOEXCEPT;
- virtual const char* what() const _NOEXCEPT;
-};
-
-} // std
-
-#endif // defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_NO_VCRUNTIME)
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
-void __throw_bad_cast()
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- throw bad_cast();
-#else
- _VSTD::abort();
-#endif
-}
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // __LIBCPP_TYPEINFO
diff --git a/lib/libcxx/include/unordered_map b/lib/libcxx/include/unordered_map
deleted file mode 100644
index 6035b05dc61..00000000000
--- a/lib/libcxx/include/unordered_map
+++ /dev/null
@@ -1,2300 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- unordered_map -----------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_UNORDERED_MAP
-#define _LIBCPP_UNORDERED_MAP
-
-/*
-
- unordered_map synopsis
-
-#include <initializer_list>
-
-namespace std
-{
-
-template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
- class Alloc = allocator<pair<const Key, T>>>
-class unordered_map
-{
-public:
- // types
- typedef Key key_type;
- typedef T mapped_type;
- typedef Hash hasher;
- typedef Pred key_equal;
- typedef Alloc allocator_type;
- typedef pair<const key_type, mapped_type> value_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename allocator_traits<allocator_type>::pointer pointer;
- typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
- typedef typename allocator_traits<allocator_type>::size_type size_type;
- typedef typename allocator_traits<allocator_type>::difference_type difference_type;
-
- typedef /unspecified/ iterator;
- typedef /unspecified/ const_iterator;
- typedef /unspecified/ local_iterator;
- typedef /unspecified/ const_local_iterator;
-
- typedef unspecified node_type; // C++17
- typedef INSERT_RETURN_TYPE<iterator, node_type> insert_return_type; // C++17
-
- unordered_map()
- noexcept(
- is_nothrow_default_constructible<hasher>::value &&
- is_nothrow_default_constructible<key_equal>::value &&
- is_nothrow_default_constructible<allocator_type>::value);
- explicit unordered_map(size_type n, const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- template <class InputIterator>
- unordered_map(InputIterator f, InputIterator l,
- size_type n = 0, const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- explicit unordered_map(const allocator_type&);
- unordered_map(const unordered_map&);
- unordered_map(const unordered_map&, const Allocator&);
- unordered_map(unordered_map&&)
- noexcept(
- is_nothrow_move_constructible<hasher>::value &&
- is_nothrow_move_constructible<key_equal>::value &&
- is_nothrow_move_constructible<allocator_type>::value);
- unordered_map(unordered_map&&, const Allocator&);
- unordered_map(initializer_list<value_type>, size_type n = 0,
- const hasher& hf = hasher(), const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- unordered_map(size_type n, const allocator_type& a)
- : unordered_map(n, hasher(), key_equal(), a) {} // C++14
- unordered_map(size_type n, const hasher& hf, const allocator_type& a)
- : unordered_map(n, hf, key_equal(), a) {} // C++14
- template <class InputIterator>
- unordered_map(InputIterator f, InputIterator l, size_type n, const allocator_type& a)
- : unordered_map(f, l, n, hasher(), key_equal(), a) {} // C++14
- template <class InputIterator>
- unordered_map(InputIterator f, InputIterator l, size_type n, const hasher& hf,
- const allocator_type& a)
- : unordered_map(f, l, n, hf, key_equal(), a) {} // C++14
- unordered_map(initializer_list<value_type> il, size_type n, const allocator_type& a)
- : unordered_map(il, n, hasher(), key_equal(), a) {} // C++14
- unordered_map(initializer_list<value_type> il, size_type n, const hasher& hf,
- const allocator_type& a)
- : unordered_map(il, n, hf, key_equal(), a) {} // C++14
- ~unordered_map();
- unordered_map& operator=(const unordered_map&);
- unordered_map& operator=(unordered_map&&)
- noexcept(
- allocator_type::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value &&
- is_nothrow_move_assignable<hasher>::value &&
- is_nothrow_move_assignable<key_equal>::value);
- unordered_map& operator=(initializer_list<value_type>);
-
- allocator_type get_allocator() const noexcept;
-
- bool empty() const noexcept;
- size_type size() const noexcept;
- size_type max_size() const noexcept;
-
- iterator begin() noexcept;
- iterator end() noexcept;
- const_iterator begin() const noexcept;
- const_iterator end() const noexcept;
- const_iterator cbegin() const noexcept;
- const_iterator cend() const noexcept;
-
- template <class... Args>
- pair<iterator, bool> emplace(Args&&... args);
- template <class... Args>
- iterator emplace_hint(const_iterator position, Args&&... args);
- pair<iterator, bool> insert(const value_type& obj);
- template <class P>
- pair<iterator, bool> insert(P&& obj);
- iterator insert(const_iterator hint, const value_type& obj);
- template <class P>
- iterator insert(const_iterator hint, P&& obj);
- template <class InputIterator>
- void insert(InputIterator first, InputIterator last);
- void insert(initializer_list<value_type>);
-
- node_type extract(const_iterator position); // C++17
- node_type extract(const key_type& x); // C++17
- insert_return_type insert(node_type&& nh); // C++17
- iterator insert(const_iterator hint, node_type&& nh); // C++17
-
- template <class... Args>
- pair<iterator, bool> try_emplace(const key_type& k, Args&&... args); // C++17
- template <class... Args>
- pair<iterator, bool> try_emplace(key_type&& k, Args&&... args); // C++17
- template <class... Args>
- iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17
- template <class... Args>
- iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args); // C++17
- template <class M>
- pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj); // C++17
- template <class M>
- pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj); // C++17
- template <class M>
- iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj); // C++17
- template <class M>
- iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj); // C++17
-
- iterator erase(const_iterator position);
- iterator erase(iterator position); // C++14
- size_type erase(const key_type& k);
- iterator erase(const_iterator first, const_iterator last);
- void clear() noexcept;
-
- template<class H2, class P2>
- void merge(unordered_map<Key, T, H2, P2, Allocator>& source); // C++17
- template<class H2, class P2>
- void merge(unordered_map<Key, T, H2, P2, Allocator>&& source); // C++17
- template<class H2, class P2>
- void merge(unordered_multimap<Key, T, H2, P2, Allocator>& source); // C++17
- template<class H2, class P2>
- void merge(unordered_multimap<Key, T, H2, P2, Allocator>&& source); // C++17
-
- void swap(unordered_map&)
- noexcept(
- (!allocator_type::propagate_on_container_swap::value ||
- __is_nothrow_swappable<allocator_type>::value) &&
- __is_nothrow_swappable<hasher>::value &&
- __is_nothrow_swappable<key_equal>::value);
-
- hasher hash_function() const;
- key_equal key_eq() const;
-
- iterator find(const key_type& k);
- const_iterator find(const key_type& k) const;
- size_type count(const key_type& k) const;
- pair<iterator, iterator> equal_range(const key_type& k);
- pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
-
- mapped_type& operator[](const key_type& k);
- mapped_type& operator[](key_type&& k);
-
- mapped_type& at(const key_type& k);
- const mapped_type& at(const key_type& k) const;
-
- size_type bucket_count() const noexcept;
- size_type max_bucket_count() const noexcept;
-
- size_type bucket_size(size_type n) const;
- size_type bucket(const key_type& k) const;
-
- local_iterator begin(size_type n);
- local_iterator end(size_type n);
- const_local_iterator begin(size_type n) const;
- const_local_iterator end(size_type n) const;
- const_local_iterator cbegin(size_type n) const;
- const_local_iterator cend(size_type n) const;
-
- float load_factor() const noexcept;
- float max_load_factor() const noexcept;
- void max_load_factor(float z);
- void rehash(size_type n);
- void reserve(size_type n);
-};
-
-template <class Key, class T, class Hash, class Pred, class Alloc>
- void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
- unordered_map<Key, T, Hash, Pred, Alloc>& y)
- noexcept(noexcept(x.swap(y)));
-
-template <class Key, class T, class Hash, class Pred, class Alloc>
- bool
- operator==(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
- const unordered_map<Key, T, Hash, Pred, Alloc>& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc>
- bool
- operator!=(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
- const unordered_map<Key, T, Hash, Pred, Alloc>& y);
-
-template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
- class Alloc = allocator<pair<const Key, T>>>
-class unordered_multimap
-{
-public:
- // types
- typedef Key key_type;
- typedef T mapped_type;
- typedef Hash hasher;
- typedef Pred key_equal;
- typedef Alloc allocator_type;
- typedef pair<const key_type, mapped_type> value_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename allocator_traits<allocator_type>::pointer pointer;
- typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
- typedef typename allocator_traits<allocator_type>::size_type size_type;
- typedef typename allocator_traits<allocator_type>::difference_type difference_type;
-
- typedef /unspecified/ iterator;
- typedef /unspecified/ const_iterator;
- typedef /unspecified/ local_iterator;
- typedef /unspecified/ const_local_iterator;
-
- typedef unspecified node_type; // C++17
-
- unordered_multimap()
- noexcept(
- is_nothrow_default_constructible<hasher>::value &&
- is_nothrow_default_constructible<key_equal>::value &&
- is_nothrow_default_constructible<allocator_type>::value);
- explicit unordered_multimap(size_type n, const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- template <class InputIterator>
- unordered_multimap(InputIterator f, InputIterator l,
- size_type n = 0, const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- explicit unordered_multimap(const allocator_type&);
- unordered_multimap(const unordered_multimap&);
- unordered_multimap(const unordered_multimap&, const Allocator&);
- unordered_multimap(unordered_multimap&&)
- noexcept(
- is_nothrow_move_constructible<hasher>::value &&
- is_nothrow_move_constructible<key_equal>::value &&
- is_nothrow_move_constructible<allocator_type>::value);
- unordered_multimap(unordered_multimap&&, const Allocator&);
- unordered_multimap(initializer_list<value_type>, size_type n = 0,
- const hasher& hf = hasher(), const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- unordered_multimap(size_type n, const allocator_type& a)
- : unordered_multimap(n, hasher(), key_equal(), a) {} // C++14
- unordered_multimap(size_type n, const hasher& hf, const allocator_type& a)
- : unordered_multimap(n, hf, key_equal(), a) {} // C++14
- template <class InputIterator>
- unordered_multimap(InputIterator f, InputIterator l, size_type n, const allocator_type& a)
- : unordered_multimap(f, l, n, hasher(), key_equal(), a) {} // C++14
- template <class InputIterator>
- unordered_multimap(InputIterator f, InputIterator l, size_type n, const hasher& hf,
- const allocator_type& a)
- : unordered_multimap(f, l, n, hf, key_equal(), a) {} // C++14
- unordered_multimap(initializer_list<value_type> il, size_type n, const allocator_type& a)
- : unordered_multimap(il, n, hasher(), key_equal(), a) {} // C++14
- unordered_multimap(initializer_list<value_type> il, size_type n, const hasher& hf,
- const allocator_type& a)
- : unordered_multimap(il, n, hf, key_equal(), a) {} // C++14
- ~unordered_multimap();
- unordered_multimap& operator=(const unordered_multimap&);
- unordered_multimap& operator=(unordered_multimap&&)
- noexcept(
- allocator_type::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value &&
- is_nothrow_move_assignable<hasher>::value &&
- is_nothrow_move_assignable<key_equal>::value);
- unordered_multimap& operator=(initializer_list<value_type>);
-
- allocator_type get_allocator() const noexcept;
-
- bool empty() const noexcept;
- size_type size() const noexcept;
- size_type max_size() const noexcept;
-
- iterator begin() noexcept;
- iterator end() noexcept;
- const_iterator begin() const noexcept;
- const_iterator end() const noexcept;
- const_iterator cbegin() const noexcept;
- const_iterator cend() const noexcept;
-
- template <class... Args>
- iterator emplace(Args&&... args);
- template <class... Args>
- iterator emplace_hint(const_iterator position, Args&&... args);
- iterator insert(const value_type& obj);
- template <class P>
- iterator insert(P&& obj);
- iterator insert(const_iterator hint, const value_type& obj);
- template <class P>
- iterator insert(const_iterator hint, P&& obj);
- template <class InputIterator>
- void insert(InputIterator first, InputIterator last);
- void insert(initializer_list<value_type>);
-
- node_type extract(const_iterator position); // C++17
- node_type extract(const key_type& x); // C++17
- iterator insert(node_type&& nh); // C++17
- iterator insert(const_iterator hint, node_type&& nh); // C++17
-
- iterator erase(const_iterator position);
- iterator erase(iterator position); // C++14
- size_type erase(const key_type& k);
- iterator erase(const_iterator first, const_iterator last);
- void clear() noexcept;
-
- template<class H2, class P2>
- void merge(unordered_multimap<Key, T, H2, P2, Allocator>& source); // C++17
- template<class H2, class P2>
- void merge(unordered_multimap<Key, T, H2, P2, Allocator>&& source); // C++17
- template<class H2, class P2>
- void merge(unordered_map<Key, T, H2, P2, Allocator>& source); // C++17
- template<class H2, class P2>
- void merge(unordered_map<Key, T, H2, P2, Allocator>&& source); // C++17
-
- void swap(unordered_multimap&)
- noexcept(
- (!allocator_type::propagate_on_container_swap::value ||
- __is_nothrow_swappable<allocator_type>::value) &&
- __is_nothrow_swappable<hasher>::value &&
- __is_nothrow_swappable<key_equal>::value);
-
- hasher hash_function() const;
- key_equal key_eq() const;
-
- iterator find(const key_type& k);
- const_iterator find(const key_type& k) const;
- size_type count(const key_type& k) const;
- pair<iterator, iterator> equal_range(const key_type& k);
- pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
-
- size_type bucket_count() const noexcept;
- size_type max_bucket_count() const noexcept;
-
- size_type bucket_size(size_type n) const;
- size_type bucket(const key_type& k) const;
-
- local_iterator begin(size_type n);
- local_iterator end(size_type n);
- const_local_iterator begin(size_type n) const;
- const_local_iterator end(size_type n) const;
- const_local_iterator cbegin(size_type n) const;
- const_local_iterator cend(size_type n) const;
-
- float load_factor() const noexcept;
- float max_load_factor() const noexcept;
- void max_load_factor(float z);
- void rehash(size_type n);
- void reserve(size_type n);
-};
-
-template <class Key, class T, class Hash, class Pred, class Alloc>
- void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
- unordered_multimap<Key, T, Hash, Pred, Alloc>& y)
- noexcept(noexcept(x.swap(y)));
-
-template <class K, class T, class H, class P, class A, class Predicate>
- void erase_if(unordered_set<K, T, H, P, A>& c, Predicate pred); // C++20
-
-template <class K, class T, class H, class P, class A, class Predicate>
- void erase_if(unordered_multiset<K, T, H, P, A>& c, Predicate pred); // C++20
-
-template <class Key, class T, class Hash, class Pred, class Alloc>
- bool
- operator==(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
- const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc>
- bool
- operator!=(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
- const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
-
-} // std
-
-*/
-
-#include <__config>
-#include <__hash_table>
-#include <__node_handle>
-#include <functional>
-#include <stdexcept>
-#include <tuple>
-#include <version>
-
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Key, class _Cp, class _Hash,
- bool = is_empty<_Hash>::value && !__libcpp_is_final<_Hash>::value>
-class __unordered_map_hasher
- : private _Hash
-{
-public:
- _LIBCPP_INLINE_VISIBILITY
- __unordered_map_hasher()
- _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
- : _Hash() {}
- _LIBCPP_INLINE_VISIBILITY
- __unordered_map_hasher(const _Hash& __h)
- _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
- : _Hash(__h) {}
- _LIBCPP_INLINE_VISIBILITY
- const _Hash& hash_function() const _NOEXCEPT {return *this;}
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(const _Cp& __x) const
- {return static_cast<const _Hash&>(*this)(__x.__get_value().first);}
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(const _Key& __x) const
- {return static_cast<const _Hash&>(*this)(__x);}
- void swap(__unordered_map_hasher&__y)
- _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
- {
- using _VSTD::swap;
- swap(static_cast<_Hash&>(*this), static_cast<_Hash&>(__y));
- }
-};
-
-template <class _Key, class _Cp, class _Hash>
-class __unordered_map_hasher<_Key, _Cp, _Hash, false>
-{
- _Hash __hash_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- __unordered_map_hasher()
- _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
- : __hash_() {}
- _LIBCPP_INLINE_VISIBILITY
- __unordered_map_hasher(const _Hash& __h)
- _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
- : __hash_(__h) {}
- _LIBCPP_INLINE_VISIBILITY
- const _Hash& hash_function() const _NOEXCEPT {return __hash_;}
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(const _Cp& __x) const
- {return __hash_(__x.__get_value().first);}
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(const _Key& __x) const
- {return __hash_(__x);}
- void swap(__unordered_map_hasher&__y)
- _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
- {
- using _VSTD::swap;
- swap(__hash_, __y.__hash_);
- }
-};
-
-template <class _Key, class _Cp, class _Hash, bool __b>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(__unordered_map_hasher<_Key, _Cp, _Hash, __b>& __x,
- __unordered_map_hasher<_Key, _Cp, _Hash, __b>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-template <class _Key, class _Cp, class _Pred,
- bool = is_empty<_Pred>::value && !__libcpp_is_final<_Pred>::value>
-class __unordered_map_equal
- : private _Pred
-{
-public:
- _LIBCPP_INLINE_VISIBILITY
- __unordered_map_equal()
- _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
- : _Pred() {}
- _LIBCPP_INLINE_VISIBILITY
- __unordered_map_equal(const _Pred& __p)
- _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
- : _Pred(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- const _Pred& key_eq() const _NOEXCEPT {return *this;}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Cp& __x, const _Cp& __y) const
- {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y.__get_value().first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Cp& __x, const _Key& __y) const
- {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Key& __x, const _Cp& __y) const
- {return static_cast<const _Pred&>(*this)(__x, __y.__get_value().first);}
- void swap(__unordered_map_equal&__y)
- _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
- {
- using _VSTD::swap;
- swap(static_cast<_Pred&>(*this), static_cast<_Pred&>(__y));
- }
-};
-
-template <class _Key, class _Cp, class _Pred>
-class __unordered_map_equal<_Key, _Cp, _Pred, false>
-{
- _Pred __pred_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- __unordered_map_equal()
- _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
- : __pred_() {}
- _LIBCPP_INLINE_VISIBILITY
- __unordered_map_equal(const _Pred& __p)
- _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
- : __pred_(__p) {}
- _LIBCPP_INLINE_VISIBILITY
- const _Pred& key_eq() const _NOEXCEPT {return __pred_;}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Cp& __x, const _Cp& __y) const
- {return __pred_(__x.__get_value().first, __y.__get_value().first);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Cp& __x, const _Key& __y) const
- {return __pred_(__x.__get_value().first, __y);}
- _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Key& __x, const _Cp& __y) const
- {return __pred_(__x, __y.__get_value().first);}
- void swap(__unordered_map_equal&__y)
- _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
- {
- using _VSTD::swap;
- swap(__pred_, __y.__pred_);
- }
-};
-
-template <class _Key, class _Cp, class _Pred, bool __b>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(__unordered_map_equal<_Key, _Cp, _Pred, __b>& __x,
- __unordered_map_equal<_Key, _Cp, _Pred, __b>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-template <class _Alloc>
-class __hash_map_node_destructor
-{
- typedef _Alloc allocator_type;
- typedef allocator_traits<allocator_type> __alloc_traits;
-
-public:
-
- typedef typename __alloc_traits::pointer pointer;
-private:
-
- allocator_type& __na_;
-
- __hash_map_node_destructor& operator=(const __hash_map_node_destructor&);
-
-public:
- bool __first_constructed;
- bool __second_constructed;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT
- : __na_(__na),
- __first_constructed(false),
- __second_constructed(false)
- {}
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x)
- _NOEXCEPT
- : __na_(__x.__na_),
- __first_constructed(__x.__value_constructed),
- __second_constructed(__x.__value_constructed)
- {
- __x.__value_constructed = false;
- }
-#else // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x)
- : __na_(__x.__na_),
- __first_constructed(__x.__value_constructed),
- __second_constructed(__x.__value_constructed)
- {
- const_cast<bool&>(__x.__value_constructed) = false;
- }
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- void operator()(pointer __p) _NOEXCEPT
- {
- if (__second_constructed)
- __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second));
- if (__first_constructed)
- __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first));
- if (__p)
- __alloc_traits::deallocate(__na_, __p, 1);
- }
-};
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Key, class _Tp>
-struct __hash_value_type
-{
- typedef _Key key_type;
- typedef _Tp mapped_type;
- typedef pair<const key_type, mapped_type> value_type;
- typedef pair<key_type&, mapped_type&> __nc_ref_pair_type;
- typedef pair<key_type&&, mapped_type&&> __nc_rref_pair_type;
-
-private:
- value_type __cc;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- value_type& __get_value()
- {
-#if _LIBCPP_STD_VER > 14
- return *_VSTD::launder(_VSTD::addressof(__cc));
-#else
- return __cc;
-#endif
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const value_type& __get_value() const
- {
-#if _LIBCPP_STD_VER > 14
- return *_VSTD::launder(_VSTD::addressof(__cc));
-#else
- return __cc;
-#endif
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __nc_ref_pair_type __ref()
- {
- value_type& __v = __get_value();
- return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __nc_rref_pair_type __move()
- {
- value_type& __v = __get_value();
- return __nc_rref_pair_type(
- _VSTD::move(const_cast<key_type&>(__v.first)),
- _VSTD::move(__v.second));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_value_type& operator=(const __hash_value_type& __v)
- {
- __ref() = __v.__get_value();
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_value_type& operator=(__hash_value_type&& __v)
- {
- __ref() = __v.__move();
- return *this;
- }
-
- template <class _ValueTp,
- class = typename enable_if<
- __is_same_uncvref<_ValueTp, value_type>::value
- >::type
- >
- _LIBCPP_INLINE_VISIBILITY
- __hash_value_type& operator=(_ValueTp&& __v)
- {
- __ref() = _VSTD::forward<_ValueTp>(__v);
- return *this;
- }
-
-private:
- __hash_value_type(const __hash_value_type& __v) = delete;
- __hash_value_type(__hash_value_type&& __v) = delete;
- template <class ..._Args>
- explicit __hash_value_type(_Args&& ...__args) = delete;
-
- ~__hash_value_type() = delete;
-};
-
-#else
-
-template <class _Key, class _Tp>
-struct __hash_value_type
-{
- typedef _Key key_type;
- typedef _Tp mapped_type;
- typedef pair<const key_type, mapped_type> value_type;
-
-private:
- value_type __cc;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- value_type& __get_value() { return __cc; }
- _LIBCPP_INLINE_VISIBILITY
- const value_type& __get_value() const { return __cc; }
-
-private:
- ~__hash_value_type();
-};
-
-#endif
-
-template <class _HashIterator>
-class _LIBCPP_TEMPLATE_VIS __hash_map_iterator
-{
- _HashIterator __i_;
-
- typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
-
-public:
- typedef forward_iterator_tag iterator_category;
- typedef typename _NodeTypes::__map_value_type value_type;
- typedef typename _NodeTypes::difference_type difference_type;
- typedef value_type& reference;
- typedef typename _NodeTypes::__map_value_type_pointer pointer;
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_iterator() _NOEXCEPT {}
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {return __i_->__get_value();}
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_iterator& operator++() {++__i_; return *this;}
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_iterator operator++(int)
- {
- __hash_map_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
- {return __x.__i_ == __y.__i_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
- {return __x.__i_ != __y.__i_;}
-
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
-};
-
-template <class _HashIterator>
-class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator
-{
- _HashIterator __i_;
-
- typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
-
-public:
- typedef forward_iterator_tag iterator_category;
- typedef typename _NodeTypes::__map_value_type value_type;
- typedef typename _NodeTypes::difference_type difference_type;
- typedef const value_type& reference;
- typedef typename _NodeTypes::__const_map_value_type_pointer pointer;
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_const_iterator() _NOEXCEPT {}
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_const_iterator(
- __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i)
- _NOEXCEPT
- : __i_(__i.__i_) {}
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {return __i_->__get_value();}
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_const_iterator& operator++() {++__i_; return *this;}
- _LIBCPP_INLINE_VISIBILITY
- __hash_map_const_iterator operator++(int)
- {
- __hash_map_const_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
- {return __x.__i_ == __y.__i_;}
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
- {return __x.__i_ != __y.__i_;}
-
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
-};
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-class unordered_multimap;
-
-template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
- class _Alloc = allocator<pair<const _Key, _Tp> > >
-class _LIBCPP_TEMPLATE_VIS unordered_map
-{
-public:
- // types
- typedef _Key key_type;
- typedef _Tp mapped_type;
- typedef _Hash hasher;
- typedef _Pred key_equal;
- typedef _Alloc allocator_type;
- typedef pair<const key_type, mapped_type> value_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- static_assert((is_same<value_type, typename allocator_type::value_type>::value),
- "Invalid allocator::value_type");
- static_assert(sizeof(__diagnose_unordered_container_requirements<_Key, _Hash, _Pred>(0)), "");
-
-private:
- typedef __hash_value_type<key_type, mapped_type> __value_type;
- typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher;
- typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
- typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
- __value_type>::type __allocator_type;
-
- typedef __hash_table<__value_type, __hasher,
- __key_equal, __allocator_type> __table;
-
- __table __table_;
-
- typedef typename __table::_NodeTypes _NodeTypes;
- typedef typename __table::__node_pointer __node_pointer;
- typedef typename __table::__node_const_pointer __node_const_pointer;
- typedef typename __table::__node_traits __node_traits;
- typedef typename __table::__node_allocator __node_allocator;
- typedef typename __table::__node __node;
- typedef __hash_map_node_destructor<__node_allocator> _Dp;
- typedef unique_ptr<__node, _Dp> __node_holder;
- typedef allocator_traits<allocator_type> __alloc_traits;
-
- static_assert((is_same<typename __table::__container_value_type, value_type>::value), "");
- static_assert((is_same<typename __table::__node_value_type, __value_type>::value), "");
-public:
- typedef typename __alloc_traits::pointer pointer;
- typedef typename __alloc_traits::const_pointer const_pointer;
- typedef typename __table::size_type size_type;
- typedef typename __table::difference_type difference_type;
-
- typedef __hash_map_iterator<typename __table::iterator> iterator;
- typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
- typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
- typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
-
-#if _LIBCPP_STD_VER > 14
- typedef __map_node_handle<__node, allocator_type> node_type;
- typedef __insert_return_type<iterator, node_type> insert_return_type;
-#endif
-
- template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
- friend class _LIBCPP_TEMPLATE_VIS unordered_map;
- template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
- friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
-
- _LIBCPP_INLINE_VISIBILITY
- unordered_map()
- _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- }
- explicit unordered_map(size_type __n, const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- unordered_map(size_type __n, const hasher& __hf,
- const key_equal& __eql,
- const allocator_type& __a);
- template <class _InputIterator>
- unordered_map(_InputIterator __first, _InputIterator __last);
- template <class _InputIterator>
- unordered_map(_InputIterator __first, _InputIterator __last,
- size_type __n, const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- template <class _InputIterator>
- unordered_map(_InputIterator __first, _InputIterator __last,
- size_type __n, const hasher& __hf,
- const key_equal& __eql,
- const allocator_type& __a);
- _LIBCPP_INLINE_VISIBILITY
- explicit unordered_map(const allocator_type& __a);
- unordered_map(const unordered_map& __u);
- unordered_map(const unordered_map& __u, const allocator_type& __a);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- unordered_map(unordered_map&& __u)
- _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
- unordered_map(unordered_map&& __u, const allocator_type& __a);
- unordered_map(initializer_list<value_type> __il);
- unordered_map(initializer_list<value_type> __il, size_type __n,
- const hasher& __hf = hasher(), const key_equal& __eql = key_equal());
- unordered_map(initializer_list<value_type> __il, size_type __n,
- const hasher& __hf, const key_equal& __eql,
- const allocator_type& __a);
-#endif // _LIBCPP_CXX03_LANG
-#if _LIBCPP_STD_VER > 11
- _LIBCPP_INLINE_VISIBILITY
- unordered_map(size_type __n, const allocator_type& __a)
- : unordered_map(__n, hasher(), key_equal(), __a) {}
- _LIBCPP_INLINE_VISIBILITY
- unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a)
- : unordered_map(__n, __hf, key_equal(), __a) {}
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
- : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {}
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
- const allocator_type& __a)
- : unordered_map(__first, __last, __n, __hf, key_equal(), __a) {}
- _LIBCPP_INLINE_VISIBILITY
- unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
- : unordered_map(__il, __n, hasher(), key_equal(), __a) {}
- _LIBCPP_INLINE_VISIBILITY
- unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
- const allocator_type& __a)
- : unordered_map(__il, __n, __hf, key_equal(), __a) {}
-#endif
- // ~unordered_map() = default;
- _LIBCPP_INLINE_VISIBILITY
- unordered_map& operator=(const unordered_map& __u)
- {
-#ifndef _LIBCPP_CXX03_LANG
- __table_ = __u.__table_;
-#else
- if (this != &__u) {
- __table_.clear();
- __table_.hash_function() = __u.__table_.hash_function();
- __table_.key_eq() = __u.__table_.key_eq();
- __table_.max_load_factor() = __u.__table_.max_load_factor();
- __table_.__copy_assign_alloc(__u.__table_);
- insert(__u.begin(), __u.end());
- }
-#endif
- return *this;
- }
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- unordered_map& operator=(unordered_map&& __u)
- _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
- _LIBCPP_INLINE_VISIBILITY
- unordered_map& operator=(initializer_list<value_type> __il);
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const _NOEXCEPT
- {return allocator_type(__table_.__node_alloc());}
-
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const _NOEXCEPT {return __table_.size() == 0;}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT {return __table_.size();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const _NOEXCEPT {return __table_.max_size();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT {return __table_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT {return __table_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const _NOEXCEPT {return __table_.end();}
-
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> insert(const value_type& __x)
- {return __table_.__insert_unique(__x);}
-
- iterator insert(const_iterator __p, const value_type& __x) {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
- " referring to this unordered_map");
-#else
- ((void)__p);
-#endif
- return insert(__x).first;
- }
-
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- void insert(_InputIterator __first, _InputIterator __last);
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- void insert(initializer_list<value_type> __il)
- {insert(__il.begin(), __il.end());}
-
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> insert(value_type&& __x)
- {return __table_.__insert_unique(_VSTD::move(__x));}
-
- iterator insert(const_iterator __p, value_type&& __x) {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
- " referring to this unordered_map");
-#else
- ((void)__p);
-#endif
- return __table_.__insert_unique(_VSTD::move(__x)).first;
- }
-
- template <class _Pp,
- class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> insert(_Pp&& __x)
- {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));}
-
- template <class _Pp,
- class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __p, _Pp&& __x)
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "unordered_map::insert(const_iterator, value_type&&) called with an iterator not"
- " referring to this unordered_map");
-#else
- ((void)__p);
-#endif
- return insert(_VSTD::forward<_Pp>(__x)).first;
- }
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> emplace(_Args&&... __args) {
- return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
- }
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator emplace_hint(const_iterator __p, _Args&&... __args) {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not"
- " referring to this unordered_map");
-#else
- ((void)__p);
-#endif
- return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
- }
-
-#endif // _LIBCPP_CXX03_LANG
-
-#if _LIBCPP_STD_VER > 14
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
- {
- return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct,
- _VSTD::forward_as_tuple(__k),
- _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
- }
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
- {
- return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct,
- _VSTD::forward_as_tuple(_VSTD::move(__k)),
- _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
- }
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this,
- "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
- " referring to this unordered_map");
-#else
- ((void)__h);
-#endif
- return try_emplace(__k, _VSTD::forward<_Args>(__args)...).first;
- }
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this,
- "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
- " referring to this unordered_map");
-#else
- ((void)__h);
-#endif
- return try_emplace(_VSTD::move(__k), _VSTD::forward<_Args>(__args)...).first;
- }
-
- template <class _Vp>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
- {
- pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
- __k, _VSTD::forward<_Vp>(__v));
- if (!__res.second) {
- __res.first->second = _VSTD::forward<_Vp>(__v);
- }
- return __res;
- }
-
- template <class _Vp>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
- {
- pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
- _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
- if (!__res.second) {
- __res.first->second = _VSTD::forward<_Vp>(__v);
- }
- return __res;
- }
-
- template <class _Vp>
- _LIBCPP_INLINE_VISIBILITY
- iterator insert_or_assign(const_iterator, const key_type& __k, _Vp&& __v)
- {
- // FIXME: Add debug mode checking for the iterator input
- return insert_or_assign(__k, _VSTD::forward<_Vp>(__v)).first;
- }
-
- template <class _Vp>
- _LIBCPP_INLINE_VISIBILITY
- iterator insert_or_assign(const_iterator, key_type&& __k, _Vp&& __v)
- {
- // FIXME: Add debug mode checking for the iterator input
- return insert_or_assign(_VSTD::move(__k), _VSTD::forward<_Vp>(__v)).first;
- }
-#endif // _LIBCPP_STD_VER > 14
-
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(iterator __p) {return __table_.erase(__p.__i_);}
- _LIBCPP_INLINE_VISIBILITY
- size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __first, const_iterator __last)
- {return __table_.erase(__first.__i_, __last.__i_);}
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT {__table_.clear();}
-
-#if _LIBCPP_STD_VER > 14
- _LIBCPP_INLINE_VISIBILITY
- insert_return_type insert(node_type&& __nh)
- {
- _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
- "node_type with incompatible allocator passed to unordered_map::insert()");
- return __table_.template __node_handle_insert_unique<
- node_type, insert_return_type>(_VSTD::move(__nh));
- }
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __hint, node_type&& __nh)
- {
- _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
- "node_type with incompatible allocator passed to unordered_map::insert()");
- return __table_.template __node_handle_insert_unique<node_type>(
- __hint.__i_, _VSTD::move(__nh));
- }
- _LIBCPP_INLINE_VISIBILITY
- node_type extract(key_type const& __key)
- {
- return __table_.template __node_handle_extract<node_type>(__key);
- }
- _LIBCPP_INLINE_VISIBILITY
- node_type extract(const_iterator __it)
- {
- return __table_.template __node_handle_extract<node_type>(
- __it.__i_);
- }
-
- template <class _H2, class _P2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- return __table_.__node_handle_merge_unique(__source.__table_);
- }
- template <class _H2, class _P2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- return __table_.__node_handle_merge_unique(__source.__table_);
- }
- template <class _H2, class _P2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- return __table_.__node_handle_merge_unique(__source.__table_);
- }
- template <class _H2, class _P2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- return __table_.__node_handle_merge_unique(__source.__table_);
- }
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(unordered_map& __u)
- _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
- { __table_.swap(__u.__table_);}
-
- _LIBCPP_INLINE_VISIBILITY
- hasher hash_function() const
- {return __table_.hash_function().hash_function();}
- _LIBCPP_INLINE_VISIBILITY
- key_equal key_eq() const
- {return __table_.key_eq().key_eq();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator find(const key_type& __k) {return __table_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator find(const key_type& __k) const {return __table_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, iterator> equal_range(const key_type& __k)
- {return __table_.__equal_range_unique(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
- {return __table_.__equal_range_unique(__k);}
-
- mapped_type& operator[](const key_type& __k);
-#ifndef _LIBCPP_CXX03_LANG
- mapped_type& operator[](key_type&& __k);
-#endif
-
- mapped_type& at(const key_type& __k);
- const mapped_type& at(const key_type& __k) const;
-
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket_size(size_type __n) const
- {return __table_.bucket_size(__n);}
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
-
- _LIBCPP_INLINE_VISIBILITY
- local_iterator begin(size_type __n) {return __table_.begin(__n);}
- _LIBCPP_INLINE_VISIBILITY
- local_iterator end(size_type __n) {return __table_.end(__n);}
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
-
- _LIBCPP_INLINE_VISIBILITY
- float load_factor() const _NOEXCEPT {return __table_.load_factor();}
- _LIBCPP_INLINE_VISIBILITY
- float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
- _LIBCPP_INLINE_VISIBILITY
- void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
- _LIBCPP_INLINE_VISIBILITY
- void rehash(size_type __n) {__table_.rehash(__n);}
- _LIBCPP_INLINE_VISIBILITY
- void reserve(size_type __n) {__table_.reserve(__n);}
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
-
- bool __dereferenceable(const const_iterator* __i) const
- {return __table_.__dereferenceable(&__i->__i_);}
- bool __decrementable(const const_iterator* __i) const
- {return __table_.__decrementable(&__i->__i_);}
- bool __addable(const const_iterator* __i, ptrdiff_t __n) const
- {return __table_.__addable(&__i->__i_, __n);}
- bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
- {return __table_.__addable(&__i->__i_, __n);}
-
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-
-private:
-
-#ifdef _LIBCPP_CXX03_LANG
- __node_holder __construct_node_with_key(const key_type& __k);
-#endif
-};
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
- size_type __n, const hasher& __hf, const key_equal& __eql)
- : __table_(__hf, __eql)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
- size_type __n, const hasher& __hf, const key_equal& __eql,
- const allocator_type& __a)
- : __table_(__hf, __eql, typename __table::allocator_type(__a))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-inline
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
- const allocator_type& __a)
- : __table_(typename __table::allocator_type(__a))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
- _InputIterator __first, _InputIterator __last)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- insert(__first, __last);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
- _InputIterator __first, _InputIterator __last, size_type __n,
- const hasher& __hf, const key_equal& __eql)
- : __table_(__hf, __eql)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
- insert(__first, __last);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
- _InputIterator __first, _InputIterator __last, size_type __n,
- const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
- : __table_(__hf, __eql, typename __table::allocator_type(__a))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
- insert(__first, __last);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
- const unordered_map& __u)
- : __table_(__u.__table_)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__u.bucket_count());
- insert(__u.begin(), __u.end());
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
- const unordered_map& __u, const allocator_type& __a)
- : __table_(__u.__table_, typename __table::allocator_type(__a))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__u.bucket_count());
- insert(__u.begin(), __u.end());
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-inline
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
- unordered_map&& __u)
- _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
- : __table_(_VSTD::move(__u.__table_))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
- __get_db()->swap(this, &__u);
-#endif
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
- unordered_map&& __u, const allocator_type& __a)
- : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- if (__a != __u.get_allocator())
- {
- iterator __i = __u.begin();
- while (__u.size() != 0) {
- __table_.__emplace_unique(
- __u.__table_.remove((__i++).__i_)->__value_.__move());
- }
- }
-#if _LIBCPP_DEBUG_LEVEL >= 2
- else
- __get_db()->swap(this, &__u);
-#endif
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
- initializer_list<value_type> __il)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- insert(__il.begin(), __il.end());
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
- initializer_list<value_type> __il, size_type __n, const hasher& __hf,
- const key_equal& __eql)
- : __table_(__hf, __eql)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
- insert(__il.begin(), __il.end());
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
- initializer_list<value_type> __il, size_type __n, const hasher& __hf,
- const key_equal& __eql, const allocator_type& __a)
- : __table_(__hf, __eql, typename __table::allocator_type(__a))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
- insert(__il.begin(), __il.end());
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-inline
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u)
- _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
-{
- __table_ = _VSTD::move(__u.__table_);
- return *this;
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-inline
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
- initializer_list<value_type> __il)
-{
- __table_.__assign_unique(__il.begin(), __il.end());
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-inline
-void
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
- _InputIterator __last)
-{
- for (; __first != __last; ++__first)
- __table_.__insert_unique(*__first);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-_Tp&
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
-{
- return __table_.__emplace_unique_key_args(__k,
- std::piecewise_construct, std::forward_as_tuple(__k),
- std::forward_as_tuple()).first->__get_value().second;
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-_Tp&
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k)
-{
- return __table_.__emplace_unique_key_args(__k,
- std::piecewise_construct, std::forward_as_tuple(std::move(__k)),
- std::forward_as_tuple()).first->__get_value().second;
-}
-#else // _LIBCPP_CXX03_LANG
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k)
-{
- __node_allocator& __na = __table_.__node_alloc();
- __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k);
- __h.get_deleter().__first_constructed = true;
- __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second));
- __h.get_deleter().__second_constructed = true;
- return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-_Tp&
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
-{
- iterator __i = find(__k);
- if (__i != end())
- return __i->second;
- __node_holder __h = __construct_node_with_key(__k);
- pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
- __h.release();
- return __r.first->second;
-}
-
-#endif // _LIBCPP_CXX03_MODE
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-_Tp&
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k)
-{
- iterator __i = find(__k);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (__i == end())
- throw out_of_range("unordered_map::at: key not found");
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __i->second;
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-const _Tp&
-unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const
-{
- const_iterator __i = find(__k);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- if (__i == end())
- throw out_of_range("unordered_map::at: key not found");
-#endif // _LIBCPP_NO_EXCEPTIONS
- return __i->second;
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
- unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-#if _LIBCPP_STD_VER > 17
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase_if(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __c, _Predicate __pred)
-{ __libcpp_erase_if_container(__c, __pred); }
-#endif
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-bool
-operator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
- const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
-{
- if (__x.size() != __y.size())
- return false;
- typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
- const_iterator;
- for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
- __i != __ex; ++__i)
- {
- const_iterator __j = __y.find(__i->first);
- if (__j == __ey || !(*__i == *__j))
- return false;
- }
- return true;
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
- const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
- class _Alloc = allocator<pair<const _Key, _Tp> > >
-class _LIBCPP_TEMPLATE_VIS unordered_multimap
-{
-public:
- // types
- typedef _Key key_type;
- typedef _Tp mapped_type;
- typedef _Hash hasher;
- typedef _Pred key_equal;
- typedef _Alloc allocator_type;
- typedef pair<const key_type, mapped_type> value_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- static_assert((is_same<value_type, typename allocator_type::value_type>::value),
- "Invalid allocator::value_type");
- static_assert(sizeof(__diagnose_unordered_container_requirements<_Key, _Hash, _Pred>(0)), "");
-
-private:
- typedef __hash_value_type<key_type, mapped_type> __value_type;
- typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher;
- typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
- typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
- __value_type>::type __allocator_type;
-
- typedef __hash_table<__value_type, __hasher,
- __key_equal, __allocator_type> __table;
-
- __table __table_;
-
- typedef typename __table::_NodeTypes _NodeTypes;
- typedef typename __table::__node_traits __node_traits;
- typedef typename __table::__node_allocator __node_allocator;
- typedef typename __table::__node __node;
- typedef __hash_map_node_destructor<__node_allocator> _Dp;
- typedef unique_ptr<__node, _Dp> __node_holder;
- typedef allocator_traits<allocator_type> __alloc_traits;
- static_assert((is_same<typename __node_traits::size_type,
- typename __alloc_traits::size_type>::value),
- "Allocator uses different size_type for different types");
-public:
- typedef typename __alloc_traits::pointer pointer;
- typedef typename __alloc_traits::const_pointer const_pointer;
- typedef typename __table::size_type size_type;
- typedef typename __table::difference_type difference_type;
-
- typedef __hash_map_iterator<typename __table::iterator> iterator;
- typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
- typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
- typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
-
-#if _LIBCPP_STD_VER > 14
- typedef __map_node_handle<__node, allocator_type> node_type;
-#endif
-
- template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
- friend class _LIBCPP_TEMPLATE_VIS unordered_map;
- template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
- friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
-
- _LIBCPP_INLINE_VISIBILITY
- unordered_multimap()
- _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- }
- explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- unordered_multimap(size_type __n, const hasher& __hf,
- const key_equal& __eql,
- const allocator_type& __a);
- template <class _InputIterator>
- unordered_multimap(_InputIterator __first, _InputIterator __last);
- template <class _InputIterator>
- unordered_multimap(_InputIterator __first, _InputIterator __last,
- size_type __n, const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- template <class _InputIterator>
- unordered_multimap(_InputIterator __first, _InputIterator __last,
- size_type __n, const hasher& __hf,
- const key_equal& __eql,
- const allocator_type& __a);
- _LIBCPP_INLINE_VISIBILITY
- explicit unordered_multimap(const allocator_type& __a);
- unordered_multimap(const unordered_multimap& __u);
- unordered_multimap(const unordered_multimap& __u, const allocator_type& __a);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- unordered_multimap(unordered_multimap&& __u)
- _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
- unordered_multimap(unordered_multimap&& __u, const allocator_type& __a);
- unordered_multimap(initializer_list<value_type> __il);
- unordered_multimap(initializer_list<value_type> __il, size_type __n,
- const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- unordered_multimap(initializer_list<value_type> __il, size_type __n,
- const hasher& __hf, const key_equal& __eql,
- const allocator_type& __a);
-#endif // _LIBCPP_CXX03_LANG
-#if _LIBCPP_STD_VER > 11
- _LIBCPP_INLINE_VISIBILITY
- unordered_multimap(size_type __n, const allocator_type& __a)
- : unordered_multimap(__n, hasher(), key_equal(), __a) {}
- _LIBCPP_INLINE_VISIBILITY
- unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a)
- : unordered_multimap(__n, __hf, key_equal(), __a) {}
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
- : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {}
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
- const allocator_type& __a)
- : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {}
- _LIBCPP_INLINE_VISIBILITY
- unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
- : unordered_multimap(__il, __n, hasher(), key_equal(), __a) {}
- _LIBCPP_INLINE_VISIBILITY
- unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
- const allocator_type& __a)
- : unordered_multimap(__il, __n, __hf, key_equal(), __a) {}
-#endif
- // ~unordered_multimap() = default;
- _LIBCPP_INLINE_VISIBILITY
- unordered_multimap& operator=(const unordered_multimap& __u)
- {
-#ifndef _LIBCPP_CXX03_LANG
- __table_ = __u.__table_;
-#else
- if (this != &__u) {
- __table_.clear();
- __table_.hash_function() = __u.__table_.hash_function();
- __table_.key_eq() = __u.__table_.key_eq();
- __table_.max_load_factor() = __u.__table_.max_load_factor();
- __table_.__copy_assign_alloc(__u.__table_);
- insert(__u.begin(), __u.end());
- }
-#endif
- return *this;
- }
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- unordered_multimap& operator=(unordered_multimap&& __u)
- _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
- _LIBCPP_INLINE_VISIBILITY
- unordered_multimap& operator=(initializer_list<value_type> __il);
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const _NOEXCEPT
- {return allocator_type(__table_.__node_alloc());}
-
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const _NOEXCEPT {return __table_.size() == 0;}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT {return __table_.size();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const _NOEXCEPT {return __table_.max_size();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT {return __table_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT {return __table_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const _NOEXCEPT {return __table_.end();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __p, const value_type& __x)
- {return __table_.__insert_multi(__p.__i_, __x);}
-
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- void insert(_InputIterator __first, _InputIterator __last);
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- void insert(initializer_list<value_type> __il)
- {insert(__il.begin(), __il.end());}
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __p, value_type&& __x)
- {return __table_.__insert_multi(__p.__i_, _VSTD::move(__x));}
-
- template <class _Pp,
- class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(_Pp&& __x)
- {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));}
-
- template <class _Pp,
- class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __p, _Pp&& __x)
- {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));}
-
- template <class... _Args>
- iterator emplace(_Args&&... __args) {
- return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
- }
-
- template <class... _Args>
- iterator emplace_hint(const_iterator __p, _Args&&... __args) {
- return __table_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
- }
-#endif // _LIBCPP_CXX03_LANG
-
-
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(iterator __p) {return __table_.erase(__p.__i_);}
- _LIBCPP_INLINE_VISIBILITY
- size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __first, const_iterator __last)
- {return __table_.erase(__first.__i_, __last.__i_);}
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT {__table_.clear();}
-
-#if _LIBCPP_STD_VER > 14
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(node_type&& __nh)
- {
- _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
- "node_type with incompatible allocator passed to unordered_multimap::insert()");
- return __table_.template __node_handle_insert_multi<node_type>(
- _VSTD::move(__nh));
- }
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __hint, node_type&& __nh)
- {
- _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
- "node_type with incompatible allocator passed to unordered_multimap::insert()");
- return __table_.template __node_handle_insert_multi<node_type>(
- __hint.__i_, _VSTD::move(__nh));
- }
- _LIBCPP_INLINE_VISIBILITY
- node_type extract(key_type const& __key)
- {
- return __table_.template __node_handle_extract<node_type>(__key);
- }
- _LIBCPP_INLINE_VISIBILITY
- node_type extract(const_iterator __it)
- {
- return __table_.template __node_handle_extract<node_type>(
- __it.__i_);
- }
-
- template <class _H2, class _P2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- return __table_.__node_handle_merge_multi(__source.__table_);
- }
- template <class _H2, class _P2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- return __table_.__node_handle_merge_multi(__source.__table_);
- }
- template <class _H2, class _P2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- return __table_.__node_handle_merge_multi(__source.__table_);
- }
- template <class _H2, class _P2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- return __table_.__node_handle_merge_multi(__source.__table_);
- }
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(unordered_multimap& __u)
- _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
- {__table_.swap(__u.__table_);}
-
- _LIBCPP_INLINE_VISIBILITY
- hasher hash_function() const
- {return __table_.hash_function().hash_function();}
- _LIBCPP_INLINE_VISIBILITY
- key_equal key_eq() const
- {return __table_.key_eq().key_eq();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator find(const key_type& __k) {return __table_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator find(const key_type& __k) const {return __table_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, iterator> equal_range(const key_type& __k)
- {return __table_.__equal_range_multi(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
- {return __table_.__equal_range_multi(__k);}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_bucket_count() const _NOEXCEPT
- {return __table_.max_bucket_count();}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket_size(size_type __n) const
- {return __table_.bucket_size(__n);}
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
-
- _LIBCPP_INLINE_VISIBILITY
- local_iterator begin(size_type __n) {return __table_.begin(__n);}
- _LIBCPP_INLINE_VISIBILITY
- local_iterator end(size_type __n) {return __table_.end(__n);}
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
-
- _LIBCPP_INLINE_VISIBILITY
- float load_factor() const _NOEXCEPT {return __table_.load_factor();}
- _LIBCPP_INLINE_VISIBILITY
- float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
- _LIBCPP_INLINE_VISIBILITY
- void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
- _LIBCPP_INLINE_VISIBILITY
- void rehash(size_type __n) {__table_.rehash(__n);}
- _LIBCPP_INLINE_VISIBILITY
- void reserve(size_type __n) {__table_.reserve(__n);}
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
-
- bool __dereferenceable(const const_iterator* __i) const
- {return __table_.__dereferenceable(&__i->__i_);}
- bool __decrementable(const const_iterator* __i) const
- {return __table_.__decrementable(&__i->__i_);}
- bool __addable(const const_iterator* __i, ptrdiff_t __n) const
- {return __table_.__addable(&__i->__i_, __n);}
- bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
- {return __table_.__addable(&__i->__i_, __n);}
-
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-
-
-};
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
- size_type __n, const hasher& __hf, const key_equal& __eql)
- : __table_(__hf, __eql)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
- size_type __n, const hasher& __hf, const key_equal& __eql,
- const allocator_type& __a)
- : __table_(__hf, __eql, typename __table::allocator_type(__a))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
- _InputIterator __first, _InputIterator __last)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- insert(__first, __last);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
- _InputIterator __first, _InputIterator __last, size_type __n,
- const hasher& __hf, const key_equal& __eql)
- : __table_(__hf, __eql)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
- insert(__first, __last);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
- _InputIterator __first, _InputIterator __last, size_type __n,
- const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
- : __table_(__hf, __eql, typename __table::allocator_type(__a))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
- insert(__first, __last);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-inline
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
- const allocator_type& __a)
- : __table_(typename __table::allocator_type(__a))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
- const unordered_multimap& __u)
- : __table_(__u.__table_)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__u.bucket_count());
- insert(__u.begin(), __u.end());
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
- const unordered_multimap& __u, const allocator_type& __a)
- : __table_(__u.__table_, typename __table::allocator_type(__a))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__u.bucket_count());
- insert(__u.begin(), __u.end());
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-inline
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
- unordered_multimap&& __u)
- _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
- : __table_(_VSTD::move(__u.__table_))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
- __get_db()->swap(this, &__u);
-#endif
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
- unordered_multimap&& __u, const allocator_type& __a)
- : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- if (__a != __u.get_allocator())
- {
- iterator __i = __u.begin();
- while (__u.size() != 0)
- {
- __table_.__insert_multi(
- __u.__table_.remove((__i++).__i_)->__value_.__move());
- }
- }
-#if _LIBCPP_DEBUG_LEVEL >= 2
- else
- __get_db()->swap(this, &__u);
-#endif
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
- initializer_list<value_type> __il)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- insert(__il.begin(), __il.end());
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
- initializer_list<value_type> __il, size_type __n, const hasher& __hf,
- const key_equal& __eql)
- : __table_(__hf, __eql)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
- insert(__il.begin(), __il.end());
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
- initializer_list<value_type> __il, size_type __n, const hasher& __hf,
- const key_equal& __eql, const allocator_type& __a)
- : __table_(__hf, __eql, typename __table::allocator_type(__a))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
- insert(__il.begin(), __il.end());
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-inline
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u)
- _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
-{
- __table_ = _VSTD::move(__u.__table_);
- return *this;
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-inline
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
- initializer_list<value_type> __il)
-{
- __table_.__assign_multi(__il.begin(), __il.end());
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-inline
-void
-unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
- _InputIterator __last)
-{
- for (; __first != __last; ++__first)
- __table_.__insert_multi(*__first);
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
- unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-#if _LIBCPP_STD_VER > 17
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase_if(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __c, _Predicate __pred)
-{ __libcpp_erase_if_container(__c, __pred); }
-#endif
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-bool
-operator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
- const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
-{
- if (__x.size() != __y.size())
- return false;
- typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
- const_iterator;
- typedef pair<const_iterator, const_iterator> _EqRng;
- for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
- {
- _EqRng __xeq = __x.equal_range(__i->first);
- _EqRng __yeq = __y.equal_range(__i->first);
- if (_VSTD::distance(__xeq.first, __xeq.second) !=
- _VSTD::distance(__yeq.first, __yeq.second) ||
- !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
- return false;
- __i = __xeq.second;
- }
- return true;
-}
-
-template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
- const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
-{
- return !(__x == __y);
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_UNORDERED_MAP
diff --git a/lib/libcxx/include/unordered_set b/lib/libcxx/include/unordered_set
deleted file mode 100644
index b4e61da89ee..00000000000
--- a/lib/libcxx/include/unordered_set
+++ /dev/null
@@ -1,1555 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- unordered_set -----------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_UNORDERED_SET
-#define _LIBCPP_UNORDERED_SET
-
-/*
-
- unordered_set synopsis
-
-#include <initializer_list>
-
-namespace std
-{
-
-template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
- class Alloc = allocator<Value>>
-class unordered_set
-{
-public:
- // types
- typedef Value key_type;
- typedef key_type value_type;
- typedef Hash hasher;
- typedef Pred key_equal;
- typedef Alloc allocator_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename allocator_traits<allocator_type>::pointer pointer;
- typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
- typedef typename allocator_traits<allocator_type>::size_type size_type;
- typedef typename allocator_traits<allocator_type>::difference_type difference_type;
-
- typedef /unspecified/ iterator;
- typedef /unspecified/ const_iterator;
- typedef /unspecified/ local_iterator;
- typedef /unspecified/ const_local_iterator;
-
- typedef unspecified node_type unspecified; // C++17
- typedef INSERT_RETURN_TYPE<iterator, node_type> insert_return_type; // C++17
-
- unordered_set()
- noexcept(
- is_nothrow_default_constructible<hasher>::value &&
- is_nothrow_default_constructible<key_equal>::value &&
- is_nothrow_default_constructible<allocator_type>::value);
- explicit unordered_set(size_type n, const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- template <class InputIterator>
- unordered_set(InputIterator f, InputIterator l,
- size_type n = 0, const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- explicit unordered_set(const allocator_type&);
- unordered_set(const unordered_set&);
- unordered_set(const unordered_set&, const Allocator&);
- unordered_set(unordered_set&&)
- noexcept(
- is_nothrow_move_constructible<hasher>::value &&
- is_nothrow_move_constructible<key_equal>::value &&
- is_nothrow_move_constructible<allocator_type>::value);
- unordered_set(unordered_set&&, const Allocator&);
- unordered_set(initializer_list<value_type>, size_type n = 0,
- const hasher& hf = hasher(), const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- unordered_set(size_type n, const allocator_type& a); // C++14
- unordered_set(size_type n, const hasher& hf, const allocator_type& a); // C++14
- template <class InputIterator>
- unordered_set(InputIterator f, InputIterator l, size_type n, const allocator_type& a); // C++14
- template <class InputIterator>
- unordered_set(InputIterator f, InputIterator l, size_type n,
- const hasher& hf, const allocator_type& a); // C++14
- unordered_set(initializer_list<value_type> il, size_type n, const allocator_type& a); // C++14
- unordered_set(initializer_list<value_type> il, size_type n,
- const hasher& hf, const allocator_type& a); // C++14
- ~unordered_set();
- unordered_set& operator=(const unordered_set&);
- unordered_set& operator=(unordered_set&&)
- noexcept(
- allocator_type::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value &&
- is_nothrow_move_assignable<hasher>::value &&
- is_nothrow_move_assignable<key_equal>::value);
- unordered_set& operator=(initializer_list<value_type>);
-
- allocator_type get_allocator() const noexcept;
-
- bool empty() const noexcept;
- size_type size() const noexcept;
- size_type max_size() const noexcept;
-
- iterator begin() noexcept;
- iterator end() noexcept;
- const_iterator begin() const noexcept;
- const_iterator end() const noexcept;
- const_iterator cbegin() const noexcept;
- const_iterator cend() const noexcept;
-
- template <class... Args>
- pair<iterator, bool> emplace(Args&&... args);
- template <class... Args>
- iterator emplace_hint(const_iterator position, Args&&... args);
- pair<iterator, bool> insert(const value_type& obj);
- pair<iterator, bool> insert(value_type&& obj);
- iterator insert(const_iterator hint, const value_type& obj);
- iterator insert(const_iterator hint, value_type&& obj);
- template <class InputIterator>
- void insert(InputIterator first, InputIterator last);
- void insert(initializer_list<value_type>);
-
- node_type extract(const_iterator position); // C++17
- node_type extract(const key_type& x); // C++17
- insert_return_type insert(node_type&& nh); // C++17
- iterator insert(const_iterator hint, node_type&& nh); // C++17
-
- iterator erase(const_iterator position);
- iterator erase(iterator position); // C++14
- size_type erase(const key_type& k);
- iterator erase(const_iterator first, const_iterator last);
- void clear() noexcept;
-
- template<class H2, class P2>
- void merge(unordered_set<Key, H2, P2, Allocator>& source); // C++17
- template<class H2, class P2>
- void merge(unordered_set<Key, H2, P2, Allocator>&& source); // C++17
- template<class H2, class P2>
- void merge(unordered_multiset<Key, H2, P2, Allocator>& source); // C++17
- template<class H2, class P2>
- void merge(unordered_multiset<Key, H2, P2, Allocator>&& source); // C++17
-
- void swap(unordered_set&)
- noexcept(allocator_traits<Allocator>::is_always_equal::value &&
- noexcept(swap(declval<hasher&>(), declval<hasher&>())) &&
- noexcept(swap(declval<key_equal&>(), declval<key_equal&>()))); // C++17
-
- hasher hash_function() const;
- key_equal key_eq() const;
-
- iterator find(const key_type& k);
- const_iterator find(const key_type& k) const;
- size_type count(const key_type& k) const;
- pair<iterator, iterator> equal_range(const key_type& k);
- pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
-
- size_type bucket_count() const noexcept;
- size_type max_bucket_count() const noexcept;
-
- size_type bucket_size(size_type n) const;
- size_type bucket(const key_type& k) const;
-
- local_iterator begin(size_type n);
- local_iterator end(size_type n);
- const_local_iterator begin(size_type n) const;
- const_local_iterator end(size_type n) const;
- const_local_iterator cbegin(size_type n) const;
- const_local_iterator cend(size_type n) const;
-
- float load_factor() const noexcept;
- float max_load_factor() const noexcept;
- void max_load_factor(float z);
- void rehash(size_type n);
- void reserve(size_type n);
-};
-
-template <class Value, class Hash, class Pred, class Alloc>
- void swap(unordered_set<Value, Hash, Pred, Alloc>& x,
- unordered_set<Value, Hash, Pred, Alloc>& y)
- noexcept(noexcept(x.swap(y)));
-
-template <class Value, class Hash, class Pred, class Alloc>
- bool
- operator==(const unordered_set<Value, Hash, Pred, Alloc>& x,
- const unordered_set<Value, Hash, Pred, Alloc>& y);
-
-template <class Value, class Hash, class Pred, class Alloc>
- bool
- operator!=(const unordered_set<Value, Hash, Pred, Alloc>& x,
- const unordered_set<Value, Hash, Pred, Alloc>& y);
-
-template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
- class Alloc = allocator<Value>>
-class unordered_multiset
-{
-public:
- // types
- typedef Value key_type;
- typedef key_type value_type;
- typedef Hash hasher;
- typedef Pred key_equal;
- typedef Alloc allocator_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename allocator_traits<allocator_type>::pointer pointer;
- typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
- typedef typename allocator_traits<allocator_type>::size_type size_type;
- typedef typename allocator_traits<allocator_type>::difference_type difference_type;
-
- typedef /unspecified/ iterator;
- typedef /unspecified/ const_iterator;
- typedef /unspecified/ local_iterator;
- typedef /unspecified/ const_local_iterator;
-
- typedef unspecified node_type unspecified; // C++17
-
- unordered_multiset()
- noexcept(
- is_nothrow_default_constructible<hasher>::value &&
- is_nothrow_default_constructible<key_equal>::value &&
- is_nothrow_default_constructible<allocator_type>::value);
- explicit unordered_multiset(size_type n, const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- template <class InputIterator>
- unordered_multiset(InputIterator f, InputIterator l,
- size_type n = 0, const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- explicit unordered_multiset(const allocator_type&);
- unordered_multiset(const unordered_multiset&);
- unordered_multiset(const unordered_multiset&, const Allocator&);
- unordered_multiset(unordered_multiset&&)
- noexcept(
- is_nothrow_move_constructible<hasher>::value &&
- is_nothrow_move_constructible<key_equal>::value &&
- is_nothrow_move_constructible<allocator_type>::value);
- unordered_multiset(unordered_multiset&&, const Allocator&);
- unordered_multiset(initializer_list<value_type>, size_type n = /see below/,
- const hasher& hf = hasher(), const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type());
- unordered_multiset(size_type n, const allocator_type& a); // C++14
- unordered_multiset(size_type n, const hasher& hf, const allocator_type& a); // C++14
- template <class InputIterator>
- unordered_multiset(InputIterator f, InputIterator l, size_type n, const allocator_type& a); // C++14
- template <class InputIterator>
- unordered_multiset(InputIterator f, InputIterator l, size_type n,
- const hasher& hf, const allocator_type& a); // C++14
- unordered_multiset(initializer_list<value_type> il, size_type n, const allocator_type& a); // C++14
- unordered_multiset(initializer_list<value_type> il, size_type n,
- const hasher& hf, const allocator_type& a); // C++14
- ~unordered_multiset();
- unordered_multiset& operator=(const unordered_multiset&);
- unordered_multiset& operator=(unordered_multiset&&)
- noexcept(
- allocator_type::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<allocator_type>::value &&
- is_nothrow_move_assignable<hasher>::value &&
- is_nothrow_move_assignable<key_equal>::value);
- unordered_multiset& operator=(initializer_list<value_type>);
-
- allocator_type get_allocator() const noexcept;
-
- bool empty() const noexcept;
- size_type size() const noexcept;
- size_type max_size() const noexcept;
-
- iterator begin() noexcept;
- iterator end() noexcept;
- const_iterator begin() const noexcept;
- const_iterator end() const noexcept;
- const_iterator cbegin() const noexcept;
- const_iterator cend() const noexcept;
-
- template <class... Args>
- iterator emplace(Args&&... args);
- template <class... Args>
- iterator emplace_hint(const_iterator position, Args&&... args);
- iterator insert(const value_type& obj);
- iterator insert(value_type&& obj);
- iterator insert(const_iterator hint, const value_type& obj);
- iterator insert(const_iterator hint, value_type&& obj);
- template <class InputIterator>
- void insert(InputIterator first, InputIterator last);
- void insert(initializer_list<value_type>);
-
- node_type extract(const_iterator position); // C++17
- node_type extract(const key_type& x); // C++17
- iterator insert(node_type&& nh); // C++17
- iterator insert(const_iterator hint, node_type&& nh); // C++17
-
- iterator erase(const_iterator position);
- iterator erase(iterator position); // C++14
- size_type erase(const key_type& k);
- iterator erase(const_iterator first, const_iterator last);
- void clear() noexcept;
-
- template<class H2, class P2>
- void merge(unordered_multiset<Key, H2, P2, Allocator>& source); // C++17
- template<class H2, class P2>
- void merge(unordered_multiset<Key, H2, P2, Allocator>&& source); // C++17
- template<class H2, class P2>
- void merge(unordered_set<Key, H2, P2, Allocator>& source); // C++17
- template<class H2, class P2>
- void merge(unordered_set<Key, H2, P2, Allocator>&& source); // C++17
-
- void swap(unordered_multiset&)
- noexcept(allocator_traits<Allocator>::is_always_equal::value &&
- noexcept(swap(declval<hasher&>(), declval<hasher&>())) &&
- noexcept(swap(declval<key_equal&>(), declval<key_equal&>()))); // C++17
-
- hasher hash_function() const;
- key_equal key_eq() const;
-
- iterator find(const key_type& k);
- const_iterator find(const key_type& k) const;
- size_type count(const key_type& k) const;
- pair<iterator, iterator> equal_range(const key_type& k);
- pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
-
- size_type bucket_count() const noexcept;
- size_type max_bucket_count() const noexcept;
-
- size_type bucket_size(size_type n) const;
- size_type bucket(const key_type& k) const;
-
- local_iterator begin(size_type n);
- local_iterator end(size_type n);
- const_local_iterator begin(size_type n) const;
- const_local_iterator end(size_type n) const;
- const_local_iterator cbegin(size_type n) const;
- const_local_iterator cend(size_type n) const;
-
- float load_factor() const noexcept;
- float max_load_factor() const noexcept;
- void max_load_factor(float z);
- void rehash(size_type n);
- void reserve(size_type n);
-};
-
-template <class Value, class Hash, class Pred, class Alloc>
- void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x,
- unordered_multiset<Value, Hash, Pred, Alloc>& y)
- noexcept(noexcept(x.swap(y)));
-
-template <class K, class T, class H, class P, class A, class Predicate>
- void erase_if(unordered_set<K, T, H, P, A>& c, Predicate pred); // C++20
-
-template <class K, class T, class H, class P, class A, class Predicate>
- void erase_if(unordered_multiset<K, T, H, P, A>& c, Predicate pred); // C++20
-
-
-template <class Value, class Hash, class Pred, class Alloc>
- bool
- operator==(const unordered_multiset<Value, Hash, Pred, Alloc>& x,
- const unordered_multiset<Value, Hash, Pred, Alloc>& y);
-
-template <class Value, class Hash, class Pred, class Alloc>
- bool
- operator!=(const unordered_multiset<Value, Hash, Pred, Alloc>& x,
- const unordered_multiset<Value, Hash, Pred, Alloc>& y);
-} // std
-
-*/
-
-#include <__config>
-#include <__hash_table>
-#include <__node_handle>
-#include <functional>
-#include <version>
-
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-class unordered_multiset;
-
-template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
- class _Alloc = allocator<_Value> >
-class _LIBCPP_TEMPLATE_VIS unordered_set
-{
-public:
- // types
- typedef _Value key_type;
- typedef key_type value_type;
- typedef _Hash hasher;
- typedef _Pred key_equal;
- typedef _Alloc allocator_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- static_assert((is_same<value_type, typename allocator_type::value_type>::value),
- "Invalid allocator::value_type");
- static_assert(sizeof(__diagnose_unordered_container_requirements<_Value, _Hash, _Pred>(0)), "");
-
-private:
- typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
-
- __table __table_;
-
-public:
- typedef typename __table::pointer pointer;
- typedef typename __table::const_pointer const_pointer;
- typedef typename __table::size_type size_type;
- typedef typename __table::difference_type difference_type;
-
- typedef typename __table::const_iterator iterator;
- typedef typename __table::const_iterator const_iterator;
- typedef typename __table::const_local_iterator local_iterator;
- typedef typename __table::const_local_iterator const_local_iterator;
-
-#if _LIBCPP_STD_VER > 14
- typedef __set_node_handle<typename __table::__node, allocator_type> node_type;
- typedef __insert_return_type<iterator, node_type> insert_return_type;
-#endif
-
- template <class _Value2, class _Hash2, class _Pred2, class _Alloc2>
- friend class _LIBCPP_TEMPLATE_VIS unordered_set;
- template <class _Value2, class _Hash2, class _Pred2, class _Alloc2>
- friend class _LIBCPP_TEMPLATE_VIS unordered_multiset;
-
- _LIBCPP_INLINE_VISIBILITY
- unordered_set()
- _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- }
- explicit unordered_set(size_type __n, const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
-#if _LIBCPP_STD_VER > 11
- inline _LIBCPP_INLINE_VISIBILITY
- unordered_set(size_type __n, const allocator_type& __a)
- : unordered_set(__n, hasher(), key_equal(), __a) {}
- inline _LIBCPP_INLINE_VISIBILITY
- unordered_set(size_type __n, const hasher& __hf, const allocator_type& __a)
- : unordered_set(__n, __hf, key_equal(), __a) {}
-#endif
- unordered_set(size_type __n, const hasher& __hf, const key_equal& __eql,
- const allocator_type& __a);
- template <class _InputIterator>
- unordered_set(_InputIterator __first, _InputIterator __last);
- template <class _InputIterator>
- unordered_set(_InputIterator __first, _InputIterator __last,
- size_type __n, const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- template <class _InputIterator>
- unordered_set(_InputIterator __first, _InputIterator __last,
- size_type __n, const hasher& __hf, const key_equal& __eql,
- const allocator_type& __a);
-#if _LIBCPP_STD_VER > 11
- template <class _InputIterator>
- inline _LIBCPP_INLINE_VISIBILITY
- unordered_set(_InputIterator __first, _InputIterator __last,
- size_type __n, const allocator_type& __a)
- : unordered_set(__first, __last, __n, hasher(), key_equal(), __a) {}
- template <class _InputIterator>
- unordered_set(_InputIterator __first, _InputIterator __last,
- size_type __n, const hasher& __hf, const allocator_type& __a)
- : unordered_set(__first, __last, __n, __hf, key_equal(), __a) {}
-#endif
- _LIBCPP_INLINE_VISIBILITY
- explicit unordered_set(const allocator_type& __a);
- unordered_set(const unordered_set& __u);
- unordered_set(const unordered_set& __u, const allocator_type& __a);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- unordered_set(unordered_set&& __u)
- _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
- unordered_set(unordered_set&& __u, const allocator_type& __a);
- unordered_set(initializer_list<value_type> __il);
- unordered_set(initializer_list<value_type> __il, size_type __n,
- const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- unordered_set(initializer_list<value_type> __il, size_type __n,
- const hasher& __hf, const key_equal& __eql,
- const allocator_type& __a);
-#if _LIBCPP_STD_VER > 11
- inline _LIBCPP_INLINE_VISIBILITY
- unordered_set(initializer_list<value_type> __il, size_type __n,
- const allocator_type& __a)
- : unordered_set(__il, __n, hasher(), key_equal(), __a) {}
- inline _LIBCPP_INLINE_VISIBILITY
- unordered_set(initializer_list<value_type> __il, size_type __n,
- const hasher& __hf, const allocator_type& __a)
- : unordered_set(__il, __n, __hf, key_equal(), __a) {}
-#endif
-#endif // _LIBCPP_CXX03_LANG
- // ~unordered_set() = default;
- _LIBCPP_INLINE_VISIBILITY
- unordered_set& operator=(const unordered_set& __u)
- {
- __table_ = __u.__table_;
- return *this;
- }
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- unordered_set& operator=(unordered_set&& __u)
- _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
- _LIBCPP_INLINE_VISIBILITY
- unordered_set& operator=(initializer_list<value_type> __il);
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const _NOEXCEPT
- {return allocator_type(__table_.__node_alloc());}
-
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const _NOEXCEPT {return __table_.size() == 0;}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT {return __table_.size();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const _NOEXCEPT {return __table_.max_size();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT {return __table_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT {return __table_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const _NOEXCEPT {return __table_.end();}
-
-#ifndef _LIBCPP_CXX03_LANG
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> emplace(_Args&&... __args)
- {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);}
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
-#if _LIBCPP_DEBUG_LEVEL >= 2
- iterator emplace_hint(const_iterator __p, _Args&&... __args)
- {
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "unordered_set::emplace_hint(const_iterator, args...) called with an iterator not"
- " referring to this unordered_set");
- return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
- }
-#else
- iterator emplace_hint(const_iterator, _Args&&... __args)
- {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> insert(value_type&& __x)
- {return __table_.__insert_unique(_VSTD::move(__x));}
- _LIBCPP_INLINE_VISIBILITY
-#if _LIBCPP_DEBUG_LEVEL >= 2
- iterator insert(const_iterator __p, value_type&& __x)
- {
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "unordered_set::insert(const_iterator, value_type&&) called with an iterator not"
- " referring to this unordered_set");
- return insert(_VSTD::move(__x)).first;
- }
-#else
- iterator insert(const_iterator, value_type&& __x)
- {return insert(_VSTD::move(__x)).first;}
-#endif
- _LIBCPP_INLINE_VISIBILITY
- void insert(initializer_list<value_type> __il)
- {insert(__il.begin(), __il.end());}
-#endif // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> insert(const value_type& __x)
- {return __table_.__insert_unique(__x);}
-
- _LIBCPP_INLINE_VISIBILITY
-#if _LIBCPP_DEBUG_LEVEL >= 2
- iterator insert(const_iterator __p, const value_type& __x)
- {
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "unordered_set::insert(const_iterator, const value_type&) called with an iterator not"
- " referring to this unordered_set");
- return insert(__x).first;
- }
-#else
- iterator insert(const_iterator, const value_type& __x)
- {return insert(__x).first;}
-#endif
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- void insert(_InputIterator __first, _InputIterator __last);
-
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __p) {return __table_.erase(__p);}
- _LIBCPP_INLINE_VISIBILITY
- size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __first, const_iterator __last)
- {return __table_.erase(__first, __last);}
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT {__table_.clear();}
-
-#if _LIBCPP_STD_VER > 14
- _LIBCPP_INLINE_VISIBILITY
- insert_return_type insert(node_type&& __nh)
- {
- _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
- "node_type with incompatible allocator passed to unordered_set::insert()");
- return __table_.template __node_handle_insert_unique<
- node_type, insert_return_type>(_VSTD::move(__nh));
- }
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __h, node_type&& __nh)
- {
- _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
- "node_type with incompatible allocator passed to unordered_set::insert()");
- return __table_.template __node_handle_insert_unique<node_type>(
- __h, _VSTD::move(__nh));
- }
- _LIBCPP_INLINE_VISIBILITY
- node_type extract(key_type const& __key)
- {
- return __table_.template __node_handle_extract<node_type>(__key);
- }
- _LIBCPP_INLINE_VISIBILITY
- node_type extract(const_iterator __it)
- {
- return __table_.template __node_handle_extract<node_type>(__it);
- }
-
- template<class _H2, class _P2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(unordered_set<key_type, _H2, _P2, allocator_type>& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- __table_.__node_handle_merge_unique(__source.__table_);
- }
- template<class _H2, class _P2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(unordered_set<key_type, _H2, _P2, allocator_type>&& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- __table_.__node_handle_merge_unique(__source.__table_);
- }
- template<class _H2, class _P2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(unordered_multiset<key_type, _H2, _P2, allocator_type>& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- __table_.__node_handle_merge_unique(__source.__table_);
- }
- template<class _H2, class _P2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(unordered_multiset<key_type, _H2, _P2, allocator_type>&& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- __table_.__node_handle_merge_unique(__source.__table_);
- }
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(unordered_set& __u)
- _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
- {__table_.swap(__u.__table_);}
-
- _LIBCPP_INLINE_VISIBILITY
- hasher hash_function() const {return __table_.hash_function();}
- _LIBCPP_INLINE_VISIBILITY
- key_equal key_eq() const {return __table_.key_eq();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator find(const key_type& __k) {return __table_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator find(const key_type& __k) const {return __table_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, iterator> equal_range(const key_type& __k)
- {return __table_.__equal_range_unique(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
- {return __table_.__equal_range_unique(__k);}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);}
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
-
- _LIBCPP_INLINE_VISIBILITY
- local_iterator begin(size_type __n) {return __table_.begin(__n);}
- _LIBCPP_INLINE_VISIBILITY
- local_iterator end(size_type __n) {return __table_.end(__n);}
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
-
- _LIBCPP_INLINE_VISIBILITY
- float load_factor() const _NOEXCEPT {return __table_.load_factor();}
- _LIBCPP_INLINE_VISIBILITY
- float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
- _LIBCPP_INLINE_VISIBILITY
- void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
- _LIBCPP_INLINE_VISIBILITY
- void rehash(size_type __n) {__table_.rehash(__n);}
- _LIBCPP_INLINE_VISIBILITY
- void reserve(size_type __n) {__table_.reserve(__n);}
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
-
- bool __dereferenceable(const const_iterator* __i) const
- {return __table_.__dereferenceable(__i);}
- bool __decrementable(const const_iterator* __i) const
- {return __table_.__decrementable(__i);}
- bool __addable(const const_iterator* __i, ptrdiff_t __n) const
- {return __table_.__addable(__i, __n);}
- bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
- {return __table_.__addable(__i, __n);}
-
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-
-};
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n,
- const hasher& __hf, const key_equal& __eql)
- : __table_(__hf, __eql)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n,
- const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
- : __table_(__hf, __eql, __a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
- _InputIterator __first, _InputIterator __last)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- insert(__first, __last);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
- _InputIterator __first, _InputIterator __last, size_type __n,
- const hasher& __hf, const key_equal& __eql)
- : __table_(__hf, __eql)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
- insert(__first, __last);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
- _InputIterator __first, _InputIterator __last, size_type __n,
- const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
- : __table_(__hf, __eql, __a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
- insert(__first, __last);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-inline
-unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
- const allocator_type& __a)
- : __table_(__a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
- const unordered_set& __u)
- : __table_(__u.__table_)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__u.bucket_count());
- insert(__u.begin(), __u.end());
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
- const unordered_set& __u, const allocator_type& __a)
- : __table_(__u.__table_, __a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__u.bucket_count());
- insert(__u.begin(), __u.end());
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-inline
-unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
- unordered_set&& __u)
- _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
- : __table_(_VSTD::move(__u.__table_))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
- __get_db()->swap(this, &__u);
-#endif
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
- unordered_set&& __u, const allocator_type& __a)
- : __table_(_VSTD::move(__u.__table_), __a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- if (__a != __u.get_allocator())
- {
- iterator __i = __u.begin();
- while (__u.size() != 0)
- __table_.__insert_unique(_VSTD::move(__u.__table_.remove(__i++)->__value_));
- }
-#if _LIBCPP_DEBUG_LEVEL >= 2
- else
- __get_db()->swap(this, &__u);
-#endif
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
- initializer_list<value_type> __il)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- insert(__il.begin(), __il.end());
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
- initializer_list<value_type> __il, size_type __n, const hasher& __hf,
- const key_equal& __eql)
- : __table_(__hf, __eql)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
- insert(__il.begin(), __il.end());
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
- initializer_list<value_type> __il, size_type __n, const hasher& __hf,
- const key_equal& __eql, const allocator_type& __a)
- : __table_(__hf, __eql, __a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
- insert(__il.begin(), __il.end());
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-inline
-unordered_set<_Value, _Hash, _Pred, _Alloc>&
-unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(unordered_set&& __u)
- _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
-{
- __table_ = _VSTD::move(__u.__table_);
- return *this;
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-inline
-unordered_set<_Value, _Hash, _Pred, _Alloc>&
-unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(
- initializer_list<value_type> __il)
-{
- __table_.__assign_unique(__il.begin(), __il.end());
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-inline
-void
-unordered_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
- _InputIterator __last)
-{
- for (; __first != __last; ++__first)
- __table_.__insert_unique(*__first);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
- unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-#if _LIBCPP_STD_VER > 17
-template <class _Value, class _Hash, class _Pred, class _Alloc, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase_if(unordered_set<_Value, _Hash, _Pred, _Alloc>& __c, _Predicate __pred)
-{ __libcpp_erase_if_container(__c, __pred); }
-#endif
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-bool
-operator==(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
- const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
-{
- if (__x.size() != __y.size())
- return false;
- typedef typename unordered_set<_Value, _Hash, _Pred, _Alloc>::const_iterator
- const_iterator;
- for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
- __i != __ex; ++__i)
- {
- const_iterator __j = __y.find(*__i);
- if (__j == __ey || !(*__i == *__j))
- return false;
- }
- return true;
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
- const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
- class _Alloc = allocator<_Value> >
-class _LIBCPP_TEMPLATE_VIS unordered_multiset
-{
-public:
- // types
- typedef _Value key_type;
- typedef key_type value_type;
- typedef _Hash hasher;
- typedef _Pred key_equal;
- typedef _Alloc allocator_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- static_assert((is_same<value_type, typename allocator_type::value_type>::value),
- "Invalid allocator::value_type");
- static_assert(sizeof(__diagnose_unordered_container_requirements<_Value, _Hash, _Pred>(0)), "");
-
-private:
- typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
-
- __table __table_;
-
-public:
- typedef typename __table::pointer pointer;
- typedef typename __table::const_pointer const_pointer;
- typedef typename __table::size_type size_type;
- typedef typename __table::difference_type difference_type;
-
- typedef typename __table::const_iterator iterator;
- typedef typename __table::const_iterator const_iterator;
- typedef typename __table::const_local_iterator local_iterator;
- typedef typename __table::const_local_iterator const_local_iterator;
-
-#if _LIBCPP_STD_VER > 14
- typedef __set_node_handle<typename __table::__node, allocator_type> node_type;
-#endif
-
- template <class _Value2, class _Hash2, class _Pred2, class _Alloc2>
- friend class _LIBCPP_TEMPLATE_VIS unordered_set;
- template <class _Value2, class _Hash2, class _Pred2, class _Alloc2>
- friend class _LIBCPP_TEMPLATE_VIS unordered_multiset;
-
- _LIBCPP_INLINE_VISIBILITY
- unordered_multiset()
- _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- }
- explicit unordered_multiset(size_type __n, const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- unordered_multiset(size_type __n, const hasher& __hf,
- const key_equal& __eql, const allocator_type& __a);
-#if _LIBCPP_STD_VER > 11
- inline _LIBCPP_INLINE_VISIBILITY
- unordered_multiset(size_type __n, const allocator_type& __a)
- : unordered_multiset(__n, hasher(), key_equal(), __a) {}
- inline _LIBCPP_INLINE_VISIBILITY
- unordered_multiset(size_type __n, const hasher& __hf, const allocator_type& __a)
- : unordered_multiset(__n, __hf, key_equal(), __a) {}
-#endif
- template <class _InputIterator>
- unordered_multiset(_InputIterator __first, _InputIterator __last);
- template <class _InputIterator>
- unordered_multiset(_InputIterator __first, _InputIterator __last,
- size_type __n, const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- template <class _InputIterator>
- unordered_multiset(_InputIterator __first, _InputIterator __last,
- size_type __n , const hasher& __hf,
- const key_equal& __eql, const allocator_type& __a);
-#if _LIBCPP_STD_VER > 11
- template <class _InputIterator>
- inline _LIBCPP_INLINE_VISIBILITY
- unordered_multiset(_InputIterator __first, _InputIterator __last,
- size_type __n, const allocator_type& __a)
- : unordered_multiset(__first, __last, __n, hasher(), key_equal(), __a) {}
- template <class _InputIterator>
- inline _LIBCPP_INLINE_VISIBILITY
- unordered_multiset(_InputIterator __first, _InputIterator __last,
- size_type __n, const hasher& __hf, const allocator_type& __a)
- : unordered_multiset(__first, __last, __n, __hf, key_equal(), __a) {}
-#endif
- _LIBCPP_INLINE_VISIBILITY
- explicit unordered_multiset(const allocator_type& __a);
- unordered_multiset(const unordered_multiset& __u);
- unordered_multiset(const unordered_multiset& __u, const allocator_type& __a);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- unordered_multiset(unordered_multiset&& __u)
- _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
- unordered_multiset(unordered_multiset&& __u, const allocator_type& __a);
- unordered_multiset(initializer_list<value_type> __il);
- unordered_multiset(initializer_list<value_type> __il, size_type __n,
- const hasher& __hf = hasher(),
- const key_equal& __eql = key_equal());
- unordered_multiset(initializer_list<value_type> __il, size_type __n,
- const hasher& __hf, const key_equal& __eql,
- const allocator_type& __a);
-#if _LIBCPP_STD_VER > 11
- inline _LIBCPP_INLINE_VISIBILITY
- unordered_multiset(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
- : unordered_multiset(__il, __n, hasher(), key_equal(), __a) {}
- inline _LIBCPP_INLINE_VISIBILITY
- unordered_multiset(initializer_list<value_type> __il, size_type __n, const hasher& __hf, const allocator_type& __a)
- : unordered_multiset(__il, __n, __hf, key_equal(), __a) {}
-#endif
-#endif // _LIBCPP_CXX03_LANG
- // ~unordered_multiset() = default;
- _LIBCPP_INLINE_VISIBILITY
- unordered_multiset& operator=(const unordered_multiset& __u)
- {
- __table_ = __u.__table_;
- return *this;
- }
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- unordered_multiset& operator=(unordered_multiset&& __u)
- _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
- unordered_multiset& operator=(initializer_list<value_type> __il);
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const _NOEXCEPT
- {return allocator_type(__table_.__node_alloc());}
-
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const _NOEXCEPT {return __table_.size() == 0;}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT {return __table_.size();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const _NOEXCEPT {return __table_.max_size();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT {return __table_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT {return __table_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const _NOEXCEPT {return __table_.end();}
-
-#ifndef _LIBCPP_CXX03_LANG
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator emplace(_Args&&... __args)
- {return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);}
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator emplace_hint(const_iterator __p, _Args&&... __args)
- {return __table_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));}
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __p, value_type&& __x)
- {return __table_.__insert_multi(__p, _VSTD::move(__x));}
- _LIBCPP_INLINE_VISIBILITY
- void insert(initializer_list<value_type> __il)
- {insert(__il.begin(), __il.end());}
-#endif // _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __p, const value_type& __x)
- {return __table_.__insert_multi(__p, __x);}
-
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- void insert(_InputIterator __first, _InputIterator __last);
-
-#if _LIBCPP_STD_VER > 14
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(node_type&& __nh)
- {
- _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
- "node_type with incompatible allocator passed to unordered_multiset::insert()");
- return __table_.template __node_handle_insert_multi<node_type>(
- _VSTD::move(__nh));
- }
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __hint, node_type&& __nh)
- {
- _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
- "node_type with incompatible allocator passed to unordered_multiset::insert()");
- return __table_.template __node_handle_insert_multi<node_type>(
- __hint, _VSTD::move(__nh));
- }
- _LIBCPP_INLINE_VISIBILITY
- node_type extract(const_iterator __position)
- {
- return __table_.template __node_handle_extract<node_type>(
- __position);
- }
- _LIBCPP_INLINE_VISIBILITY
- node_type extract(key_type const& __key)
- {
- return __table_.template __node_handle_extract<node_type>(__key);
- }
-
- template <class _H2, class _P2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(unordered_multiset<key_type, _H2, _P2, allocator_type>& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- return __table_.__node_handle_merge_multi(__source.__table_);
- }
- template <class _H2, class _P2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(unordered_multiset<key_type, _H2, _P2, allocator_type>&& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- return __table_.__node_handle_merge_multi(__source.__table_);
- }
- template <class _H2, class _P2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(unordered_set<key_type, _H2, _P2, allocator_type>& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- return __table_.__node_handle_merge_multi(__source.__table_);
- }
- template <class _H2, class _P2>
- _LIBCPP_INLINE_VISIBILITY
- void merge(unordered_set<key_type, _H2, _P2, allocator_type>&& __source)
- {
- _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
- "merging container with incompatible allocator");
- return __table_.__node_handle_merge_multi(__source.__table_);
- }
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __p) {return __table_.erase(__p);}
- _LIBCPP_INLINE_VISIBILITY
- size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
- _LIBCPP_INLINE_VISIBILITY
- iterator erase(const_iterator __first, const_iterator __last)
- {return __table_.erase(__first, __last);}
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT {__table_.clear();}
-
- _LIBCPP_INLINE_VISIBILITY
- void swap(unordered_multiset& __u)
- _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
- {__table_.swap(__u.__table_);}
-
- _LIBCPP_INLINE_VISIBILITY
- hasher hash_function() const {return __table_.hash_function();}
- _LIBCPP_INLINE_VISIBILITY
- key_equal key_eq() const {return __table_.key_eq();}
-
- _LIBCPP_INLINE_VISIBILITY
- iterator find(const key_type& __k) {return __table_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator find(const key_type& __k) const {return __table_.find(__k);}
- _LIBCPP_INLINE_VISIBILITY
- size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, iterator> equal_range(const key_type& __k)
- {return __table_.__equal_range_multi(__k);}
- _LIBCPP_INLINE_VISIBILITY
- pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
- {return __table_.__equal_range_multi(__k);}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);}
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
-
- _LIBCPP_INLINE_VISIBILITY
- local_iterator begin(size_type __n) {return __table_.begin(__n);}
- _LIBCPP_INLINE_VISIBILITY
- local_iterator end(size_type __n) {return __table_.end(__n);}
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
-
- _LIBCPP_INLINE_VISIBILITY
- float load_factor() const _NOEXCEPT {return __table_.load_factor();}
- _LIBCPP_INLINE_VISIBILITY
- float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
- _LIBCPP_INLINE_VISIBILITY
- void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
- _LIBCPP_INLINE_VISIBILITY
- void rehash(size_type __n) {__table_.rehash(__n);}
- _LIBCPP_INLINE_VISIBILITY
- void reserve(size_type __n) {__table_.reserve(__n);}
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
-
- bool __dereferenceable(const const_iterator* __i) const
- {return __table_.__dereferenceable(__i);}
- bool __decrementable(const const_iterator* __i) const
- {return __table_.__decrementable(__i);}
- bool __addable(const const_iterator* __i, ptrdiff_t __n) const
- {return __table_.__addable(__i, __n);}
- bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
- {return __table_.__addable(__i, __n);}
-
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-
-};
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
- size_type __n, const hasher& __hf, const key_equal& __eql)
- : __table_(__hf, __eql)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
- size_type __n, const hasher& __hf, const key_equal& __eql,
- const allocator_type& __a)
- : __table_(__hf, __eql, __a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
- _InputIterator __first, _InputIterator __last)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- insert(__first, __last);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
- _InputIterator __first, _InputIterator __last, size_type __n,
- const hasher& __hf, const key_equal& __eql)
- : __table_(__hf, __eql)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
- insert(__first, __last);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
- _InputIterator __first, _InputIterator __last, size_type __n,
- const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
- : __table_(__hf, __eql, __a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
- insert(__first, __last);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-inline
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
- const allocator_type& __a)
- : __table_(__a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
- const unordered_multiset& __u)
- : __table_(__u.__table_)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__u.bucket_count());
- insert(__u.begin(), __u.end());
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
- const unordered_multiset& __u, const allocator_type& __a)
- : __table_(__u.__table_, __a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__u.bucket_count());
- insert(__u.begin(), __u.end());
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-inline
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
- unordered_multiset&& __u)
- _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
- : __table_(_VSTD::move(__u.__table_))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
- __get_db()->swap(this, &__u);
-#endif
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
- unordered_multiset&& __u, const allocator_type& __a)
- : __table_(_VSTD::move(__u.__table_), __a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- if (__a != __u.get_allocator())
- {
- iterator __i = __u.begin();
- while (__u.size() != 0)
- __table_.__insert_multi(_VSTD::move(__u.__table_.remove(__i++)->__value_));
- }
-#if _LIBCPP_DEBUG_LEVEL >= 2
- else
- __get_db()->swap(this, &__u);
-#endif
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
- initializer_list<value_type> __il)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- insert(__il.begin(), __il.end());
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
- initializer_list<value_type> __il, size_type __n, const hasher& __hf,
- const key_equal& __eql)
- : __table_(__hf, __eql)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
- insert(__il.begin(), __il.end());
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
- initializer_list<value_type> __il, size_type __n, const hasher& __hf,
- const key_equal& __eql, const allocator_type& __a)
- : __table_(__hf, __eql, __a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- __table_.rehash(__n);
- insert(__il.begin(), __il.end());
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-inline
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>&
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=(
- unordered_multiset&& __u)
- _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
-{
- __table_ = _VSTD::move(__u.__table_);
- return *this;
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-inline
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>&
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=(
- initializer_list<value_type> __il)
-{
- __table_.__assign_multi(__il.begin(), __il.end());
- return *this;
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-template <class _InputIterator>
-inline
-void
-unordered_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
- _InputIterator __last)
-{
- for (; __first != __last; ++__first)
- __table_.__insert_multi(*__first);
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
- unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-#if _LIBCPP_STD_VER > 17
-template <class _Value, class _Hash, class _Pred, class _Alloc, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase_if(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __c, _Predicate __pred)
-{ __libcpp_erase_if_container(__c, __pred); }
-#endif
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-bool
-operator==(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
- const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
-{
- if (__x.size() != __y.size())
- return false;
- typedef typename unordered_multiset<_Value, _Hash, _Pred, _Alloc>::const_iterator
- const_iterator;
- typedef pair<const_iterator, const_iterator> _EqRng;
- for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
- {
- _EqRng __xeq = __x.equal_range(*__i);
- _EqRng __yeq = __y.equal_range(*__i);
- if (_VSTD::distance(__xeq.first, __xeq.second) !=
- _VSTD::distance(__yeq.first, __yeq.second) ||
- !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
- return false;
- __i = __xeq.second;
- }
- return true;
-}
-
-template <class _Value, class _Hash, class _Pred, class _Alloc>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
- const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
-{
- return !(__x == __y);
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_UNORDERED_SET
diff --git a/lib/libcxx/include/utility b/lib/libcxx/include/utility
deleted file mode 100644
index 74bbc5cf34f..00000000000
--- a/lib/libcxx/include/utility
+++ /dev/null
@@ -1,1625 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- utility -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_UTILITY
-#define _LIBCPP_UTILITY
-
-/*
- utility synopsis
-
-#include <initializer_list>
-
-namespace std
-{
-
-template <class T>
- void
- swap(T& a, T& b);
-
-namespace rel_ops
-{
- template<class T> bool operator!=(const T&, const T&);
- template<class T> bool operator> (const T&, const T&);
- template<class T> bool operator<=(const T&, const T&);
- template<class T> bool operator>=(const T&, const T&);
-}
-
-template<class T>
-void
-swap(T& a, T& b) noexcept(is_nothrow_move_constructible<T>::value &&
- is_nothrow_move_assignable<T>::value);
-
-template <class T, size_t N>
-void
-swap(T (&a)[N], T (&b)[N]) noexcept(noexcept(swap(*a, *b)));
-
-template <class T> T&& forward(typename remove_reference<T>::type& t) noexcept; // constexpr in C++14
-template <class T> T&& forward(typename remove_reference<T>::type&& t) noexcept; // constexpr in C++14
-
-template <class T> typename remove_reference<T>::type&& move(T&&) noexcept; // constexpr in C++14
-
-template <class T>
- typename conditional
- <
- !is_nothrow_move_constructible<T>::value && is_copy_constructible<T>::value,
- const T&,
- T&&
- >::type
- move_if_noexcept(T& x) noexcept; // constexpr in C++14
-
-template <class T> constexpr add_const_t<T>& as_const(T& t) noexcept; // C++17
-template <class T> void as_const(const T&&) = delete; // C++17
-
-template <class T> typename add_rvalue_reference<T>::type declval() noexcept;
-
-template <class T1, class T2>
-struct pair
-{
- typedef T1 first_type;
- typedef T2 second_type;
-
- T1 first;
- T2 second;
-
- pair(const pair&) = default;
- pair(pair&&) = default;
- constexpr pair();
- pair(const T1& x, const T2& y); // constexpr in C++14
- template <class U, class V> pair(U&& x, V&& y); // constexpr in C++14
- template <class U, class V> pair(const pair<U, V>& p); // constexpr in C++14
- template <class U, class V> pair(pair<U, V>&& p); // constexpr in C++14
- template <class... Args1, class... Args2>
- pair(piecewise_construct_t, tuple<Args1...> first_args,
- tuple<Args2...> second_args);
-
- template <class U, class V> pair& operator=(const pair<U, V>& p);
- pair& operator=(pair&& p) noexcept(is_nothrow_move_assignable<T1>::value &&
- is_nothrow_move_assignable<T2>::value);
- template <class U, class V> pair& operator=(pair<U, V>&& p);
-
- void swap(pair& p) noexcept(is_nothrow_swappable_v<T1> &&
- is_nothrow_swappable_v<T2>);
-};
-
-template <class T1, class T2> bool operator==(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14
-template <class T1, class T2> bool operator!=(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14
-template <class T1, class T2> bool operator< (const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14
-template <class T1, class T2> bool operator> (const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14
-template <class T1, class T2> bool operator>=(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14
-template <class T1, class T2> bool operator<=(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14
-
-template <class T1, class T2> pair<V1, V2> make_pair(T1&&, T2&&); // constexpr in C++14
-template <class T1, class T2>
-void
-swap(pair<T1, T2>& x, pair<T1, T2>& y) noexcept(noexcept(x.swap(y)));
-
-struct piecewise_construct_t { };
-inline constexpr piecewise_construct_t piecewise_construct = piecewise_construct_t();
-
-template <class T> struct tuple_size;
-template <size_t I, class T> class tuple_element;
-
-template <class T1, class T2> struct tuple_size<pair<T1, T2> >;
-template <class T1, class T2> struct tuple_element<0, pair<T1, T2> >;
-template <class T1, class T2> struct tuple_element<1, pair<T1, T2> >;
-
-template<size_t I, class T1, class T2>
- typename tuple_element<I, pair<T1, T2> >::type&
- get(pair<T1, T2>&) noexcept; // constexpr in C++14
-
-template<size_t I, class T1, class T2>
- const typename tuple_element<I, pair<T1, T2> >::type&
- get(const pair<T1, T2>&) noexcept; // constexpr in C++14
-
-template<size_t I, class T1, class T2>
- typename tuple_element<I, pair<T1, T2> >::type&&
- get(pair<T1, T2>&&) noexcept; // constexpr in C++14
-
-template<size_t I, class T1, class T2>
- const typename tuple_element<I, pair<T1, T2> >::type&&
- get(const pair<T1, T2>&&) noexcept; // constexpr in C++14
-
-template<class T1, class T2>
- constexpr T1& get(pair<T1, T2>&) noexcept; // C++14
-
-template<class T1, class T2>
- constexpr const T1& get(const pair<T1, T2>&) noexcept; // C++14
-
-template<class T1, class T2>
- constexpr T1&& get(pair<T1, T2>&&) noexcept; // C++14
-
-template<class T1, class T2>
- constexpr const T1&& get(const pair<T1, T2>&&) noexcept; // C++14
-
-template<class T1, class T2>
- constexpr T1& get(pair<T2, T1>&) noexcept; // C++14
-
-template<class T1, class T2>
- constexpr const T1& get(const pair<T2, T1>&) noexcept; // C++14
-
-template<class T1, class T2>
- constexpr T1&& get(pair<T2, T1>&&) noexcept; // C++14
-
-template<class T1, class T2>
- constexpr const T1&& get(const pair<T2, T1>&&) noexcept; // C++14
-
-// C++14
-
-template<class T, T... I>
-struct integer_sequence
-{
- typedef T value_type;
-
- static constexpr size_t size() noexcept;
-};
-
-template<size_t... I>
- using index_sequence = integer_sequence<size_t, I...>;
-
-template<class T, T N>
- using make_integer_sequence = integer_sequence<T, 0, 1, ..., N-1>;
-template<size_t N>
- using make_index_sequence = make_integer_sequence<size_t, N>;
-
-template<class... T>
- using index_sequence_for = make_index_sequence<sizeof...(T)>;
-
-template<class T, class U=T>
- T exchange(T& obj, U&& new_value);
-
-// 20.2.7, in-place construction // C++17
-struct in_place_t {
- explicit in_place_t() = default;
-};
-inline constexpr in_place_t in_place{};
-template <class T>
- struct in_place_type_t {
- explicit in_place_type_t() = default;
- };
-template <class T>
- inline constexpr in_place_type_t<T> in_place_type{};
-template <size_t I>
- struct in_place_index_t {
- explicit in_place_index_t() = default;
- };
-template <size_t I>
- inline constexpr in_place_index_t<I> in_place_index{};
-
-} // std
-
-*/
-
-#include <__config>
-#include <__tuple>
-#include <type_traits>
-#include <initializer_list>
-#include <cstddef>
-#include <cstring>
-#include <cstdint>
-#include <version>
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-namespace rel_ops
-{
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const _Tp& __x, const _Tp& __y)
-{
- return !(__x == __y);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator> (const _Tp& __x, const _Tp& __y)
-{
- return __y < __x;
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const _Tp& __x, const _Tp& __y)
-{
- return !(__y < __x);
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const _Tp& __x, const _Tp& __y)
-{
- return !(__x < __y);
-}
-
-} // rel_ops
-
-// swap_ranges
-
-
-template <class _ForwardIterator1, class _ForwardIterator2>
-inline _LIBCPP_INLINE_VISIBILITY
-_ForwardIterator2
-swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2)
-{
- for(; __first1 != __last1; ++__first1, (void) ++__first2)
- swap(*__first1, *__first2);
- return __first2;
-}
-
-// forward declared in <type_traits>
-template<class _Tp, size_t _Np>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if<
- __is_swappable<_Tp>::value
->::type
-swap(_Tp (&__a)[_Np], _Tp (&__b)[_Np]) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value)
-{
- _VSTD::swap_ranges(__a, __a + _Np, __b);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-#ifndef _LIBCPP_CXX03_LANG
-typename conditional
-<
- !is_nothrow_move_constructible<_Tp>::value && is_copy_constructible<_Tp>::value,
- const _Tp&,
- _Tp&&
->::type
-#else // _LIBCPP_CXX03_LANG
-const _Tp&
-#endif
-move_if_noexcept(_Tp& __x) _NOEXCEPT
-{
- return _VSTD::move(__x);
-}
-
-#if _LIBCPP_STD_VER > 14
-template <class _Tp> constexpr add_const_t<_Tp>& as_const(_Tp& __t) noexcept { return __t; }
-template <class _Tp> void as_const(const _Tp&&) = delete;
-#endif
-
-struct _LIBCPP_TEMPLATE_VIS piecewise_construct_t { };
-#if defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY)
-extern _LIBCPP_EXPORTED_FROM_ABI const piecewise_construct_t piecewise_construct;// = piecewise_construct_t();
-#else
-/* _LIBCPP_INLINE_VAR */ constexpr piecewise_construct_t piecewise_construct = piecewise_construct_t();
-#endif
-
-#if defined(_LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR)
-template <class, class>
-struct __non_trivially_copyable_base {
- _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
- __non_trivially_copyable_base() _NOEXCEPT {}
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- __non_trivially_copyable_base(__non_trivially_copyable_base const&) _NOEXCEPT {}
-};
-#endif
-
-template <class _T1, class _T2>
-struct _LIBCPP_TEMPLATE_VIS pair
-#if defined(_LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR)
-: private __non_trivially_copyable_base<_T1, _T2>
-#endif
-{
- typedef _T1 first_type;
- typedef _T2 second_type;
-
- _T1 first;
- _T2 second;
-
-#if !defined(_LIBCPP_CXX03_LANG)
- pair(pair const&) = default;
- pair(pair&&) = default;
-#else
- // Use the implicitly declared copy constructor in C++03
-#endif
-
-#ifdef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- pair() : first(), second() {}
-
- _LIBCPP_INLINE_VISIBILITY
- pair(_T1 const& __t1, _T2 const& __t2) : first(__t1), second(__t2) {}
-
- template <class _U1, class _U2>
- _LIBCPP_INLINE_VISIBILITY
- pair(const pair<_U1, _U2>& __p) : first(__p.first), second(__p.second) {}
-
- _LIBCPP_INLINE_VISIBILITY
- pair& operator=(pair const& __p) {
- first = __p.first;
- second = __p.second;
- return *this;
- }
-#else
- template <bool _Val>
- using _EnableB = typename enable_if<_Val, bool>::type;
-
- struct _CheckArgs {
- template <class _U1, class _U2>
- static constexpr bool __enable_default() {
- return is_default_constructible<_U1>::value
- && is_default_constructible<_U2>::value;
- }
-
- template <class _U1, class _U2>
- static constexpr bool __enable_explicit() {
- return is_constructible<first_type, _U1>::value
- && is_constructible<second_type, _U2>::value
- && (!is_convertible<_U1, first_type>::value
- || !is_convertible<_U2, second_type>::value);
- }
-
- template <class _U1, class _U2>
- static constexpr bool __enable_implicit() {
- return is_constructible<first_type, _U1>::value
- && is_constructible<second_type, _U2>::value
- && is_convertible<_U1, first_type>::value
- && is_convertible<_U2, second_type>::value;
- }
- };
-
- template <bool _MaybeEnable>
- using _CheckArgsDep = typename conditional<
- _MaybeEnable, _CheckArgs, __check_tuple_constructor_fail>::type;
-
- struct _CheckTupleLikeConstructor {
- template <class _Tuple>
- static constexpr bool __enable_implicit() {
- return __tuple_convertible<_Tuple, pair>::value;
- }
-
- template <class _Tuple>
- static constexpr bool __enable_explicit() {
- return __tuple_constructible<_Tuple, pair>::value
- && !__tuple_convertible<_Tuple, pair>::value;
- }
-
- template <class _Tuple>
- static constexpr bool __enable_assign() {
- return __tuple_assignable<_Tuple, pair>::value;
- }
- };
-
- template <class _Tuple>
- using _CheckTLC = typename conditional<
- __tuple_like_with_size<_Tuple, 2>::value
- && !is_same<typename decay<_Tuple>::type, pair>::value,
- _CheckTupleLikeConstructor,
- __check_tuple_constructor_fail
- >::type;
-
- template<bool _Dummy = true, _EnableB<
- _CheckArgsDep<_Dummy>::template __enable_default<_T1, _T2>()
- > = false>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- pair() _NOEXCEPT_(is_nothrow_default_constructible<first_type>::value &&
- is_nothrow_default_constructible<second_type>::value)
- : first(), second() {}
-
- template <bool _Dummy = true, _EnableB<
- _CheckArgsDep<_Dummy>::template __enable_explicit<_T1 const&, _T2 const&>()
- > = false>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- explicit pair(_T1 const& __t1, _T2 const& __t2)
- _NOEXCEPT_(is_nothrow_copy_constructible<first_type>::value &&
- is_nothrow_copy_constructible<second_type>::value)
- : first(__t1), second(__t2) {}
-
- template<bool _Dummy = true, _EnableB<
- _CheckArgsDep<_Dummy>::template __enable_implicit<_T1 const&, _T2 const&>()
- > = false>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- pair(_T1 const& __t1, _T2 const& __t2)
- _NOEXCEPT_(is_nothrow_copy_constructible<first_type>::value &&
- is_nothrow_copy_constructible<second_type>::value)
- : first(__t1), second(__t2) {}
-
- template<class _U1, class _U2, _EnableB<
- _CheckArgs::template __enable_explicit<_U1, _U2>()
- > = false>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- explicit pair(_U1&& __u1, _U2&& __u2)
- _NOEXCEPT_((is_nothrow_constructible<first_type, _U1>::value &&
- is_nothrow_constructible<second_type, _U2>::value))
- : first(_VSTD::forward<_U1>(__u1)), second(_VSTD::forward<_U2>(__u2)) {}
-
- template<class _U1, class _U2, _EnableB<
- _CheckArgs::template __enable_implicit<_U1, _U2>()
- > = false>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- pair(_U1&& __u1, _U2&& __u2)
- _NOEXCEPT_((is_nothrow_constructible<first_type, _U1>::value &&
- is_nothrow_constructible<second_type, _U2>::value))
- : first(_VSTD::forward<_U1>(__u1)), second(_VSTD::forward<_U2>(__u2)) {}
-
- template<class _U1, class _U2, _EnableB<
- _CheckArgs::template __enable_explicit<_U1 const&, _U2 const&>()
- > = false>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- explicit pair(pair<_U1, _U2> const& __p)
- _NOEXCEPT_((is_nothrow_constructible<first_type, _U1 const&>::value &&
- is_nothrow_constructible<second_type, _U2 const&>::value))
- : first(__p.first), second(__p.second) {}
-
- template<class _U1, class _U2, _EnableB<
- _CheckArgs::template __enable_implicit<_U1 const&, _U2 const&>()
- > = false>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- pair(pair<_U1, _U2> const& __p)
- _NOEXCEPT_((is_nothrow_constructible<first_type, _U1 const&>::value &&
- is_nothrow_constructible<second_type, _U2 const&>::value))
- : first(__p.first), second(__p.second) {}
-
- template<class _U1, class _U2, _EnableB<
- _CheckArgs::template __enable_explicit<_U1, _U2>()
- > = false>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- explicit pair(pair<_U1, _U2>&&__p)
- _NOEXCEPT_((is_nothrow_constructible<first_type, _U1&&>::value &&
- is_nothrow_constructible<second_type, _U2&&>::value))
- : first(_VSTD::forward<_U1>(__p.first)), second(_VSTD::forward<_U2>(__p.second)) {}
-
- template<class _U1, class _U2, _EnableB<
- _CheckArgs::template __enable_implicit<_U1, _U2>()
- > = false>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- pair(pair<_U1, _U2>&& __p)
- _NOEXCEPT_((is_nothrow_constructible<first_type, _U1&&>::value &&
- is_nothrow_constructible<second_type, _U2&&>::value))
- : first(_VSTD::forward<_U1>(__p.first)), second(_VSTD::forward<_U2>(__p.second)) {}
-
- template<class _Tuple, _EnableB<
- _CheckTLC<_Tuple>::template __enable_explicit<_Tuple>()
- > = false>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- explicit pair(_Tuple&& __p)
- : first(_VSTD::get<0>(_VSTD::forward<_Tuple>(__p))),
- second(_VSTD::get<1>(_VSTD::forward<_Tuple>(__p))) {}
-
- template<class _Tuple, _EnableB<
- _CheckTLC<_Tuple>::template __enable_implicit<_Tuple>()
- > = false>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- pair(_Tuple&& __p)
- : first(_VSTD::get<0>(_VSTD::forward<_Tuple>(__p))),
- second(_VSTD::get<1>(_VSTD::forward<_Tuple>(__p))) {}
-
- template <class... _Args1, class... _Args2>
- _LIBCPP_INLINE_VISIBILITY
- pair(piecewise_construct_t __pc,
- tuple<_Args1...> __first_args, tuple<_Args2...> __second_args)
- _NOEXCEPT_((is_nothrow_constructible<first_type, _Args1...>::value &&
- is_nothrow_constructible<second_type, _Args2...>::value))
- : pair(__pc, __first_args, __second_args,
- typename __make_tuple_indices<sizeof...(_Args1)>::type(),
- typename __make_tuple_indices<sizeof...(_Args2) >::type()) {}
-
- _LIBCPP_INLINE_VISIBILITY
- pair& operator=(typename conditional<
- is_copy_assignable<first_type>::value &&
- is_copy_assignable<second_type>::value,
- pair, __nat>::type const& __p)
- _NOEXCEPT_(is_nothrow_copy_assignable<first_type>::value &&
- is_nothrow_copy_assignable<second_type>::value)
- {
- first = __p.first;
- second = __p.second;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- pair& operator=(typename conditional<
- is_move_assignable<first_type>::value &&
- is_move_assignable<second_type>::value,
- pair, __nat>::type&& __p)
- _NOEXCEPT_(is_nothrow_move_assignable<first_type>::value &&
- is_nothrow_move_assignable<second_type>::value)
- {
- first = _VSTD::forward<first_type>(__p.first);
- second = _VSTD::forward<second_type>(__p.second);
- return *this;
- }
-
- template <class _Tuple, _EnableB<
- _CheckTLC<_Tuple>::template __enable_assign<_Tuple>()
- > = false>
- _LIBCPP_INLINE_VISIBILITY
- pair& operator=(_Tuple&& __p) {
- first = _VSTD::get<0>(_VSTD::forward<_Tuple>(__p));
- second = _VSTD::get<1>(_VSTD::forward<_Tuple>(__p));
- return *this;
- }
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- void
- swap(pair& __p) _NOEXCEPT_(__is_nothrow_swappable<first_type>::value &&
- __is_nothrow_swappable<second_type>::value)
- {
- using _VSTD::swap;
- swap(first, __p.first);
- swap(second, __p.second);
- }
-private:
-
-#ifndef _LIBCPP_CXX03_LANG
- template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2>
- _LIBCPP_INLINE_VISIBILITY
- pair(piecewise_construct_t,
- tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args,
- __tuple_indices<_I1...>, __tuple_indices<_I2...>);
-#endif
-};
-
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-template<class _T1, class _T2>
-pair(_T1, _T2) -> pair<_T1, _T2>;
-#endif // _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator==(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)
-{
- return __x.first == __y.first && __x.second == __y.second;
-}
-
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator!=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator< (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)
-{
- return __x.first < __y.first || (!(__y.first < __x.first) && __x.second < __y.second);
-}
-
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator> (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)
-{
- return __y < __x;
-}
-
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator>=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)
-{
- return !(__x < __y);
-}
-
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-bool
-operator<=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)
-{
- return !(__y < __x);
-}
-
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_swappable<_T1>::value &&
- __is_swappable<_T2>::value,
- void
->::type
-swap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y)
- _NOEXCEPT_((__is_nothrow_swappable<_T1>::value &&
- __is_nothrow_swappable<_T2>::value))
-{
- __x.swap(__y);
-}
-
-template <class _Tp>
-struct __unwrap_reference { typedef _Tp type; };
-
-template <class _Tp>
-struct __unwrap_reference<reference_wrapper<_Tp> > { typedef _Tp& type; };
-
-#if _LIBCPP_STD_VER > 17
-template <class _Tp>
-struct unwrap_reference : __unwrap_reference<_Tp> { };
-
-template <class _Tp>
-struct unwrap_ref_decay : unwrap_reference<typename decay<_Tp>::type> { };
-#endif // > C++17
-
-template <class _Tp>
-struct __unwrap_ref_decay
-#if _LIBCPP_STD_VER > 17
- : unwrap_ref_decay<_Tp>
-#else
- : __unwrap_reference<typename decay<_Tp>::type>
-#endif
-{ };
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-pair<typename __unwrap_ref_decay<_T1>::type, typename __unwrap_ref_decay<_T2>::type>
-make_pair(_T1&& __t1, _T2&& __t2)
-{
- return pair<typename __unwrap_ref_decay<_T1>::type, typename __unwrap_ref_decay<_T2>::type>
- (_VSTD::forward<_T1>(__t1), _VSTD::forward<_T2>(__t2));
-}
-
-#else // _LIBCPP_CXX03_LANG
-
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY
-pair<_T1,_T2>
-make_pair(_T1 __x, _T2 __y)
-{
- return pair<_T1, _T2>(__x, __y);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _T1, class _T2>
- struct _LIBCPP_TEMPLATE_VIS tuple_size<pair<_T1, _T2> >
- : public integral_constant<size_t, 2> {};
-
-template <size_t _Ip, class _T1, class _T2>
-class _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, pair<_T1, _T2> >
-{
- static_assert(_Ip < 2, "Index out of bounds in std::tuple_element<std::pair<T1, T2>>");
-};
-
-template <class _T1, class _T2>
-class _LIBCPP_TEMPLATE_VIS tuple_element<0, pair<_T1, _T2> >
-{
-public:
- typedef _T1 type;
-};
-
-template <class _T1, class _T2>
-class _LIBCPP_TEMPLATE_VIS tuple_element<1, pair<_T1, _T2> >
-{
-public:
- typedef _T2 type;
-};
-
-template <size_t _Ip> struct __get_pair;
-
-template <>
-struct __get_pair<0>
-{
- template <class _T1, class _T2>
- static
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- _T1&
- get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;}
-
- template <class _T1, class _T2>
- static
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- const _T1&
- get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;}
-
-#ifndef _LIBCPP_CXX03_LANG
- template <class _T1, class _T2>
- static
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- _T1&&
- get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T1>(__p.first);}
-
- template <class _T1, class _T2>
- static
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- const _T1&&
- get(const pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<const _T1>(__p.first);}
-#endif // _LIBCPP_CXX03_LANG
-};
-
-template <>
-struct __get_pair<1>
-{
- template <class _T1, class _T2>
- static
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- _T2&
- get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;}
-
- template <class _T1, class _T2>
- static
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- const _T2&
- get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;}
-
-#ifndef _LIBCPP_CXX03_LANG
- template <class _T1, class _T2>
- static
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- _T2&&
- get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T2>(__p.second);}
-
- template <class _T1, class _T2>
- static
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
- const _T2&&
- get(const pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<const _T2>(__p.second);}
-#endif // _LIBCPP_CXX03_LANG
-};
-
-template <size_t _Ip, class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-typename tuple_element<_Ip, pair<_T1, _T2> >::type&
-get(pair<_T1, _T2>& __p) _NOEXCEPT
-{
- return __get_pair<_Ip>::get(__p);
-}
-
-template <size_t _Ip, class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-const typename tuple_element<_Ip, pair<_T1, _T2> >::type&
-get(const pair<_T1, _T2>& __p) _NOEXCEPT
-{
- return __get_pair<_Ip>::get(__p);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-template <size_t _Ip, class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-typename tuple_element<_Ip, pair<_T1, _T2> >::type&&
-get(pair<_T1, _T2>&& __p) _NOEXCEPT
-{
- return __get_pair<_Ip>::get(_VSTD::move(__p));
-}
-
-template <size_t _Ip, class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-const typename tuple_element<_Ip, pair<_T1, _T2> >::type&&
-get(const pair<_T1, _T2>&& __p) _NOEXCEPT
-{
- return __get_pair<_Ip>::get(_VSTD::move(__p));
-}
-#endif // _LIBCPP_CXX03_LANG
-
-#if _LIBCPP_STD_VER > 11
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr _T1 & get(pair<_T1, _T2>& __p) _NOEXCEPT
-{
- return __get_pair<0>::get(__p);
-}
-
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr _T1 const & get(pair<_T1, _T2> const& __p) _NOEXCEPT
-{
- return __get_pair<0>::get(__p);
-}
-
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr _T1 && get(pair<_T1, _T2>&& __p) _NOEXCEPT
-{
- return __get_pair<0>::get(_VSTD::move(__p));
-}
-
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr _T1 const && get(pair<_T1, _T2> const&& __p) _NOEXCEPT
-{
- return __get_pair<0>::get(_VSTD::move(__p));
-}
-
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr _T1 & get(pair<_T2, _T1>& __p) _NOEXCEPT
-{
- return __get_pair<1>::get(__p);
-}
-
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr _T1 const & get(pair<_T2, _T1> const& __p) _NOEXCEPT
-{
- return __get_pair<1>::get(__p);
-}
-
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr _T1 && get(pair<_T2, _T1>&& __p) _NOEXCEPT
-{
- return __get_pair<1>::get(_VSTD::move(__p));
-}
-
-template <class _T1, class _T2>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr _T1 const && get(pair<_T2, _T1> const&& __p) _NOEXCEPT
-{
- return __get_pair<1>::get(_VSTD::move(__p));
-}
-
-#endif
-
-#if _LIBCPP_STD_VER > 11
-
-template<class _Tp, _Tp... _Ip>
-struct _LIBCPP_TEMPLATE_VIS integer_sequence
-{
- typedef _Tp value_type;
- static_assert( is_integral<_Tp>::value,
- "std::integer_sequence can only be instantiated with an integral type" );
- static
- _LIBCPP_INLINE_VISIBILITY
- constexpr
- size_t
- size() noexcept { return sizeof...(_Ip); }
-};
-
-template<size_t... _Ip>
- using index_sequence = integer_sequence<size_t, _Ip...>;
-
-#if __has_builtin(__make_integer_seq) && !defined(_LIBCPP_TESTING_FALLBACK_MAKE_INTEGER_SEQUENCE)
-
-template <class _Tp, _Tp _Ep>
-using __make_integer_sequence = __make_integer_seq<integer_sequence, _Tp, _Ep>;
-
-#else
-
-template<typename _Tp, _Tp _Np> using __make_integer_sequence_unchecked =
- typename __detail::__make<_Np>::type::template __convert<integer_sequence, _Tp>;
-
-template <class _Tp, _Tp _Ep>
-struct __make_integer_sequence_checked
-{
- static_assert(is_integral<_Tp>::value,
- "std::make_integer_sequence can only be instantiated with an integral type" );
- static_assert(0 <= _Ep, "std::make_integer_sequence must have a non-negative sequence length");
- // Workaround GCC bug by preventing bad installations when 0 <= _Ep
- // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68929
- typedef __make_integer_sequence_unchecked<_Tp, 0 <= _Ep ? _Ep : 0> type;
-};
-
-template <class _Tp, _Tp _Ep>
-using __make_integer_sequence = typename __make_integer_sequence_checked<_Tp, _Ep>::type;
-
-#endif
-
-template<class _Tp, _Tp _Np>
- using make_integer_sequence = __make_integer_sequence<_Tp, _Np>;
-
-template<size_t _Np>
- using make_index_sequence = make_integer_sequence<size_t, _Np>;
-
-template<class... _Tp>
- using index_sequence_for = make_index_sequence<sizeof...(_Tp)>;
-
-#endif // _LIBCPP_STD_VER > 11
-
-#if _LIBCPP_STD_VER > 11
-template<class _T1, class _T2 = _T1>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-_T1 exchange(_T1& __obj, _T2 && __new_value)
-{
- _T1 __old_value = _VSTD::move(__obj);
- __obj = _VSTD::forward<_T2>(__new_value);
- return __old_value;
-}
-#endif // _LIBCPP_STD_VER > 11
-
-#if _LIBCPP_STD_VER > 14
-
-struct _LIBCPP_TYPE_VIS in_place_t {
- explicit in_place_t() = default;
-};
-_LIBCPP_INLINE_VAR constexpr in_place_t in_place{};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS in_place_type_t {
- explicit in_place_type_t() = default;
-};
-template <class _Tp>
-_LIBCPP_INLINE_VAR constexpr in_place_type_t<_Tp> in_place_type{};
-
-template <size_t _Idx>
-struct _LIBCPP_TYPE_VIS in_place_index_t {
- explicit in_place_index_t() = default;
-};
-template <size_t _Idx>
-_LIBCPP_INLINE_VAR constexpr in_place_index_t<_Idx> in_place_index{};
-
-template <class _Tp> struct __is_inplace_type_imp : false_type {};
-template <class _Tp> struct __is_inplace_type_imp<in_place_type_t<_Tp>> : true_type {};
-
-template <class _Tp>
-using __is_inplace_type = __is_inplace_type_imp<__uncvref_t<_Tp>>;
-
-template <class _Tp> struct __is_inplace_index_imp : false_type {};
-template <size_t _Idx> struct __is_inplace_index_imp<in_place_index_t<_Idx>> : true_type {};
-
-template <class _Tp>
-using __is_inplace_index = __is_inplace_index_imp<__uncvref_t<_Tp>>;
-
-#endif // _LIBCPP_STD_VER > 14
-
-template <class _Arg, class _Result>
-struct _LIBCPP_TEMPLATE_VIS unary_function
-{
- typedef _Arg argument_type;
- typedef _Result result_type;
-};
-
-template <class _Size>
-inline _LIBCPP_INLINE_VISIBILITY
-_Size
-__loadword(const void* __p)
-{
- _Size __r;
- std::memcpy(&__r, __p, sizeof(__r));
- return __r;
-}
-
-// We use murmur2 when size_t is 32 bits, and cityhash64 when size_t
-// is 64 bits. This is because cityhash64 uses 64bit x 64bit
-// multiplication, which can be very slow on 32-bit systems.
-template <class _Size, size_t = sizeof(_Size)*__CHAR_BIT__>
-struct __murmur2_or_cityhash;
-
-template <class _Size>
-struct __murmur2_or_cityhash<_Size, 32>
-{
- inline _Size operator()(const void* __key, _Size __len)
- _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK;
-};
-
-// murmur2
-template <class _Size>
-_Size
-__murmur2_or_cityhash<_Size, 32>::operator()(const void* __key, _Size __len)
-{
- const _Size __m = 0x5bd1e995;
- const _Size __r = 24;
- _Size __h = __len;
- const unsigned char* __data = static_cast<const unsigned char*>(__key);
- for (; __len >= 4; __data += 4, __len -= 4)
- {
- _Size __k = __loadword<_Size>(__data);
- __k *= __m;
- __k ^= __k >> __r;
- __k *= __m;
- __h *= __m;
- __h ^= __k;
- }
- switch (__len)
- {
- case 3:
- __h ^= __data[2] << 16;
- _LIBCPP_FALLTHROUGH();
- case 2:
- __h ^= __data[1] << 8;
- _LIBCPP_FALLTHROUGH();
- case 1:
- __h ^= __data[0];
- __h *= __m;
- }
- __h ^= __h >> 13;
- __h *= __m;
- __h ^= __h >> 15;
- return __h;
-}
-
-template <class _Size>
-struct __murmur2_or_cityhash<_Size, 64>
-{
- inline _Size operator()(const void* __key, _Size __len) _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK;
-
- private:
- // Some primes between 2^63 and 2^64.
- static const _Size __k0 = 0xc3a5c85c97cb3127ULL;
- static const _Size __k1 = 0xb492b66fbe98f273ULL;
- static const _Size __k2 = 0x9ae16a3b2f90404fULL;
- static const _Size __k3 = 0xc949d7c7509e6557ULL;
-
- static _Size __rotate(_Size __val, int __shift) {
- return __shift == 0 ? __val : ((__val >> __shift) | (__val << (64 - __shift)));
- }
-
- static _Size __rotate_by_at_least_1(_Size __val, int __shift) {
- return (__val >> __shift) | (__val << (64 - __shift));
- }
-
- static _Size __shift_mix(_Size __val) {
- return __val ^ (__val >> 47);
- }
-
- static _Size __hash_len_16(_Size __u, _Size __v)
- _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
- {
- const _Size __mul = 0x9ddfea08eb382d69ULL;
- _Size __a = (__u ^ __v) * __mul;
- __a ^= (__a >> 47);
- _Size __b = (__v ^ __a) * __mul;
- __b ^= (__b >> 47);
- __b *= __mul;
- return __b;
- }
-
- static _Size __hash_len_0_to_16(const char* __s, _Size __len)
- _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
- {
- if (__len > 8) {
- const _Size __a = __loadword<_Size>(__s);
- const _Size __b = __loadword<_Size>(__s + __len - 8);
- return __hash_len_16(__a, __rotate_by_at_least_1(__b + __len, __len)) ^ __b;
- }
- if (__len >= 4) {
- const uint32_t __a = __loadword<uint32_t>(__s);
- const uint32_t __b = __loadword<uint32_t>(__s + __len - 4);
- return __hash_len_16(__len + (__a << 3), __b);
- }
- if (__len > 0) {
- const unsigned char __a = __s[0];
- const unsigned char __b = __s[__len >> 1];
- const unsigned char __c = __s[__len - 1];
- const uint32_t __y = static_cast<uint32_t>(__a) +
- (static_cast<uint32_t>(__b) << 8);
- const uint32_t __z = __len + (static_cast<uint32_t>(__c) << 2);
- return __shift_mix(__y * __k2 ^ __z * __k3) * __k2;
- }
- return __k2;
- }
-
- static _Size __hash_len_17_to_32(const char *__s, _Size __len)
- _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
- {
- const _Size __a = __loadword<_Size>(__s) * __k1;
- const _Size __b = __loadword<_Size>(__s + 8);
- const _Size __c = __loadword<_Size>(__s + __len - 8) * __k2;
- const _Size __d = __loadword<_Size>(__s + __len - 16) * __k0;
- return __hash_len_16(__rotate(__a - __b, 43) + __rotate(__c, 30) + __d,
- __a + __rotate(__b ^ __k3, 20) - __c + __len);
- }
-
- // Return a 16-byte hash for 48 bytes. Quick and dirty.
- // Callers do best to use "random-looking" values for a and b.
- static pair<_Size, _Size> __weak_hash_len_32_with_seeds(
- _Size __w, _Size __x, _Size __y, _Size __z, _Size __a, _Size __b)
- _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
- {
- __a += __w;
- __b = __rotate(__b + __a + __z, 21);
- const _Size __c = __a;
- __a += __x;
- __a += __y;
- __b += __rotate(__a, 44);
- return pair<_Size, _Size>(__a + __z, __b + __c);
- }
-
- // Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty.
- static pair<_Size, _Size> __weak_hash_len_32_with_seeds(
- const char* __s, _Size __a, _Size __b)
- _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
- {
- return __weak_hash_len_32_with_seeds(__loadword<_Size>(__s),
- __loadword<_Size>(__s + 8),
- __loadword<_Size>(__s + 16),
- __loadword<_Size>(__s + 24),
- __a,
- __b);
- }
-
- // Return an 8-byte hash for 33 to 64 bytes.
- static _Size __hash_len_33_to_64(const char *__s, size_t __len)
- _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
- {
- _Size __z = __loadword<_Size>(__s + 24);
- _Size __a = __loadword<_Size>(__s) +
- (__len + __loadword<_Size>(__s + __len - 16)) * __k0;
- _Size __b = __rotate(__a + __z, 52);
- _Size __c = __rotate(__a, 37);
- __a += __loadword<_Size>(__s + 8);
- __c += __rotate(__a, 7);
- __a += __loadword<_Size>(__s + 16);
- _Size __vf = __a + __z;
- _Size __vs = __b + __rotate(__a, 31) + __c;
- __a = __loadword<_Size>(__s + 16) + __loadword<_Size>(__s + __len - 32);
- __z += __loadword<_Size>(__s + __len - 8);
- __b = __rotate(__a + __z, 52);
- __c = __rotate(__a, 37);
- __a += __loadword<_Size>(__s + __len - 24);
- __c += __rotate(__a, 7);
- __a += __loadword<_Size>(__s + __len - 16);
- _Size __wf = __a + __z;
- _Size __ws = __b + __rotate(__a, 31) + __c;
- _Size __r = __shift_mix((__vf + __ws) * __k2 + (__wf + __vs) * __k0);
- return __shift_mix(__r * __k0 + __vs) * __k2;
- }
-};
-
-// cityhash64
-template <class _Size>
-_Size
-__murmur2_or_cityhash<_Size, 64>::operator()(const void* __key, _Size __len)
-{
- const char* __s = static_cast<const char*>(__key);
- if (__len <= 32) {
- if (__len <= 16) {
- return __hash_len_0_to_16(__s, __len);
- } else {
- return __hash_len_17_to_32(__s, __len);
- }
- } else if (__len <= 64) {
- return __hash_len_33_to_64(__s, __len);
- }
-
- // For strings over 64 bytes we hash the end first, and then as we
- // loop we keep 56 bytes of state: v, w, x, y, and z.
- _Size __x = __loadword<_Size>(__s + __len - 40);
- _Size __y = __loadword<_Size>(__s + __len - 16) +
- __loadword<_Size>(__s + __len - 56);
- _Size __z = __hash_len_16(__loadword<_Size>(__s + __len - 48) + __len,
- __loadword<_Size>(__s + __len - 24));
- pair<_Size, _Size> __v = __weak_hash_len_32_with_seeds(__s + __len - 64, __len, __z);
- pair<_Size, _Size> __w = __weak_hash_len_32_with_seeds(__s + __len - 32, __y + __k1, __x);
- __x = __x * __k1 + __loadword<_Size>(__s);
-
- // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks.
- __len = (__len - 1) & ~static_cast<_Size>(63);
- do {
- __x = __rotate(__x + __y + __v.first + __loadword<_Size>(__s + 8), 37) * __k1;
- __y = __rotate(__y + __v.second + __loadword<_Size>(__s + 48), 42) * __k1;
- __x ^= __w.second;
- __y += __v.first + __loadword<_Size>(__s + 40);
- __z = __rotate(__z + __w.first, 33) * __k1;
- __v = __weak_hash_len_32_with_seeds(__s, __v.second * __k1, __x + __w.first);
- __w = __weak_hash_len_32_with_seeds(__s + 32, __z + __w.second,
- __y + __loadword<_Size>(__s + 16));
- std::swap(__z, __x);
- __s += 64;
- __len -= 64;
- } while (__len != 0);
- return __hash_len_16(
- __hash_len_16(__v.first, __w.first) + __shift_mix(__y) * __k1 + __z,
- __hash_len_16(__v.second, __w.second) + __x);
-}
-
-template <class _Tp, size_t = sizeof(_Tp) / sizeof(size_t)>
-struct __scalar_hash;
-
-template <class _Tp>
-struct __scalar_hash<_Tp, 0>
- : public unary_function<_Tp, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(_Tp __v) const _NOEXCEPT
- {
- union
- {
- _Tp __t;
- size_t __a;
- } __u;
- __u.__a = 0;
- __u.__t = __v;
- return __u.__a;
- }
-};
-
-template <class _Tp>
-struct __scalar_hash<_Tp, 1>
- : public unary_function<_Tp, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(_Tp __v) const _NOEXCEPT
- {
- union
- {
- _Tp __t;
- size_t __a;
- } __u;
- __u.__t = __v;
- return __u.__a;
- }
-};
-
-template <class _Tp>
-struct __scalar_hash<_Tp, 2>
- : public unary_function<_Tp, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(_Tp __v) const _NOEXCEPT
- {
- union
- {
- _Tp __t;
- struct
- {
- size_t __a;
- size_t __b;
- } __s;
- } __u;
- __u.__t = __v;
- return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u));
- }
-};
-
-template <class _Tp>
-struct __scalar_hash<_Tp, 3>
- : public unary_function<_Tp, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(_Tp __v) const _NOEXCEPT
- {
- union
- {
- _Tp __t;
- struct
- {
- size_t __a;
- size_t __b;
- size_t __c;
- } __s;
- } __u;
- __u.__t = __v;
- return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u));
- }
-};
-
-template <class _Tp>
-struct __scalar_hash<_Tp, 4>
- : public unary_function<_Tp, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(_Tp __v) const _NOEXCEPT
- {
- union
- {
- _Tp __t;
- struct
- {
- size_t __a;
- size_t __b;
- size_t __c;
- size_t __d;
- } __s;
- } __u;
- __u.__t = __v;
- return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u));
- }
-};
-
-struct _PairT {
- size_t first;
- size_t second;
-};
-
-_LIBCPP_INLINE_VISIBILITY
-inline size_t __hash_combine(size_t __lhs, size_t __rhs) _NOEXCEPT {
- typedef __scalar_hash<_PairT> _HashT;
- const _PairT __p = {__lhs, __rhs};
- return _HashT()(__p);
-}
-
-template<class _Tp>
-struct _LIBCPP_TEMPLATE_VIS hash<_Tp*>
- : public unary_function<_Tp*, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(_Tp* __v) const _NOEXCEPT
- {
- union
- {
- _Tp* __t;
- size_t __a;
- } __u;
- __u.__t = __v;
- return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u));
- }
-};
-
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<bool>
- : public unary_function<bool, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(bool __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<char>
- : public unary_function<char, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(char __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<signed char>
- : public unary_function<signed char, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(signed char __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<unsigned char>
- : public unary_function<unsigned char, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(unsigned char __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
-};
-
-#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<char16_t>
- : public unary_function<char16_t, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(char16_t __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<char32_t>
- : public unary_function<char32_t, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(char32_t __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
-};
-
-#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<wchar_t>
- : public unary_function<wchar_t, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(wchar_t __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<short>
- : public unary_function<short, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(short __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<unsigned short>
- : public unary_function<unsigned short, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(unsigned short __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<int>
- : public unary_function<int, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(int __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<unsigned int>
- : public unary_function<unsigned int, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(unsigned int __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<long>
- : public unary_function<long, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(long __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<unsigned long>
- : public unary_function<unsigned long, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(unsigned long __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<long long>
- : public __scalar_hash<long long>
-{
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<unsigned long long>
- : public __scalar_hash<unsigned long long>
-{
-};
-
-#ifndef _LIBCPP_HAS_NO_INT128
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<__int128_t>
- : public __scalar_hash<__int128_t>
-{
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<__uint128_t>
- : public __scalar_hash<__uint128_t>
-{
-};
-
-#endif
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<float>
- : public __scalar_hash<float>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(float __v) const _NOEXCEPT
- {
- // -0.0 and 0.0 should return same hash
- if (__v == 0.0)
- return 0;
- return __scalar_hash<float>::operator()(__v);
- }
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<double>
- : public __scalar_hash<double>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(double __v) const _NOEXCEPT
- {
- // -0.0 and 0.0 should return same hash
- if (__v == 0.0)
- return 0;
- return __scalar_hash<double>::operator()(__v);
- }
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<long double>
- : public __scalar_hash<long double>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(long double __v) const _NOEXCEPT
- {
- // -0.0 and 0.0 should return same hash
- if (__v == 0.0)
- return 0;
-#if defined(__i386__)
- // Zero out padding bits
- union
- {
- long double __t;
- struct
- {
- size_t __a;
- size_t __b;
- size_t __c;
- size_t __d;
- } __s;
- } __u;
- __u.__s.__a = 0;
- __u.__s.__b = 0;
- __u.__s.__c = 0;
- __u.__s.__d = 0;
- __u.__t = __v;
- return __u.__s.__a ^ __u.__s.__b ^ __u.__s.__c ^ __u.__s.__d;
-#elif defined(__x86_64__)
- // Zero out padding bits
- union
- {
- long double __t;
- struct
- {
- size_t __a;
- size_t __b;
- } __s;
- } __u;
- __u.__s.__a = 0;
- __u.__s.__b = 0;
- __u.__t = __v;
- return __u.__s.__a ^ __u.__s.__b;
-#else
- return __scalar_hash<long double>::operator()(__v);
-#endif
- }
-};
-
-#if _LIBCPP_STD_VER > 11
-
-template <class _Tp, bool = is_enum<_Tp>::value>
-struct _LIBCPP_TEMPLATE_VIS __enum_hash
- : public unary_function<_Tp, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(_Tp __v) const _NOEXCEPT
- {
- typedef typename underlying_type<_Tp>::type type;
- return hash<type>{}(static_cast<type>(__v));
- }
-};
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS __enum_hash<_Tp, false> {
- __enum_hash() = delete;
- __enum_hash(__enum_hash const&) = delete;
- __enum_hash& operator=(__enum_hash const&) = delete;
-};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS hash : public __enum_hash<_Tp>
-{
-};
-#endif
-
-#if _LIBCPP_STD_VER > 14
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<nullptr_t>
- : public unary_function<nullptr_t, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(nullptr_t) const _NOEXCEPT {
- return 662607004ull;
- }
-};
-#endif
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Key, class _Hash>
-using __check_hash_requirements = integral_constant<bool,
- is_copy_constructible<_Hash>::value &&
- is_move_constructible<_Hash>::value &&
- __invokable_r<size_t, _Hash, _Key const&>::value
->;
-
-template <class _Key, class _Hash = std::hash<_Key> >
-using __has_enabled_hash = integral_constant<bool,
- __check_hash_requirements<_Key, _Hash>::value &&
- is_default_constructible<_Hash>::value
->;
-
-#if _LIBCPP_STD_VER > 14
-template <class _Type, class>
-using __enable_hash_helper_imp = _Type;
-
-template <class _Type, class ..._Keys>
-using __enable_hash_helper = __enable_hash_helper_imp<_Type,
- typename enable_if<__all<__has_enabled_hash<_Keys>::value...>::value>::type
->;
-#else
-template <class _Type, class ...>
-using __enable_hash_helper = _Type;
-#endif
-
-#endif // !_LIBCPP_CXX03_LANG
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_UTILITY
diff --git a/lib/libcxx/include/valarray b/lib/libcxx/include/valarray
deleted file mode 100644
index 07f38c81150..00000000000
--- a/lib/libcxx/include/valarray
+++ /dev/null
@@ -1,4930 +0,0 @@
-// -*- C++ -*-
-//===-------------------------- valarray ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_VALARRAY
-#define _LIBCPP_VALARRAY
-
-/*
- valarray synopsis
-
-namespace std
-{
-
-template<class T>
-class valarray
-{
-public:
- typedef T value_type;
-
- // construct/destroy:
- valarray();
- explicit valarray(size_t n);
- valarray(const value_type& x, size_t n);
- valarray(const value_type* px, size_t n);
- valarray(const valarray& v);
- valarray(valarray&& v) noexcept;
- valarray(const slice_array<value_type>& sa);
- valarray(const gslice_array<value_type>& ga);
- valarray(const mask_array<value_type>& ma);
- valarray(const indirect_array<value_type>& ia);
- valarray(initializer_list<value_type> il);
- ~valarray();
-
- // assignment:
- valarray& operator=(const valarray& v);
- valarray& operator=(valarray&& v) noexcept;
- valarray& operator=(initializer_list<value_type> il);
- valarray& operator=(const value_type& x);
- valarray& operator=(const slice_array<value_type>& sa);
- valarray& operator=(const gslice_array<value_type>& ga);
- valarray& operator=(const mask_array<value_type>& ma);
- valarray& operator=(const indirect_array<value_type>& ia);
-
- // element access:
- const value_type& operator[](size_t i) const;
- value_type& operator[](size_t i);
-
- // subset operations:
- valarray operator[](slice s) const;
- slice_array<value_type> operator[](slice s);
- valarray operator[](const gslice& gs) const;
- gslice_array<value_type> operator[](const gslice& gs);
- valarray operator[](const valarray<bool>& vb) const;
- mask_array<value_type> operator[](const valarray<bool>& vb);
- valarray operator[](const valarray<size_t>& vs) const;
- indirect_array<value_type> operator[](const valarray<size_t>& vs);
-
- // unary operators:
- valarray operator+() const;
- valarray operator-() const;
- valarray operator~() const;
- valarray<bool> operator!() const;
-
- // computed assignment:
- valarray& operator*= (const value_type& x);
- valarray& operator/= (const value_type& x);
- valarray& operator%= (const value_type& x);
- valarray& operator+= (const value_type& x);
- valarray& operator-= (const value_type& x);
- valarray& operator^= (const value_type& x);
- valarray& operator&= (const value_type& x);
- valarray& operator|= (const value_type& x);
- valarray& operator<<=(const value_type& x);
- valarray& operator>>=(const value_type& x);
-
- valarray& operator*= (const valarray& v);
- valarray& operator/= (const valarray& v);
- valarray& operator%= (const valarray& v);
- valarray& operator+= (const valarray& v);
- valarray& operator-= (const valarray& v);
- valarray& operator^= (const valarray& v);
- valarray& operator|= (const valarray& v);
- valarray& operator&= (const valarray& v);
- valarray& operator<<=(const valarray& v);
- valarray& operator>>=(const valarray& v);
-
- // member functions:
- void swap(valarray& v) noexcept;
-
- size_t size() const;
-
- value_type sum() const;
- value_type min() const;
- value_type max() const;
-
- valarray shift (int i) const;
- valarray cshift(int i) const;
- valarray apply(value_type f(value_type)) const;
- valarray apply(value_type f(const value_type&)) const;
- void resize(size_t n, value_type x = value_type());
-};
-
-class slice
-{
-public:
- slice();
- slice(size_t start, size_t size, size_t stride);
-
- size_t start() const;
- size_t size() const;
- size_t stride() const;
-};
-
-template <class T>
-class slice_array
-{
-public:
- typedef T value_type;
-
- const slice_array& operator=(const slice_array& sa) const;
- void operator= (const valarray<value_type>& v) const;
- void operator*= (const valarray<value_type>& v) const;
- void operator/= (const valarray<value_type>& v) const;
- void operator%= (const valarray<value_type>& v) const;
- void operator+= (const valarray<value_type>& v) const;
- void operator-= (const valarray<value_type>& v) const;
- void operator^= (const valarray<value_type>& v) const;
- void operator&= (const valarray<value_type>& v) const;
- void operator|= (const valarray<value_type>& v) const;
- void operator<<=(const valarray<value_type>& v) const;
- void operator>>=(const valarray<value_type>& v) const;
-
- void operator=(const value_type& x) const;
-
- slice_array() = delete;
-};
-
-class gslice
-{
-public:
- gslice();
- gslice(size_t start, const valarray<size_t>& size,
- const valarray<size_t>& stride);
-
- size_t start() const;
- valarray<size_t> size() const;
- valarray<size_t> stride() const;
-};
-
-template <class T>
-class gslice_array
-{
-public:
- typedef T value_type;
-
- void operator= (const valarray<value_type>& v) const;
- void operator*= (const valarray<value_type>& v) const;
- void operator/= (const valarray<value_type>& v) const;
- void operator%= (const valarray<value_type>& v) const;
- void operator+= (const valarray<value_type>& v) const;
- void operator-= (const valarray<value_type>& v) const;
- void operator^= (const valarray<value_type>& v) const;
- void operator&= (const valarray<value_type>& v) const;
- void operator|= (const valarray<value_type>& v) const;
- void operator<<=(const valarray<value_type>& v) const;
- void operator>>=(const valarray<value_type>& v) const;
-
- gslice_array(const gslice_array& ga);
- ~gslice_array();
- const gslice_array& operator=(const gslice_array& ga) const;
- void operator=(const value_type& x) const;
-
- gslice_array() = delete;
-};
-
-template <class T>
-class mask_array
-{
-public:
- typedef T value_type;
-
- void operator= (const valarray<value_type>& v) const;
- void operator*= (const valarray<value_type>& v) const;
- void operator/= (const valarray<value_type>& v) const;
- void operator%= (const valarray<value_type>& v) const;
- void operator+= (const valarray<value_type>& v) const;
- void operator-= (const valarray<value_type>& v) const;
- void operator^= (const valarray<value_type>& v) const;
- void operator&= (const valarray<value_type>& v) const;
- void operator|= (const valarray<value_type>& v) const;
- void operator<<=(const valarray<value_type>& v) const;
- void operator>>=(const valarray<value_type>& v) const;
-
- mask_array(const mask_array& ma);
- ~mask_array();
- const mask_array& operator=(const mask_array& ma) const;
- void operator=(const value_type& x) const;
-
- mask_array() = delete;
-};
-
-template <class T>
-class indirect_array
-{
-public:
- typedef T value_type;
-
- void operator= (const valarray<value_type>& v) const;
- void operator*= (const valarray<value_type>& v) const;
- void operator/= (const valarray<value_type>& v) const;
- void operator%= (const valarray<value_type>& v) const;
- void operator+= (const valarray<value_type>& v) const;
- void operator-= (const valarray<value_type>& v) const;
- void operator^= (const valarray<value_type>& v) const;
- void operator&= (const valarray<value_type>& v) const;
- void operator|= (const valarray<value_type>& v) const;
- void operator<<=(const valarray<value_type>& v) const;
- void operator>>=(const valarray<value_type>& v) const;
-
- indirect_array(const indirect_array& ia);
- ~indirect_array();
- const indirect_array& operator=(const indirect_array& ia) const;
- void operator=(const value_type& x) const;
-
- indirect_array() = delete;
-};
-
-template<class T> void swap(valarray<T>& x, valarray<T>& y) noexcept;
-
-template<class T> valarray<T> operator* (const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<T> operator* (const valarray<T>& x, const T& y);
-template<class T> valarray<T> operator* (const T& x, const valarray<T>& y);
-
-template<class T> valarray<T> operator/ (const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<T> operator/ (const valarray<T>& x, const T& y);
-template<class T> valarray<T> operator/ (const T& x, const valarray<T>& y);
-
-template<class T> valarray<T> operator% (const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<T> operator% (const valarray<T>& x, const T& y);
-template<class T> valarray<T> operator% (const T& x, const valarray<T>& y);
-
-template<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<T> operator+ (const valarray<T>& x, const T& y);
-template<class T> valarray<T> operator+ (const T& x, const valarray<T>& y);
-
-template<class T> valarray<T> operator- (const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<T> operator- (const valarray<T>& x, const T& y);
-template<class T> valarray<T> operator- (const T& x, const valarray<T>& y);
-
-template<class T> valarray<T> operator^ (const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<T> operator^ (const valarray<T>& x, const T& y);
-template<class T> valarray<T> operator^ (const T& x, const valarray<T>& y);
-
-template<class T> valarray<T> operator& (const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<T> operator& (const valarray<T>& x, const T& y);
-template<class T> valarray<T> operator& (const T& x, const valarray<T>& y);
-
-template<class T> valarray<T> operator| (const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<T> operator| (const valarray<T>& x, const T& y);
-template<class T> valarray<T> operator| (const T& x, const valarray<T>& y);
-
-template<class T> valarray<T> operator<<(const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<T> operator<<(const valarray<T>& x, const T& y);
-template<class T> valarray<T> operator<<(const T& x, const valarray<T>& y);
-
-template<class T> valarray<T> operator>>(const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<T> operator>>(const valarray<T>& x, const T& y);
-template<class T> valarray<T> operator>>(const T& x, const valarray<T>& y);
-
-template<class T> valarray<bool> operator&&(const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<bool> operator&&(const valarray<T>& x, const T& y);
-template<class T> valarray<bool> operator&&(const T& x, const valarray<T>& y);
-
-template<class T> valarray<bool> operator||(const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<bool> operator||(const valarray<T>& x, const T& y);
-template<class T> valarray<bool> operator||(const T& x, const valarray<T>& y);
-
-template<class T> valarray<bool> operator==(const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<bool> operator==(const valarray<T>& x, const T& y);
-template<class T> valarray<bool> operator==(const T& x, const valarray<T>& y);
-
-template<class T> valarray<bool> operator!=(const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<bool> operator!=(const valarray<T>& x, const T& y);
-template<class T> valarray<bool> operator!=(const T& x, const valarray<T>& y);
-
-template<class T> valarray<bool> operator< (const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<bool> operator< (const valarray<T>& x, const T& y);
-template<class T> valarray<bool> operator< (const T& x, const valarray<T>& y);
-
-template<class T> valarray<bool> operator> (const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<bool> operator> (const valarray<T>& x, const T& y);
-template<class T> valarray<bool> operator> (const T& x, const valarray<T>& y);
-
-template<class T> valarray<bool> operator<=(const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<bool> operator<=(const valarray<T>& x, const T& y);
-template<class T> valarray<bool> operator<=(const T& x, const valarray<T>& y);
-
-template<class T> valarray<bool> operator>=(const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<bool> operator>=(const valarray<T>& x, const T& y);
-template<class T> valarray<bool> operator>=(const T& x, const valarray<T>& y);
-
-template<class T> valarray<T> abs (const valarray<T>& x);
-template<class T> valarray<T> acos (const valarray<T>& x);
-template<class T> valarray<T> asin (const valarray<T>& x);
-template<class T> valarray<T> atan (const valarray<T>& x);
-
-template<class T> valarray<T> atan2(const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<T> atan2(const valarray<T>& x, const T& y);
-template<class T> valarray<T> atan2(const T& x, const valarray<T>& y);
-
-template<class T> valarray<T> cos (const valarray<T>& x);
-template<class T> valarray<T> cosh (const valarray<T>& x);
-template<class T> valarray<T> exp (const valarray<T>& x);
-template<class T> valarray<T> log (const valarray<T>& x);
-template<class T> valarray<T> log10(const valarray<T>& x);
-
-template<class T> valarray<T> pow(const valarray<T>& x, const valarray<T>& y);
-template<class T> valarray<T> pow(const valarray<T>& x, const T& y);
-template<class T> valarray<T> pow(const T& x, const valarray<T>& y);
-
-template<class T> valarray<T> sin (const valarray<T>& x);
-template<class T> valarray<T> sinh (const valarray<T>& x);
-template<class T> valarray<T> sqrt (const valarray<T>& x);
-template<class T> valarray<T> tan (const valarray<T>& x);
-template<class T> valarray<T> tanh (const valarray<T>& x);
-
-template <class T> unspecified1 begin(valarray<T>& v);
-template <class T> unspecified2 begin(const valarray<T>& v);
-template <class T> unspecified1 end(valarray<T>& v);
-template <class T> unspecified2 end(const valarray<T>& v);
-
-} // std
-
-*/
-
-#include <__config>
-#include <cstddef>
-#include <cmath>
-#include <initializer_list>
-#include <algorithm>
-#include <functional>
-#include <new>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template<class _Tp> class _LIBCPP_TEMPLATE_VIS valarray;
-
-class _LIBCPP_TEMPLATE_VIS slice
-{
- size_t __start_;
- size_t __size_;
- size_t __stride_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- slice()
- : __start_(0),
- __size_(0),
- __stride_(0)
- {}
-
- _LIBCPP_INLINE_VISIBILITY
- slice(size_t __start, size_t __size, size_t __stride)
- : __start_(__start),
- __size_(__size),
- __stride_(__stride)
- {}
-
- _LIBCPP_INLINE_VISIBILITY size_t start() const {return __start_;}
- _LIBCPP_INLINE_VISIBILITY size_t size() const {return __size_;}
- _LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;}
-};
-
-template <class _Tp> class _LIBCPP_TEMPLATE_VIS slice_array;
-class _LIBCPP_TYPE_VIS gslice;
-template <class _Tp> class _LIBCPP_TEMPLATE_VIS gslice_array;
-template <class _Tp> class _LIBCPP_TEMPLATE_VIS mask_array;
-template <class _Tp> class _LIBCPP_TEMPLATE_VIS indirect_array;
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY
-_Tp*
-begin(valarray<_Tp>& __v);
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY
-const _Tp*
-begin(const valarray<_Tp>& __v);
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY
-_Tp*
-end(valarray<_Tp>& __v);
-
-template <class _Tp>
-_LIBCPP_INLINE_VISIBILITY
-const _Tp*
-end(const valarray<_Tp>& __v);
-
-template <class _Op, class _A0>
-struct _UnaryOp
-{
- typedef typename _Op::result_type result_type;
- typedef typename _A0::value_type value_type;
-
- _Op __op_;
- _A0 __a0_;
-
- _LIBCPP_INLINE_VISIBILITY
- _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
-
- _LIBCPP_INLINE_VISIBILITY
- size_t size() const {return __a0_.size();}
-};
-
-template <class _Op, class _A0, class _A1>
-struct _BinaryOp
-{
- typedef typename _Op::result_type result_type;
- typedef typename _A0::value_type value_type;
-
- _Op __op_;
- _A0 __a0_;
- _A1 __a1_;
-
- _LIBCPP_INLINE_VISIBILITY
- _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1)
- : __op_(__op), __a0_(__a0), __a1_(__a1) {}
-
- _LIBCPP_INLINE_VISIBILITY
- value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
-
- _LIBCPP_INLINE_VISIBILITY
- size_t size() const {return __a0_.size();}
-};
-
-template <class _Tp>
-class __scalar_expr
-{
-public:
- typedef _Tp value_type;
- typedef const _Tp& result_type;
-private:
- const value_type& __t_;
- size_t __s_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type operator[](size_t) const {return __t_;}
-
- _LIBCPP_INLINE_VISIBILITY
- size_t size() const {return __s_;}
-};
-
-template <class _Tp>
-struct __unary_plus : unary_function<_Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return +__x;}
-};
-
-template <class _Tp>
-struct __bit_not : unary_function<_Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return ~__x;}
-};
-
-template <class _Tp>
-struct __bit_shift_left : binary_function<_Tp, _Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x << __y;}
-};
-
-template <class _Tp>
-struct __bit_shift_right : binary_function<_Tp, _Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return __x >> __y;}
-};
-
-template <class _Tp, class _Fp>
-struct __apply_expr : unary_function<_Tp, _Tp>
-{
-private:
- _Fp __f_;
-public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __apply_expr(_Fp __f) : __f_(__f) {}
-
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return __f_(__x);}
-};
-
-template <class _Tp>
-struct __abs_expr : unary_function<_Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return abs(__x);}
-};
-
-template <class _Tp>
-struct __acos_expr : unary_function<_Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return acos(__x);}
-};
-
-template <class _Tp>
-struct __asin_expr : unary_function<_Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return asin(__x);}
-};
-
-template <class _Tp>
-struct __atan_expr : unary_function<_Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return atan(__x);}
-};
-
-template <class _Tp>
-struct __atan2_expr : binary_function<_Tp, _Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return atan2(__x, __y);}
-};
-
-template <class _Tp>
-struct __cos_expr : unary_function<_Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return cos(__x);}
-};
-
-template <class _Tp>
-struct __cosh_expr : unary_function<_Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return cosh(__x);}
-};
-
-template <class _Tp>
-struct __exp_expr : unary_function<_Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return exp(__x);}
-};
-
-template <class _Tp>
-struct __log_expr : unary_function<_Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return log(__x);}
-};
-
-template <class _Tp>
-struct __log10_expr : unary_function<_Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return log10(__x);}
-};
-
-template <class _Tp>
-struct __pow_expr : binary_function<_Tp, _Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x, const _Tp& __y) const
- {return pow(__x, __y);}
-};
-
-template <class _Tp>
-struct __sin_expr : unary_function<_Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return sin(__x);}
-};
-
-template <class _Tp>
-struct __sinh_expr : unary_function<_Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return sinh(__x);}
-};
-
-template <class _Tp>
-struct __sqrt_expr : unary_function<_Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return sqrt(__x);}
-};
-
-template <class _Tp>
-struct __tan_expr : unary_function<_Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return tan(__x);}
-};
-
-template <class _Tp>
-struct __tanh_expr : unary_function<_Tp, _Tp>
-{
- _LIBCPP_INLINE_VISIBILITY
- _Tp operator()(const _Tp& __x) const
- {return tanh(__x);}
-};
-
-template <class _ValExpr>
-class __slice_expr
-{
- typedef typename remove_reference<_ValExpr>::type _RmExpr;
-public:
- typedef typename _RmExpr::value_type value_type;
- typedef value_type result_type;
-
-private:
- _ValExpr __expr_;
- size_t __start_;
- size_t __size_;
- size_t __stride_;
-
- _LIBCPP_INLINE_VISIBILITY
- __slice_expr(const slice& __sl, const _RmExpr& __e)
- : __expr_(__e),
- __start_(__sl.start()),
- __size_(__sl.size()),
- __stride_(__sl.stride())
- {}
-public:
-
- _LIBCPP_INLINE_VISIBILITY
- result_type operator[](size_t __i) const
- {return __expr_[__start_ + __i * __stride_];}
-
- _LIBCPP_INLINE_VISIBILITY
- size_t size() const {return __size_;}
-
- template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
-};
-
-template <class _ValExpr>
-class __mask_expr;
-
-template <class _ValExpr>
-class __indirect_expr;
-
-template <class _ValExpr>
-class __shift_expr
-{
- typedef typename remove_reference<_ValExpr>::type _RmExpr;
-public:
- typedef typename _RmExpr::value_type value_type;
- typedef value_type result_type;
-
-private:
- _ValExpr __expr_;
- size_t __size_;
- ptrdiff_t __ul_;
- ptrdiff_t __sn_;
- ptrdiff_t __n_;
- static const ptrdiff_t _Np = static_cast<ptrdiff_t>(
- sizeof(ptrdiff_t) * __CHAR_BIT__ - 1);
-
- _LIBCPP_INLINE_VISIBILITY
- __shift_expr(int __n, const _RmExpr& __e)
- : __expr_(__e),
- __size_(__e.size()),
- __n_(__n)
- {
- ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np);
- __sn_ = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np);
- __ul_ = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n);
- }
-public:
-
- _LIBCPP_INLINE_VISIBILITY
- result_type operator[](size_t __j) const
- {
- ptrdiff_t __i = static_cast<ptrdiff_t>(__j);
- ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np;
- return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- size_t size() const {return __size_;}
-
- template <class> friend class __val_expr;
-};
-
-template <class _ValExpr>
-class __cshift_expr
-{
- typedef typename remove_reference<_ValExpr>::type _RmExpr;
-public:
- typedef typename _RmExpr::value_type value_type;
- typedef value_type result_type;
-
-private:
- _ValExpr __expr_;
- size_t __size_;
- size_t __m_;
- size_t __o1_;
- size_t __o2_;
-
- _LIBCPP_INLINE_VISIBILITY
- __cshift_expr(int __n, const _RmExpr& __e)
- : __expr_(__e),
- __size_(__e.size())
- {
- __n %= static_cast<int>(__size_);
- if (__n >= 0)
- {
- __m_ = __size_ - __n;
- __o1_ = __n;
- __o2_ = __n - __size_;
- }
- else
- {
- __m_ = -__n;
- __o1_ = __n + __size_;
- __o2_ = __n;
- }
- }
-public:
-
- _LIBCPP_INLINE_VISIBILITY
- result_type operator[](size_t __i) const
- {
- if (__i < __m_)
- return __expr_[__i + __o1_];
- return __expr_[__i + __o2_];
- }
-
- _LIBCPP_INLINE_VISIBILITY
- size_t size() const {return __size_;}
-
- template <class> friend class __val_expr;
-};
-
-template<class _ValExpr>
-class __val_expr;
-
-template<class _ValExpr>
-struct __is_val_expr : false_type {};
-
-template<class _ValExpr>
-struct __is_val_expr<__val_expr<_ValExpr> > : true_type {};
-
-template<class _Tp>
-struct __is_val_expr<valarray<_Tp> > : true_type {};
-
-template<class _Tp>
-class _LIBCPP_TEMPLATE_VIS valarray
-{
-public:
- typedef _Tp value_type;
- typedef _Tp result_type;
-
-private:
- value_type* __begin_;
- value_type* __end_;
-
-public:
- // construct/destroy:
- _LIBCPP_INLINE_VISIBILITY
- valarray() : __begin_(0), __end_(0) {}
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- explicit valarray(size_t __n);
- _LIBCPP_INLINE_VISIBILITY
- valarray(const value_type& __x, size_t __n);
- valarray(const value_type* __p, size_t __n);
- valarray(const valarray& __v);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- valarray(valarray&& __v) _NOEXCEPT;
- valarray(initializer_list<value_type> __il);
-#endif // _LIBCPP_CXX03_LANG
- valarray(const slice_array<value_type>& __sa);
- valarray(const gslice_array<value_type>& __ga);
- valarray(const mask_array<value_type>& __ma);
- valarray(const indirect_array<value_type>& __ia);
- inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
- ~valarray();
-
- // assignment:
- valarray& operator=(const valarray& __v);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator=(valarray&& __v) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator=(initializer_list<value_type>);
-#endif // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator=(const value_type& __x);
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator=(const slice_array<value_type>& __sa);
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator=(const gslice_array<value_type>& __ga);
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator=(const mask_array<value_type>& __ma);
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator=(const indirect_array<value_type>& __ia);
- template <class _ValExpr>
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator=(const __val_expr<_ValExpr>& __v);
-
- // element access:
- _LIBCPP_INLINE_VISIBILITY
- const value_type& operator[](size_t __i) const {return __begin_[__i];}
-
- _LIBCPP_INLINE_VISIBILITY
- value_type& operator[](size_t __i) {return __begin_[__i];}
-
- // subset operations:
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<__slice_expr<const valarray&> > operator[](slice __s) const;
- _LIBCPP_INLINE_VISIBILITY
- slice_array<value_type> operator[](slice __s);
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const;
- _LIBCPP_INLINE_VISIBILITY
- gslice_array<value_type> operator[](const gslice& __gs);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const;
- _LIBCPP_INLINE_VISIBILITY
- gslice_array<value_type> operator[](gslice&& __gs);
-#endif // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<__mask_expr<const valarray&> > operator[](const valarray<bool>& __vb) const;
- _LIBCPP_INLINE_VISIBILITY
- mask_array<value_type> operator[](const valarray<bool>& __vb);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<__mask_expr<const valarray&> > operator[](valarray<bool>&& __vb) const;
- _LIBCPP_INLINE_VISIBILITY
- mask_array<value_type> operator[](valarray<bool>&& __vb);
-#endif // _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const;
- _LIBCPP_INLINE_VISIBILITY
- indirect_array<value_type> operator[](const valarray<size_t>& __vs);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const;
- _LIBCPP_INLINE_VISIBILITY
- indirect_array<value_type> operator[](valarray<size_t>&& __vs);
-#endif // _LIBCPP_CXX03_LANG
-
- // unary operators:
- valarray operator+() const;
- valarray operator-() const;
- valarray operator~() const;
- valarray<bool> operator!() const;
-
- // computed assignment:
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator*= (const value_type& __x);
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator/= (const value_type& __x);
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator%= (const value_type& __x);
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator+= (const value_type& __x);
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator-= (const value_type& __x);
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator^= (const value_type& __x);
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator&= (const value_type& __x);
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator|= (const value_type& __x);
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator<<=(const value_type& __x);
- _LIBCPP_INLINE_VISIBILITY
- valarray& operator>>=(const value_type& __x);
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- valarray&
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator*= (const _Expr& __v);
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- valarray&
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator/= (const _Expr& __v);
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- valarray&
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator%= (const _Expr& __v);
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- valarray&
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator+= (const _Expr& __v);
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- valarray&
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator-= (const _Expr& __v);
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- valarray&
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator^= (const _Expr& __v);
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- valarray&
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator|= (const _Expr& __v);
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- valarray&
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator&= (const _Expr& __v);
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- valarray&
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator<<= (const _Expr& __v);
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- valarray&
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator>>= (const _Expr& __v);
-
- // member functions:
- _LIBCPP_INLINE_VISIBILITY
- void swap(valarray& __v) _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- size_t size() const {return static_cast<size_t>(__end_ - __begin_);}
-
- _LIBCPP_INLINE_VISIBILITY
- value_type sum() const;
- _LIBCPP_INLINE_VISIBILITY
- value_type min() const;
- _LIBCPP_INLINE_VISIBILITY
- value_type max() const;
-
- valarray shift (int __i) const;
- valarray cshift(int __i) const;
- valarray apply(value_type __f(value_type)) const;
- valarray apply(value_type __f(const value_type&)) const;
- void resize(size_t __n, value_type __x = value_type());
-
-private:
- template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
- template <class> friend class _LIBCPP_TEMPLATE_VIS slice_array;
- template <class> friend class _LIBCPP_TEMPLATE_VIS gslice_array;
- template <class> friend class _LIBCPP_TEMPLATE_VIS mask_array;
- template <class> friend class __mask_expr;
- template <class> friend class _LIBCPP_TEMPLATE_VIS indirect_array;
- template <class> friend class __indirect_expr;
- template <class> friend class __val_expr;
-
- template <class _Up>
- friend
- _Up*
- begin(valarray<_Up>& __v);
-
- template <class _Up>
- friend
- const _Up*
- begin(const valarray<_Up>& __v);
-
- template <class _Up>
- friend
- _Up*
- end(valarray<_Up>& __v);
-
- template <class _Up>
- friend
- const _Up*
- end(const valarray<_Up>& __v);
-
- _LIBCPP_INLINE_VISIBILITY
- void __clear(size_t __capacity);
- valarray& __assign_range(const value_type* __f, const value_type* __l);
-};
-
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS valarray<size_t>::valarray(size_t))
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS valarray<size_t>::~valarray())
-_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void valarray<size_t>::resize(size_t, size_t))
-
-template <class _Op, class _Tp>
-struct _UnaryOp<_Op, valarray<_Tp> >
-{
- typedef typename _Op::result_type result_type;
- typedef _Tp value_type;
-
- _Op __op_;
- const valarray<_Tp>& __a0_;
-
- _LIBCPP_INLINE_VISIBILITY
- _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
-
- _LIBCPP_INLINE_VISIBILITY
- size_t size() const {return __a0_.size();}
-};
-
-template <class _Op, class _Tp, class _A1>
-struct _BinaryOp<_Op, valarray<_Tp>, _A1>
-{
- typedef typename _Op::result_type result_type;
- typedef _Tp value_type;
-
- _Op __op_;
- const valarray<_Tp>& __a0_;
- _A1 __a1_;
-
- _LIBCPP_INLINE_VISIBILITY
- _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1)
- : __op_(__op), __a0_(__a0), __a1_(__a1) {}
-
- _LIBCPP_INLINE_VISIBILITY
- value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
-
- _LIBCPP_INLINE_VISIBILITY
- size_t size() const {return __a0_.size();}
-};
-
-template <class _Op, class _A0, class _Tp>
-struct _BinaryOp<_Op, _A0, valarray<_Tp> >
-{
- typedef typename _Op::result_type result_type;
- typedef _Tp value_type;
-
- _Op __op_;
- _A0 __a0_;
- const valarray<_Tp>& __a1_;
-
- _LIBCPP_INLINE_VISIBILITY
- _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1)
- : __op_(__op), __a0_(__a0), __a1_(__a1) {}
-
- _LIBCPP_INLINE_VISIBILITY
- value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
-
- _LIBCPP_INLINE_VISIBILITY
- size_t size() const {return __a0_.size();}
-};
-
-template <class _Op, class _Tp>
-struct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> >
-{
- typedef typename _Op::result_type result_type;
- typedef _Tp value_type;
-
- _Op __op_;
- const valarray<_Tp>& __a0_;
- const valarray<_Tp>& __a1_;
-
- _LIBCPP_INLINE_VISIBILITY
- _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1)
- : __op_(__op), __a0_(__a0), __a1_(__a1) {}
-
- _LIBCPP_INLINE_VISIBILITY
- value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
-
- _LIBCPP_INLINE_VISIBILITY
- size_t size() const {return __a0_.size();}
-};
-
-// slice_array
-
-template <class _Tp>
-class _LIBCPP_TEMPLATE_VIS slice_array
-{
-public:
- typedef _Tp value_type;
-
-private:
- value_type* __vp_;
- size_t __size_;
- size_t __stride_;
-
-public:
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator*=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator/=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator%=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator+=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator-=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator^=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator&=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator|=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator<<=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator>>=(const _Expr& __v) const;
-
- _LIBCPP_INLINE_VISIBILITY
- const slice_array& operator=(const slice_array& __sa) const;
-
- _LIBCPP_INLINE_VISIBILITY
- void operator=(const value_type& __x) const;
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- slice_array(const slice& __sl, const valarray<value_type>& __v)
- : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())),
- __size_(__sl.size()),
- __stride_(__sl.stride())
- {}
-
- template <class> friend class valarray;
- template <class> friend class sliceExpr;
-};
-
-template <class _Tp>
-inline
-const slice_array<_Tp>&
-slice_array<_Tp>::operator=(const slice_array& __sa) const
-{
- value_type* __t = __vp_;
- const value_type* __s = __sa.__vp_;
- for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
- *__t = *__s;
- return *this;
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-slice_array<_Tp>::operator=(const _Expr& __v) const
-{
- value_type* __t = __vp_;
- for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
- *__t = __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-slice_array<_Tp>::operator*=(const _Expr& __v) const
-{
- value_type* __t = __vp_;
- for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
- *__t *= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-slice_array<_Tp>::operator/=(const _Expr& __v) const
-{
- value_type* __t = __vp_;
- for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
- *__t /= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-slice_array<_Tp>::operator%=(const _Expr& __v) const
-{
- value_type* __t = __vp_;
- for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
- *__t %= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-slice_array<_Tp>::operator+=(const _Expr& __v) const
-{
- value_type* __t = __vp_;
- for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
- *__t += __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-slice_array<_Tp>::operator-=(const _Expr& __v) const
-{
- value_type* __t = __vp_;
- for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
- *__t -= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-slice_array<_Tp>::operator^=(const _Expr& __v) const
-{
- value_type* __t = __vp_;
- for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
- *__t ^= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-slice_array<_Tp>::operator&=(const _Expr& __v) const
-{
- value_type* __t = __vp_;
- for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
- *__t &= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-slice_array<_Tp>::operator|=(const _Expr& __v) const
-{
- value_type* __t = __vp_;
- for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
- *__t |= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-slice_array<_Tp>::operator<<=(const _Expr& __v) const
-{
- value_type* __t = __vp_;
- for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
- *__t <<= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-slice_array<_Tp>::operator>>=(const _Expr& __v) const
-{
- value_type* __t = __vp_;
- for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
- *__t >>= __v[__i];
-}
-
-template <class _Tp>
-inline
-void
-slice_array<_Tp>::operator=(const value_type& __x) const
-{
- value_type* __t = __vp_;
- for (size_t __n = __size_; __n; --__n, __t += __stride_)
- *__t = __x;
-}
-
-// gslice
-
-class _LIBCPP_TYPE_VIS gslice
-{
- valarray<size_t> __size_;
- valarray<size_t> __stride_;
- valarray<size_t> __1d_;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- gslice() {}
-
- _LIBCPP_INLINE_VISIBILITY
- gslice(size_t __start, const valarray<size_t>& __size,
- const valarray<size_t>& __stride)
- : __size_(__size),
- __stride_(__stride)
- {__init(__start);}
-
-#ifndef _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- gslice(size_t __start, const valarray<size_t>& __size,
- valarray<size_t>&& __stride)
- : __size_(__size),
- __stride_(move(__stride))
- {__init(__start);}
-
- _LIBCPP_INLINE_VISIBILITY
- gslice(size_t __start, valarray<size_t>&& __size,
- const valarray<size_t>& __stride)
- : __size_(move(__size)),
- __stride_(__stride)
- {__init(__start);}
-
- _LIBCPP_INLINE_VISIBILITY
- gslice(size_t __start, valarray<size_t>&& __size,
- valarray<size_t>&& __stride)
- : __size_(move(__size)),
- __stride_(move(__stride))
- {__init(__start);}
-
-#endif // _LIBCPP_CXX03_LANG
-
-// gslice(const gslice&) = default;
-// gslice(gslice&&) = default;
-// gslice& operator=(const gslice&) = default;
-// gslice& operator=(gslice&&) = default;
-
- _LIBCPP_INLINE_VISIBILITY
- size_t start() const {return __1d_.size() ? __1d_[0] : 0;}
-
- _LIBCPP_INLINE_VISIBILITY
- valarray<size_t> size() const {return __size_;}
-
- _LIBCPP_INLINE_VISIBILITY
- valarray<size_t> stride() const {return __stride_;}
-
-private:
- void __init(size_t __start);
-
- template <class> friend class gslice_array;
- template <class> friend class valarray;
- template <class> friend class __val_expr;
-};
-
-// gslice_array
-
-template <class _Tp>
-class _LIBCPP_TEMPLATE_VIS gslice_array
-{
-public:
- typedef _Tp value_type;
-
-private:
- value_type* __vp_;
- valarray<size_t> __1d_;
-
-public:
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator*=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator/=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator%=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator+=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator-=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator^=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator&=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator|=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator<<=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator>>=(const _Expr& __v) const;
-
- _LIBCPP_INLINE_VISIBILITY
- const gslice_array& operator=(const gslice_array& __ga) const;
-
- _LIBCPP_INLINE_VISIBILITY
- void operator=(const value_type& __x) const;
-
-// gslice_array(const gslice_array&) = default;
-// gslice_array(gslice_array&&) = default;
-// gslice_array& operator=(const gslice_array&) = default;
-// gslice_array& operator=(gslice_array&&) = default;
-
-private:
- gslice_array(const gslice& __gs, const valarray<value_type>& __v)
- : __vp_(const_cast<value_type*>(__v.__begin_)),
- __1d_(__gs.__1d_)
- {}
-
-#ifndef _LIBCPP_CXX03_LANG
- gslice_array(gslice&& __gs, const valarray<value_type>& __v)
- : __vp_(const_cast<value_type*>(__v.__begin_)),
- __1d_(move(__gs.__1d_))
- {}
-#endif // _LIBCPP_CXX03_LANG
-
- template <class> friend class valarray;
-};
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-gslice_array<_Tp>::operator=(const _Expr& __v) const
-{
- typedef const size_t* _Ip;
- size_t __j = 0;
- for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
- __vp_[*__i] = __v[__j];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-gslice_array<_Tp>::operator*=(const _Expr& __v) const
-{
- typedef const size_t* _Ip;
- size_t __j = 0;
- for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
- __vp_[*__i] *= __v[__j];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-gslice_array<_Tp>::operator/=(const _Expr& __v) const
-{
- typedef const size_t* _Ip;
- size_t __j = 0;
- for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
- __vp_[*__i] /= __v[__j];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-gslice_array<_Tp>::operator%=(const _Expr& __v) const
-{
- typedef const size_t* _Ip;
- size_t __j = 0;
- for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
- __vp_[*__i] %= __v[__j];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-gslice_array<_Tp>::operator+=(const _Expr& __v) const
-{
- typedef const size_t* _Ip;
- size_t __j = 0;
- for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
- __vp_[*__i] += __v[__j];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-gslice_array<_Tp>::operator-=(const _Expr& __v) const
-{
- typedef const size_t* _Ip;
- size_t __j = 0;
- for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
- __vp_[*__i] -= __v[__j];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-gslice_array<_Tp>::operator^=(const _Expr& __v) const
-{
- typedef const size_t* _Ip;
- size_t __j = 0;
- for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
- __vp_[*__i] ^= __v[__j];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-gslice_array<_Tp>::operator&=(const _Expr& __v) const
-{
- typedef const size_t* _Ip;
- size_t __j = 0;
- for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
- __vp_[*__i] &= __v[__j];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-gslice_array<_Tp>::operator|=(const _Expr& __v) const
-{
- typedef const size_t* _Ip;
- size_t __j = 0;
- for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
- __vp_[*__i] |= __v[__j];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-gslice_array<_Tp>::operator<<=(const _Expr& __v) const
-{
- typedef const size_t* _Ip;
- size_t __j = 0;
- for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
- __vp_[*__i] <<= __v[__j];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-gslice_array<_Tp>::operator>>=(const _Expr& __v) const
-{
- typedef const size_t* _Ip;
- size_t __j = 0;
- for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
- __vp_[*__i] >>= __v[__j];
-}
-
-template <class _Tp>
-inline
-const gslice_array<_Tp>&
-gslice_array<_Tp>::operator=(const gslice_array& __ga) const
-{
- typedef const size_t* _Ip;
- const value_type* __s = __ga.__vp_;
- for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_;
- __i != __e; ++__i, ++__j)
- __vp_[*__i] = __s[*__j];
- return *this;
-}
-
-template <class _Tp>
-inline
-void
-gslice_array<_Tp>::operator=(const value_type& __x) const
-{
- typedef const size_t* _Ip;
- for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
- __vp_[*__i] = __x;
-}
-
-// mask_array
-
-template <class _Tp>
-class _LIBCPP_TEMPLATE_VIS mask_array
-{
-public:
- typedef _Tp value_type;
-
-private:
- value_type* __vp_;
- valarray<size_t> __1d_;
-
-public:
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator*=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator/=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator%=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator+=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator-=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator^=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator&=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator|=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator<<=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator>>=(const _Expr& __v) const;
-
- _LIBCPP_INLINE_VISIBILITY
- const mask_array& operator=(const mask_array& __ma) const;
-
- _LIBCPP_INLINE_VISIBILITY
- void operator=(const value_type& __x) const;
-
-// mask_array(const mask_array&) = default;
-// mask_array(mask_array&&) = default;
-// mask_array& operator=(const mask_array&) = default;
-// mask_array& operator=(mask_array&&) = default;
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v)
- : __vp_(const_cast<value_type*>(__v.__begin_)),
- __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
- {
- size_t __j = 0;
- for (size_t __i = 0; __i < __vb.size(); ++__i)
- if (__vb[__i])
- __1d_[__j++] = __i;
- }
-
- template <class> friend class valarray;
-};
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-mask_array<_Tp>::operator=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] = __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-mask_array<_Tp>::operator*=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] *= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-mask_array<_Tp>::operator/=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] /= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-mask_array<_Tp>::operator%=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] %= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-mask_array<_Tp>::operator+=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] += __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-mask_array<_Tp>::operator-=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] -= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-mask_array<_Tp>::operator^=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] ^= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-mask_array<_Tp>::operator&=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] &= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-mask_array<_Tp>::operator|=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] |= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-mask_array<_Tp>::operator<<=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] <<= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-mask_array<_Tp>::operator>>=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] >>= __v[__i];
-}
-
-template <class _Tp>
-inline
-const mask_array<_Tp>&
-mask_array<_Tp>::operator=(const mask_array& __ma) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
- return *this;
-}
-
-template <class _Tp>
-inline
-void
-mask_array<_Tp>::operator=(const value_type& __x) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] = __x;
-}
-
-template <class _ValExpr>
-class __mask_expr
-{
- typedef typename remove_reference<_ValExpr>::type _RmExpr;
-public:
- typedef typename _RmExpr::value_type value_type;
- typedef value_type result_type;
-
-private:
- _ValExpr __expr_;
- valarray<size_t> __1d_;
-
- _LIBCPP_INLINE_VISIBILITY
- __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e)
- : __expr_(__e),
- __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
- {
- size_t __j = 0;
- for (size_t __i = 0; __i < __vb.size(); ++__i)
- if (__vb[__i])
- __1d_[__j++] = __i;
- }
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- result_type operator[](size_t __i) const
- {return __expr_[__1d_[__i]];}
-
- _LIBCPP_INLINE_VISIBILITY
- size_t size() const {return __1d_.size();}
-
- template <class> friend class valarray;
-};
-
-// indirect_array
-
-template <class _Tp>
-class _LIBCPP_TEMPLATE_VIS indirect_array
-{
-public:
- typedef _Tp value_type;
-
-private:
- value_type* __vp_;
- valarray<size_t> __1d_;
-
-public:
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator*=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator/=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator%=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator+=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator-=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator^=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator&=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator|=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator<<=(const _Expr& __v) const;
-
- template <class _Expr>
- typename enable_if
- <
- __is_val_expr<_Expr>::value,
- void
- >::type
- _LIBCPP_INLINE_VISIBILITY
- operator>>=(const _Expr& __v) const;
-
- _LIBCPP_INLINE_VISIBILITY
- const indirect_array& operator=(const indirect_array& __ia) const;
-
- _LIBCPP_INLINE_VISIBILITY
- void operator=(const value_type& __x) const;
-
-// indirect_array(const indirect_array&) = default;
-// indirect_array(indirect_array&&) = default;
-// indirect_array& operator=(const indirect_array&) = default;
-// indirect_array& operator=(indirect_array&&) = default;
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v)
- : __vp_(const_cast<value_type*>(__v.__begin_)),
- __1d_(__ia)
- {}
-
-#ifndef _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v)
- : __vp_(const_cast<value_type*>(__v.__begin_)),
- __1d_(move(__ia))
- {}
-
-#endif // _LIBCPP_CXX03_LANG
-
- template <class> friend class valarray;
-};
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-indirect_array<_Tp>::operator=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] = __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-indirect_array<_Tp>::operator*=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] *= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-indirect_array<_Tp>::operator/=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] /= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-indirect_array<_Tp>::operator%=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] %= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-indirect_array<_Tp>::operator+=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] += __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-indirect_array<_Tp>::operator-=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] -= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-indirect_array<_Tp>::operator^=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] ^= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-indirect_array<_Tp>::operator&=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] &= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-indirect_array<_Tp>::operator|=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] |= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-indirect_array<_Tp>::operator<<=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] <<= __v[__i];
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- void
->::type
-indirect_array<_Tp>::operator>>=(const _Expr& __v) const
-{
- size_t __n = __1d_.size();
- for (size_t __i = 0; __i < __n; ++__i)
- __vp_[__1d_[__i]] >>= __v[__i];
-}
-
-template <class _Tp>
-inline
-const indirect_array<_Tp>&
-indirect_array<_Tp>::operator=(const indirect_array& __ia) const
-{
- typedef const size_t* _Ip;
- const value_type* __s = __ia.__vp_;
- for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_;
- __i != __e; ++__i, ++__j)
- __vp_[*__i] = __s[*__j];
- return *this;
-}
-
-template <class _Tp>
-inline
-void
-indirect_array<_Tp>::operator=(const value_type& __x) const
-{
- typedef const size_t* _Ip;
- for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
- __vp_[*__i] = __x;
-}
-
-template <class _ValExpr>
-class __indirect_expr
-{
- typedef typename remove_reference<_ValExpr>::type _RmExpr;
-public:
- typedef typename _RmExpr::value_type value_type;
- typedef value_type result_type;
-
-private:
- _ValExpr __expr_;
- valarray<size_t> __1d_;
-
- _LIBCPP_INLINE_VISIBILITY
- __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e)
- : __expr_(__e),
- __1d_(__ia)
- {}
-
-#ifndef _LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e)
- : __expr_(__e),
- __1d_(move(__ia))
- {}
-
-#endif // _LIBCPP_CXX03_LANG
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- result_type operator[](size_t __i) const
- {return __expr_[__1d_[__i]];}
-
- _LIBCPP_INLINE_VISIBILITY
- size_t size() const {return __1d_.size();}
-
- template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
-};
-
-template<class _ValExpr>
-class __val_expr
-{
- typedef typename remove_reference<_ValExpr>::type _RmExpr;
-
- _ValExpr __expr_;
-public:
- typedef typename _RmExpr::value_type value_type;
- typedef typename _RmExpr::result_type result_type;
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type operator[](size_t __i) const
- {return __expr_[__i];}
-
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const
- {return __val_expr<__slice_expr<_ValExpr> >(__expr_, __s);}
-
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const
- {return __val_expr<__indirect_expr<_ValExpr> >(__expr_, __gs.__1d_);}
-
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const
- {return __val_expr<__mask_expr<_ValExpr> >(__expr_, __vb);}
-
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const
- {return __val_expr<__indirect_expr<_ValExpr> >(__expr_, __vs);}
-
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> >
- operator+() const
- {
- typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr;
- return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<_UnaryOp<negate<value_type>, _ValExpr> >
- operator-() const
- {
- typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr;
- return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> >
- operator~() const
- {
- typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr;
- return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> >
- operator!() const
- {
- typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr;
- return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_));
- }
-
- operator valarray<result_type>() const;
-
- _LIBCPP_INLINE_VISIBILITY
- size_t size() const {return __expr_.size();}
-
- _LIBCPP_INLINE_VISIBILITY
- result_type sum() const
- {
- size_t __n = __expr_.size();
- result_type __r = __n ? __expr_[0] : result_type();
- for (size_t __i = 1; __i < __n; ++__i)
- __r += __expr_[__i];
- return __r;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- result_type min() const
- {
- size_t __n = size();
- result_type __r = __n ? (*this)[0] : result_type();
- for (size_t __i = 1; __i < __n; ++__i)
- {
- result_type __x = __expr_[__i];
- if (__x < __r)
- __r = __x;
- }
- return __r;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- result_type max() const
- {
- size_t __n = size();
- result_type __r = __n ? (*this)[0] : result_type();
- for (size_t __i = 1; __i < __n; ++__i)
- {
- result_type __x = __expr_[__i];
- if (__r < __x)
- __r = __x;
- }
- return __r;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<__shift_expr<_ValExpr> > shift (int __i) const
- {return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));}
-
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const
- {return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));}
-
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(value_type)>, _ValExpr> >
- apply(value_type __f(value_type)) const
- {
- typedef __apply_expr<value_type, value_type(*)(value_type)> _Op;
- typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
- return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(const value_type&)>, _ValExpr> >
- apply(value_type __f(const value_type&)) const
- {
- typedef __apply_expr<value_type, value_type(*)(const value_type&)> _Op;
- typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
- return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
- }
-};
-
-template<class _ValExpr>
-__val_expr<_ValExpr>::operator valarray<__val_expr::result_type>() const
-{
- valarray<result_type> __r;
- size_t __n = __expr_.size();
- if (__n)
- {
- __r.__begin_ =
- __r.__end_ =
- static_cast<result_type*>(
- _VSTD::__libcpp_allocate(__n * sizeof(result_type), _LIBCPP_ALIGNOF(result_type)));
- for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i)
- ::new (__r.__end_) result_type(__expr_[__i]);
- }
- return __r;
-}
-
-// valarray
-
-template <class _Tp>
-inline
-valarray<_Tp>::valarray(size_t __n)
- : __begin_(0),
- __end_(0)
-{
- if (__n)
- {
- __begin_ = __end_ = static_cast<value_type*>(
- _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
- ::new (__end_) value_type();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __clear(__n);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
-}
-
-template <class _Tp>
-inline
-valarray<_Tp>::valarray(const value_type& __x, size_t __n)
- : __begin_(0),
- __end_(0)
-{
- resize(__n, __x);
-}
-
-template <class _Tp>
-valarray<_Tp>::valarray(const value_type* __p, size_t __n)
- : __begin_(0),
- __end_(0)
-{
- if (__n)
- {
- __begin_ = __end_ = static_cast<value_type*>(
- _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (size_t __n_left = __n; __n_left; ++__end_, ++__p, --__n_left)
- ::new (__end_) value_type(*__p);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __clear(__n);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
-}
-
-template <class _Tp>
-valarray<_Tp>::valarray(const valarray& __v)
- : __begin_(0),
- __end_(0)
-{
- if (__v.size())
- {
- __begin_ = __end_ = static_cast<value_type*>(
- _VSTD::__libcpp_allocate(__v.size() * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p)
- ::new (__end_) value_type(*__p);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __clear(__v.size());
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp>
-inline
-valarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT
- : __begin_(__v.__begin_),
- __end_(__v.__end_)
-{
- __v.__begin_ = __v.__end_ = nullptr;
-}
-
-template <class _Tp>
-valarray<_Tp>::valarray(initializer_list<value_type> __il)
- : __begin_(0),
- __end_(0)
-{
- const size_t __n = __il.size();
- if (__n)
- {
- __begin_ = __end_ = static_cast<value_type*>(
-_VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- size_t __n_left = __n;
- for (const value_type* __p = __il.begin(); __n_left; ++__end_, ++__p, --__n_left)
- ::new (__end_) value_type(*__p);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __clear(__n);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp>
-valarray<_Tp>::valarray(const slice_array<value_type>& __sa)
- : __begin_(0),
- __end_(0)
-{
- const size_t __n = __sa.__size_;
- if (__n)
- {
- __begin_ = __end_ = static_cast<value_type*>(
- _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- size_t __n_left = __n;
- for (const value_type* __p = __sa.__vp_; __n_left; ++__end_, __p += __sa.__stride_, --__n_left)
- ::new (__end_) value_type(*__p);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __clear(__n);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
-}
-
-template <class _Tp>
-valarray<_Tp>::valarray(const gslice_array<value_type>& __ga)
- : __begin_(0),
- __end_(0)
-{
- const size_t __n = __ga.__1d_.size();
- if (__n)
- {
- __begin_ = __end_ = static_cast<value_type*>(
- _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typedef const size_t* _Ip;
- const value_type* __s = __ga.__vp_;
- for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
- __i != __e; ++__i, ++__end_)
- ::new (__end_) value_type(__s[*__i]);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __clear(__n);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
-}
-
-template <class _Tp>
-valarray<_Tp>::valarray(const mask_array<value_type>& __ma)
- : __begin_(0),
- __end_(0)
-{
- const size_t __n = __ma.__1d_.size();
- if (__n)
- {
- __begin_ = __end_ = static_cast<value_type*>(
- _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typedef const size_t* _Ip;
- const value_type* __s = __ma.__vp_;
- for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
- __i != __e; ++__i, ++__end_)
- ::new (__end_) value_type(__s[*__i]);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __clear(__n);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
-}
-
-template <class _Tp>
-valarray<_Tp>::valarray(const indirect_array<value_type>& __ia)
- : __begin_(0),
- __end_(0)
-{
- const size_t __n = __ia.__1d_.size();
- if (__n)
- {
- __begin_ = __end_ = static_cast<value_type*>(
- _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- typedef const size_t* _Ip;
- const value_type* __s = __ia.__vp_;
- for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
- __i != __e; ++__i, ++__end_)
- ::new (__end_) value_type(__s[*__i]);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __clear(__n);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
-}
-
-template <class _Tp>
-inline
-valarray<_Tp>::~valarray()
-{
- __clear(size());
-}
-
-template <class _Tp>
-valarray<_Tp>&
-valarray<_Tp>::__assign_range(const value_type* __f, const value_type* __l)
-{
- size_t __n = __l - __f;
- if (size() != __n)
- {
- __clear(size());
- __begin_ = static_cast<value_type*>(
- _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
- __end_ = __begin_ + __n;
- _VSTD::uninitialized_copy(__f, __l, __begin_);
- } else {
- _VSTD::copy(__f, __l, __begin_);
- }
- return *this;
-}
-
-template <class _Tp>
-valarray<_Tp>&
-valarray<_Tp>::operator=(const valarray& __v)
-{
- if (this != &__v)
- return __assign_range(__v.__begin_, __v.__end_);
- return *this;
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator=(valarray&& __v) _NOEXCEPT
-{
- __clear(size());
- __begin_ = __v.__begin_;
- __end_ = __v.__end_;
- __v.__begin_ = nullptr;
- __v.__end_ = nullptr;
- return *this;
-}
-
-template <class _Tp>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator=(initializer_list<value_type> __il)
-{
- return __assign_range(__il.begin(), __il.end());
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator=(const value_type& __x)
-{
- _VSTD::fill(__begin_, __end_, __x);
- return *this;
-}
-
-template <class _Tp>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator=(const slice_array<value_type>& __sa)
-{
- value_type* __t = __begin_;
- const value_type* __s = __sa.__vp_;
- for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t)
- *__t = *__s;
- return *this;
-}
-
-template <class _Tp>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator=(const gslice_array<value_type>& __ga)
-{
- typedef const size_t* _Ip;
- value_type* __t = __begin_;
- const value_type* __s = __ga.__vp_;
- for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
- __i != __e; ++__i, ++__t)
- *__t = __s[*__i];
- return *this;
-}
-
-template <class _Tp>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator=(const mask_array<value_type>& __ma)
-{
- typedef const size_t* _Ip;
- value_type* __t = __begin_;
- const value_type* __s = __ma.__vp_;
- for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
- __i != __e; ++__i, ++__t)
- *__t = __s[*__i];
- return *this;
-}
-
-template <class _Tp>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator=(const indirect_array<value_type>& __ia)
-{
- typedef const size_t* _Ip;
- value_type* __t = __begin_;
- const value_type* __s = __ia.__vp_;
- for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
- __i != __e; ++__i, ++__t)
- *__t = __s[*__i];
- return *this;
-}
-
-template <class _Tp>
-template <class _ValExpr>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v)
-{
- size_t __n = __v.size();
- if (size() != __n)
- resize(__n);
- value_type* __t = __begin_;
- for (size_t __i = 0; __i != __n; ++__t, ++__i)
- *__t = result_type(__v[__i]);
- return *this;
-}
-
-template <class _Tp>
-inline
-__val_expr<__slice_expr<const valarray<_Tp>&> >
-valarray<_Tp>::operator[](slice __s) const
-{
- return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this));
-}
-
-template <class _Tp>
-inline
-slice_array<_Tp>
-valarray<_Tp>::operator[](slice __s)
-{
- return slice_array<value_type>(__s, *this);
-}
-
-template <class _Tp>
-inline
-__val_expr<__indirect_expr<const valarray<_Tp>&> >
-valarray<_Tp>::operator[](const gslice& __gs) const
-{
- return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this));
-}
-
-template <class _Tp>
-inline
-gslice_array<_Tp>
-valarray<_Tp>::operator[](const gslice& __gs)
-{
- return gslice_array<value_type>(__gs, *this);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp>
-inline
-__val_expr<__indirect_expr<const valarray<_Tp>&> >
-valarray<_Tp>::operator[](gslice&& __gs) const
-{
- return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__gs.__1d_), *this));
-}
-
-template <class _Tp>
-inline
-gslice_array<_Tp>
-valarray<_Tp>::operator[](gslice&& __gs)
-{
- return gslice_array<value_type>(move(__gs), *this);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp>
-inline
-__val_expr<__mask_expr<const valarray<_Tp>&> >
-valarray<_Tp>::operator[](const valarray<bool>& __vb) const
-{
- return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this));
-}
-
-template <class _Tp>
-inline
-mask_array<_Tp>
-valarray<_Tp>::operator[](const valarray<bool>& __vb)
-{
- return mask_array<value_type>(__vb, *this);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp>
-inline
-__val_expr<__mask_expr<const valarray<_Tp>&> >
-valarray<_Tp>::operator[](valarray<bool>&& __vb) const
-{
- return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(move(__vb), *this));
-}
-
-template <class _Tp>
-inline
-mask_array<_Tp>
-valarray<_Tp>::operator[](valarray<bool>&& __vb)
-{
- return mask_array<value_type>(move(__vb), *this);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp>
-inline
-__val_expr<__indirect_expr<const valarray<_Tp>&> >
-valarray<_Tp>::operator[](const valarray<size_t>& __vs) const
-{
- return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this));
-}
-
-template <class _Tp>
-inline
-indirect_array<_Tp>
-valarray<_Tp>::operator[](const valarray<size_t>& __vs)
-{
- return indirect_array<value_type>(__vs, *this);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp>
-inline
-__val_expr<__indirect_expr<const valarray<_Tp>&> >
-valarray<_Tp>::operator[](valarray<size_t>&& __vs) const
-{
- return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__vs), *this));
-}
-
-template <class _Tp>
-inline
-indirect_array<_Tp>
-valarray<_Tp>::operator[](valarray<size_t>&& __vs)
-{
- return indirect_array<value_type>(move(__vs), *this);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Tp>
-valarray<_Tp>
-valarray<_Tp>::operator+() const
-{
- valarray<value_type> __r;
- size_t __n = size();
- if (__n)
- {
- __r.__begin_ =
- __r.__end_ =
- static_cast<value_type*>(
- _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
- for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
- ::new (__r.__end_) value_type(+*__p);
- }
- return __r;
-}
-
-template <class _Tp>
-valarray<_Tp>
-valarray<_Tp>::operator-() const
-{
- valarray<value_type> __r;
- size_t __n = size();
- if (__n)
- {
- __r.__begin_ =
- __r.__end_ =
- static_cast<value_type*>(
- _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
- for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
- ::new (__r.__end_) value_type(-*__p);
- }
- return __r;
-}
-
-template <class _Tp>
-valarray<_Tp>
-valarray<_Tp>::operator~() const
-{
- valarray<value_type> __r;
- size_t __n = size();
- if (__n)
- {
- __r.__begin_ =
- __r.__end_ =
- static_cast<value_type*>(
- _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
- for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
- ::new (__r.__end_) value_type(~*__p);
- }
- return __r;
-}
-
-template <class _Tp>
-valarray<bool>
-valarray<_Tp>::operator!() const
-{
- valarray<bool> __r;
- size_t __n = size();
- if (__n)
- {
- __r.__begin_ =
- __r.__end_ =
- static_cast<bool*>(_VSTD::__libcpp_allocate(__n * sizeof(bool), _LIBCPP_ALIGNOF(bool)));
- for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
- ::new (__r.__end_) bool(!*__p);
- }
- return __r;
-}
-
-template <class _Tp>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator*=(const value_type& __x)
-{
- for (value_type* __p = __begin_; __p != __end_; ++__p)
- *__p *= __x;
- return *this;
-}
-
-template <class _Tp>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator/=(const value_type& __x)
-{
- for (value_type* __p = __begin_; __p != __end_; ++__p)
- *__p /= __x;
- return *this;
-}
-
-template <class _Tp>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator%=(const value_type& __x)
-{
- for (value_type* __p = __begin_; __p != __end_; ++__p)
- *__p %= __x;
- return *this;
-}
-
-template <class _Tp>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator+=(const value_type& __x)
-{
- for (value_type* __p = __begin_; __p != __end_; ++__p)
- *__p += __x;
- return *this;
-}
-
-template <class _Tp>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator-=(const value_type& __x)
-{
- for (value_type* __p = __begin_; __p != __end_; ++__p)
- *__p -= __x;
- return *this;
-}
-
-template <class _Tp>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator^=(const value_type& __x)
-{
- for (value_type* __p = __begin_; __p != __end_; ++__p)
- *__p ^= __x;
- return *this;
-}
-
-template <class _Tp>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator&=(const value_type& __x)
-{
- for (value_type* __p = __begin_; __p != __end_; ++__p)
- *__p &= __x;
- return *this;
-}
-
-template <class _Tp>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator|=(const value_type& __x)
-{
- for (value_type* __p = __begin_; __p != __end_; ++__p)
- *__p |= __x;
- return *this;
-}
-
-template <class _Tp>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator<<=(const value_type& __x)
-{
- for (value_type* __p = __begin_; __p != __end_; ++__p)
- *__p <<= __x;
- return *this;
-}
-
-template <class _Tp>
-inline
-valarray<_Tp>&
-valarray<_Tp>::operator>>=(const value_type& __x)
-{
- for (value_type* __p = __begin_; __p != __end_; ++__p)
- *__p >>= __x;
- return *this;
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- valarray<_Tp>&
->::type
-valarray<_Tp>::operator*=(const _Expr& __v)
-{
- size_t __i = 0;
- for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
- *__t *= __v[__i];
- return *this;
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- valarray<_Tp>&
->::type
-valarray<_Tp>::operator/=(const _Expr& __v)
-{
- size_t __i = 0;
- for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
- *__t /= __v[__i];
- return *this;
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- valarray<_Tp>&
->::type
-valarray<_Tp>::operator%=(const _Expr& __v)
-{
- size_t __i = 0;
- for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
- *__t %= __v[__i];
- return *this;
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- valarray<_Tp>&
->::type
-valarray<_Tp>::operator+=(const _Expr& __v)
-{
- size_t __i = 0;
- for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
- *__t += __v[__i];
- return *this;
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- valarray<_Tp>&
->::type
-valarray<_Tp>::operator-=(const _Expr& __v)
-{
- size_t __i = 0;
- for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
- *__t -= __v[__i];
- return *this;
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- valarray<_Tp>&
->::type
-valarray<_Tp>::operator^=(const _Expr& __v)
-{
- size_t __i = 0;
- for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
- *__t ^= __v[__i];
- return *this;
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- valarray<_Tp>&
->::type
-valarray<_Tp>::operator|=(const _Expr& __v)
-{
- size_t __i = 0;
- for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
- *__t |= __v[__i];
- return *this;
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- valarray<_Tp>&
->::type
-valarray<_Tp>::operator&=(const _Expr& __v)
-{
- size_t __i = 0;
- for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
- *__t &= __v[__i];
- return *this;
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- valarray<_Tp>&
->::type
-valarray<_Tp>::operator<<=(const _Expr& __v)
-{
- size_t __i = 0;
- for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
- *__t <<= __v[__i];
- return *this;
-}
-
-template <class _Tp>
-template <class _Expr>
-inline
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- valarray<_Tp>&
->::type
-valarray<_Tp>::operator>>=(const _Expr& __v)
-{
- size_t __i = 0;
- for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
- *__t >>= __v[__i];
- return *this;
-}
-
-template <class _Tp>
-inline
-void
-valarray<_Tp>::swap(valarray& __v) _NOEXCEPT
-{
- _VSTD::swap(__begin_, __v.__begin_);
- _VSTD::swap(__end_, __v.__end_);
-}
-
-template <class _Tp>
-inline
-_Tp
-valarray<_Tp>::sum() const
-{
- if (__begin_ == __end_)
- return value_type();
- const value_type* __p = __begin_;
- _Tp __r = *__p;
- for (++__p; __p != __end_; ++__p)
- __r += *__p;
- return __r;
-}
-
-template <class _Tp>
-inline
-_Tp
-valarray<_Tp>::min() const
-{
- if (__begin_ == __end_)
- return value_type();
- return *_VSTD::min_element(__begin_, __end_);
-}
-
-template <class _Tp>
-inline
-_Tp
-valarray<_Tp>::max() const
-{
- if (__begin_ == __end_)
- return value_type();
- return *_VSTD::max_element(__begin_, __end_);
-}
-
-template <class _Tp>
-valarray<_Tp>
-valarray<_Tp>::shift(int __i) const
-{
- valarray<value_type> __r;
- size_t __n = size();
- if (__n)
- {
- __r.__begin_ =
- __r.__end_ =
- static_cast<value_type*>(
- _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
- const value_type* __sb;
- value_type* __tb;
- value_type* __te;
- if (__i >= 0)
- {
- __i = _VSTD::min(__i, static_cast<int>(__n));
- __sb = __begin_ + __i;
- __tb = __r.__begin_;
- __te = __r.__begin_ + (__n - __i);
- }
- else
- {
- __i = _VSTD::min(-__i, static_cast<int>(__n));
- __sb = __begin_;
- __tb = __r.__begin_ + __i;
- __te = __r.__begin_ + __n;
- }
- for (; __r.__end_ != __tb; ++__r.__end_)
- ::new (__r.__end_) value_type();
- for (; __r.__end_ != __te; ++__r.__end_, ++__sb)
- ::new (__r.__end_) value_type(*__sb);
- for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_)
- ::new (__r.__end_) value_type();
- }
- return __r;
-}
-
-template <class _Tp>
-valarray<_Tp>
-valarray<_Tp>::cshift(int __i) const
-{
- valarray<value_type> __r;
- size_t __n = size();
- if (__n)
- {
- __r.__begin_ =
- __r.__end_ =
- static_cast<value_type*>(
- _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
- __i %= static_cast<int>(__n);
- const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i;
- for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s)
- ::new (__r.__end_) value_type(*__s);
- for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s)
- ::new (__r.__end_) value_type(*__s);
- }
- return __r;
-}
-
-template <class _Tp>
-valarray<_Tp>
-valarray<_Tp>::apply(value_type __f(value_type)) const
-{
- valarray<value_type> __r;
- size_t __n = size();
- if (__n)
- {
- __r.__begin_ =
- __r.__end_ =
- static_cast<value_type*>(
- _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
- for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
- ::new (__r.__end_) value_type(__f(*__p));
- }
- return __r;
-}
-
-template <class _Tp>
-valarray<_Tp>
-valarray<_Tp>::apply(value_type __f(const value_type&)) const
-{
- valarray<value_type> __r;
- size_t __n = size();
- if (__n)
- {
- __r.__begin_ =
- __r.__end_ =
- static_cast<value_type*>(
- _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
- for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
- ::new (__r.__end_) value_type(__f(*__p));
- }
- return __r;
-}
-
-template <class _Tp>
-inline
-void valarray<_Tp>::__clear(size_t __capacity)
-{
- if (__begin_ != nullptr)
- {
- while (__end_ != __begin_)
- (--__end_)->~value_type();
- _VSTD::__libcpp_deallocate(__begin_, __capacity * sizeof(value_type), _LIBCPP_ALIGNOF(value_type));
- __begin_ = __end_ = nullptr;
- }
-}
-
-template <class _Tp>
-void
-valarray<_Tp>::resize(size_t __n, value_type __x)
-{
- __clear(size());
- if (__n)
- {
- __begin_ = __end_ = static_cast<value_type*>(
- _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
- ::new (__end_) value_type(__x);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __clear(__n);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
-}
-
-template<class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT
-{
- __x.swap(__y);
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator*(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator*(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(multiplies<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator*(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(multiplies<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator/(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator/(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(divides<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator/(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(divides<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator%(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator%(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(modulus<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator%(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(modulus<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator+(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator+(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(plus<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator+(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(plus<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator-(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator-(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(minus<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator-(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(minus<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator^(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator^(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(bit_xor<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator^(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(bit_xor<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator&(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator&(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(bit_and<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator&(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(bit_and<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator|(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator|(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(bit_or<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator|(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(bit_or<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator<<(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator<<(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator<<(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator>>(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator>>(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator>>(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator&&(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator&&(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(logical_and<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator&&(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(logical_and<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator||(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator||(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(logical_or<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator||(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(logical_or<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator==(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator==(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(equal_to<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator==(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(equal_to<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator!=(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator!=(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator!=(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator<(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(less<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<less<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator<(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(less<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<less<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator<(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(less<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator>(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator>(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(greater<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator>(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(greater<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator<=(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator<=(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(less_equal<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator<=(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(less_equal<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-operator>=(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-operator>=(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(greater_equal<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-operator>=(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(greater_equal<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> >
->::type
-abs(const _Expr& __x)
-{
- typedef typename _Expr::value_type value_type;
- typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> >
->::type
-acos(const _Expr& __x)
-{
- typedef typename _Expr::value_type value_type;
- typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> >
->::type
-asin(const _Expr& __x)
-{
- typedef typename _Expr::value_type value_type;
- typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> >
->::type
-atan(const _Expr& __x)
-{
- typedef typename _Expr::value_type value_type;
- typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-atan2(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-atan2(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-atan2(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> >
->::type
-cos(const _Expr& __x)
-{
- typedef typename _Expr::value_type value_type;
- typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> >
->::type
-cosh(const _Expr& __x)
-{
- typedef typename _Expr::value_type value_type;
- typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> >
->::type
-exp(const _Expr& __x)
-{
- typedef typename _Expr::value_type value_type;
- typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> >
->::type
-log(const _Expr& __x)
-{
- typedef typename _Expr::value_type value_type;
- typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> >
->::type
-log10(const _Expr& __x)
-{
- typedef typename _Expr::value_type value_type;
- typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x));
-}
-
-template<class _Expr1, class _Expr2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
- __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
->::type
-pow(const _Expr1& __x, const _Expr2& __y)
-{
- typedef typename _Expr1::value_type value_type;
- typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op;
- return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
- _Expr, __scalar_expr<typename _Expr::value_type> > >
->::type
-pow(const _Expr& __x, const typename _Expr::value_type& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
- return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
- __x, __scalar_expr<value_type>(__y, __x.size())));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
- __scalar_expr<typename _Expr::value_type>, _Expr> >
->::type
-pow(const typename _Expr::value_type& __x, const _Expr& __y)
-{
- typedef typename _Expr::value_type value_type;
- typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
- __scalar_expr<value_type>(__x, __y.size()), __y));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> >
->::type
-sin(const _Expr& __x)
-{
- typedef typename _Expr::value_type value_type;
- typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> >
->::type
-sinh(const _Expr& __x)
-{
- typedef typename _Expr::value_type value_type;
- typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> >
->::type
-sqrt(const _Expr& __x)
-{
- typedef typename _Expr::value_type value_type;
- typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> >
->::type
-tan(const _Expr& __x)
-{
- typedef typename _Expr::value_type value_type;
- typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x));
-}
-
-template<class _Expr>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- __is_val_expr<_Expr>::value,
- __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> >
->::type
-tanh(const _Expr& __x)
-{
- typedef typename _Expr::value_type value_type;
- typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op;
- return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x));
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp*
-begin(valarray<_Tp>& __v)
-{
- return __v.__begin_;
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-const _Tp*
-begin(const valarray<_Tp>& __v)
-{
- return __v.__begin_;
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-_Tp*
-end(valarray<_Tp>& __v)
-{
- return __v.__end_;
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-const _Tp*
-end(const valarray<_Tp>& __v)
-{
- return __v.__end_;
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_VALARRAY
diff --git a/lib/libcxx/include/variant b/lib/libcxx/include/variant
deleted file mode 100644
index a4339de6cde..00000000000
--- a/lib/libcxx/include/variant
+++ /dev/null
@@ -1,1616 +0,0 @@
-// -*- C++ -*-
-//===------------------------------ variant -------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_VARIANT
-#define _LIBCPP_VARIANT
-
-/*
- variant synopsis
-
-namespace std {
-
- // 20.7.2, class template variant
- template <class... Types>
- class variant {
- public:
-
- // 20.7.2.1, constructors
- constexpr variant() noexcept(see below);
- variant(const variant&); // constexpr in C++20
- variant(variant&&) noexcept(see below); // constexpr in C++20
-
- template <class T> constexpr variant(T&&) noexcept(see below);
-
- template <class T, class... Args>
- constexpr explicit variant(in_place_type_t<T>, Args&&...);
-
- template <class T, class U, class... Args>
- constexpr explicit variant(
- in_place_type_t<T>, initializer_list<U>, Args&&...);
-
- template <size_t I, class... Args>
- constexpr explicit variant(in_place_index_t<I>, Args&&...);
-
- template <size_t I, class U, class... Args>
- constexpr explicit variant(
- in_place_index_t<I>, initializer_list<U>, Args&&...);
-
- // 20.7.2.2, destructor
- ~variant();
-
- // 20.7.2.3, assignment
- variant& operator=(const variant&); // constexpr in C++20
- variant& operator=(variant&&) noexcept(see below); // constexpr in C++20
-
- template <class T> variant& operator=(T&&) noexcept(see below);
-
- // 20.7.2.4, modifiers
- template <class T, class... Args>
- T& emplace(Args&&...);
-
- template <class T, class U, class... Args>
- T& emplace(initializer_list<U>, Args&&...);
-
- template <size_t I, class... Args>
- variant_alternative_t<I, variant>& emplace(Args&&...);
-
- template <size_t I, class U, class... Args>
- variant_alternative_t<I, variant>& emplace(initializer_list<U>, Args&&...);
-
- // 20.7.2.5, value status
- constexpr bool valueless_by_exception() const noexcept;
- constexpr size_t index() const noexcept;
-
- // 20.7.2.6, swap
- void swap(variant&) noexcept(see below);
- };
-
- // 20.7.3, variant helper classes
- template <class T> struct variant_size; // undefined
-
- template <class T>
- inline constexpr size_t variant_size_v = variant_size<T>::value;
-
- template <class T> struct variant_size<const T>;
- template <class T> struct variant_size<volatile T>;
- template <class T> struct variant_size<const volatile T>;
-
- template <class... Types>
- struct variant_size<variant<Types...>>;
-
- template <size_t I, class T> struct variant_alternative; // undefined
-
- template <size_t I, class T>
- using variant_alternative_t = typename variant_alternative<I, T>::type;
-
- template <size_t I, class T> struct variant_alternative<I, const T>;
- template <size_t I, class T> struct variant_alternative<I, volatile T>;
- template <size_t I, class T> struct variant_alternative<I, const volatile T>;
-
- template <size_t I, class... Types>
- struct variant_alternative<I, variant<Types...>>;
-
- inline constexpr size_t variant_npos = -1;
-
- // 20.7.4, value access
- template <class T, class... Types>
- constexpr bool holds_alternative(const variant<Types...>&) noexcept;
-
- template <size_t I, class... Types>
- constexpr variant_alternative_t<I, variant<Types...>>&
- get(variant<Types...>&);
-
- template <size_t I, class... Types>
- constexpr variant_alternative_t<I, variant<Types...>>&&
- get(variant<Types...>&&);
-
- template <size_t I, class... Types>
- constexpr variant_alternative_t<I, variant<Types...>> const&
- get(const variant<Types...>&);
-
- template <size_t I, class... Types>
- constexpr variant_alternative_t<I, variant<Types...>> const&&
- get(const variant<Types...>&&);
-
- template <class T, class... Types>
- constexpr T& get(variant<Types...>&);
-
- template <class T, class... Types>
- constexpr T&& get(variant<Types...>&&);
-
- template <class T, class... Types>
- constexpr const T& get(const variant<Types...>&);
-
- template <class T, class... Types>
- constexpr const T&& get(const variant<Types...>&&);
-
- template <size_t I, class... Types>
- constexpr add_pointer_t<variant_alternative_t<I, variant<Types...>>>
- get_if(variant<Types...>*) noexcept;
-
- template <size_t I, class... Types>
- constexpr add_pointer_t<const variant_alternative_t<I, variant<Types...>>>
- get_if(const variant<Types...>*) noexcept;
-
- template <class T, class... Types>
- constexpr add_pointer_t<T>
- get_if(variant<Types...>*) noexcept;
-
- template <class T, class... Types>
- constexpr add_pointer_t<const T>
- get_if(const variant<Types...>*) noexcept;
-
- // 20.7.5, relational operators
- template <class... Types>
- constexpr bool operator==(const variant<Types...>&, const variant<Types...>&);
-
- template <class... Types>
- constexpr bool operator!=(const variant<Types...>&, const variant<Types...>&);
-
- template <class... Types>
- constexpr bool operator<(const variant<Types...>&, const variant<Types...>&);
-
- template <class... Types>
- constexpr bool operator>(const variant<Types...>&, const variant<Types...>&);
-
- template <class... Types>
- constexpr bool operator<=(const variant<Types...>&, const variant<Types...>&);
-
- template <class... Types>
- constexpr bool operator>=(const variant<Types...>&, const variant<Types...>&);
-
- // 20.7.6, visitation
- template <class Visitor, class... Variants>
- constexpr see below visit(Visitor&&, Variants&&...);
-
- // 20.7.7, class monostate
- struct monostate;
-
- // 20.7.8, monostate relational operators
- constexpr bool operator<(monostate, monostate) noexcept;
- constexpr bool operator>(monostate, monostate) noexcept;
- constexpr bool operator<=(monostate, monostate) noexcept;
- constexpr bool operator>=(monostate, monostate) noexcept;
- constexpr bool operator==(monostate, monostate) noexcept;
- constexpr bool operator!=(monostate, monostate) noexcept;
-
- // 20.7.9, specialized algorithms
- template <class... Types>
- void swap(variant<Types...>&, variant<Types...>&) noexcept(see below);
-
- // 20.7.10, class bad_variant_access
- class bad_variant_access;
-
- // 20.7.11, hash support
- template <class T> struct hash;
- template <class... Types> struct hash<variant<Types...>>;
- template <> struct hash<monostate>;
-
-} // namespace std
-
-*/
-
-#include <__config>
-#include <__tuple>
-#include <array>
-#include <exception>
-#include <functional>
-#include <initializer_list>
-#include <new>
-#include <tuple>
-#include <type_traits>
-#include <utility>
-#include <limits>
-#include <version>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-namespace std { // explicitly not using versioning namespace
-
-class _LIBCPP_EXCEPTION_ABI _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS bad_variant_access : public exception {
-public:
- virtual const char* what() const _NOEXCEPT;
-};
-
-} // namespace std
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-#if _LIBCPP_STD_VER > 14
-
-_LIBCPP_NORETURN
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
-void __throw_bad_variant_access() {
-#ifndef _LIBCPP_NO_EXCEPTIONS
- throw bad_variant_access();
-#else
- _VSTD::abort();
-#endif
-}
-
-template <class... _Types>
-class _LIBCPP_TEMPLATE_VIS variant;
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS variant_size;
-
-template <class _Tp>
-_LIBCPP_INLINE_VAR constexpr size_t variant_size_v = variant_size<_Tp>::value;
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS variant_size<const _Tp> : variant_size<_Tp> {};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS variant_size<volatile _Tp> : variant_size<_Tp> {};
-
-template <class _Tp>
-struct _LIBCPP_TEMPLATE_VIS variant_size<const volatile _Tp>
- : variant_size<_Tp> {};
-
-template <class... _Types>
-struct _LIBCPP_TEMPLATE_VIS variant_size<variant<_Types...>>
- : integral_constant<size_t, sizeof...(_Types)> {};
-
-template <size_t _Ip, class _Tp>
-struct _LIBCPP_TEMPLATE_VIS variant_alternative;
-
-template <size_t _Ip, class _Tp>
-using variant_alternative_t = typename variant_alternative<_Ip, _Tp>::type;
-
-template <size_t _Ip, class _Tp>
-struct _LIBCPP_TEMPLATE_VIS variant_alternative<_Ip, const _Tp>
- : add_const<variant_alternative_t<_Ip, _Tp>> {};
-
-template <size_t _Ip, class _Tp>
-struct _LIBCPP_TEMPLATE_VIS variant_alternative<_Ip, volatile _Tp>
- : add_volatile<variant_alternative_t<_Ip, _Tp>> {};
-
-template <size_t _Ip, class _Tp>
-struct _LIBCPP_TEMPLATE_VIS variant_alternative<_Ip, const volatile _Tp>
- : add_cv<variant_alternative_t<_Ip, _Tp>> {};
-
-template <size_t _Ip, class... _Types>
-struct _LIBCPP_TEMPLATE_VIS variant_alternative<_Ip, variant<_Types...>> {
- static_assert(_Ip < sizeof...(_Types), "Index out of bounds in std::variant_alternative<>");
- using type = __type_pack_element<_Ip, _Types...>;
-};
-
-_LIBCPP_INLINE_VAR constexpr size_t variant_npos = static_cast<size_t>(-1);
-
-constexpr int __choose_index_type(unsigned int __num_elem) {
- if (__num_elem < std::numeric_limits<unsigned char>::max())
- return 0;
- if (__num_elem < std::numeric_limits<unsigned short>::max())
- return 1;
- return 2;
-}
-
-template <size_t _NumAlts>
-using __variant_index_t =
-#ifndef _LIBCPP_ABI_VARIANT_INDEX_TYPE_OPTIMIZATION
- unsigned int;
-#else
- std::tuple_element_t<
- __choose_index_type(_NumAlts),
- std::tuple<unsigned char, unsigned short, unsigned int>
- >;
-#endif
-
-template <class _IndexType>
-constexpr _IndexType __variant_npos = static_cast<_IndexType>(-1);
-
-namespace __find_detail {
-
-template <class _Tp, class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr size_t __find_index() {
- constexpr bool __matches[] = {is_same_v<_Tp, _Types>...};
- size_t __result = __not_found;
- for (size_t __i = 0; __i < sizeof...(_Types); ++__i) {
- if (__matches[__i]) {
- if (__result != __not_found) {
- return __ambiguous;
- }
- __result = __i;
- }
- }
- return __result;
-}
-
-template <size_t _Index>
-struct __find_unambiguous_index_sfinae_impl
- : integral_constant<size_t, _Index> {};
-
-template <>
-struct __find_unambiguous_index_sfinae_impl<__not_found> {};
-
-template <>
-struct __find_unambiguous_index_sfinae_impl<__ambiguous> {};
-
-template <class _Tp, class... _Types>
-struct __find_unambiguous_index_sfinae
- : __find_unambiguous_index_sfinae_impl<__find_index<_Tp, _Types...>()> {};
-
-} // namespace __find_detail
-
-namespace __variant_detail {
-
-struct __valueless_t {};
-
-enum class _Trait { _TriviallyAvailable, _Available, _Unavailable };
-
-template <typename _Tp,
- template <typename> class _IsTriviallyAvailable,
- template <typename> class _IsAvailable>
-constexpr _Trait __trait =
- _IsTriviallyAvailable<_Tp>::value
- ? _Trait::_TriviallyAvailable
- : _IsAvailable<_Tp>::value ? _Trait::_Available : _Trait::_Unavailable;
-
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr _Trait __common_trait(initializer_list<_Trait> __traits) {
- _Trait __result = _Trait::_TriviallyAvailable;
- for (_Trait __t : __traits) {
- if (static_cast<int>(__t) > static_cast<int>(__result)) {
- __result = __t;
- }
- }
- return __result;
-}
-
-template <typename... _Types>
-struct __traits {
- static constexpr _Trait __copy_constructible_trait =
- __common_trait({__trait<_Types,
- is_trivially_copy_constructible,
- is_copy_constructible>...});
-
- static constexpr _Trait __move_constructible_trait =
- __common_trait({__trait<_Types,
- is_trivially_move_constructible,
- is_move_constructible>...});
-
- static constexpr _Trait __copy_assignable_trait = __common_trait(
- {__copy_constructible_trait,
- __trait<_Types, is_trivially_copy_assignable, is_copy_assignable>...});
-
- static constexpr _Trait __move_assignable_trait = __common_trait(
- {__move_constructible_trait,
- __trait<_Types, is_trivially_move_assignable, is_move_assignable>...});
-
- static constexpr _Trait __destructible_trait = __common_trait(
- {__trait<_Types, is_trivially_destructible, is_destructible>...});
-};
-
-namespace __access {
-
-struct __union {
- template <class _Vp>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr auto&& __get_alt(_Vp&& __v, in_place_index_t<0>) {
- return _VSTD::forward<_Vp>(__v).__head;
- }
-
- template <class _Vp, size_t _Ip>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr auto&& __get_alt(_Vp&& __v, in_place_index_t<_Ip>) {
- return __get_alt(_VSTD::forward<_Vp>(__v).__tail, in_place_index<_Ip - 1>);
- }
-};
-
-struct __base {
- template <size_t _Ip, class _Vp>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr auto&& __get_alt(_Vp&& __v) {
- return __union::__get_alt(_VSTD::forward<_Vp>(__v).__data,
- in_place_index<_Ip>);
- }
-};
-
-struct __variant {
- template <size_t _Ip, class _Vp>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr auto&& __get_alt(_Vp&& __v) {
- return __base::__get_alt<_Ip>(_VSTD::forward<_Vp>(__v).__impl);
- }
-};
-
-} // namespace __access
-
-namespace __visitation {
-
-struct __base {
- template <class _Visitor, class... _Vs>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr decltype(auto)
- __visit_alt_at(size_t __index, _Visitor&& __visitor, _Vs&&... __vs) {
- constexpr auto __fdiagonal =
- __make_fdiagonal<_Visitor&&,
- decltype(_VSTD::forward<_Vs>(__vs).__as_base())...>();
- return __fdiagonal[__index](_VSTD::forward<_Visitor>(__visitor),
- _VSTD::forward<_Vs>(__vs).__as_base()...);
- }
-
- template <class _Visitor, class... _Vs>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr decltype(auto) __visit_alt(_Visitor&& __visitor,
- _Vs&&... __vs) {
- constexpr auto __fmatrix =
- __make_fmatrix<_Visitor&&,
- decltype(_VSTD::forward<_Vs>(__vs).__as_base())...>();
- return __at(__fmatrix, __vs.index()...)(
- _VSTD::forward<_Visitor>(__visitor),
- _VSTD::forward<_Vs>(__vs).__as_base()...);
- }
-
-private:
- template <class _Tp>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr const _Tp& __at(const _Tp& __elem) { return __elem; }
-
- template <class _Tp, size_t _Np, typename... _Indices>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr auto&& __at(const array<_Tp, _Np>& __elems,
- size_t __index, _Indices... __indices) {
- return __at(__elems[__index], __indices...);
- }
-
- template <class _Fp, class... _Fs>
- static constexpr void __std_visit_visitor_return_type_check() {
- static_assert(
- __all<is_same_v<_Fp, _Fs>...>::value,
- "`std::visit` requires the visitor to have a single return type.");
- }
-
- template <class... _Fs>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr auto __make_farray(_Fs&&... __fs) {
- __std_visit_visitor_return_type_check<__uncvref_t<_Fs>...>();
- using __result = array<common_type_t<__uncvref_t<_Fs>...>, sizeof...(_Fs)>;
- return __result{{_VSTD::forward<_Fs>(__fs)...}};
- }
-
- template <std::size_t... _Is>
- struct __dispatcher {
- template <class _Fp, class... _Vs>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr decltype(auto) __dispatch(_Fp __f, _Vs... __vs) {
- return __invoke_constexpr(
- static_cast<_Fp>(__f),
- __access::__base::__get_alt<_Is>(static_cast<_Vs>(__vs))...);
- }
- };
-
- template <class _Fp, class... _Vs, size_t... _Is>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr auto __make_dispatch(index_sequence<_Is...>) {
- return __dispatcher<_Is...>::template __dispatch<_Fp, _Vs...>;
- }
-
- template <size_t _Ip, class _Fp, class... _Vs>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr auto __make_fdiagonal_impl() {
- return __make_dispatch<_Fp, _Vs...>(
- index_sequence<(__identity<_Vs>{}, _Ip)...>{});
- }
-
- template <class _Fp, class... _Vs, size_t... _Is>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr auto __make_fdiagonal_impl(index_sequence<_Is...>) {
- return __base::__make_farray(__make_fdiagonal_impl<_Is, _Fp, _Vs...>()...);
- }
-
- template <class _Fp, class _Vp, class... _Vs>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr auto __make_fdiagonal() {
- constexpr size_t _Np = __uncvref_t<_Vp>::__size();
- static_assert(__all<(_Np == __uncvref_t<_Vs>::__size())...>::value);
- return __make_fdiagonal_impl<_Fp, _Vp, _Vs...>(make_index_sequence<_Np>{});
- }
-
- template <class _Fp, class... _Vs, size_t... _Is>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr auto __make_fmatrix_impl(index_sequence<_Is...> __is) {
- return __make_dispatch<_Fp, _Vs...>(__is);
- }
-
- template <class _Fp, class... _Vs, size_t... _Is, size_t... _Js, class... _Ls>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr auto __make_fmatrix_impl(index_sequence<_Is...>,
- index_sequence<_Js...>,
- _Ls... __ls) {
- return __base::__make_farray(__make_fmatrix_impl<_Fp, _Vs...>(
- index_sequence<_Is..., _Js>{}, __ls...)...);
- }
-
- template <class _Fp, class... _Vs>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr auto __make_fmatrix() {
- return __make_fmatrix_impl<_Fp, _Vs...>(
- index_sequence<>{}, make_index_sequence<__uncvref_t<_Vs>::__size()>{}...);
- }
-};
-
-struct __variant {
- template <class _Visitor, class... _Vs>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr decltype(auto)
- __visit_alt_at(size_t __index, _Visitor&& __visitor, _Vs&&... __vs) {
- return __base::__visit_alt_at(__index,
- _VSTD::forward<_Visitor>(__visitor),
- _VSTD::forward<_Vs>(__vs).__impl...);
- }
-
- template <class _Visitor, class... _Vs>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr decltype(auto) __visit_alt(_Visitor&& __visitor,
- _Vs&&... __vs) {
- return __base::__visit_alt(_VSTD::forward<_Visitor>(__visitor),
- _VSTD::forward<_Vs>(__vs).__impl...);
- }
-
- template <class _Visitor, class... _Vs>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr decltype(auto)
- __visit_value_at(size_t __index, _Visitor&& __visitor, _Vs&&... __vs) {
- return __visit_alt_at(
- __index,
- __make_value_visitor(_VSTD::forward<_Visitor>(__visitor)),
- _VSTD::forward<_Vs>(__vs)...);
- }
-
- template <class _Visitor, class... _Vs>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr decltype(auto) __visit_value(_Visitor&& __visitor,
- _Vs&&... __vs) {
- return __visit_alt(
- __make_value_visitor(_VSTD::forward<_Visitor>(__visitor)),
- _VSTD::forward<_Vs>(__vs)...);
- }
-
-private:
- template <class _Visitor, class... _Values>
- static constexpr void __std_visit_exhaustive_visitor_check() {
- static_assert(is_invocable_v<_Visitor, _Values...>,
- "`std::visit` requires the visitor to be exhaustive.");
- }
-
- template <class _Visitor>
- struct __value_visitor {
- template <class... _Alts>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr decltype(auto) operator()(_Alts&&... __alts) const {
- __std_visit_exhaustive_visitor_check<
- _Visitor,
- decltype((_VSTD::forward<_Alts>(__alts).__value))...>();
- return __invoke_constexpr(_VSTD::forward<_Visitor>(__visitor),
- _VSTD::forward<_Alts>(__alts).__value...);
- }
- _Visitor&& __visitor;
- };
-
- template <class _Visitor>
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr auto __make_value_visitor(_Visitor&& __visitor) {
- return __value_visitor<_Visitor>{_VSTD::forward<_Visitor>(__visitor)};
- }
-};
-
-} // namespace __visitation
-
-template <size_t _Index, class _Tp>
-struct _LIBCPP_TEMPLATE_VIS __alt {
- using __value_type = _Tp;
-
- template <class... _Args>
- inline _LIBCPP_INLINE_VISIBILITY
- explicit constexpr __alt(in_place_t, _Args&&... __args)
- : __value(_VSTD::forward<_Args>(__args)...) {}
-
- __value_type __value;
-};
-
-template <_Trait _DestructibleTrait, size_t _Index, class... _Types>
-union _LIBCPP_TEMPLATE_VIS __union;
-
-template <_Trait _DestructibleTrait, size_t _Index>
-union _LIBCPP_TEMPLATE_VIS __union<_DestructibleTrait, _Index> {};
-
-#define _LIBCPP_VARIANT_UNION(destructible_trait, destructor) \
- template <size_t _Index, class _Tp, class... _Types> \
- union _LIBCPP_TEMPLATE_VIS __union<destructible_trait, \
- _Index, \
- _Tp, \
- _Types...> { \
- public: \
- inline _LIBCPP_INLINE_VISIBILITY \
- explicit constexpr __union(__valueless_t) noexcept : __dummy{} {} \
- \
- template <class... _Args> \
- inline _LIBCPP_INLINE_VISIBILITY \
- explicit constexpr __union(in_place_index_t<0>, _Args&&... __args) \
- : __head(in_place, _VSTD::forward<_Args>(__args)...) {} \
- \
- template <size_t _Ip, class... _Args> \
- inline _LIBCPP_INLINE_VISIBILITY \
- explicit constexpr __union(in_place_index_t<_Ip>, _Args&&... __args) \
- : __tail(in_place_index<_Ip - 1>, _VSTD::forward<_Args>(__args)...) {} \
- \
- __union(const __union&) = default; \
- __union(__union&&) = default; \
- \
- destructor \
- \
- __union& operator=(const __union&) = default; \
- __union& operator=(__union&&) = default; \
- \
- private: \
- char __dummy; \
- __alt<_Index, _Tp> __head; \
- __union<destructible_trait, _Index + 1, _Types...> __tail; \
- \
- friend struct __access::__union; \
- }
-
-_LIBCPP_VARIANT_UNION(_Trait::_TriviallyAvailable, ~__union() = default;);
-_LIBCPP_VARIANT_UNION(_Trait::_Available, ~__union() {});
-_LIBCPP_VARIANT_UNION(_Trait::_Unavailable, ~__union() = delete;);
-
-#undef _LIBCPP_VARIANT_UNION
-
-template <_Trait _DestructibleTrait, class... _Types>
-class _LIBCPP_TEMPLATE_VIS __base {
-public:
- using __index_t = __variant_index_t<sizeof...(_Types)>;
-
- inline _LIBCPP_INLINE_VISIBILITY
- explicit constexpr __base(__valueless_t tag) noexcept
- : __data(tag), __index(__variant_npos<__index_t>) {}
-
- template <size_t _Ip, class... _Args>
- inline _LIBCPP_INLINE_VISIBILITY
- explicit constexpr __base(in_place_index_t<_Ip>, _Args&&... __args)
- :
- __data(in_place_index<_Ip>, _VSTD::forward<_Args>(__args)...),
- __index(_Ip) {}
-
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr bool valueless_by_exception() const noexcept {
- return index() == variant_npos;
- }
-
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr size_t index() const noexcept {
- return __index == __variant_npos<__index_t> ? variant_npos : __index;
- }
-
-protected:
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr auto&& __as_base() & { return *this; }
-
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr auto&& __as_base() && { return _VSTD::move(*this); }
-
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr auto&& __as_base() const & { return *this; }
-
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr auto&& __as_base() const && { return _VSTD::move(*this); }
-
- inline _LIBCPP_INLINE_VISIBILITY
- static constexpr size_t __size() { return sizeof...(_Types); }
-
- __union<_DestructibleTrait, 0, _Types...> __data;
- __index_t __index;
-
- friend struct __access::__base;
- friend struct __visitation::__base;
-};
-
-template <class _Traits, _Trait = _Traits::__destructible_trait>
-class _LIBCPP_TEMPLATE_VIS __destructor;
-
-#define _LIBCPP_VARIANT_DESTRUCTOR(destructible_trait, destructor, destroy) \
- template <class... _Types> \
- class _LIBCPP_TEMPLATE_VIS __destructor<__traits<_Types...>, \
- destructible_trait> \
- : public __base<destructible_trait, _Types...> { \
- using __base_type = __base<destructible_trait, _Types...>; \
- using __index_t = typename __base_type::__index_t; \
- \
- public: \
- using __base_type::__base_type; \
- using __base_type::operator=; \
- \
- __destructor(const __destructor&) = default; \
- __destructor(__destructor&&) = default; \
- destructor \
- __destructor& operator=(const __destructor&) = default; \
- __destructor& operator=(__destructor&&) = default; \
- \
- protected: \
- inline _LIBCPP_INLINE_VISIBILITY \
- destroy \
- }
-
-_LIBCPP_VARIANT_DESTRUCTOR(
- _Trait::_TriviallyAvailable,
- ~__destructor() = default;,
- void __destroy() noexcept { this->__index = __variant_npos<__index_t>; });
-
-_LIBCPP_VARIANT_DESTRUCTOR(
- _Trait::_Available,
- ~__destructor() { __destroy(); },
- void __destroy() noexcept {
- if (!this->valueless_by_exception()) {
- __visitation::__base::__visit_alt(
- [](auto& __alt) noexcept {
- using __alt_type = __uncvref_t<decltype(__alt)>;
- __alt.~__alt_type();
- },
- *this);
- }
- this->__index = __variant_npos<__index_t>;
- });
-
-_LIBCPP_VARIANT_DESTRUCTOR(
- _Trait::_Unavailable,
- ~__destructor() = delete;,
- void __destroy() noexcept = delete;);
-
-#undef _LIBCPP_VARIANT_DESTRUCTOR
-
-template <class _Traits>
-class _LIBCPP_TEMPLATE_VIS __constructor : public __destructor<_Traits> {
- using __base_type = __destructor<_Traits>;
-
-public:
- using __base_type::__base_type;
- using __base_type::operator=;
-
-protected:
- template <size_t _Ip, class _Tp, class... _Args>
- inline _LIBCPP_INLINE_VISIBILITY
- static _Tp& __construct_alt(__alt<_Ip, _Tp>& __a, _Args&&... __args) {
- ::new ((void*)_VSTD::addressof(__a))
- __alt<_Ip, _Tp>(in_place, _VSTD::forward<_Args>(__args)...);
- return __a.__value;
- }
-
- template <class _Rhs>
- inline _LIBCPP_INLINE_VISIBILITY
- static void __generic_construct(__constructor& __lhs, _Rhs&& __rhs) {
- __lhs.__destroy();
- if (!__rhs.valueless_by_exception()) {
- __visitation::__base::__visit_alt_at(
- __rhs.index(),
- [](auto& __lhs_alt, auto&& __rhs_alt) {
- __construct_alt(
- __lhs_alt,
- _VSTD::forward<decltype(__rhs_alt)>(__rhs_alt).__value);
- },
- __lhs, _VSTD::forward<_Rhs>(__rhs));
- __lhs.__index = __rhs.index();
- }
- }
-};
-
-template <class _Traits, _Trait = _Traits::__move_constructible_trait>
-class _LIBCPP_TEMPLATE_VIS __move_constructor;
-
-#define _LIBCPP_VARIANT_MOVE_CONSTRUCTOR(move_constructible_trait, \
- move_constructor) \
- template <class... _Types> \
- class _LIBCPP_TEMPLATE_VIS __move_constructor<__traits<_Types...>, \
- move_constructible_trait> \
- : public __constructor<__traits<_Types...>> { \
- using __base_type = __constructor<__traits<_Types...>>; \
- \
- public: \
- using __base_type::__base_type; \
- using __base_type::operator=; \
- \
- __move_constructor(const __move_constructor&) = default; \
- move_constructor \
- ~__move_constructor() = default; \
- __move_constructor& operator=(const __move_constructor&) = default; \
- __move_constructor& operator=(__move_constructor&&) = default; \
- }
-
-_LIBCPP_VARIANT_MOVE_CONSTRUCTOR(
- _Trait::_TriviallyAvailable,
- __move_constructor(__move_constructor&& __that) = default;);
-
-_LIBCPP_VARIANT_MOVE_CONSTRUCTOR(
- _Trait::_Available,
- __move_constructor(__move_constructor&& __that) noexcept(
- __all<is_nothrow_move_constructible_v<_Types>...>::value)
- : __move_constructor(__valueless_t{}) {
- this->__generic_construct(*this, _VSTD::move(__that));
- });
-
-_LIBCPP_VARIANT_MOVE_CONSTRUCTOR(
- _Trait::_Unavailable,
- __move_constructor(__move_constructor&&) = delete;);
-
-#undef _LIBCPP_VARIANT_MOVE_CONSTRUCTOR
-
-template <class _Traits, _Trait = _Traits::__copy_constructible_trait>
-class _LIBCPP_TEMPLATE_VIS __copy_constructor;
-
-#define _LIBCPP_VARIANT_COPY_CONSTRUCTOR(copy_constructible_trait, \
- copy_constructor) \
- template <class... _Types> \
- class _LIBCPP_TEMPLATE_VIS __copy_constructor<__traits<_Types...>, \
- copy_constructible_trait> \
- : public __move_constructor<__traits<_Types...>> { \
- using __base_type = __move_constructor<__traits<_Types...>>; \
- \
- public: \
- using __base_type::__base_type; \
- using __base_type::operator=; \
- \
- copy_constructor \
- __copy_constructor(__copy_constructor&&) = default; \
- ~__copy_constructor() = default; \
- __copy_constructor& operator=(const __copy_constructor&) = default; \
- __copy_constructor& operator=(__copy_constructor&&) = default; \
- }
-
-_LIBCPP_VARIANT_COPY_CONSTRUCTOR(
- _Trait::_TriviallyAvailable,
- __copy_constructor(const __copy_constructor& __that) = default;);
-
-_LIBCPP_VARIANT_COPY_CONSTRUCTOR(
- _Trait::_Available,
- __copy_constructor(const __copy_constructor& __that)
- : __copy_constructor(__valueless_t{}) {
- this->__generic_construct(*this, __that);
- });
-
-_LIBCPP_VARIANT_COPY_CONSTRUCTOR(
- _Trait::_Unavailable,
- __copy_constructor(const __copy_constructor&) = delete;);
-
-#undef _LIBCPP_VARIANT_COPY_CONSTRUCTOR
-
-template <class _Traits>
-class _LIBCPP_TEMPLATE_VIS __assignment : public __copy_constructor<_Traits> {
- using __base_type = __copy_constructor<_Traits>;
-
-public:
- using __base_type::__base_type;
- using __base_type::operator=;
-
- template <size_t _Ip, class... _Args>
- inline _LIBCPP_INLINE_VISIBILITY
- auto& __emplace(_Args&&... __args) {
- this->__destroy();
- auto& __res = this->__construct_alt(__access::__base::__get_alt<_Ip>(*this),
- _VSTD::forward<_Args>(__args)...);
- this->__index = _Ip;
- return __res;
- }
-
-protected:
- template <size_t _Ip, class _Tp, class _Arg>
- inline _LIBCPP_INLINE_VISIBILITY
- void __assign_alt(__alt<_Ip, _Tp>& __a, _Arg&& __arg) {
- if (this->index() == _Ip) {
- __a.__value = _VSTD::forward<_Arg>(__arg);
- } else {
- struct {
- void operator()(true_type) const {
- __this->__emplace<_Ip>(_VSTD::forward<_Arg>(__arg));
- }
- void operator()(false_type) const {
- __this->__emplace<_Ip>(_Tp(_VSTD::forward<_Arg>(__arg)));
- }
- __assignment* __this;
- _Arg&& __arg;
- } __impl{this, _VSTD::forward<_Arg>(__arg)};
- __impl(bool_constant<is_nothrow_constructible_v<_Tp, _Arg> ||
- !is_nothrow_move_constructible_v<_Tp>>{});
- }
- }
-
- template <class _That>
- inline _LIBCPP_INLINE_VISIBILITY
- void __generic_assign(_That&& __that) {
- if (this->valueless_by_exception() && __that.valueless_by_exception()) {
- // do nothing.
- } else if (__that.valueless_by_exception()) {
- this->__destroy();
- } else {
- __visitation::__base::__visit_alt_at(
- __that.index(),
- [this](auto& __this_alt, auto&& __that_alt) {
- this->__assign_alt(
- __this_alt,
- _VSTD::forward<decltype(__that_alt)>(__that_alt).__value);
- },
- *this, _VSTD::forward<_That>(__that));
- }
- }
-};
-
-template <class _Traits, _Trait = _Traits::__move_assignable_trait>
-class _LIBCPP_TEMPLATE_VIS __move_assignment;
-
-#define _LIBCPP_VARIANT_MOVE_ASSIGNMENT(move_assignable_trait, \
- move_assignment) \
- template <class... _Types> \
- class _LIBCPP_TEMPLATE_VIS __move_assignment<__traits<_Types...>, \
- move_assignable_trait> \
- : public __assignment<__traits<_Types...>> { \
- using __base_type = __assignment<__traits<_Types...>>; \
- \
- public: \
- using __base_type::__base_type; \
- using __base_type::operator=; \
- \
- __move_assignment(const __move_assignment&) = default; \
- __move_assignment(__move_assignment&&) = default; \
- ~__move_assignment() = default; \
- __move_assignment& operator=(const __move_assignment&) = default; \
- move_assignment \
- }
-
-_LIBCPP_VARIANT_MOVE_ASSIGNMENT(
- _Trait::_TriviallyAvailable,
- __move_assignment& operator=(__move_assignment&& __that) = default;);
-
-_LIBCPP_VARIANT_MOVE_ASSIGNMENT(
- _Trait::_Available,
- __move_assignment& operator=(__move_assignment&& __that) noexcept(
- __all<(is_nothrow_move_constructible_v<_Types> &&
- is_nothrow_move_assignable_v<_Types>)...>::value) {
- this->__generic_assign(_VSTD::move(__that));
- return *this;
- });
-
-_LIBCPP_VARIANT_MOVE_ASSIGNMENT(
- _Trait::_Unavailable,
- __move_assignment& operator=(__move_assignment&&) = delete;);
-
-#undef _LIBCPP_VARIANT_MOVE_ASSIGNMENT
-
-template <class _Traits, _Trait = _Traits::__copy_assignable_trait>
-class _LIBCPP_TEMPLATE_VIS __copy_assignment;
-
-#define _LIBCPP_VARIANT_COPY_ASSIGNMENT(copy_assignable_trait, \
- copy_assignment) \
- template <class... _Types> \
- class _LIBCPP_TEMPLATE_VIS __copy_assignment<__traits<_Types...>, \
- copy_assignable_trait> \
- : public __move_assignment<__traits<_Types...>> { \
- using __base_type = __move_assignment<__traits<_Types...>>; \
- \
- public: \
- using __base_type::__base_type; \
- using __base_type::operator=; \
- \
- __copy_assignment(const __copy_assignment&) = default; \
- __copy_assignment(__copy_assignment&&) = default; \
- ~__copy_assignment() = default; \
- copy_assignment \
- __copy_assignment& operator=(__copy_assignment&&) = default; \
- }
-
-_LIBCPP_VARIANT_COPY_ASSIGNMENT(
- _Trait::_TriviallyAvailable,
- __copy_assignment& operator=(const __copy_assignment& __that) = default;);
-
-_LIBCPP_VARIANT_COPY_ASSIGNMENT(
- _Trait::_Available,
- __copy_assignment& operator=(const __copy_assignment& __that) {
- this->__generic_assign(__that);
- return *this;
- });
-
-_LIBCPP_VARIANT_COPY_ASSIGNMENT(
- _Trait::_Unavailable,
- __copy_assignment& operator=(const __copy_assignment&) = delete;);
-
-#undef _LIBCPP_VARIANT_COPY_ASSIGNMENT
-
-template <class... _Types>
-class _LIBCPP_TEMPLATE_VIS __impl
- : public __copy_assignment<__traits<_Types...>> {
- using __base_type = __copy_assignment<__traits<_Types...>>;
-
-public:
- using __base_type::__base_type;
- using __base_type::operator=;
-
- template <size_t _Ip, class _Arg>
- inline _LIBCPP_INLINE_VISIBILITY
- void __assign(_Arg&& __arg) {
- this->__assign_alt(__access::__base::__get_alt<_Ip>(*this),
- _VSTD::forward<_Arg>(__arg));
- }
-
- inline _LIBCPP_INLINE_VISIBILITY
- void __swap(__impl& __that) {
- if (this->valueless_by_exception() && __that.valueless_by_exception()) {
- // do nothing.
- } else if (this->index() == __that.index()) {
- __visitation::__base::__visit_alt_at(
- this->index(),
- [](auto& __this_alt, auto& __that_alt) {
- using _VSTD::swap;
- swap(__this_alt.__value, __that_alt.__value);
- },
- *this,
- __that);
- } else {
- __impl* __lhs = this;
- __impl* __rhs = _VSTD::addressof(__that);
- if (__lhs->__move_nothrow() && !__rhs->__move_nothrow()) {
- _VSTD::swap(__lhs, __rhs);
- }
- __impl __tmp(_VSTD::move(*__rhs));
-#ifndef _LIBCPP_NO_EXCEPTIONS
- // EXTENSION: When the move construction of `__lhs` into `__rhs` throws
- // and `__tmp` is nothrow move constructible then we move `__tmp` back
- // into `__rhs` and provide the strong exception safety guarantee.
- try {
- this->__generic_construct(*__rhs, _VSTD::move(*__lhs));
- } catch (...) {
- if (__tmp.__move_nothrow()) {
- this->__generic_construct(*__rhs, _VSTD::move(__tmp));
- }
- throw;
- }
-#else
- this->__generic_construct(*__rhs, _VSTD::move(*__lhs));
-#endif
- this->__generic_construct(*__lhs, _VSTD::move(__tmp));
- }
- }
-
-private:
- inline _LIBCPP_INLINE_VISIBILITY
- bool __move_nothrow() const {
- constexpr bool __results[] = {is_nothrow_move_constructible_v<_Types>...};
- return this->valueless_by_exception() || __results[this->index()];
- }
-};
-
-template <class... _Types>
-struct __overload;
-
-template <>
-struct __overload<> { void operator()() const; };
-
-template <class _Tp, class... _Types>
-struct __overload<_Tp, _Types...> : __overload<_Types...> {
- using __overload<_Types...>::operator();
- __identity<_Tp> operator()(_Tp) const;
-};
-
-template <class _Tp, class... _Types>
-using __best_match_t = typename result_of_t<__overload<_Types...>(_Tp&&)>::type;
-
-} // __variant_detail
-
-template <class... _Types>
-class _LIBCPP_TEMPLATE_VIS variant
- : private __sfinae_ctor_base<
- __all<is_copy_constructible_v<_Types>...>::value,
- __all<is_move_constructible_v<_Types>...>::value>,
- private __sfinae_assign_base<
- __all<(is_copy_constructible_v<_Types> &&
- is_copy_assignable_v<_Types>)...>::value,
- __all<(is_move_constructible_v<_Types> &&
- is_move_assignable_v<_Types>)...>::value> {
- static_assert(0 < sizeof...(_Types),
- "variant must consist of at least one alternative.");
-
- static_assert(__all<!is_array_v<_Types>...>::value,
- "variant can not have an array type as an alternative.");
-
- static_assert(__all<!is_reference_v<_Types>...>::value,
- "variant can not have a reference type as an alternative.");
-
- static_assert(__all<!is_void_v<_Types>...>::value,
- "variant can not have a void type as an alternative.");
-
- using __first_type = variant_alternative_t<0, variant>;
-
-public:
- template <bool _Dummy = true,
- enable_if_t<__dependent_type<is_default_constructible<__first_type>,
- _Dummy>::value,
- int> = 0>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr variant() noexcept(is_nothrow_default_constructible_v<__first_type>)
- : __impl(in_place_index<0>) {}
-
- variant(const variant&) = default;
- variant(variant&&) = default;
-
- template <
- class _Arg,
- enable_if_t<!is_same_v<__uncvref_t<_Arg>, variant>, int> = 0,
- enable_if_t<!__is_inplace_type<__uncvref_t<_Arg>>::value, int> = 0,
- enable_if_t<!__is_inplace_index<__uncvref_t<_Arg>>::value, int> = 0,
- class _Tp = __variant_detail::__best_match_t<_Arg, _Types...>,
- size_t _Ip =
- __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value,
- enable_if_t<is_constructible_v<_Tp, _Arg>, int> = 0>
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr variant(_Arg&& __arg) noexcept(
- is_nothrow_constructible_v<_Tp, _Arg>)
- : __impl(in_place_index<_Ip>, _VSTD::forward<_Arg>(__arg)) {}
-
- template <size_t _Ip, class... _Args,
- class = enable_if_t<(_Ip < sizeof...(_Types)), int>,
- class _Tp = variant_alternative_t<_Ip, variant<_Types...>>,
- enable_if_t<is_constructible_v<_Tp, _Args...>, int> = 0>
- inline _LIBCPP_INLINE_VISIBILITY
- explicit constexpr variant(
- in_place_index_t<_Ip>,
- _Args&&... __args) noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
- : __impl(in_place_index<_Ip>, _VSTD::forward<_Args>(__args)...) {}
-
- template <
- size_t _Ip,
- class _Up,
- class... _Args,
- enable_if_t<(_Ip < sizeof...(_Types)), int> = 0,
- class _Tp = variant_alternative_t<_Ip, variant<_Types...>>,
- enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>,
- int> = 0>
- inline _LIBCPP_INLINE_VISIBILITY
- explicit constexpr variant(
- in_place_index_t<_Ip>,
- initializer_list<_Up> __il,
- _Args&&... __args) noexcept(
- is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>)
- : __impl(in_place_index<_Ip>, __il, _VSTD::forward<_Args>(__args)...) {}
-
- template <
- class _Tp,
- class... _Args,
- size_t _Ip =
- __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value,
- enable_if_t<is_constructible_v<_Tp, _Args...>, int> = 0>
- inline _LIBCPP_INLINE_VISIBILITY
- explicit constexpr variant(in_place_type_t<_Tp>, _Args&&... __args) noexcept(
- is_nothrow_constructible_v<_Tp, _Args...>)
- : __impl(in_place_index<_Ip>, _VSTD::forward<_Args>(__args)...) {}
-
- template <
- class _Tp,
- class _Up,
- class... _Args,
- size_t _Ip =
- __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value,
- enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>,
- int> = 0>
- inline _LIBCPP_INLINE_VISIBILITY
- explicit constexpr variant(
- in_place_type_t<_Tp>,
- initializer_list<_Up> __il,
- _Args&&... __args) noexcept(
- is_nothrow_constructible_v<_Tp, initializer_list< _Up>&, _Args...>)
- : __impl(in_place_index<_Ip>, __il, _VSTD::forward<_Args>(__args)...) {}
-
- ~variant() = default;
-
- variant& operator=(const variant&) = default;
- variant& operator=(variant&&) = default;
-
- template <
- class _Arg,
- enable_if_t<!is_same_v<__uncvref_t<_Arg>, variant>, int> = 0,
- class _Tp = __variant_detail::__best_match_t<_Arg, _Types...>,
- size_t _Ip =
- __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value,
- enable_if_t<is_assignable_v<_Tp&, _Arg> && is_constructible_v<_Tp, _Arg>,
- int> = 0>
- inline _LIBCPP_INLINE_VISIBILITY
- variant& operator=(_Arg&& __arg) noexcept(
- is_nothrow_assignable_v<_Tp&, _Arg> &&
- is_nothrow_constructible_v<_Tp, _Arg>) {
- __impl.template __assign<_Ip>(_VSTD::forward<_Arg>(__arg));
- return *this;
- }
-
- template <
- size_t _Ip,
- class... _Args,
- enable_if_t<(_Ip < sizeof...(_Types)), int> = 0,
- class _Tp = variant_alternative_t<_Ip, variant<_Types...>>,
- enable_if_t<is_constructible_v<_Tp, _Args...>, int> = 0>
- inline _LIBCPP_INLINE_VISIBILITY
- _Tp& emplace(_Args&&... __args) {
- return __impl.template __emplace<_Ip>(_VSTD::forward<_Args>(__args)...);
- }
-
- template <
- size_t _Ip,
- class _Up,
- class... _Args,
- enable_if_t<(_Ip < sizeof...(_Types)), int> = 0,
- class _Tp = variant_alternative_t<_Ip, variant<_Types...>>,
- enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>,
- int> = 0>
- inline _LIBCPP_INLINE_VISIBILITY
- _Tp& emplace(initializer_list<_Up> __il, _Args&&... __args) {
- return __impl.template __emplace<_Ip>(__il, _VSTD::forward<_Args>(__args)...);
- }
-
- template <
- class _Tp,
- class... _Args,
- size_t _Ip =
- __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value,
- enable_if_t<is_constructible_v<_Tp, _Args...>, int> = 0>
- inline _LIBCPP_INLINE_VISIBILITY
- _Tp& emplace(_Args&&... __args) {
- return __impl.template __emplace<_Ip>(_VSTD::forward<_Args>(__args)...);
- }
-
- template <
- class _Tp,
- class _Up,
- class... _Args,
- size_t _Ip =
- __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value,
- enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>,
- int> = 0>
- inline _LIBCPP_INLINE_VISIBILITY
- _Tp& emplace(initializer_list<_Up> __il, _Args&&... __args) {
- return __impl.template __emplace<_Ip>(__il, _VSTD::forward<_Args>(__args)...);
- }
-
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr bool valueless_by_exception() const noexcept {
- return __impl.valueless_by_exception();
- }
-
- inline _LIBCPP_INLINE_VISIBILITY
- constexpr size_t index() const noexcept { return __impl.index(); }
-
- template <
- bool _Dummy = true,
- enable_if_t<
- __all<(
- __dependent_type<is_move_constructible<_Types>, _Dummy>::value &&
- __dependent_type<is_swappable<_Types>, _Dummy>::value)...>::value,
- int> = 0>
- inline _LIBCPP_INLINE_VISIBILITY
- void swap(variant& __that) noexcept(
- __all<(is_nothrow_move_constructible_v<_Types> &&
- is_nothrow_swappable_v<_Types>)...>::value) {
- __impl.__swap(__that.__impl);
- }
-
-private:
- __variant_detail::__impl<_Types...> __impl;
-
- friend struct __variant_detail::__access::__variant;
- friend struct __variant_detail::__visitation::__variant;
-};
-
-template <size_t _Ip, class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr bool __holds_alternative(const variant<_Types...>& __v) noexcept {
- return __v.index() == _Ip;
-}
-
-template <class _Tp, class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr bool holds_alternative(const variant<_Types...>& __v) noexcept {
- return __holds_alternative<__find_exactly_one_t<_Tp, _Types...>::value>(__v);
-}
-
-template <size_t _Ip, class _Vp>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
-constexpr auto&& __generic_get(_Vp&& __v) {
- using __variant_detail::__access::__variant;
- if (!__holds_alternative<_Ip>(__v)) {
- __throw_bad_variant_access();
- }
- return __variant::__get_alt<_Ip>(_VSTD::forward<_Vp>(__v)).__value;
-}
-
-template <size_t _Ip, class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
-constexpr variant_alternative_t<_Ip, variant<_Types...>>& get(
- variant<_Types...>& __v) {
- static_assert(_Ip < sizeof...(_Types));
- static_assert(!is_void_v<variant_alternative_t<_Ip, variant<_Types...>>>);
- return __generic_get<_Ip>(__v);
-}
-
-template <size_t _Ip, class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
-constexpr variant_alternative_t<_Ip, variant<_Types...>>&& get(
- variant<_Types...>&& __v) {
- static_assert(_Ip < sizeof...(_Types));
- static_assert(!is_void_v<variant_alternative_t<_Ip, variant<_Types...>>>);
- return __generic_get<_Ip>(_VSTD::move(__v));
-}
-
-template <size_t _Ip, class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
-constexpr const variant_alternative_t<_Ip, variant<_Types...>>& get(
- const variant<_Types...>& __v) {
- static_assert(_Ip < sizeof...(_Types));
- static_assert(!is_void_v<variant_alternative_t<_Ip, variant<_Types...>>>);
- return __generic_get<_Ip>(__v);
-}
-
-template <size_t _Ip, class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
-constexpr const variant_alternative_t<_Ip, variant<_Types...>>&& get(
- const variant<_Types...>&& __v) {
- static_assert(_Ip < sizeof...(_Types));
- static_assert(!is_void_v<variant_alternative_t<_Ip, variant<_Types...>>>);
- return __generic_get<_Ip>(_VSTD::move(__v));
-}
-
-template <class _Tp, class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
-constexpr _Tp& get(variant<_Types...>& __v) {
- static_assert(!is_void_v<_Tp>);
- return _VSTD::get<__find_exactly_one_t<_Tp, _Types...>::value>(__v);
-}
-
-template <class _Tp, class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
-constexpr _Tp&& get(variant<_Types...>&& __v) {
- static_assert(!is_void_v<_Tp>);
- return _VSTD::get<__find_exactly_one_t<_Tp, _Types...>::value>(
- _VSTD::move(__v));
-}
-
-template <class _Tp, class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
-constexpr const _Tp& get(const variant<_Types...>& __v) {
- static_assert(!is_void_v<_Tp>);
- return _VSTD::get<__find_exactly_one_t<_Tp, _Types...>::value>(__v);
-}
-
-template <class _Tp, class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
-constexpr const _Tp&& get(const variant<_Types...>&& __v) {
- static_assert(!is_void_v<_Tp>);
- return _VSTD::get<__find_exactly_one_t<_Tp, _Types...>::value>(
- _VSTD::move(__v));
-}
-
-template <size_t _Ip, class _Vp>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr auto* __generic_get_if(_Vp* __v) noexcept {
- using __variant_detail::__access::__variant;
- return __v && __holds_alternative<_Ip>(*__v)
- ? _VSTD::addressof(__variant::__get_alt<_Ip>(*__v).__value)
- : nullptr;
-}
-
-template <size_t _Ip, class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr add_pointer_t<variant_alternative_t<_Ip, variant<_Types...>>>
-get_if(variant<_Types...>* __v) noexcept {
- static_assert(_Ip < sizeof...(_Types));
- static_assert(!is_void_v<variant_alternative_t<_Ip, variant<_Types...>>>);
- return __generic_get_if<_Ip>(__v);
-}
-
-template <size_t _Ip, class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr add_pointer_t<const variant_alternative_t<_Ip, variant<_Types...>>>
-get_if(const variant<_Types...>* __v) noexcept {
- static_assert(_Ip < sizeof...(_Types));
- static_assert(!is_void_v<variant_alternative_t<_Ip, variant<_Types...>>>);
- return __generic_get_if<_Ip>(__v);
-}
-
-template <class _Tp, class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr add_pointer_t<_Tp>
-get_if(variant<_Types...>* __v) noexcept {
- static_assert(!is_void_v<_Tp>);
- return _VSTD::get_if<__find_exactly_one_t<_Tp, _Types...>::value>(__v);
-}
-
-template <class _Tp, class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr add_pointer_t<const _Tp>
-get_if(const variant<_Types...>* __v) noexcept {
- static_assert(!is_void_v<_Tp>);
- return _VSTD::get_if<__find_exactly_one_t<_Tp, _Types...>::value>(__v);
-}
-
-template <class _Operator>
-struct __convert_to_bool {
- template <class _T1, class _T2>
- _LIBCPP_INLINE_VISIBILITY constexpr bool operator()(_T1 && __t1, _T2&& __t2) const {
- static_assert(std::is_convertible<decltype(_Operator{}(_VSTD::forward<_T1>(__t1), _VSTD::forward<_T2>(__t2))), bool>::value,
- "the relational operator does not return a type which is implicitly convertible to bool");
- return _Operator{}(_VSTD::forward<_T1>(__t1), _VSTD::forward<_T2>(__t2));
- }
-};
-
-template <class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr bool operator==(const variant<_Types...>& __lhs,
- const variant<_Types...>& __rhs) {
- using __variant_detail::__visitation::__variant;
- if (__lhs.index() != __rhs.index()) return false;
- if (__lhs.valueless_by_exception()) return true;
- return __variant::__visit_value_at(__lhs.index(), __convert_to_bool<equal_to<>>{}, __lhs, __rhs);
-}
-
-template <class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr bool operator!=(const variant<_Types...>& __lhs,
- const variant<_Types...>& __rhs) {
- using __variant_detail::__visitation::__variant;
- if (__lhs.index() != __rhs.index()) return true;
- if (__lhs.valueless_by_exception()) return false;
- return __variant::__visit_value_at(
- __lhs.index(), __convert_to_bool<not_equal_to<>>{}, __lhs, __rhs);
-}
-
-template <class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr bool operator<(const variant<_Types...>& __lhs,
- const variant<_Types...>& __rhs) {
- using __variant_detail::__visitation::__variant;
- if (__rhs.valueless_by_exception()) return false;
- if (__lhs.valueless_by_exception()) return true;
- if (__lhs.index() < __rhs.index()) return true;
- if (__lhs.index() > __rhs.index()) return false;
- return __variant::__visit_value_at(__lhs.index(), __convert_to_bool<less<>>{}, __lhs, __rhs);
-}
-
-template <class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr bool operator>(const variant<_Types...>& __lhs,
- const variant<_Types...>& __rhs) {
- using __variant_detail::__visitation::__variant;
- if (__lhs.valueless_by_exception()) return false;
- if (__rhs.valueless_by_exception()) return true;
- if (__lhs.index() > __rhs.index()) return true;
- if (__lhs.index() < __rhs.index()) return false;
- return __variant::__visit_value_at(__lhs.index(), __convert_to_bool<greater<>>{}, __lhs, __rhs);
-}
-
-template <class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr bool operator<=(const variant<_Types...>& __lhs,
- const variant<_Types...>& __rhs) {
- using __variant_detail::__visitation::__variant;
- if (__lhs.valueless_by_exception()) return true;
- if (__rhs.valueless_by_exception()) return false;
- if (__lhs.index() < __rhs.index()) return true;
- if (__lhs.index() > __rhs.index()) return false;
- return __variant::__visit_value_at(
- __lhs.index(), __convert_to_bool<less_equal<>>{}, __lhs, __rhs);
-}
-
-template <class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr bool operator>=(const variant<_Types...>& __lhs,
- const variant<_Types...>& __rhs) {
- using __variant_detail::__visitation::__variant;
- if (__rhs.valueless_by_exception()) return true;
- if (__lhs.valueless_by_exception()) return false;
- if (__lhs.index() > __rhs.index()) return true;
- if (__lhs.index() < __rhs.index()) return false;
- return __variant::__visit_value_at(
- __lhs.index(), __convert_to_bool<greater_equal<>>{}, __lhs, __rhs);
-}
-
-template <class _Visitor, class... _Vs>
-inline _LIBCPP_INLINE_VISIBILITY
-_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
-constexpr decltype(auto) visit(_Visitor&& __visitor, _Vs&&... __vs) {
- using __variant_detail::__visitation::__variant;
- bool __results[] = {__vs.valueless_by_exception()...};
- for (bool __result : __results) {
- if (__result) {
- __throw_bad_variant_access();
- }
- }
- return __variant::__visit_value(_VSTD::forward<_Visitor>(__visitor),
- _VSTD::forward<_Vs>(__vs)...);
-}
-
-struct _LIBCPP_TEMPLATE_VIS monostate {};
-
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr bool operator<(monostate, monostate) noexcept { return false; }
-
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr bool operator>(monostate, monostate) noexcept { return false; }
-
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr bool operator<=(monostate, monostate) noexcept { return true; }
-
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr bool operator>=(monostate, monostate) noexcept { return true; }
-
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr bool operator==(monostate, monostate) noexcept { return true; }
-
-inline _LIBCPP_INLINE_VISIBILITY
-constexpr bool operator!=(monostate, monostate) noexcept { return false; }
-
-template <class... _Types>
-inline _LIBCPP_INLINE_VISIBILITY
-auto swap(variant<_Types...>& __lhs,
- variant<_Types...>& __rhs) noexcept(noexcept(__lhs.swap(__rhs)))
- -> decltype(__lhs.swap(__rhs)) {
- __lhs.swap(__rhs);
-}
-
-template <class... _Types>
-struct _LIBCPP_TEMPLATE_VIS hash<
- __enable_hash_helper<variant<_Types...>, remove_const_t<_Types>...>> {
- using argument_type = variant<_Types...>;
- using result_type = size_t;
-
- inline _LIBCPP_INLINE_VISIBILITY
- result_type operator()(const argument_type& __v) const {
- using __variant_detail::__visitation::__variant;
- size_t __res =
- __v.valueless_by_exception()
- ? 299792458 // Random value chosen by the universe upon creation
- : __variant::__visit_alt(
- [](const auto& __alt) {
- using __alt_type = __uncvref_t<decltype(__alt)>;
- using __value_type = remove_const_t<
- typename __alt_type::__value_type>;
- return hash<__value_type>{}(__alt.__value);
- },
- __v);
- return __hash_combine(__res, hash<size_t>{}(__v.index()));
- }
-};
-
-template <>
-struct _LIBCPP_TEMPLATE_VIS hash<monostate> {
- using argument_type = monostate;
- using result_type = size_t;
-
- inline _LIBCPP_INLINE_VISIBILITY
- result_type operator()(const argument_type&) const _NOEXCEPT {
- return 66740831; // return a fundamentally attractive random value.
- }
-};
-
-#endif // _LIBCPP_STD_VER > 14
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_VARIANT
diff --git a/lib/libcxx/include/vector b/lib/libcxx/include/vector
deleted file mode 100644
index edb6d3e09f5..00000000000
--- a/lib/libcxx/include/vector
+++ /dev/null
@@ -1,3432 +0,0 @@
-// -*- C++ -*-
-//===------------------------------ vector --------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_VECTOR
-#define _LIBCPP_VECTOR
-
-/*
- vector synopsis
-
-namespace std
-{
-
-template <class T, class Allocator = allocator<T> >
-class vector
-{
-public:
- typedef T value_type;
- typedef Allocator allocator_type;
- typedef typename allocator_type::reference reference;
- typedef typename allocator_type::const_reference const_reference;
- typedef implementation-defined iterator;
- typedef implementation-defined const_iterator;
- typedef typename allocator_type::size_type size_type;
- typedef typename allocator_type::difference_type difference_type;
- typedef typename allocator_type::pointer pointer;
- typedef typename allocator_type::const_pointer const_pointer;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
-
- vector()
- noexcept(is_nothrow_default_constructible<allocator_type>::value);
- explicit vector(const allocator_type&);
- explicit vector(size_type n);
- explicit vector(size_type n, const allocator_type&); // C++14
- vector(size_type n, const value_type& value, const allocator_type& = allocator_type());
- template <class InputIterator>
- vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type());
- vector(const vector& x);
- vector(vector&& x)
- noexcept(is_nothrow_move_constructible<allocator_type>::value);
- vector(initializer_list<value_type> il);
- vector(initializer_list<value_type> il, const allocator_type& a);
- ~vector();
- vector& operator=(const vector& x);
- vector& operator=(vector&& x)
- noexcept(
- allocator_type::propagate_on_container_move_assignment::value ||
- allocator_type::is_always_equal::value); // C++17
- vector& operator=(initializer_list<value_type> il);
- template <class InputIterator>
- void assign(InputIterator first, InputIterator last);
- void assign(size_type n, const value_type& u);
- void assign(initializer_list<value_type> il);
-
- allocator_type get_allocator() const noexcept;
-
- iterator begin() noexcept;
- const_iterator begin() const noexcept;
- iterator end() noexcept;
- const_iterator end() const noexcept;
-
- reverse_iterator rbegin() noexcept;
- const_reverse_iterator rbegin() const noexcept;
- reverse_iterator rend() noexcept;
- const_reverse_iterator rend() const noexcept;
-
- const_iterator cbegin() const noexcept;
- const_iterator cend() const noexcept;
- const_reverse_iterator crbegin() const noexcept;
- const_reverse_iterator crend() const noexcept;
-
- size_type size() const noexcept;
- size_type max_size() const noexcept;
- size_type capacity() const noexcept;
- bool empty() const noexcept;
- void reserve(size_type n);
- void shrink_to_fit() noexcept;
-
- reference operator[](size_type n);
- const_reference operator[](size_type n) const;
- reference at(size_type n);
- const_reference at(size_type n) const;
-
- reference front();
- const_reference front() const;
- reference back();
- const_reference back() const;
-
- value_type* data() noexcept;
- const value_type* data() const noexcept;
-
- void push_back(const value_type& x);
- void push_back(value_type&& x);
- template <class... Args>
- reference emplace_back(Args&&... args); // reference in C++17
- void pop_back();
-
- template <class... Args> iterator emplace(const_iterator position, Args&&... args);
- iterator insert(const_iterator position, const value_type& x);
- iterator insert(const_iterator position, value_type&& x);
- iterator insert(const_iterator position, size_type n, const value_type& x);
- template <class InputIterator>
- iterator insert(const_iterator position, InputIterator first, InputIterator last);
- iterator insert(const_iterator position, initializer_list<value_type> il);
-
- iterator erase(const_iterator position);
- iterator erase(const_iterator first, const_iterator last);
-
- void clear() noexcept;
-
- void resize(size_type sz);
- void resize(size_type sz, const value_type& c);
-
- void swap(vector&)
- noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||
- allocator_traits<allocator_type>::is_always_equal::value); // C++17
-
- bool __invariants() const;
-};
-
-template <class Allocator = allocator<T> >
-class vector<bool, Allocator>
-{
-public:
- typedef bool value_type;
- typedef Allocator allocator_type;
- typedef implementation-defined iterator;
- typedef implementation-defined const_iterator;
- typedef typename allocator_type::size_type size_type;
- typedef typename allocator_type::difference_type difference_type;
- typedef iterator pointer;
- typedef const_iterator const_pointer;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
-
- class reference
- {
- public:
- reference(const reference&) noexcept;
- operator bool() const noexcept;
- reference& operator=(const bool x) noexcept;
- reference& operator=(const reference& x) noexcept;
- iterator operator&() const noexcept;
- void flip() noexcept;
- };
-
- class const_reference
- {
- public:
- const_reference(const reference&) noexcept;
- operator bool() const noexcept;
- const_iterator operator&() const noexcept;
- };
-
- vector()
- noexcept(is_nothrow_default_constructible<allocator_type>::value);
- explicit vector(const allocator_type&);
- explicit vector(size_type n, const allocator_type& a = allocator_type()); // C++14
- vector(size_type n, const value_type& value, const allocator_type& = allocator_type());
- template <class InputIterator>
- vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type());
- vector(const vector& x);
- vector(vector&& x)
- noexcept(is_nothrow_move_constructible<allocator_type>::value);
- vector(initializer_list<value_type> il);
- vector(initializer_list<value_type> il, const allocator_type& a);
- ~vector();
- vector& operator=(const vector& x);
- vector& operator=(vector&& x)
- noexcept(
- allocator_type::propagate_on_container_move_assignment::value ||
- allocator_type::is_always_equal::value); // C++17
- vector& operator=(initializer_list<value_type> il);
- template <class InputIterator>
- void assign(InputIterator first, InputIterator last);
- void assign(size_type n, const value_type& u);
- void assign(initializer_list<value_type> il);
-
- allocator_type get_allocator() const noexcept;
-
- iterator begin() noexcept;
- const_iterator begin() const noexcept;
- iterator end() noexcept;
- const_iterator end() const noexcept;
-
- reverse_iterator rbegin() noexcept;
- const_reverse_iterator rbegin() const noexcept;
- reverse_iterator rend() noexcept;
- const_reverse_iterator rend() const noexcept;
-
- const_iterator cbegin() const noexcept;
- const_iterator cend() const noexcept;
- const_reverse_iterator crbegin() const noexcept;
- const_reverse_iterator crend() const noexcept;
-
- size_type size() const noexcept;
- size_type max_size() const noexcept;
- size_type capacity() const noexcept;
- bool empty() const noexcept;
- void reserve(size_type n);
- void shrink_to_fit() noexcept;
-
- reference operator[](size_type n);
- const_reference operator[](size_type n) const;
- reference at(size_type n);
- const_reference at(size_type n) const;
-
- reference front();
- const_reference front() const;
- reference back();
- const_reference back() const;
-
- void push_back(const value_type& x);
- template <class... Args> reference emplace_back(Args&&... args); // C++14; reference in C++17
- void pop_back();
-
- template <class... Args> iterator emplace(const_iterator position, Args&&... args); // C++14
- iterator insert(const_iterator position, const value_type& x);
- iterator insert(const_iterator position, size_type n, const value_type& x);
- template <class InputIterator>
- iterator insert(const_iterator position, InputIterator first, InputIterator last);
- iterator insert(const_iterator position, initializer_list<value_type> il);
-
- iterator erase(const_iterator position);
- iterator erase(const_iterator first, const_iterator last);
-
- void clear() noexcept;
-
- void resize(size_type sz);
- void resize(size_type sz, value_type x);
-
- void swap(vector&)
- noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||
- allocator_traits<allocator_type>::is_always_equal::value); // C++17
- void flip() noexcept;
-
- bool __invariants() const;
-};
-
-template <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
- vector(InputIterator, InputIterator, Allocator = Allocator())
- -> vector<typename iterator_traits<InputIterator>::value_type, Allocator>;
-
-template <class Allocator> struct hash<std::vector<bool, Allocator>>;
-
-template <class T, class Allocator> bool operator==(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
-template <class T, class Allocator> bool operator< (const vector<T,Allocator>& x, const vector<T,Allocator>& y);
-template <class T, class Allocator> bool operator!=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
-template <class T, class Allocator> bool operator> (const vector<T,Allocator>& x, const vector<T,Allocator>& y);
-template <class T, class Allocator> bool operator>=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
-template <class T, class Allocator> bool operator<=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
-
-template <class T, class Allocator>
-void swap(vector<T,Allocator>& x, vector<T,Allocator>& y)
- noexcept(noexcept(x.swap(y)));
-
-template <class T, class Allocator, class U>
- void erase(vector<T, Allocator>& c, const U& value); // C++20
-template <class T, class Allocator, class Predicate>
- void erase_if(vector<T, Allocator>& c, Predicate pred); // C++20
-
-} // std
-
-*/
-
-#include <__config>
-#include <iosfwd> // for forward declaration of vector
-#include <__bit_reference>
-#include <type_traits>
-#include <climits>
-#include <limits>
-#include <initializer_list>
-#include <memory>
-#include <stdexcept>
-#include <algorithm>
-#include <cstring>
-#include <version>
-#include <__split_buffer>
-#include <__functional_base>
-
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <bool>
-class __vector_base_common
-{
-protected:
- _LIBCPP_INLINE_VISIBILITY __vector_base_common() {}
- _LIBCPP_NORETURN void __throw_length_error() const;
- _LIBCPP_NORETURN void __throw_out_of_range() const;
-};
-
-template <bool __b>
-void
-__vector_base_common<__b>::__throw_length_error() const
-{
- _VSTD::__throw_length_error("vector");
-}
-
-template <bool __b>
-void
-__vector_base_common<__b>::__throw_out_of_range() const
-{
- _VSTD::__throw_out_of_range("vector");
-}
-
-_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __vector_base_common<true>)
-
-template <class _Tp, class _Allocator>
-class __vector_base
- : protected __vector_base_common<true>
-{
-public:
- typedef _Allocator allocator_type;
- typedef allocator_traits<allocator_type> __alloc_traits;
- typedef typename __alloc_traits::size_type size_type;
-protected:
- typedef _Tp value_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename __alloc_traits::difference_type difference_type;
- typedef typename __alloc_traits::pointer pointer;
- typedef typename __alloc_traits::const_pointer const_pointer;
- typedef pointer iterator;
- typedef const_pointer const_iterator;
-
- pointer __begin_;
- pointer __end_;
- __compressed_pair<pointer, allocator_type> __end_cap_;
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type& __alloc() _NOEXCEPT
- {return __end_cap_.second();}
- _LIBCPP_INLINE_VISIBILITY
- const allocator_type& __alloc() const _NOEXCEPT
- {return __end_cap_.second();}
- _LIBCPP_INLINE_VISIBILITY
- pointer& __end_cap() _NOEXCEPT
- {return __end_cap_.first();}
- _LIBCPP_INLINE_VISIBILITY
- const pointer& __end_cap() const _NOEXCEPT
- {return __end_cap_.first();}
-
- _LIBCPP_INLINE_VISIBILITY
- __vector_base()
- _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
- _LIBCPP_INLINE_VISIBILITY __vector_base(const allocator_type& __a);
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY __vector_base(allocator_type&& __a) _NOEXCEPT;
-#endif
- ~__vector_base();
-
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT {__destruct_at_end(__begin_);}
- _LIBCPP_INLINE_VISIBILITY
- size_type capacity() const _NOEXCEPT
- {return static_cast<size_type>(__end_cap() - __begin_);}
-
- _LIBCPP_INLINE_VISIBILITY
- void __destruct_at_end(pointer __new_last) _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __vector_base& __c)
- {__copy_assign_alloc(__c, integral_constant<bool,
- __alloc_traits::propagate_on_container_copy_assignment::value>());}
-
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__vector_base& __c)
- _NOEXCEPT_(
- !__alloc_traits::propagate_on_container_move_assignment::value ||
- is_nothrow_move_assignable<allocator_type>::value)
- {__move_assign_alloc(__c, integral_constant<bool,
- __alloc_traits::propagate_on_container_move_assignment::value>());}
-private:
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __vector_base& __c, true_type)
- {
- if (__alloc() != __c.__alloc())
- {
- clear();
- __alloc_traits::deallocate(__alloc(), __begin_, capacity());
- __begin_ = __end_ = __end_cap() = nullptr;
- }
- __alloc() = __c.__alloc();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __vector_base&, false_type)
- {}
-
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__vector_base& __c, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
- {
- __alloc() = _VSTD::move(__c.__alloc());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__vector_base&, false_type)
- _NOEXCEPT
- {}
-};
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-__vector_base<_Tp, _Allocator>::__destruct_at_end(pointer __new_last) _NOEXCEPT
-{
- pointer __soon_to_be_end = __end_;
- while (__new_last != __soon_to_be_end)
- __alloc_traits::destroy(__alloc(), _VSTD::__to_raw_pointer(--__soon_to_be_end));
- __end_ = __new_last;
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-__vector_base<_Tp, _Allocator>::__vector_base()
- _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
- : __begin_(nullptr),
- __end_(nullptr),
- __end_cap_(nullptr)
-{
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-__vector_base<_Tp, _Allocator>::__vector_base(const allocator_type& __a)
- : __begin_(nullptr),
- __end_(nullptr),
- __end_cap_(nullptr, __a)
-{
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-__vector_base<_Tp, _Allocator>::__vector_base(allocator_type&& __a) _NOEXCEPT
- : __begin_(nullptr),
- __end_(nullptr),
- __end_cap_(nullptr, std::move(__a)) {}
-#endif
-
-template <class _Tp, class _Allocator>
-__vector_base<_Tp, _Allocator>::~__vector_base()
-{
- if (__begin_ != nullptr)
- {
- clear();
- __alloc_traits::deallocate(__alloc(), __begin_, capacity());
- }
-}
-
-template <class _Tp, class _Allocator /* = allocator<_Tp> */>
-class _LIBCPP_TEMPLATE_VIS vector
- : private __vector_base<_Tp, _Allocator>
-{
-private:
- typedef __vector_base<_Tp, _Allocator> __base;
- typedef allocator<_Tp> __default_allocator_type;
-public:
- typedef vector __self;
- typedef _Tp value_type;
- typedef _Allocator allocator_type;
- typedef typename __base::__alloc_traits __alloc_traits;
- typedef typename __base::reference reference;
- typedef typename __base::const_reference const_reference;
- typedef typename __base::size_type size_type;
- typedef typename __base::difference_type difference_type;
- typedef typename __base::pointer pointer;
- typedef typename __base::const_pointer const_pointer;
- typedef __wrap_iter<pointer> iterator;
- typedef __wrap_iter<const_pointer> const_iterator;
- typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
- typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
-
- static_assert((is_same<typename allocator_type::value_type, value_type>::value),
- "Allocator::value_type must be same type as value_type");
-
- _LIBCPP_INLINE_VISIBILITY
- vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- }
- _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a)
-#if _LIBCPP_STD_VER <= 14
- _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
-#else
- _NOEXCEPT
-#endif
- : __base(__a)
- {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- }
- explicit vector(size_type __n);
-#if _LIBCPP_STD_VER > 11
- explicit vector(size_type __n, const allocator_type& __a);
-#endif
- vector(size_type __n, const value_type& __x);
- vector(size_type __n, const value_type& __x, const allocator_type& __a);
- template <class _InputIterator>
- vector(_InputIterator __first,
- typename enable_if<__is_input_iterator <_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value &&
- is_constructible<
- value_type,
- typename iterator_traits<_InputIterator>::reference>::value,
- _InputIterator>::type __last);
- template <class _InputIterator>
- vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
- typename enable_if<__is_input_iterator <_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value &&
- is_constructible<
- value_type,
- typename iterator_traits<_InputIterator>::reference>::value>::type* = 0);
- template <class _ForwardIterator>
- vector(_ForwardIterator __first,
- typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
- is_constructible<
- value_type,
- typename iterator_traits<_ForwardIterator>::reference>::value,
- _ForwardIterator>::type __last);
- template <class _ForwardIterator>
- vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
- typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
- is_constructible<
- value_type,
- typename iterator_traits<_ForwardIterator>::reference>::value>::type* = 0);
-
- _LIBCPP_INLINE_VISIBILITY
- ~vector()
- {
- __annotate_delete();
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__erase_c(this);
-#endif
- }
-
- vector(const vector& __x);
- vector(const vector& __x, const allocator_type& __a);
- _LIBCPP_INLINE_VISIBILITY
- vector& operator=(const vector& __x);
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- vector(initializer_list<value_type> __il);
-
- _LIBCPP_INLINE_VISIBILITY
- vector(initializer_list<value_type> __il, const allocator_type& __a);
-
- _LIBCPP_INLINE_VISIBILITY
- vector(vector&& __x)
-#if _LIBCPP_STD_VER > 14
- _NOEXCEPT;
-#else
- _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- vector(vector&& __x, const allocator_type& __a);
- _LIBCPP_INLINE_VISIBILITY
- vector& operator=(vector&& __x)
- _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
-
- _LIBCPP_INLINE_VISIBILITY
- vector& operator=(initializer_list<value_type> __il)
- {assign(__il.begin(), __il.end()); return *this;}
-
-#endif // !_LIBCPP_CXX03_LANG
-
- template <class _InputIterator>
- typename enable_if
- <
- __is_input_iterator <_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value &&
- is_constructible<
- value_type,
- typename iterator_traits<_InputIterator>::reference>::value,
- void
- >::type
- assign(_InputIterator __first, _InputIterator __last);
- template <class _ForwardIterator>
- typename enable_if
- <
- __is_forward_iterator<_ForwardIterator>::value &&
- is_constructible<
- value_type,
- typename iterator_traits<_ForwardIterator>::reference>::value,
- void
- >::type
- assign(_ForwardIterator __first, _ForwardIterator __last);
-
- void assign(size_type __n, const_reference __u);
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- void assign(initializer_list<value_type> __il)
- {assign(__il.begin(), __il.end());}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const _NOEXCEPT
- {return this->__alloc();}
-
- _LIBCPP_INLINE_VISIBILITY iterator begin() _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY const_iterator begin() const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY iterator end() _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY const_iterator end() const _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rbegin() _NOEXCEPT
- {return reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rbegin() const _NOEXCEPT
- {return const_reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rend() _NOEXCEPT
- {return reverse_iterator(begin());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rend() const _NOEXCEPT
- {return const_reverse_iterator(begin());}
-
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const _NOEXCEPT
- {return begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const _NOEXCEPT
- {return end();}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crbegin() const _NOEXCEPT
- {return rbegin();}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crend() const _NOEXCEPT
- {return rend();}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT
- {return static_cast<size_type>(this->__end_ - this->__begin_);}
- _LIBCPP_INLINE_VISIBILITY
- size_type capacity() const _NOEXCEPT
- {return __base::capacity();}
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const _NOEXCEPT
- {return this->__begin_ == this->__end_;}
- size_type max_size() const _NOEXCEPT;
- void reserve(size_type __n);
- void shrink_to_fit() _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n);
- _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const;
- reference at(size_type __n);
- const_reference at(size_type __n) const;
-
- _LIBCPP_INLINE_VISIBILITY reference front()
- {
- _LIBCPP_ASSERT(!empty(), "front() called for empty vector");
- return *this->__begin_;
- }
- _LIBCPP_INLINE_VISIBILITY const_reference front() const
- {
- _LIBCPP_ASSERT(!empty(), "front() called for empty vector");
- return *this->__begin_;
- }
- _LIBCPP_INLINE_VISIBILITY reference back()
- {
- _LIBCPP_ASSERT(!empty(), "back() called for empty vector");
- return *(this->__end_ - 1);
- }
- _LIBCPP_INLINE_VISIBILITY const_reference back() const
- {
- _LIBCPP_ASSERT(!empty(), "back() called for empty vector");
- return *(this->__end_ - 1);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- value_type* data() _NOEXCEPT
- {return _VSTD::__to_raw_pointer(this->__begin_);}
- _LIBCPP_INLINE_VISIBILITY
- const value_type* data() const _NOEXCEPT
- {return _VSTD::__to_raw_pointer(this->__begin_);}
-
-#ifdef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- void __emplace_back(const value_type& __x) { push_back(__x); }
-#else
- template <class _Arg>
- _LIBCPP_INLINE_VISIBILITY
- void __emplace_back(_Arg&& __arg) {
- emplace_back(_VSTD::forward<_Arg>(__arg));
- }
-#endif
-
- _LIBCPP_INLINE_VISIBILITY void push_back(const_reference __x);
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY void push_back(value_type&& __x);
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
-#if _LIBCPP_STD_VER > 14
- reference emplace_back(_Args&&... __args);
-#else
- void emplace_back(_Args&&... __args);
-#endif
-#endif // !_LIBCPP_CXX03_LANG
-
- _LIBCPP_INLINE_VISIBILITY
- void pop_back();
-
- iterator insert(const_iterator __position, const_reference __x);
-
-#ifndef _LIBCPP_CXX03_LANG
- iterator insert(const_iterator __position, value_type&& __x);
- template <class... _Args>
- iterator emplace(const_iterator __position, _Args&&... __args);
-#endif // !_LIBCPP_CXX03_LANG
-
- iterator insert(const_iterator __position, size_type __n, const_reference __x);
- template <class _InputIterator>
- typename enable_if
- <
- __is_input_iterator <_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value &&
- is_constructible<
- value_type,
- typename iterator_traits<_InputIterator>::reference>::value,
- iterator
- >::type
- insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
- template <class _ForwardIterator>
- typename enable_if
- <
- __is_forward_iterator<_ForwardIterator>::value &&
- is_constructible<
- value_type,
- typename iterator_traits<_ForwardIterator>::reference>::value,
- iterator
- >::type
- insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __position, initializer_list<value_type> __il)
- {return insert(__position, __il.begin(), __il.end());}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
- iterator erase(const_iterator __first, const_iterator __last);
-
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT
- {
- size_type __old_size = size();
- __base::clear();
- __annotate_shrink(__old_size);
- __invalidate_all_iterators();
- }
-
- void resize(size_type __sz);
- void resize(size_type __sz, const_reference __x);
-
- void swap(vector&)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT_DEBUG;
-#else
- _NOEXCEPT_DEBUG_(!__alloc_traits::propagate_on_container_swap::value ||
- __is_nothrow_swappable<allocator_type>::value);
-#endif
-
- bool __invariants() const;
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
-
- bool __dereferenceable(const const_iterator* __i) const;
- bool __decrementable(const const_iterator* __i) const;
- bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
- bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
-
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-
-private:
- _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
- _LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(pointer __new_last);
- void __vallocate(size_type __n);
- void __vdeallocate() _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
- void __construct_at_end(size_type __n);
- _LIBCPP_INLINE_VISIBILITY
- void __construct_at_end(size_type __n, const_reference __x);
- template <class _ForwardIterator>
- typename enable_if
- <
- __is_forward_iterator<_ForwardIterator>::value,
- void
- >::type
- __construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n);
- void __append(size_type __n);
- void __append(size_type __n, const_reference __x);
- _LIBCPP_INLINE_VISIBILITY
- iterator __make_iter(pointer __p) _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- const_iterator __make_iter(const_pointer __p) const _NOEXCEPT;
- void __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v);
- pointer __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p);
- void __move_range(pointer __from_s, pointer __from_e, pointer __to);
- void __move_assign(vector& __c, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
- void __move_assign(vector& __c, false_type)
- _NOEXCEPT_(__alloc_traits::is_always_equal::value);
- _LIBCPP_INLINE_VISIBILITY
- void __destruct_at_end(pointer __new_last) _NOEXCEPT
- {
- __invalidate_iterators_past(__new_last);
- size_type __old_size = size();
- __base::__destruct_at_end(__new_last);
- __annotate_shrink(__old_size);
- }
-
-#ifndef _LIBCPP_CXX03_LANG
- template <class _Up> void __push_back_slow_path(_Up&& __x);
-
- template <class... _Args>
- void __emplace_back_slow_path(_Args&&... __args);
-#else
- template <class _Up> void __push_back_slow_path(_Up& __x);
-#endif
-
- // The following functions are no-ops outside of AddressSanitizer mode.
- // We call annotatations only for the default Allocator because other allocators
- // may not meet the AddressSanitizer alignment constraints.
- // See the documentation for __sanitizer_annotate_contiguous_container for more details.
-#ifndef _LIBCPP_HAS_NO_ASAN
- void __annotate_contiguous_container(const void *__beg, const void *__end,
- const void *__old_mid,
- const void *__new_mid) const
- {
-
- if (__beg && is_same<allocator_type, __default_allocator_type>::value)
- __sanitizer_annotate_contiguous_container(__beg, __end, __old_mid, __new_mid);
- }
-#else
- _LIBCPP_INLINE_VISIBILITY
- void __annotate_contiguous_container(const void*, const void*, const void*,
- const void*) const {}
-#endif
- _LIBCPP_INLINE_VISIBILITY
- void __annotate_new(size_type __current_size) const {
- __annotate_contiguous_container(data(), data() + capacity(),
- data() + capacity(), data() + __current_size);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __annotate_delete() const {
- __annotate_contiguous_container(data(), data() + capacity(),
- data() + size(), data() + capacity());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __annotate_increase(size_type __n) const
- {
- __annotate_contiguous_container(data(), data() + capacity(),
- data() + size(), data() + size() + __n);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __annotate_shrink(size_type __old_size) const
- {
- __annotate_contiguous_container(data(), data() + capacity(),
- data() + __old_size, data() + size());
- }
-#ifndef _LIBCPP_HAS_NO_ASAN
- // The annotation for size increase should happen before the actual increase,
- // but if an exception is thrown after that the annotation has to be undone.
- struct __RAII_IncreaseAnnotator {
- __RAII_IncreaseAnnotator(const vector &__v, size_type __n = 1)
- : __commit(false), __v(__v), __old_size(__v.size() + __n) {
- __v.__annotate_increase(__n);
- }
- void __done() { __commit = true; }
- ~__RAII_IncreaseAnnotator() {
- if (__commit) return;
- __v.__annotate_shrink(__old_size);
- }
- bool __commit;
- const vector &__v;
- size_type __old_size;
- };
-#else
- struct __RAII_IncreaseAnnotator {
- _LIBCPP_INLINE_VISIBILITY
- __RAII_IncreaseAnnotator(const vector &, size_type = 1) {}
- _LIBCPP_INLINE_VISIBILITY void __done() {}
- };
-#endif
-
-};
-
-#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-template<class _InputIterator,
- class _Alloc = typename std::allocator<typename iterator_traits<_InputIterator>::value_type>,
- class = typename enable_if<__is_allocator<_Alloc>::value, void>::type
- >
-vector(_InputIterator, _InputIterator)
- -> vector<typename iterator_traits<_InputIterator>::value_type, _Alloc>;
-
-template<class _InputIterator,
- class _Alloc,
- class = typename enable_if<__is_allocator<_Alloc>::value, void>::type
- >
-vector(_InputIterator, _InputIterator, _Alloc)
- -> vector<typename iterator_traits<_InputIterator>::value_type, _Alloc>;
-#endif
-
-template <class _Tp, class _Allocator>
-void
-vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v)
-{
- __annotate_delete();
- __alloc_traits::__construct_backward(this->__alloc(), this->__begin_, this->__end_, __v.__begin_);
- _VSTD::swap(this->__begin_, __v.__begin_);
- _VSTD::swap(this->__end_, __v.__end_);
- _VSTD::swap(this->__end_cap(), __v.__end_cap());
- __v.__first_ = __v.__begin_;
- __annotate_new(size());
- __invalidate_all_iterators();
-}
-
-template <class _Tp, class _Allocator>
-typename vector<_Tp, _Allocator>::pointer
-vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p)
-{
- __annotate_delete();
- pointer __r = __v.__begin_;
- __alloc_traits::__construct_backward(this->__alloc(), this->__begin_, __p, __v.__begin_);
- __alloc_traits::__construct_forward(this->__alloc(), __p, this->__end_, __v.__end_);
- _VSTD::swap(this->__begin_, __v.__begin_);
- _VSTD::swap(this->__end_, __v.__end_);
- _VSTD::swap(this->__end_cap(), __v.__end_cap());
- __v.__first_ = __v.__begin_;
- __annotate_new(size());
- __invalidate_all_iterators();
- return __r;
-}
-
-// Allocate space for __n objects
-// throws length_error if __n > max_size()
-// throws (probably bad_alloc) if memory run out
-// Precondition: __begin_ == __end_ == __end_cap() == 0
-// Precondition: __n > 0
-// Postcondition: capacity() == __n
-// Postcondition: size() == 0
-template <class _Tp, class _Allocator>
-void
-vector<_Tp, _Allocator>::__vallocate(size_type __n)
-{
- if (__n > max_size())
- this->__throw_length_error();
- this->__begin_ = this->__end_ = __alloc_traits::allocate(this->__alloc(), __n);
- this->__end_cap() = this->__begin_ + __n;
- __annotate_new(0);
-}
-
-template <class _Tp, class _Allocator>
-void
-vector<_Tp, _Allocator>::__vdeallocate() _NOEXCEPT
-{
- if (this->__begin_ != nullptr)
- {
- clear();
- __alloc_traits::deallocate(this->__alloc(), this->__begin_, capacity());
- this->__begin_ = this->__end_ = this->__end_cap() = nullptr;
- }
-}
-
-template <class _Tp, class _Allocator>
-typename vector<_Tp, _Allocator>::size_type
-vector<_Tp, _Allocator>::max_size() const _NOEXCEPT
-{
- return _VSTD::min<size_type>(__alloc_traits::max_size(this->__alloc()),
- numeric_limits<difference_type>::max());
-}
-
-// Precondition: __new_size > capacity()
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-typename vector<_Tp, _Allocator>::size_type
-vector<_Tp, _Allocator>::__recommend(size_type __new_size) const
-{
- const size_type __ms = max_size();
- if (__new_size > __ms)
- this->__throw_length_error();
- const size_type __cap = capacity();
- if (__cap >= __ms / 2)
- return __ms;
- return _VSTD::max<size_type>(2*__cap, __new_size);
-}
-
-// Default constructs __n objects starting at __end_
-// throws if construction throws
-// Precondition: __n > 0
-// Precondition: size() + __n <= capacity()
-// Postcondition: size() == size() + __n
-template <class _Tp, class _Allocator>
-void
-vector<_Tp, _Allocator>::__construct_at_end(size_type __n)
-{
- allocator_type& __a = this->__alloc();
- do
- {
- __RAII_IncreaseAnnotator __annotator(*this);
- __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_));
- ++this->__end_;
- --__n;
- __annotator.__done();
- } while (__n > 0);
-}
-
-// Copy constructs __n objects starting at __end_ from __x
-// throws if construction throws
-// Precondition: __n > 0
-// Precondition: size() + __n <= capacity()
-// Postcondition: size() == old size() + __n
-// Postcondition: [i] == __x for all i in [size() - __n, __n)
-template <class _Tp, class _Allocator>
-inline
-void
-vector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x)
-{
- allocator_type& __a = this->__alloc();
- do
- {
- __RAII_IncreaseAnnotator __annotator(*this);
- __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), __x);
- ++this->__end_;
- --__n;
- __annotator.__done();
- } while (__n > 0);
-}
-
-template <class _Tp, class _Allocator>
-template <class _ForwardIterator>
-typename enable_if
-<
- __is_forward_iterator<_ForwardIterator>::value,
- void
->::type
-vector<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n)
-{
- allocator_type& __a = this->__alloc();
- __RAII_IncreaseAnnotator __annotator(*this, __n);
- __alloc_traits::__construct_range_forward(__a, __first, __last, this->__end_);
- __annotator.__done();
-}
-
-// Default constructs __n objects starting at __end_
-// throws if construction throws
-// Postcondition: size() == size() + __n
-// Exception safety: strong.
-template <class _Tp, class _Allocator>
-void
-vector<_Tp, _Allocator>::__append(size_type __n)
-{
- if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
- this->__construct_at_end(__n);
- else
- {
- allocator_type& __a = this->__alloc();
- __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
- __v.__construct_at_end(__n);
- __swap_out_circular_buffer(__v);
- }
-}
-
-// Default constructs __n objects starting at __end_
-// throws if construction throws
-// Postcondition: size() == size() + __n
-// Exception safety: strong.
-template <class _Tp, class _Allocator>
-void
-vector<_Tp, _Allocator>::__append(size_type __n, const_reference __x)
-{
- if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
- this->__construct_at_end(__n, __x);
- else
- {
- allocator_type& __a = this->__alloc();
- __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
- __v.__construct_at_end(__n, __x);
- __swap_out_circular_buffer(__v);
- }
-}
-
-template <class _Tp, class _Allocator>
-vector<_Tp, _Allocator>::vector(size_type __n)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- if (__n > 0)
- {
- __vallocate(__n);
- __construct_at_end(__n);
- }
-}
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp, class _Allocator>
-vector<_Tp, _Allocator>::vector(size_type __n, const allocator_type& __a)
- : __base(__a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- if (__n > 0)
- {
- __vallocate(__n);
- __construct_at_end(__n);
- }
-}
-#endif
-
-template <class _Tp, class _Allocator>
-vector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- if (__n > 0)
- {
- __vallocate(__n);
- __construct_at_end(__n, __x);
- }
-}
-
-template <class _Tp, class _Allocator>
-vector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
- : __base(__a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- if (__n > 0)
- {
- __vallocate(__n);
- __construct_at_end(__n, __x);
- }
-}
-
-template <class _Tp, class _Allocator>
-template <class _InputIterator>
-vector<_Tp, _Allocator>::vector(_InputIterator __first,
- typename enable_if<__is_input_iterator <_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value &&
- is_constructible<
- value_type,
- typename iterator_traits<_InputIterator>::reference>::value,
- _InputIterator>::type __last)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- for (; __first != __last; ++__first)
- __emplace_back(*__first);
-}
-
-template <class _Tp, class _Allocator>
-template <class _InputIterator>
-vector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
- typename enable_if<__is_input_iterator <_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value &&
- is_constructible<
- value_type,
- typename iterator_traits<_InputIterator>::reference>::value>::type*)
- : __base(__a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- for (; __first != __last; ++__first)
- __emplace_back(*__first);
-}
-
-template <class _Tp, class _Allocator>
-template <class _ForwardIterator>
-vector<_Tp, _Allocator>::vector(_ForwardIterator __first,
- typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
- is_constructible<
- value_type,
- typename iterator_traits<_ForwardIterator>::reference>::value,
- _ForwardIterator>::type __last)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
- if (__n > 0)
- {
- __vallocate(__n);
- __construct_at_end(__first, __last, __n);
- }
-}
-
-template <class _Tp, class _Allocator>
-template <class _ForwardIterator>
-vector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
- typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
- is_constructible<
- value_type,
- typename iterator_traits<_ForwardIterator>::reference>::value>::type*)
- : __base(__a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
- if (__n > 0)
- {
- __vallocate(__n);
- __construct_at_end(__first, __last, __n);
- }
-}
-
-template <class _Tp, class _Allocator>
-vector<_Tp, _Allocator>::vector(const vector& __x)
- : __base(__alloc_traits::select_on_container_copy_construction(__x.__alloc()))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- size_type __n = __x.size();
- if (__n > 0)
- {
- __vallocate(__n);
- __construct_at_end(__x.__begin_, __x.__end_, __n);
- }
-}
-
-template <class _Tp, class _Allocator>
-vector<_Tp, _Allocator>::vector(const vector& __x, const allocator_type& __a)
- : __base(__a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- size_type __n = __x.size();
- if (__n > 0)
- {
- __vallocate(__n);
- __construct_at_end(__x.__begin_, __x.__end_, __n);
- }
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-vector<_Tp, _Allocator>::vector(vector&& __x)
-#if _LIBCPP_STD_VER > 14
- _NOEXCEPT
-#else
- _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
-#endif
- : __base(_VSTD::move(__x.__alloc()))
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
- __get_db()->swap(this, &__x);
-#endif
- this->__begin_ = __x.__begin_;
- this->__end_ = __x.__end_;
- this->__end_cap() = __x.__end_cap();
- __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-vector<_Tp, _Allocator>::vector(vector&& __x, const allocator_type& __a)
- : __base(__a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- if (__a == __x.__alloc())
- {
- this->__begin_ = __x.__begin_;
- this->__end_ = __x.__end_;
- this->__end_cap() = __x.__end_cap();
- __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->swap(this, &__x);
-#endif
- }
- else
- {
- typedef move_iterator<iterator> _Ip;
- assign(_Ip(__x.begin()), _Ip(__x.end()));
- }
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- if (__il.size() > 0)
- {
- __vallocate(__il.size());
- __construct_at_end(__il.begin(), __il.end(), __il.size());
- }
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
- : __base(__a)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__insert_c(this);
-#endif
- if (__il.size() > 0)
- {
- __vallocate(__il.size());
- __construct_at_end(__il.begin(), __il.end(), __il.size());
- }
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-vector<_Tp, _Allocator>&
-vector<_Tp, _Allocator>::operator=(vector&& __x)
- _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
-{
- __move_assign(__x, integral_constant<bool,
- __alloc_traits::propagate_on_container_move_assignment::value>());
- return *this;
-}
-
-template <class _Tp, class _Allocator>
-void
-vector<_Tp, _Allocator>::__move_assign(vector& __c, false_type)
- _NOEXCEPT_(__alloc_traits::is_always_equal::value)
-{
- if (__base::__alloc() != __c.__alloc())
- {
- typedef move_iterator<iterator> _Ip;
- assign(_Ip(__c.begin()), _Ip(__c.end()));
- }
- else
- __move_assign(__c, true_type());
-}
-
-template <class _Tp, class _Allocator>
-void
-vector<_Tp, _Allocator>::__move_assign(vector& __c, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
-{
- __vdeallocate();
- __base::__move_assign_alloc(__c); // this can throw
- this->__begin_ = __c.__begin_;
- this->__end_ = __c.__end_;
- this->__end_cap() = __c.__end_cap();
- __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr;
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->swap(this, &__c);
-#endif
-}
-
-#endif // !_LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-vector<_Tp, _Allocator>&
-vector<_Tp, _Allocator>::operator=(const vector& __x)
-{
- if (this != &__x)
- {
- __base::__copy_assign_alloc(__x);
- assign(__x.__begin_, __x.__end_);
- }
- return *this;
-}
-
-template <class _Tp, class _Allocator>
-template <class _InputIterator>
-typename enable_if
-<
- __is_input_iterator <_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value &&
- is_constructible<
- _Tp,
- typename iterator_traits<_InputIterator>::reference>::value,
- void
->::type
-vector<_Tp, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
-{
- clear();
- for (; __first != __last; ++__first)
- __emplace_back(*__first);
-}
-
-template <class _Tp, class _Allocator>
-template <class _ForwardIterator>
-typename enable_if
-<
- __is_forward_iterator<_ForwardIterator>::value &&
- is_constructible<
- _Tp,
- typename iterator_traits<_ForwardIterator>::reference>::value,
- void
->::type
-vector<_Tp, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
-{
- size_type __new_size = static_cast<size_type>(_VSTD::distance(__first, __last));
- if (__new_size <= capacity())
- {
- _ForwardIterator __mid = __last;
- bool __growing = false;
- if (__new_size > size())
- {
- __growing = true;
- __mid = __first;
- _VSTD::advance(__mid, size());
- }
- pointer __m = _VSTD::copy(__first, __mid, this->__begin_);
- if (__growing)
- __construct_at_end(__mid, __last, __new_size - size());
- else
- this->__destruct_at_end(__m);
- }
- else
- {
- __vdeallocate();
- __vallocate(__recommend(__new_size));
- __construct_at_end(__first, __last, __new_size);
- }
- __invalidate_all_iterators();
-}
-
-template <class _Tp, class _Allocator>
-void
-vector<_Tp, _Allocator>::assign(size_type __n, const_reference __u)
-{
- if (__n <= capacity())
- {
- size_type __s = size();
- _VSTD::fill_n(this->__begin_, _VSTD::min(__n, __s), __u);
- if (__n > __s)
- __construct_at_end(__n - __s, __u);
- else
- this->__destruct_at_end(this->__begin_ + __n);
- }
- else
- {
- __vdeallocate();
- __vallocate(__recommend(static_cast<size_type>(__n)));
- __construct_at_end(__n, __u);
- }
- __invalidate_all_iterators();
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-typename vector<_Tp, _Allocator>::iterator
-vector<_Tp, _Allocator>::__make_iter(pointer __p) _NOEXCEPT
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return iterator(this, __p);
-#else
- return iterator(__p);
-#endif
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-typename vector<_Tp, _Allocator>::const_iterator
-vector<_Tp, _Allocator>::__make_iter(const_pointer __p) const _NOEXCEPT
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- return const_iterator(this, __p);
-#else
- return const_iterator(__p);
-#endif
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-typename vector<_Tp, _Allocator>::iterator
-vector<_Tp, _Allocator>::begin() _NOEXCEPT
-{
- return __make_iter(this->__begin_);
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-typename vector<_Tp, _Allocator>::const_iterator
-vector<_Tp, _Allocator>::begin() const _NOEXCEPT
-{
- return __make_iter(this->__begin_);
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-typename vector<_Tp, _Allocator>::iterator
-vector<_Tp, _Allocator>::end() _NOEXCEPT
-{
- return __make_iter(this->__end_);
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-typename vector<_Tp, _Allocator>::const_iterator
-vector<_Tp, _Allocator>::end() const _NOEXCEPT
-{
- return __make_iter(this->__end_);
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-typename vector<_Tp, _Allocator>::reference
-vector<_Tp, _Allocator>::operator[](size_type __n)
-{
- _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
- return this->__begin_[__n];
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-typename vector<_Tp, _Allocator>::const_reference
-vector<_Tp, _Allocator>::operator[](size_type __n) const
-{
- _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
- return this->__begin_[__n];
-}
-
-template <class _Tp, class _Allocator>
-typename vector<_Tp, _Allocator>::reference
-vector<_Tp, _Allocator>::at(size_type __n)
-{
- if (__n >= size())
- this->__throw_out_of_range();
- return this->__begin_[__n];
-}
-
-template <class _Tp, class _Allocator>
-typename vector<_Tp, _Allocator>::const_reference
-vector<_Tp, _Allocator>::at(size_type __n) const
-{
- if (__n >= size())
- this->__throw_out_of_range();
- return this->__begin_[__n];
-}
-
-template <class _Tp, class _Allocator>
-void
-vector<_Tp, _Allocator>::reserve(size_type __n)
-{
- if (__n > capacity())
- {
- allocator_type& __a = this->__alloc();
- __split_buffer<value_type, allocator_type&> __v(__n, size(), __a);
- __swap_out_circular_buffer(__v);
- }
-}
-
-template <class _Tp, class _Allocator>
-void
-vector<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
-{
- if (capacity() > size())
- {
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- allocator_type& __a = this->__alloc();
- __split_buffer<value_type, allocator_type&> __v(size(), size(), __a);
- __swap_out_circular_buffer(__v);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
-}
-
-template <class _Tp, class _Allocator>
-template <class _Up>
-void
-#ifndef _LIBCPP_CXX03_LANG
-vector<_Tp, _Allocator>::__push_back_slow_path(_Up&& __x)
-#else
-vector<_Tp, _Allocator>::__push_back_slow_path(_Up& __x)
-#endif
-{
- allocator_type& __a = this->__alloc();
- __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
- // __v.push_back(_VSTD::forward<_Up>(__x));
- __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Up>(__x));
- __v.__end_++;
- __swap_out_circular_buffer(__v);
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-vector<_Tp, _Allocator>::push_back(const_reference __x)
-{
- if (this->__end_ != this->__end_cap())
- {
- __RAII_IncreaseAnnotator __annotator(*this);
- __alloc_traits::construct(this->__alloc(),
- _VSTD::__to_raw_pointer(this->__end_), __x);
- __annotator.__done();
- ++this->__end_;
- }
- else
- __push_back_slow_path(__x);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-vector<_Tp, _Allocator>::push_back(value_type&& __x)
-{
- if (this->__end_ < this->__end_cap())
- {
- __RAII_IncreaseAnnotator __annotator(*this);
- __alloc_traits::construct(this->__alloc(),
- _VSTD::__to_raw_pointer(this->__end_),
- _VSTD::move(__x));
- __annotator.__done();
- ++this->__end_;
- }
- else
- __push_back_slow_path(_VSTD::move(__x));
-}
-
-template <class _Tp, class _Allocator>
-template <class... _Args>
-void
-vector<_Tp, _Allocator>::__emplace_back_slow_path(_Args&&... __args)
-{
- allocator_type& __a = this->__alloc();
- __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
-// __v.emplace_back(_VSTD::forward<_Args>(__args)...);
- __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Args>(__args)...);
- __v.__end_++;
- __swap_out_circular_buffer(__v);
-}
-
-template <class _Tp, class _Allocator>
-template <class... _Args>
-inline
-#if _LIBCPP_STD_VER > 14
-typename vector<_Tp, _Allocator>::reference
-#else
-void
-#endif
-vector<_Tp, _Allocator>::emplace_back(_Args&&... __args)
-{
- if (this->__end_ < this->__end_cap())
- {
- __RAII_IncreaseAnnotator __annotator(*this);
- __alloc_traits::construct(this->__alloc(),
- _VSTD::__to_raw_pointer(this->__end_),
- _VSTD::forward<_Args>(__args)...);
- __annotator.__done();
- ++this->__end_;
- }
- else
- __emplace_back_slow_path(_VSTD::forward<_Args>(__args)...);
-#if _LIBCPP_STD_VER > 14
- return this->back();
-#endif
-}
-
-#endif // !_LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Allocator>
-inline
-void
-vector<_Tp, _Allocator>::pop_back()
-{
- _LIBCPP_ASSERT(!empty(), "vector::pop_back called for empty vector");
- this->__destruct_at_end(this->__end_ - 1);
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-typename vector<_Tp, _Allocator>::iterator
-vector<_Tp, _Allocator>::erase(const_iterator __position)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
- "vector::erase(iterator) called with an iterator not"
- " referring to this vector");
-#endif
- _LIBCPP_ASSERT(__position != end(),
- "vector::erase(iterator) called with a non-dereferenceable iterator");
- difference_type __ps = __position - cbegin();
- pointer __p = this->__begin_ + __ps;
- this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p));
- this->__invalidate_iterators_past(__p-1);
- iterator __r = __make_iter(__p);
- return __r;
-}
-
-template <class _Tp, class _Allocator>
-typename vector<_Tp, _Allocator>::iterator
-vector<_Tp, _Allocator>::erase(const_iterator __first, const_iterator __last)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
- "vector::erase(iterator, iterator) called with an iterator not"
- " referring to this vector");
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__last) == this,
- "vector::erase(iterator, iterator) called with an iterator not"
- " referring to this vector");
-#endif
- _LIBCPP_ASSERT(__first <= __last, "vector::erase(first, last) called with invalid range");
- pointer __p = this->__begin_ + (__first - begin());
- if (__first != __last) {
- this->__destruct_at_end(_VSTD::move(__p + (__last - __first), this->__end_, __p));
- this->__invalidate_iterators_past(__p - 1);
- }
- iterator __r = __make_iter(__p);
- return __r;
-}
-
-template <class _Tp, class _Allocator>
-void
-vector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to)
-{
- pointer __old_last = this->__end_;
- difference_type __n = __old_last - __to;
- for (pointer __i = __from_s + __n; __i < __from_e; ++__i, ++this->__end_)
- __alloc_traits::construct(this->__alloc(),
- _VSTD::__to_raw_pointer(this->__end_),
- _VSTD::move(*__i));
- _VSTD::move_backward(__from_s, __from_s + __n, __old_last);
-}
-
-template <class _Tp, class _Allocator>
-typename vector<_Tp, _Allocator>::iterator
-vector<_Tp, _Allocator>::insert(const_iterator __position, const_reference __x)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
- "vector::insert(iterator, x) called with an iterator not"
- " referring to this vector");
-#endif
- pointer __p = this->__begin_ + (__position - begin());
- if (this->__end_ < this->__end_cap())
- {
- __RAII_IncreaseAnnotator __annotator(*this);
- if (__p == this->__end_)
- {
- __alloc_traits::construct(this->__alloc(),
- _VSTD::__to_raw_pointer(this->__end_), __x);
- ++this->__end_;
- }
- else
- {
- __move_range(__p, this->__end_, __p + 1);
- const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
- if (__p <= __xr && __xr < this->__end_)
- ++__xr;
- *__p = *__xr;
- }
- __annotator.__done();
- }
- else
- {
- allocator_type& __a = this->__alloc();
- __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
- __v.push_back(__x);
- __p = __swap_out_circular_buffer(__v, __p);
- }
- return __make_iter(__p);
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Allocator>
-typename vector<_Tp, _Allocator>::iterator
-vector<_Tp, _Allocator>::insert(const_iterator __position, value_type&& __x)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
- "vector::insert(iterator, x) called with an iterator not"
- " referring to this vector");
-#endif
- pointer __p = this->__begin_ + (__position - begin());
- if (this->__end_ < this->__end_cap())
- {
- __RAII_IncreaseAnnotator __annotator(*this);
- if (__p == this->__end_)
- {
- __alloc_traits::construct(this->__alloc(),
- _VSTD::__to_raw_pointer(this->__end_),
- _VSTD::move(__x));
- ++this->__end_;
- }
- else
- {
- __move_range(__p, this->__end_, __p + 1);
- *__p = _VSTD::move(__x);
- }
- __annotator.__done();
- }
- else
- {
- allocator_type& __a = this->__alloc();
- __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
- __v.push_back(_VSTD::move(__x));
- __p = __swap_out_circular_buffer(__v, __p);
- }
- return __make_iter(__p);
-}
-
-template <class _Tp, class _Allocator>
-template <class... _Args>
-typename vector<_Tp, _Allocator>::iterator
-vector<_Tp, _Allocator>::emplace(const_iterator __position, _Args&&... __args)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
- "vector::emplace(iterator, x) called with an iterator not"
- " referring to this vector");
-#endif
- pointer __p = this->__begin_ + (__position - begin());
- if (this->__end_ < this->__end_cap())
- {
- __RAII_IncreaseAnnotator __annotator(*this);
- if (__p == this->__end_)
- {
- __alloc_traits::construct(this->__alloc(),
- _VSTD::__to_raw_pointer(this->__end_),
- _VSTD::forward<_Args>(__args)...);
- ++this->__end_;
- }
- else
- {
- __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...);
- __move_range(__p, this->__end_, __p + 1);
- *__p = _VSTD::move(__tmp.get());
- }
- __annotator.__done();
- }
- else
- {
- allocator_type& __a = this->__alloc();
- __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
- __v.emplace_back(_VSTD::forward<_Args>(__args)...);
- __p = __swap_out_circular_buffer(__v, __p);
- }
- return __make_iter(__p);
-}
-
-#endif // !_LIBCPP_CXX03_LANG
-
-template <class _Tp, class _Allocator>
-typename vector<_Tp, _Allocator>::iterator
-vector<_Tp, _Allocator>::insert(const_iterator __position, size_type __n, const_reference __x)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
- "vector::insert(iterator, n, x) called with an iterator not"
- " referring to this vector");
-#endif
- pointer __p = this->__begin_ + (__position - begin());
- if (__n > 0)
- {
- if (__n <= static_cast<size_type>(this->__end_cap() - this->__end_))
- {
- size_type __old_n = __n;
- pointer __old_last = this->__end_;
- if (__n > static_cast<size_type>(this->__end_ - __p))
- {
- size_type __cx = __n - (this->__end_ - __p);
- __construct_at_end(__cx, __x);
- __n -= __cx;
- }
- if (__n > 0)
- {
- __RAII_IncreaseAnnotator __annotator(*this, __n);
- __move_range(__p, __old_last, __p + __old_n);
- __annotator.__done();
- const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
- if (__p <= __xr && __xr < this->__end_)
- __xr += __old_n;
- _VSTD::fill_n(__p, __n, *__xr);
- }
- }
- else
- {
- allocator_type& __a = this->__alloc();
- __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
- __v.__construct_at_end(__n, __x);
- __p = __swap_out_circular_buffer(__v, __p);
- }
- }
- return __make_iter(__p);
-}
-
-template <class _Tp, class _Allocator>
-template <class _InputIterator>
-typename enable_if
-<
- __is_input_iterator <_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value &&
- is_constructible<
- _Tp,
- typename iterator_traits<_InputIterator>::reference>::value,
- typename vector<_Tp, _Allocator>::iterator
->::type
-vector<_Tp, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
- "vector::insert(iterator, range) called with an iterator not"
- " referring to this vector");
-#endif
- difference_type __off = __position - begin();
- pointer __p = this->__begin_ + __off;
- allocator_type& __a = this->__alloc();
- pointer __old_last = this->__end_;
- for (; this->__end_ != this->__end_cap() && __first != __last; ++__first)
- {
- __RAII_IncreaseAnnotator __annotator(*this);
- __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_),
- *__first);
- ++this->__end_;
- __annotator.__done();
- }
- __split_buffer<value_type, allocator_type&> __v(__a);
- if (__first != __last)
- {
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- __v.__construct_at_end(__first, __last);
- difference_type __old_size = __old_last - this->__begin_;
- difference_type __old_p = __p - this->__begin_;
- reserve(__recommend(size() + __v.size()));
- __p = this->__begin_ + __old_p;
- __old_last = this->__begin_ + __old_size;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- erase(__make_iter(__old_last), end());
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
- __p = _VSTD::rotate(__p, __old_last, this->__end_);
- insert(__make_iter(__p), make_move_iterator(__v.begin()),
- make_move_iterator(__v.end()));
- return begin() + __off;
-}
-
-template <class _Tp, class _Allocator>
-template <class _ForwardIterator>
-typename enable_if
-<
- __is_forward_iterator<_ForwardIterator>::value &&
- is_constructible<
- _Tp,
- typename iterator_traits<_ForwardIterator>::reference>::value,
- typename vector<_Tp, _Allocator>::iterator
->::type
-vector<_Tp, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
- "vector::insert(iterator, range) called with an iterator not"
- " referring to this vector");
-#endif
- pointer __p = this->__begin_ + (__position - begin());
- difference_type __n = _VSTD::distance(__first, __last);
- if (__n > 0)
- {
- if (__n <= this->__end_cap() - this->__end_)
- {
- size_type __old_n = __n;
- pointer __old_last = this->__end_;
- _ForwardIterator __m = __last;
- difference_type __dx = this->__end_ - __p;
- if (__n > __dx)
- {
- __m = __first;
- difference_type __diff = this->__end_ - __p;
- _VSTD::advance(__m, __diff);
- __construct_at_end(__m, __last, __n - __diff);
- __n = __dx;
- }
- if (__n > 0)
- {
- __RAII_IncreaseAnnotator __annotator(*this, __n);
- __move_range(__p, __old_last, __p + __old_n);
- __annotator.__done();
- _VSTD::copy(__first, __m, __p);
- }
- }
- else
- {
- allocator_type& __a = this->__alloc();
- __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
- __v.__construct_at_end(__first, __last);
- __p = __swap_out_circular_buffer(__v, __p);
- }
- }
- return __make_iter(__p);
-}
-
-template <class _Tp, class _Allocator>
-void
-vector<_Tp, _Allocator>::resize(size_type __sz)
-{
- size_type __cs = size();
- if (__cs < __sz)
- this->__append(__sz - __cs);
- else if (__cs > __sz)
- this->__destruct_at_end(this->__begin_ + __sz);
-}
-
-template <class _Tp, class _Allocator>
-void
-vector<_Tp, _Allocator>::resize(size_type __sz, const_reference __x)
-{
- size_type __cs = size();
- if (__cs < __sz)
- this->__append(__sz - __cs, __x);
- else if (__cs > __sz)
- this->__destruct_at_end(this->__begin_ + __sz);
-}
-
-template <class _Tp, class _Allocator>
-void
-vector<_Tp, _Allocator>::swap(vector& __x)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT_DEBUG
-#else
- _NOEXCEPT_DEBUG_(!__alloc_traits::propagate_on_container_swap::value ||
- __is_nothrow_swappable<allocator_type>::value)
-#endif
-{
- _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value ||
- this->__alloc() == __x.__alloc(),
- "vector::swap: Either propagate_on_container_swap must be true"
- " or the allocators must compare equal");
- _VSTD::swap(this->__begin_, __x.__begin_);
- _VSTD::swap(this->__end_, __x.__end_);
- _VSTD::swap(this->__end_cap(), __x.__end_cap());
- __swap_allocator(this->__alloc(), __x.__alloc(),
- integral_constant<bool,__alloc_traits::propagate_on_container_swap::value>());
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->swap(this, &__x);
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-}
-
-template <class _Tp, class _Allocator>
-bool
-vector<_Tp, _Allocator>::__invariants() const
-{
- if (this->__begin_ == nullptr)
- {
- if (this->__end_ != nullptr || this->__end_cap() != nullptr)
- return false;
- }
- else
- {
- if (this->__begin_ > this->__end_)
- return false;
- if (this->__begin_ == this->__end_cap())
- return false;
- if (this->__end_ > this->__end_cap())
- return false;
- }
- return true;
-}
-
-#if _LIBCPP_DEBUG_LEVEL >= 2
-
-template <class _Tp, class _Allocator>
-bool
-vector<_Tp, _Allocator>::__dereferenceable(const const_iterator* __i) const
-{
- return this->__begin_ <= __i->base() && __i->base() < this->__end_;
-}
-
-template <class _Tp, class _Allocator>
-bool
-vector<_Tp, _Allocator>::__decrementable(const const_iterator* __i) const
-{
- return this->__begin_ < __i->base() && __i->base() <= this->__end_;
-}
-
-template <class _Tp, class _Allocator>
-bool
-vector<_Tp, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
-{
- const_pointer __p = __i->base() + __n;
- return this->__begin_ <= __p && __p <= this->__end_;
-}
-
-template <class _Tp, class _Allocator>
-bool
-vector<_Tp, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
-{
- const_pointer __p = __i->base() + __n;
- return this->__begin_ <= __p && __p < this->__end_;
-}
-
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-vector<_Tp, _Allocator>::__invalidate_all_iterators()
-{
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __get_db()->__invalidate_all(this);
-#endif // _LIBCPP_DEBUG_LEVEL >= 2
-}
-
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-vector<_Tp, _Allocator>::__invalidate_iterators_past(pointer __new_last) {
-#if _LIBCPP_DEBUG_LEVEL >= 2
- __c_node* __c = __get_db()->__find_c_and_lock(this);
- for (__i_node** __p = __c->end_; __p != __c->beg_; ) {
- --__p;
- const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
- if (__i->base() > __new_last) {
- (*__p)->__c_ = nullptr;
- if (--__c->end_ != __p)
- memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
- }
- }
- __get_db()->unlock();
-#else
- ((void)__new_last);
-#endif
-}
-
-// vector<bool>
-
-template <class _Allocator> class vector<bool, _Allocator>;
-
-template <class _Allocator> struct hash<vector<bool, _Allocator> >;
-
-template <class _Allocator>
-struct __has_storage_type<vector<bool, _Allocator> >
-{
- static const bool value = true;
-};
-
-template <class _Allocator>
-class _LIBCPP_TEMPLATE_VIS vector<bool, _Allocator>
- : private __vector_base_common<true>
-{
-public:
- typedef vector __self;
- typedef bool value_type;
- typedef _Allocator allocator_type;
- typedef allocator_traits<allocator_type> __alloc_traits;
- typedef typename __alloc_traits::size_type size_type;
- typedef typename __alloc_traits::difference_type difference_type;
- typedef size_type __storage_type;
- typedef __bit_iterator<vector, false> pointer;
- typedef __bit_iterator<vector, true> const_pointer;
- typedef pointer iterator;
- typedef const_pointer const_iterator;
- typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
- typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
-
-private:
- typedef typename __rebind_alloc_helper<__alloc_traits, __storage_type>::type __storage_allocator;
- typedef allocator_traits<__storage_allocator> __storage_traits;
- typedef typename __storage_traits::pointer __storage_pointer;
- typedef typename __storage_traits::const_pointer __const_storage_pointer;
-
- __storage_pointer __begin_;
- size_type __size_;
- __compressed_pair<size_type, __storage_allocator> __cap_alloc_;
-public:
- typedef __bit_reference<vector> reference;
- typedef __bit_const_reference<vector> const_reference;
-private:
- _LIBCPP_INLINE_VISIBILITY
- size_type& __cap() _NOEXCEPT
- {return __cap_alloc_.first();}
- _LIBCPP_INLINE_VISIBILITY
- const size_type& __cap() const _NOEXCEPT
- {return __cap_alloc_.first();}
- _LIBCPP_INLINE_VISIBILITY
- __storage_allocator& __alloc() _NOEXCEPT
- {return __cap_alloc_.second();}
- _LIBCPP_INLINE_VISIBILITY
- const __storage_allocator& __alloc() const _NOEXCEPT
- {return __cap_alloc_.second();}
-
- static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
-
- _LIBCPP_INLINE_VISIBILITY
- static size_type __internal_cap_to_external(size_type __n) _NOEXCEPT
- {return __n * __bits_per_word;}
- _LIBCPP_INLINE_VISIBILITY
- static size_type __external_cap_to_internal(size_type __n) _NOEXCEPT
- {return (__n - 1) / __bits_per_word + 1;}
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
-
- _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a)
-#if _LIBCPP_STD_VER <= 14
- _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value);
-#else
- _NOEXCEPT;
-#endif
- ~vector();
- explicit vector(size_type __n);
-#if _LIBCPP_STD_VER > 11
- explicit vector(size_type __n, const allocator_type& __a);
-#endif
- vector(size_type __n, const value_type& __v);
- vector(size_type __n, const value_type& __v, const allocator_type& __a);
- template <class _InputIterator>
- vector(_InputIterator __first, _InputIterator __last,
- typename enable_if<__is_input_iterator <_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value>::type* = 0);
- template <class _InputIterator>
- vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
- typename enable_if<__is_input_iterator <_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value>::type* = 0);
- template <class _ForwardIterator>
- vector(_ForwardIterator __first, _ForwardIterator __last,
- typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
- template <class _ForwardIterator>
- vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
- typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
-
- vector(const vector& __v);
- vector(const vector& __v, const allocator_type& __a);
- vector& operator=(const vector& __v);
-
-#ifndef _LIBCPP_CXX03_LANG
- vector(initializer_list<value_type> __il);
- vector(initializer_list<value_type> __il, const allocator_type& __a);
-
- _LIBCPP_INLINE_VISIBILITY
- vector(vector&& __v)
-#if _LIBCPP_STD_VER > 14
- _NOEXCEPT;
-#else
- _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
-#endif
- vector(vector&& __v, const allocator_type& __a);
- _LIBCPP_INLINE_VISIBILITY
- vector& operator=(vector&& __v)
- _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
-
- _LIBCPP_INLINE_VISIBILITY
- vector& operator=(initializer_list<value_type> __il)
- {assign(__il.begin(), __il.end()); return *this;}
-
-#endif // !_LIBCPP_CXX03_LANG
-
- template <class _InputIterator>
- typename enable_if
- <
- __is_input_iterator<_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value,
- void
- >::type
- assign(_InputIterator __first, _InputIterator __last);
- template <class _ForwardIterator>
- typename enable_if
- <
- __is_forward_iterator<_ForwardIterator>::value,
- void
- >::type
- assign(_ForwardIterator __first, _ForwardIterator __last);
-
- void assign(size_type __n, const value_type& __x);
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- void assign(initializer_list<value_type> __il)
- {assign(__il.begin(), __il.end());}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY allocator_type get_allocator() const _NOEXCEPT
- {return allocator_type(this->__alloc());}
-
- size_type max_size() const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- size_type capacity() const _NOEXCEPT
- {return __internal_cap_to_external(__cap());}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT
- {return __size_;}
- _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
- bool empty() const _NOEXCEPT
- {return __size_ == 0;}
- void reserve(size_type __n);
- void shrink_to_fit() _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT
- {return __make_iter(0);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT
- {return __make_iter(0);}
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT
- {return __make_iter(__size_);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT
- {return __make_iter(__size_);}
-
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rbegin() _NOEXCEPT
- {return reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rbegin() const _NOEXCEPT
- {return const_reverse_iterator(end());}
- _LIBCPP_INLINE_VISIBILITY
- reverse_iterator rend() _NOEXCEPT
- {return reverse_iterator(begin());}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator rend() const _NOEXCEPT
- {return const_reverse_iterator(begin());}
-
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const _NOEXCEPT
- {return __make_iter(0);}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const _NOEXCEPT
- {return __make_iter(__size_);}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crbegin() const _NOEXCEPT
- {return rbegin();}
- _LIBCPP_INLINE_VISIBILITY
- const_reverse_iterator crend() const _NOEXCEPT
- {return rend();}
-
- _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __make_ref(__n);}
- _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __make_ref(__n);}
- reference at(size_type __n);
- const_reference at(size_type __n) const;
-
- _LIBCPP_INLINE_VISIBILITY reference front() {return __make_ref(0);}
- _LIBCPP_INLINE_VISIBILITY const_reference front() const {return __make_ref(0);}
- _LIBCPP_INLINE_VISIBILITY reference back() {return __make_ref(__size_ - 1);}
- _LIBCPP_INLINE_VISIBILITY const_reference back() const {return __make_ref(__size_ - 1);}
-
- void push_back(const value_type& __x);
-#if _LIBCPP_STD_VER > 11
- template <class... _Args>
-#if _LIBCPP_STD_VER > 14
- _LIBCPP_INLINE_VISIBILITY reference emplace_back(_Args&&... __args)
-#else
- _LIBCPP_INLINE_VISIBILITY void emplace_back(_Args&&... __args)
-#endif
- {
- push_back ( value_type ( _VSTD::forward<_Args>(__args)... ));
-#if _LIBCPP_STD_VER > 14
- return this->back();
-#endif
- }
-#endif
-
- _LIBCPP_INLINE_VISIBILITY void pop_back() {--__size_;}
-
-#if _LIBCPP_STD_VER > 11
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY iterator emplace(const_iterator position, _Args&&... __args)
- { return insert ( position, value_type ( _VSTD::forward<_Args>(__args)... )); }
-#endif
-
- iterator insert(const_iterator __position, const value_type& __x);
- iterator insert(const_iterator __position, size_type __n, const value_type& __x);
- iterator insert(const_iterator __position, size_type __n, const_reference __x);
- template <class _InputIterator>
- typename enable_if
- <
- __is_input_iterator <_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value,
- iterator
- >::type
- insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
- template <class _ForwardIterator>
- typename enable_if
- <
- __is_forward_iterator<_ForwardIterator>::value,
- iterator
- >::type
- insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
-
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_INLINE_VISIBILITY
- iterator insert(const_iterator __position, initializer_list<value_type> __il)
- {return insert(__position, __il.begin(), __il.end());}
-#endif
-
- _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
- iterator erase(const_iterator __first, const_iterator __last);
-
- _LIBCPP_INLINE_VISIBILITY
- void clear() _NOEXCEPT {__size_ = 0;}
-
- void swap(vector&)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT;
-#else
- _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
- __is_nothrow_swappable<allocator_type>::value);
-#endif
- static void swap(reference __x, reference __y) _NOEXCEPT { _VSTD::swap(__x, __y); }
-
- void resize(size_type __sz, value_type __x = false);
- void flip() _NOEXCEPT;
-
- bool __invariants() const;
-
-private:
- _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
- void __vallocate(size_type __n);
- void __vdeallocate() _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- static size_type __align_it(size_type __new_size) _NOEXCEPT
- {return __new_size + (__bits_per_word-1) & ~((size_type)__bits_per_word-1);}
- _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
- _LIBCPP_INLINE_VISIBILITY void __construct_at_end(size_type __n, bool __x);
- template <class _ForwardIterator>
- typename enable_if
- <
- __is_forward_iterator<_ForwardIterator>::value,
- void
- >::type
- __construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
- void __append(size_type __n, const_reference __x);
- _LIBCPP_INLINE_VISIBILITY
- reference __make_ref(size_type __pos) _NOEXCEPT
- {return reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
- _LIBCPP_INLINE_VISIBILITY
- const_reference __make_ref(size_type __pos) const _NOEXCEPT
- {return const_reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
- _LIBCPP_INLINE_VISIBILITY
- iterator __make_iter(size_type __pos) _NOEXCEPT
- {return iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator __make_iter(size_type __pos) const _NOEXCEPT
- {return const_iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
- _LIBCPP_INLINE_VISIBILITY
- iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT
- {return begin() + (__p - cbegin());}
-
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const vector& __v)
- {__copy_assign_alloc(__v, integral_constant<bool,
- __storage_traits::propagate_on_container_copy_assignment::value>());}
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const vector& __c, true_type)
- {
- if (__alloc() != __c.__alloc())
- __vdeallocate();
- __alloc() = __c.__alloc();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const vector&, false_type)
- {}
-
- void __move_assign(vector& __c, false_type);
- void __move_assign(vector& __c, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(vector& __c)
- _NOEXCEPT_(
- !__storage_traits::propagate_on_container_move_assignment::value ||
- is_nothrow_move_assignable<allocator_type>::value)
- {__move_assign_alloc(__c, integral_constant<bool,
- __storage_traits::propagate_on_container_move_assignment::value>());}
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(vector& __c, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
- {
- __alloc() = _VSTD::move(__c.__alloc());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(vector&, false_type)
- _NOEXCEPT
- {}
-
- size_t __hash_code() const _NOEXCEPT;
-
- friend class __bit_reference<vector>;
- friend class __bit_const_reference<vector>;
- friend class __bit_iterator<vector, false>;
- friend class __bit_iterator<vector, true>;
- friend struct __bit_array<vector>;
- friend struct _LIBCPP_TEMPLATE_VIS hash<vector>;
-};
-
-template <class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-vector<bool, _Allocator>::__invalidate_all_iterators()
-{
-}
-
-// Allocate space for __n objects
-// throws length_error if __n > max_size()
-// throws (probably bad_alloc) if memory run out
-// Precondition: __begin_ == __end_ == __cap() == 0
-// Precondition: __n > 0
-// Postcondition: capacity() == __n
-// Postcondition: size() == 0
-template <class _Allocator>
-void
-vector<bool, _Allocator>::__vallocate(size_type __n)
-{
- if (__n > max_size())
- this->__throw_length_error();
- __n = __external_cap_to_internal(__n);
- this->__begin_ = __storage_traits::allocate(this->__alloc(), __n);
- this->__size_ = 0;
- this->__cap() = __n;
-}
-
-template <class _Allocator>
-void
-vector<bool, _Allocator>::__vdeallocate() _NOEXCEPT
-{
- if (this->__begin_ != nullptr)
- {
- __storage_traits::deallocate(this->__alloc(), this->__begin_, __cap());
- __invalidate_all_iterators();
- this->__begin_ = nullptr;
- this->__size_ = this->__cap() = 0;
- }
-}
-
-template <class _Allocator>
-typename vector<bool, _Allocator>::size_type
-vector<bool, _Allocator>::max_size() const _NOEXCEPT
-{
- size_type __amax = __storage_traits::max_size(__alloc());
- size_type __nmax = numeric_limits<size_type>::max() / 2; // end() >= begin(), always
- if (__nmax / __bits_per_word <= __amax)
- return __nmax;
- return __internal_cap_to_external(__amax);
-}
-
-// Precondition: __new_size > capacity()
-template <class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-typename vector<bool, _Allocator>::size_type
-vector<bool, _Allocator>::__recommend(size_type __new_size) const
-{
- const size_type __ms = max_size();
- if (__new_size > __ms)
- this->__throw_length_error();
- const size_type __cap = capacity();
- if (__cap >= __ms / 2)
- return __ms;
- return _VSTD::max(2*__cap, __align_it(__new_size));
-}
-
-// Default constructs __n objects starting at __end_
-// Precondition: __n > 0
-// Precondition: size() + __n <= capacity()
-// Postcondition: size() == size() + __n
-template <class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-vector<bool, _Allocator>::__construct_at_end(size_type __n, bool __x)
-{
- size_type __old_size = this->__size_;
- this->__size_ += __n;
- if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word))
- {
- if (this->__size_ <= __bits_per_word)
- this->__begin_[0] = __storage_type(0);
- else
- this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0);
- }
- _VSTD::fill_n(__make_iter(__old_size), __n, __x);
-}
-
-template <class _Allocator>
-template <class _ForwardIterator>
-typename enable_if
-<
- __is_forward_iterator<_ForwardIterator>::value,
- void
->::type
-vector<bool, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last)
-{
- size_type __old_size = this->__size_;
- this->__size_ += _VSTD::distance(__first, __last);
- if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word))
- {
- if (this->__size_ <= __bits_per_word)
- this->__begin_[0] = __storage_type(0);
- else
- this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0);
- }
- _VSTD::copy(__first, __last, __make_iter(__old_size));
-}
-
-template <class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-vector<bool, _Allocator>::vector()
- _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
- : __begin_(nullptr),
- __size_(0),
- __cap_alloc_(0)
-{
-}
-
-template <class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-vector<bool, _Allocator>::vector(const allocator_type& __a)
-#if _LIBCPP_STD_VER <= 14
- _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
-#else
- _NOEXCEPT
-#endif
- : __begin_(nullptr),
- __size_(0),
- __cap_alloc_(0, static_cast<__storage_allocator>(__a))
-{
-}
-
-template <class _Allocator>
-vector<bool, _Allocator>::vector(size_type __n)
- : __begin_(nullptr),
- __size_(0),
- __cap_alloc_(0)
-{
- if (__n > 0)
- {
- __vallocate(__n);
- __construct_at_end(__n, false);
- }
-}
-
-#if _LIBCPP_STD_VER > 11
-template <class _Allocator>
-vector<bool, _Allocator>::vector(size_type __n, const allocator_type& __a)
- : __begin_(nullptr),
- __size_(0),
- __cap_alloc_(0, static_cast<__storage_allocator>(__a))
-{
- if (__n > 0)
- {
- __vallocate(__n);
- __construct_at_end(__n, false);
- }
-}
-#endif
-
-template <class _Allocator>
-vector<bool, _Allocator>::vector(size_type __n, const value_type& __x)
- : __begin_(nullptr),
- __size_(0),
- __cap_alloc_(0)
-{
- if (__n > 0)
- {
- __vallocate(__n);
- __construct_at_end(__n, __x);
- }
-}
-
-template <class _Allocator>
-vector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
- : __begin_(nullptr),
- __size_(0),
- __cap_alloc_(0, static_cast<__storage_allocator>(__a))
-{
- if (__n > 0)
- {
- __vallocate(__n);
- __construct_at_end(__n, __x);
- }
-}
-
-template <class _Allocator>
-template <class _InputIterator>
-vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last,
- typename enable_if<__is_input_iterator <_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value>::type*)
- : __begin_(nullptr),
- __size_(0),
- __cap_alloc_(0)
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (; __first != __last; ++__first)
- push_back(*__first);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- if (__begin_ != nullptr)
- __storage_traits::deallocate(__alloc(), __begin_, __cap());
- __invalidate_all_iterators();
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
-}
-
-template <class _Allocator>
-template <class _InputIterator>
-vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
- typename enable_if<__is_input_iterator <_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value>::type*)
- : __begin_(nullptr),
- __size_(0),
- __cap_alloc_(0, static_cast<__storage_allocator>(__a))
-{
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (; __first != __last; ++__first)
- push_back(*__first);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- if (__begin_ != nullptr)
- __storage_traits::deallocate(__alloc(), __begin_, __cap());
- __invalidate_all_iterators();
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
-}
-
-template <class _Allocator>
-template <class _ForwardIterator>
-vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last,
- typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
- : __begin_(nullptr),
- __size_(0),
- __cap_alloc_(0)
-{
- size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
- if (__n > 0)
- {
- __vallocate(__n);
- __construct_at_end(__first, __last);
- }
-}
-
-template <class _Allocator>
-template <class _ForwardIterator>
-vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
- typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
- : __begin_(nullptr),
- __size_(0),
- __cap_alloc_(0, static_cast<__storage_allocator>(__a))
-{
- size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
- if (__n > 0)
- {
- __vallocate(__n);
- __construct_at_end(__first, __last);
- }
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Allocator>
-vector<bool, _Allocator>::vector(initializer_list<value_type> __il)
- : __begin_(nullptr),
- __size_(0),
- __cap_alloc_(0)
-{
- size_type __n = static_cast<size_type>(__il.size());
- if (__n > 0)
- {
- __vallocate(__n);
- __construct_at_end(__il.begin(), __il.end());
- }
-}
-
-template <class _Allocator>
-vector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
- : __begin_(nullptr),
- __size_(0),
- __cap_alloc_(0, static_cast<__storage_allocator>(__a))
-{
- size_type __n = static_cast<size_type>(__il.size());
- if (__n > 0)
- {
- __vallocate(__n);
- __construct_at_end(__il.begin(), __il.end());
- }
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-template <class _Allocator>
-vector<bool, _Allocator>::~vector()
-{
- if (__begin_ != nullptr)
- __storage_traits::deallocate(__alloc(), __begin_, __cap());
- __invalidate_all_iterators();
-}
-
-template <class _Allocator>
-vector<bool, _Allocator>::vector(const vector& __v)
- : __begin_(nullptr),
- __size_(0),
- __cap_alloc_(0, __storage_traits::select_on_container_copy_construction(__v.__alloc()))
-{
- if (__v.size() > 0)
- {
- __vallocate(__v.size());
- __construct_at_end(__v.begin(), __v.end());
- }
-}
-
-template <class _Allocator>
-vector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a)
- : __begin_(nullptr),
- __size_(0),
- __cap_alloc_(0, __a)
-{
- if (__v.size() > 0)
- {
- __vallocate(__v.size());
- __construct_at_end(__v.begin(), __v.end());
- }
-}
-
-template <class _Allocator>
-vector<bool, _Allocator>&
-vector<bool, _Allocator>::operator=(const vector& __v)
-{
- if (this != &__v)
- {
- __copy_assign_alloc(__v);
- if (__v.__size_)
- {
- if (__v.__size_ > capacity())
- {
- __vdeallocate();
- __vallocate(__v.__size_);
- }
- _VSTD::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_);
- }
- __size_ = __v.__size_;
- }
- return *this;
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-
-template <class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY vector<bool, _Allocator>::vector(vector&& __v)
-#if _LIBCPP_STD_VER > 14
- _NOEXCEPT
-#else
- _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
-#endif
- : __begin_(__v.__begin_),
- __size_(__v.__size_),
- __cap_alloc_(std::move(__v.__cap_alloc_)) {
- __v.__begin_ = nullptr;
- __v.__size_ = 0;
- __v.__cap() = 0;
-}
-
-template <class _Allocator>
-vector<bool, _Allocator>::vector(vector&& __v, const allocator_type& __a)
- : __begin_(nullptr),
- __size_(0),
- __cap_alloc_(0, __a)
-{
- if (__a == allocator_type(__v.__alloc()))
- {
- this->__begin_ = __v.__begin_;
- this->__size_ = __v.__size_;
- this->__cap() = __v.__cap();
- __v.__begin_ = nullptr;
- __v.__cap() = __v.__size_ = 0;
- }
- else if (__v.size() > 0)
- {
- __vallocate(__v.size());
- __construct_at_end(__v.begin(), __v.end());
- }
-}
-
-template <class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-vector<bool, _Allocator>&
-vector<bool, _Allocator>::operator=(vector&& __v)
- _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
-{
- __move_assign(__v, integral_constant<bool,
- __storage_traits::propagate_on_container_move_assignment::value>());
- return *this;
-}
-
-template <class _Allocator>
-void
-vector<bool, _Allocator>::__move_assign(vector& __c, false_type)
-{
- if (__alloc() != __c.__alloc())
- assign(__c.begin(), __c.end());
- else
- __move_assign(__c, true_type());
-}
-
-template <class _Allocator>
-void
-vector<bool, _Allocator>::__move_assign(vector& __c, true_type)
- _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
-{
- __vdeallocate();
- __move_assign_alloc(__c);
- this->__begin_ = __c.__begin_;
- this->__size_ = __c.__size_;
- this->__cap() = __c.__cap();
- __c.__begin_ = nullptr;
- __c.__cap() = __c.__size_ = 0;
-}
-
-#endif // !_LIBCPP_CXX03_LANG
-
-template <class _Allocator>
-void
-vector<bool, _Allocator>::assign(size_type __n, const value_type& __x)
-{
- __size_ = 0;
- if (__n > 0)
- {
- size_type __c = capacity();
- if (__n <= __c)
- __size_ = __n;
- else
- {
- vector __v(__alloc());
- __v.reserve(__recommend(__n));
- __v.__size_ = __n;
- swap(__v);
- }
- _VSTD::fill_n(begin(), __n, __x);
- }
- __invalidate_all_iterators();
-}
-
-template <class _Allocator>
-template <class _InputIterator>
-typename enable_if
-<
- __is_input_iterator<_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value,
- void
->::type
-vector<bool, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
-{
- clear();
- for (; __first != __last; ++__first)
- push_back(*__first);
-}
-
-template <class _Allocator>
-template <class _ForwardIterator>
-typename enable_if
-<
- __is_forward_iterator<_ForwardIterator>::value,
- void
->::type
-vector<bool, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
-{
- clear();
- difference_type __ns = _VSTD::distance(__first, __last);
- _LIBCPP_ASSERT(__ns >= 0, "invalid range specified");
- const size_t __n = static_cast<size_type>(__ns);
- if (__n)
- {
- if (__n > capacity())
- {
- __vdeallocate();
- __vallocate(__n);
- }
- __construct_at_end(__first, __last);
- }
-}
-
-template <class _Allocator>
-void
-vector<bool, _Allocator>::reserve(size_type __n)
-{
- if (__n > capacity())
- {
- vector __v(this->__alloc());
- __v.__vallocate(__n);
- __v.__construct_at_end(this->begin(), this->end());
- swap(__v);
- __invalidate_all_iterators();
- }
-}
-
-template <class _Allocator>
-void
-vector<bool, _Allocator>::shrink_to_fit() _NOEXCEPT
-{
- if (__external_cap_to_internal(size()) > __cap())
- {
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- vector(*this, allocator_type(__alloc())).swap(*this);
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
-}
-
-template <class _Allocator>
-typename vector<bool, _Allocator>::reference
-vector<bool, _Allocator>::at(size_type __n)
-{
- if (__n >= size())
- this->__throw_out_of_range();
- return (*this)[__n];
-}
-
-template <class _Allocator>
-typename vector<bool, _Allocator>::const_reference
-vector<bool, _Allocator>::at(size_type __n) const
-{
- if (__n >= size())
- this->__throw_out_of_range();
- return (*this)[__n];
-}
-
-template <class _Allocator>
-void
-vector<bool, _Allocator>::push_back(const value_type& __x)
-{
- if (this->__size_ == this->capacity())
- reserve(__recommend(this->__size_ + 1));
- ++this->__size_;
- back() = __x;
-}
-
-template <class _Allocator>
-typename vector<bool, _Allocator>::iterator
-vector<bool, _Allocator>::insert(const_iterator __position, const value_type& __x)
-{
- iterator __r;
- if (size() < capacity())
- {
- const_iterator __old_end = end();
- ++__size_;
- _VSTD::copy_backward(__position, __old_end, end());
- __r = __const_iterator_cast(__position);
- }
- else
- {
- vector __v(__alloc());
- __v.reserve(__recommend(__size_ + 1));
- __v.__size_ = __size_ + 1;
- __r = _VSTD::copy(cbegin(), __position, __v.begin());
- _VSTD::copy_backward(__position, cend(), __v.end());
- swap(__v);
- }
- *__r = __x;
- return __r;
-}
-
-template <class _Allocator>
-typename vector<bool, _Allocator>::iterator
-vector<bool, _Allocator>::insert(const_iterator __position, size_type __n, const value_type& __x)
-{
- iterator __r;
- size_type __c = capacity();
- if (__n <= __c && size() <= __c - __n)
- {
- const_iterator __old_end = end();
- __size_ += __n;
- _VSTD::copy_backward(__position, __old_end, end());
- __r = __const_iterator_cast(__position);
- }
- else
- {
- vector __v(__alloc());
- __v.reserve(__recommend(__size_ + __n));
- __v.__size_ = __size_ + __n;
- __r = _VSTD::copy(cbegin(), __position, __v.begin());
- _VSTD::copy_backward(__position, cend(), __v.end());
- swap(__v);
- }
- _VSTD::fill_n(__r, __n, __x);
- return __r;
-}
-
-template <class _Allocator>
-template <class _InputIterator>
-typename enable_if
-<
- __is_input_iterator <_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value,
- typename vector<bool, _Allocator>::iterator
->::type
-vector<bool, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
-{
- difference_type __off = __position - begin();
- iterator __p = __const_iterator_cast(__position);
- iterator __old_end = end();
- for (; size() != capacity() && __first != __last; ++__first)
- {
- ++this->__size_;
- back() = *__first;
- }
- vector __v(__alloc());
- if (__first != __last)
- {
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- __v.assign(__first, __last);
- difference_type __old_size = static_cast<difference_type>(__old_end - begin());
- difference_type __old_p = __p - begin();
- reserve(__recommend(size() + __v.size()));
- __p = begin() + __old_p;
- __old_end = begin() + __old_size;
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- erase(__old_end, end());
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- }
- __p = _VSTD::rotate(__p, __old_end, end());
- insert(__p, __v.begin(), __v.end());
- return begin() + __off;
-}
-
-template <class _Allocator>
-template <class _ForwardIterator>
-typename enable_if
-<
- __is_forward_iterator<_ForwardIterator>::value,
- typename vector<bool, _Allocator>::iterator
->::type
-vector<bool, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
-{
- const difference_type __n_signed = _VSTD::distance(__first, __last);
- _LIBCPP_ASSERT(__n_signed >= 0, "invalid range specified");
- const size_type __n = static_cast<size_type>(__n_signed);
- iterator __r;
- size_type __c = capacity();
- if (__n <= __c && size() <= __c - __n)
- {
- const_iterator __old_end = end();
- __size_ += __n;
- _VSTD::copy_backward(__position, __old_end, end());
- __r = __const_iterator_cast(__position);
- }
- else
- {
- vector __v(__alloc());
- __v.reserve(__recommend(__size_ + __n));
- __v.__size_ = __size_ + __n;
- __r = _VSTD::copy(cbegin(), __position, __v.begin());
- _VSTD::copy_backward(__position, cend(), __v.end());
- swap(__v);
- }
- _VSTD::copy(__first, __last, __r);
- return __r;
-}
-
-template <class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-typename vector<bool, _Allocator>::iterator
-vector<bool, _Allocator>::erase(const_iterator __position)
-{
- iterator __r = __const_iterator_cast(__position);
- _VSTD::copy(__position + 1, this->cend(), __r);
- --__size_;
- return __r;
-}
-
-template <class _Allocator>
-typename vector<bool, _Allocator>::iterator
-vector<bool, _Allocator>::erase(const_iterator __first, const_iterator __last)
-{
- iterator __r = __const_iterator_cast(__first);
- difference_type __d = __last - __first;
- _VSTD::copy(__last, this->cend(), __r);
- __size_ -= __d;
- return __r;
-}
-
-template <class _Allocator>
-void
-vector<bool, _Allocator>::swap(vector& __x)
-#if _LIBCPP_STD_VER >= 14
- _NOEXCEPT
-#else
- _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
- __is_nothrow_swappable<allocator_type>::value)
-#endif
-{
- _VSTD::swap(this->__begin_, __x.__begin_);
- _VSTD::swap(this->__size_, __x.__size_);
- _VSTD::swap(this->__cap(), __x.__cap());
- __swap_allocator(this->__alloc(), __x.__alloc(),
- integral_constant<bool, __alloc_traits::propagate_on_container_swap::value>());
-}
-
-template <class _Allocator>
-void
-vector<bool, _Allocator>::resize(size_type __sz, value_type __x)
-{
- size_type __cs = size();
- if (__cs < __sz)
- {
- iterator __r;
- size_type __c = capacity();
- size_type __n = __sz - __cs;
- if (__n <= __c && __cs <= __c - __n)
- {
- __r = end();
- __size_ += __n;
- }
- else
- {
- vector __v(__alloc());
- __v.reserve(__recommend(__size_ + __n));
- __v.__size_ = __size_ + __n;
- __r = _VSTD::copy(cbegin(), cend(), __v.begin());
- swap(__v);
- }
- _VSTD::fill_n(__r, __n, __x);
- }
- else
- __size_ = __sz;
-}
-
-template <class _Allocator>
-void
-vector<bool, _Allocator>::flip() _NOEXCEPT
-{
- // do middle whole words
- size_type __n = __size_;
- __storage_pointer __p = __begin_;
- for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
- *__p = ~*__p;
- // do last partial word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __storage_type __b = *__p & __m;
- *__p &= ~__m;
- *__p |= ~__b & __m;
- }
-}
-
-template <class _Allocator>
-bool
-vector<bool, _Allocator>::__invariants() const
-{
- if (this->__begin_ == nullptr)
- {
- if (this->__size_ != 0 || this->__cap() != 0)
- return false;
- }
- else
- {
- if (this->__cap() == 0)
- return false;
- if (this->__size_ > this->capacity())
- return false;
- }
- return true;
-}
-
-template <class _Allocator>
-size_t
-vector<bool, _Allocator>::__hash_code() const _NOEXCEPT
-{
- size_t __h = 0;
- // do middle whole words
- size_type __n = __size_;
- __storage_pointer __p = __begin_;
- for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
- __h ^= *__p;
- // do last partial word
- if (__n > 0)
- {
- const __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __h ^= *__p & __m;
- }
- return __h;
-}
-
-template <class _Allocator>
-struct _LIBCPP_TEMPLATE_VIS hash<vector<bool, _Allocator> >
- : public unary_function<vector<bool, _Allocator>, size_t>
-{
- _LIBCPP_INLINE_VISIBILITY
- size_t operator()(const vector<bool, _Allocator>& __vec) const _NOEXCEPT
- {return __vec.__hash_code();}
-};
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
-{
- const typename vector<_Tp, _Allocator>::size_type __sz = __x.size();
- return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
-{
- return !(__x == __y);
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator< (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
-{
- return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator> (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
-{
- return __y < __x;
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator>=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
-{
- return !(__x < __y);
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator<=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
-{
- return !(__y < __x);
-}
-
-template <class _Tp, class _Allocator>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(vector<_Tp, _Allocator>& __x, vector<_Tp, _Allocator>& __y)
- _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
-{
- __x.swap(__y);
-}
-
-#if _LIBCPP_STD_VER > 17
-template <class _Tp, class _Allocator, class _Up>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase(vector<_Tp, _Allocator>& __c, const _Up& __v)
-{ __c.erase(_VSTD::remove(__c.begin(), __c.end(), __v), __c.end()); }
-
-template <class _Tp, class _Allocator, class _Predicate>
-inline _LIBCPP_INLINE_VISIBILITY
-void erase_if(vector<_Tp, _Allocator>& __c, _Predicate __pred)
-{ __c.erase(_VSTD::remove_if(__c.begin(), __c.end(), __pred), __c.end()); }
-#endif
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP_VECTOR
diff --git a/lib/libcxx/include/version b/lib/libcxx/include/version
deleted file mode 100644
index e37afc44860..00000000000
--- a/lib/libcxx/include/version
+++ /dev/null
@@ -1,232 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- version ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_VERSIONH
-#define _LIBCPP_VERSIONH
-
-/*
- version synopsis
-
-Macro name Value Headers
-__cpp_lib_addressof_constexpr 201603L <memory>
-__cpp_lib_allocator_traits_is_always_equal 201411L <memory> <scoped_allocator> <string>
- <deque> <forward_list> <list>
- <vector> <map> <set>
- <unordered_map> <unordered_set>
-__cpp_lib_any 201606L <any>
-__cpp_lib_apply 201603L <tuple>
-__cpp_lib_array_constexpr 201603L <iterator> <array>
-__cpp_lib_as_const 201510L <utility>
-__cpp_lib_atomic_is_always_lock_free 201603L <atomic>
-__cpp_lib_atomic_ref 201806L <atomic>
-__cpp_lib_bind_front 201811L <functional>
-__cpp_lib_bit_cast 201806L <bit>
-__cpp_lib_bool_constant 201505L <type_traits>
-__cpp_lib_boyer_moore_searcher 201603L <functional>
-__cpp_lib_byte 201603L <cstddef>
-__cpp_lib_char8_t 201811L <atomic> <filesystem> <istream>
- <limits> <locale> <ostream>
- <string> <string_view>
-__cpp_lib_chrono 201611L <chrono>
-__cpp_lib_chrono_udls 201304L <chrono>
-__cpp_lib_clamp 201603L <algorithm>
-__cpp_lib_complex_udls 201309L <complex>
-__cpp_lib_concepts 201806L <concepts>
-__cpp_lib_constexpr_misc 201811L <array> <functional> <iterator>
- <string_view> <tuple> <utility>
-__cpp_lib_constexpr_swap_algorithms 201806L <algorithm>
-__cpp_lib_destroying_delete 201806L <new>
-__cpp_lib_enable_shared_from_this 201603L <memory>
-__cpp_lib_erase_if 201811L <string> <deque> <forward_list>
- <list> <vector> <map>
- <set> <unordered_map> <unordered_set>
-__cpp_lib_exchange_function 201304L <utility>
-__cpp_lib_execution 201603L <execution>
-__cpp_lib_filesystem 201703L <filesystem>
-__cpp_lib_gcd_lcm 201606L <numeric>
-__cpp_lib_generic_associative_lookup 201304L <map> <set>
-__cpp_lib_generic_unordered_lookup 201811L <unordered_map> <unordered_set>
-__cpp_lib_hardware_interference_size 201703L <new>
-__cpp_lib_has_unique_object_representations 201606L <type_traits>
-__cpp_lib_hypot 201603L <cmath>
-__cpp_lib_incomplete_container_elements 201505L <forward_list> <list> <vector>
-__cpp_lib_integer_sequence 201304L <utility>
-__cpp_lib_integral_constant_callable 201304L <type_traits>
-__cpp_lib_invoke 201411L <functional>
-__cpp_lib_is_aggregate 201703L <type_traits>
-__cpp_lib_is_constant_evaluated 201811L <type_traits>
-__cpp_lib_is_final 201402L <type_traits>
-__cpp_lib_is_invocable 201703L <type_traits>
-__cpp_lib_is_null_pointer 201309L <type_traits>
-__cpp_lib_is_swappable 201603L <type_traits>
-__cpp_lib_launder 201606L <new>
-__cpp_lib_list_remove_return_type 201806L <forward_list> <list>
-__cpp_lib_logical_traits 201510L <type_traits>
-__cpp_lib_make_from_tuple 201606L <tuple>
-__cpp_lib_make_reverse_iterator 201402L <iterator>
-__cpp_lib_make_unique 201304L <memory>
-__cpp_lib_map_try_emplace 201411L <map>
-__cpp_lib_math_special_functions 201603L <cmath>
-__cpp_lib_memory_resource 201603L <memory_resource>
-__cpp_lib_node_extract 201606L <map> <set> <unordered_map>
- <unordered_set>
-__cpp_lib_nonmember_container_access 201411L <iterator> <array> <deque>
- <forward_list> <list> <map>
- <regex> <set> <string>
- <unordered_map> <unordered_set> <vector>
-__cpp_lib_not_fn 201603L <functional>
-__cpp_lib_null_iterators 201304L <iterator>
-__cpp_lib_optional 201606L <optional>
-__cpp_lib_parallel_algorithm 201603L <algorithm> <numeric>
-__cpp_lib_quoted_string_io 201304L <iomanip>
-__cpp_lib_ranges 201811L <algorithm> <functional> <iterator>
- <memory> <ranges>
-__cpp_lib_raw_memory_algorithms 201606L <memory>
-__cpp_lib_result_of_sfinae 201210L <functional> <type_traits>
-__cpp_lib_robust_nonmodifying_seq_ops 201304L <algorithm>
-__cpp_lib_sample 201603L <algorithm>
-__cpp_lib_scoped_lock 201703L <mutex>
-__cpp_lib_shared_mutex 201505L <shared_mutex>
-__cpp_lib_shared_ptr_arrays 201611L <memory>
-__cpp_lib_shared_ptr_weak_type 201606L <memory>
-__cpp_lib_shared_timed_mutex 201402L <shared_mutex>
-__cpp_lib_string_udls 201304L <string>
-__cpp_lib_string_view 201606L <string> <string_view>
-__cpp_lib_three_way_comparison 201711L <compare>
-__cpp_lib_to_chars 201611L <utility>
-__cpp_lib_transformation_trait_aliases 201304L <type_traits>
-__cpp_lib_transparent_operators 201510L <functional>
- 201210L // C++14
-__cpp_lib_tuple_element_t 201402L <tuple>
-__cpp_lib_tuples_by_type 201304L <utility> <tuple>
-__cpp_lib_type_trait_variable_templates 201510L <type_traits>
-__cpp_lib_uncaught_exceptions 201411L <exception>
-__cpp_lib_unordered_map_try_emplace 201411L <unordered_map>
-__cpp_lib_variant 201606L <variant>
-__cpp_lib_void_t 201411L <type_traits>
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#if _LIBCPP_STD_VER > 11
-# define __cpp_lib_chrono_udls 201304L
-# define __cpp_lib_complex_udls 201309L
-# define __cpp_lib_exchange_function 201304L
-# define __cpp_lib_generic_associative_lookup 201304L
-# define __cpp_lib_integer_sequence 201304L
-# define __cpp_lib_integral_constant_callable 201304L
-# define __cpp_lib_is_final 201402L
-# define __cpp_lib_is_null_pointer 201309L
-# define __cpp_lib_make_reverse_iterator 201402L
-# define __cpp_lib_make_unique 201304L
-# define __cpp_lib_null_iterators 201304L
-# define __cpp_lib_quoted_string_io 201304L
-# define __cpp_lib_result_of_sfinae 201210L
-# define __cpp_lib_robust_nonmodifying_seq_ops 201304L
-# if !defined(_LIBCPP_HAS_NO_THREADS)
-# define __cpp_lib_shared_timed_mutex 201402L
-# endif
-# define __cpp_lib_string_udls 201304L
-# define __cpp_lib_transformation_trait_aliases 201304L
-# define __cpp_lib_transparent_operators 201210L
-# define __cpp_lib_tuple_element_t 201402L
-# define __cpp_lib_tuples_by_type 201304L
-#endif
-
-#if _LIBCPP_STD_VER > 14
-# if !defined(_LIBCPP_HAS_NO_BUILTIN_ADDRESSOF)
-# define __cpp_lib_addressof_constexpr 201603L
-# endif
-# define __cpp_lib_allocator_traits_is_always_equal 201411L
-# define __cpp_lib_any 201606L
-# define __cpp_lib_apply 201603L
-# define __cpp_lib_array_constexpr 201603L
-# define __cpp_lib_as_const 201510L
-# if !defined(_LIBCPP_HAS_NO_THREADS)
-# define __cpp_lib_atomic_is_always_lock_free 201603L
-# endif
-# define __cpp_lib_bool_constant 201505L
-// # define __cpp_lib_boyer_moore_searcher 201603L
-# define __cpp_lib_byte 201603L
-# define __cpp_lib_chrono 201611L
-# define __cpp_lib_clamp 201603L
-# define __cpp_lib_enable_shared_from_this 201603L
-// # define __cpp_lib_execution 201603L
-# define __cpp_lib_filesystem 201703L
-# define __cpp_lib_gcd_lcm 201606L
-# define __cpp_lib_hardware_interference_size 201703L
-# if defined(_LIBCPP_HAS_UNIQUE_OBJECT_REPRESENTATIONS)
-# define __cpp_lib_has_unique_object_representations 201606L
-# endif
-# define __cpp_lib_hypot 201603L
-# define __cpp_lib_incomplete_container_elements 201505L
-# define __cpp_lib_invoke 201411L
-# if !defined(_LIBCPP_HAS_NO_IS_AGGREGATE)
-# define __cpp_lib_is_aggregate 201703L
-# endif
-# define __cpp_lib_is_invocable 201703L
-# define __cpp_lib_is_swappable 201603L
-# define __cpp_lib_launder 201606L
-# define __cpp_lib_logical_traits 201510L
-# define __cpp_lib_make_from_tuple 201606L
-# define __cpp_lib_map_try_emplace 201411L
-// # define __cpp_lib_math_special_functions 201603L
-// # define __cpp_lib_memory_resource 201603L
-# define __cpp_lib_node_extract 201606L
-# define __cpp_lib_nonmember_container_access 201411L
-# define __cpp_lib_not_fn 201603L
-# define __cpp_lib_optional 201606L
-// # define __cpp_lib_parallel_algorithm 201603L
-# define __cpp_lib_raw_memory_algorithms 201606L
-# define __cpp_lib_sample 201603L
-# define __cpp_lib_scoped_lock 201703L
-# if !defined(_LIBCPP_HAS_NO_THREADS)
-# define __cpp_lib_shared_mutex 201505L
-# endif
-// # define __cpp_lib_shared_ptr_arrays 201611L
-# define __cpp_lib_shared_ptr_weak_type 201606L
-# define __cpp_lib_string_view 201606L
-// # define __cpp_lib_to_chars 201611L
-# undef __cpp_lib_transparent_operators
-# define __cpp_lib_transparent_operators 201510L
-# define __cpp_lib_type_trait_variable_templates 201510L
-# define __cpp_lib_uncaught_exceptions 201411L
-# define __cpp_lib_unordered_map_try_emplace 201411L
-# define __cpp_lib_variant 201606L
-# define __cpp_lib_void_t 201411L
-#endif
-
-#if _LIBCPP_STD_VER > 17
-# if !defined(_LIBCPP_HAS_NO_THREADS)
-// # define __cpp_lib_atomic_ref 201806L
-# endif
-// # define __cpp_lib_bind_front 201811L
-// # define __cpp_lib_bit_cast 201806L
-# if !defined(_LIBCPP_NO_HAS_CHAR8_T)
-# define __cpp_lib_char8_t 201811L
-# endif
-// # define __cpp_lib_concepts 201806L
-// # define __cpp_lib_constexpr_misc 201811L
-// # define __cpp_lib_constexpr_swap_algorithms 201806L
-// # define __cpp_lib_destroying_delete 201806L
-# define __cpp_lib_erase_if 201811L
-// # define __cpp_lib_generic_unordered_lookup 201811L
-// # define __cpp_lib_is_constant_evaluated 201811L
-// # define __cpp_lib_list_remove_return_type 201806L
-// # define __cpp_lib_ranges 201811L
-// # define __cpp_lib_three_way_comparison 201711L
-#endif
-
-#endif // _LIBCPP_VERSIONH
diff --git a/lib/libcxx/include/wchar.h b/lib/libcxx/include/wchar.h
deleted file mode 100644
index f74fe6ddcff..00000000000
--- a/lib/libcxx/include/wchar.h
+++ /dev/null
@@ -1,182 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- wchar.h ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#if defined(__need_wint_t) || defined(__need_mbstate_t)
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#include_next <wchar.h>
-
-#elif !defined(_LIBCPP_WCHAR_H)
-#define _LIBCPP_WCHAR_H
-
-/*
- wchar.h synopsis
-
-Macros:
-
- NULL
- WCHAR_MAX
- WCHAR_MIN
- WEOF
-
-Types:
-
- mbstate_t
- size_t
- tm
- wint_t
-
-int fwprintf(FILE* restrict stream, const wchar_t* restrict format, ...);
-int fwscanf(FILE* restrict stream, const wchar_t* restrict format, ...);
-int swprintf(wchar_t* restrict s, size_t n, const wchar_t* restrict format, ...);
-int swscanf(const wchar_t* restrict s, const wchar_t* restrict format, ...);
-int vfwprintf(FILE* restrict stream, const wchar_t* restrict format, va_list arg);
-int vfwscanf(FILE* restrict stream, const wchar_t* restrict format, va_list arg); // C99
-int vswprintf(wchar_t* restrict s, size_t n, const wchar_t* restrict format, va_list arg);
-int vswscanf(const wchar_t* restrict s, const wchar_t* restrict format, va_list arg); // C99
-int vwprintf(const wchar_t* restrict format, va_list arg);
-int vwscanf(const wchar_t* restrict format, va_list arg); // C99
-int wprintf(const wchar_t* restrict format, ...);
-int wscanf(const wchar_t* restrict format, ...);
-wint_t fgetwc(FILE* stream);
-wchar_t* fgetws(wchar_t* restrict s, int n, FILE* restrict stream);
-wint_t fputwc(wchar_t c, FILE* stream);
-int fputws(const wchar_t* restrict s, FILE* restrict stream);
-int fwide(FILE* stream, int mode);
-wint_t getwc(FILE* stream);
-wint_t getwchar();
-wint_t putwc(wchar_t c, FILE* stream);
-wint_t putwchar(wchar_t c);
-wint_t ungetwc(wint_t c, FILE* stream);
-double wcstod(const wchar_t* restrict nptr, wchar_t** restrict endptr);
-float wcstof(const wchar_t* restrict nptr, wchar_t** restrict endptr); // C99
-long double wcstold(const wchar_t* restrict nptr, wchar_t** restrict endptr); // C99
-long wcstol(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base);
-long long wcstoll(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base); // C99
-unsigned long wcstoul(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base);
-unsigned long long wcstoull(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base); // C99
-wchar_t* wcscpy(wchar_t* restrict s1, const wchar_t* restrict s2);
-wchar_t* wcsncpy(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n);
-wchar_t* wcscat(wchar_t* restrict s1, const wchar_t* restrict s2);
-wchar_t* wcsncat(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n);
-int wcscmp(const wchar_t* s1, const wchar_t* s2);
-int wcscoll(const wchar_t* s1, const wchar_t* s2);
-int wcsncmp(const wchar_t* s1, const wchar_t* s2, size_t n);
-size_t wcsxfrm(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n);
-const wchar_t* wcschr(const wchar_t* s, wchar_t c);
- wchar_t* wcschr( wchar_t* s, wchar_t c);
-size_t wcscspn(const wchar_t* s1, const wchar_t* s2);
-size_t wcslen(const wchar_t* s);
-const wchar_t* wcspbrk(const wchar_t* s1, const wchar_t* s2);
- wchar_t* wcspbrk( wchar_t* s1, const wchar_t* s2);
-const wchar_t* wcsrchr(const wchar_t* s, wchar_t c);
- wchar_t* wcsrchr( wchar_t* s, wchar_t c);
-size_t wcsspn(const wchar_t* s1, const wchar_t* s2);
-const wchar_t* wcsstr(const wchar_t* s1, const wchar_t* s2);
- wchar_t* wcsstr( wchar_t* s1, const wchar_t* s2);
-wchar_t* wcstok(wchar_t* restrict s1, const wchar_t* restrict s2, wchar_t** restrict ptr);
-const wchar_t* wmemchr(const wchar_t* s, wchar_t c, size_t n);
- wchar_t* wmemchr( wchar_t* s, wchar_t c, size_t n);
-int wmemcmp(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n);
-wchar_t* wmemcpy(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n);
-wchar_t* wmemmove(wchar_t* s1, const wchar_t* s2, size_t n);
-wchar_t* wmemset(wchar_t* s, wchar_t c, size_t n);
-size_t wcsftime(wchar_t* restrict s, size_t maxsize, const wchar_t* restrict format,
- const tm* restrict timeptr);
-wint_t btowc(int c);
-int wctob(wint_t c);
-int mbsinit(const mbstate_t* ps);
-size_t mbrlen(const char* restrict s, size_t n, mbstate_t* restrict ps);
-size_t mbrtowc(wchar_t* restrict pwc, const char* restrict s, size_t n, mbstate_t* restrict ps);
-size_t wcrtomb(char* restrict s, wchar_t wc, mbstate_t* restrict ps);
-size_t mbsrtowcs(wchar_t* restrict dst, const char** restrict src, size_t len,
- mbstate_t* restrict ps);
-size_t wcsrtombs(char* restrict dst, const wchar_t** restrict src, size_t len,
- mbstate_t* restrict ps);
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#ifdef __cplusplus
-#define __CORRECT_ISO_CPP_WCHAR_H_PROTO
-#endif
-
-#include_next <wchar.h>
-
-// Determine whether we have const-correct overloads for wcschr and friends.
-#if defined(_WCHAR_H_CPLUSPLUS_98_CONFORMANCE_)
-# define _LIBCPP_WCHAR_H_HAS_CONST_OVERLOADS 1
-#elif defined(__GLIBC_PREREQ)
-# if __GLIBC_PREREQ(2, 10)
-# define _LIBCPP_WCHAR_H_HAS_CONST_OVERLOADS 1
-# endif
-#elif defined(_LIBCPP_MSVCRT)
-# if defined(_CRT_CONST_CORRECT_OVERLOADS)
-# define _LIBCPP_WCHAR_H_HAS_CONST_OVERLOADS 1
-# endif
-#endif
-
-#if defined(__cplusplus) && !defined(_LIBCPP_WCHAR_H_HAS_CONST_OVERLOADS) && defined(_LIBCPP_PREFERRED_OVERLOAD)
-extern "C++" {
-inline _LIBCPP_INLINE_VISIBILITY
-wchar_t* __libcpp_wcschr(const wchar_t* __s, wchar_t __c) {return (wchar_t*)wcschr(__s, __c);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
-const wchar_t* wcschr(const wchar_t* __s, wchar_t __c) {return __libcpp_wcschr(__s, __c);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
- wchar_t* wcschr( wchar_t* __s, wchar_t __c) {return __libcpp_wcschr(__s, __c);}
-
-inline _LIBCPP_INLINE_VISIBILITY
-wchar_t* __libcpp_wcspbrk(const wchar_t* __s1, const wchar_t* __s2) {return (wchar_t*)wcspbrk(__s1, __s2);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
-const wchar_t* wcspbrk(const wchar_t* __s1, const wchar_t* __s2) {return __libcpp_wcspbrk(__s1, __s2);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
- wchar_t* wcspbrk( wchar_t* __s1, const wchar_t* __s2) {return __libcpp_wcspbrk(__s1, __s2);}
-
-inline _LIBCPP_INLINE_VISIBILITY
-wchar_t* __libcpp_wcsrchr(const wchar_t* __s, wchar_t __c) {return (wchar_t*)wcsrchr(__s, __c);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
-const wchar_t* wcsrchr(const wchar_t* __s, wchar_t __c) {return __libcpp_wcsrchr(__s, __c);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
- wchar_t* wcsrchr( wchar_t* __s, wchar_t __c) {return __libcpp_wcsrchr(__s, __c);}
-
-inline _LIBCPP_INLINE_VISIBILITY
-wchar_t* __libcpp_wcsstr(const wchar_t* __s1, const wchar_t* __s2) {return (wchar_t*)wcsstr(__s1, __s2);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
-const wchar_t* wcsstr(const wchar_t* __s1, const wchar_t* __s2) {return __libcpp_wcsstr(__s1, __s2);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
- wchar_t* wcsstr( wchar_t* __s1, const wchar_t* __s2) {return __libcpp_wcsstr(__s1, __s2);}
-
-inline _LIBCPP_INLINE_VISIBILITY
-wchar_t* __libcpp_wmemchr(const wchar_t* __s, wchar_t __c, size_t __n) {return (wchar_t*)wmemchr(__s, __c, __n);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
-const wchar_t* wmemchr(const wchar_t* __s, wchar_t __c, size_t __n) {return __libcpp_wmemchr(__s, __c, __n);}
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
- wchar_t* wmemchr( wchar_t* __s, wchar_t __c, size_t __n) {return __libcpp_wmemchr(__s, __c, __n);}
-}
-#endif
-
-#if defined(__cplusplus) && defined(_LIBCPP_MSVCRT_LIKE)
-extern "C" {
-size_t mbsnrtowcs(wchar_t *__restrict dst, const char **__restrict src,
- size_t nmc, size_t len, mbstate_t *__restrict ps);
-size_t wcsnrtombs(char *__restrict dst, const wchar_t **__restrict src,
- size_t nwc, size_t len, mbstate_t *__restrict ps);
-} // extern "C++"
-#endif // __cplusplus && _LIBCPP_MSVCRT
-
-#endif // _LIBCPP_WCHAR_H
diff --git a/lib/libcxx/include/wctype.h b/lib/libcxx/include/wctype.h
deleted file mode 100644
index f9c5a47754b..00000000000
--- a/lib/libcxx/include/wctype.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- wctype.h ---------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_WCTYPE_H
-#define _LIBCPP_WCTYPE_H
-
-/*
- wctype.h synopsis
-
-Macros:
-
- WEOF
-
-Types:
-
- wint_t
- wctrans_t
- wctype_t
-
-int iswalnum(wint_t wc);
-int iswalpha(wint_t wc);
-int iswblank(wint_t wc); // C99
-int iswcntrl(wint_t wc);
-int iswdigit(wint_t wc);
-int iswgraph(wint_t wc);
-int iswlower(wint_t wc);
-int iswprint(wint_t wc);
-int iswpunct(wint_t wc);
-int iswspace(wint_t wc);
-int iswupper(wint_t wc);
-int iswxdigit(wint_t wc);
-int iswctype(wint_t wc, wctype_t desc);
-wctype_t wctype(const char* property);
-wint_t towlower(wint_t wc);
-wint_t towupper(wint_t wc);
-wint_t towctrans(wint_t wc, wctrans_t desc);
-wctrans_t wctrans(const char* property);
-
-*/
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#include_next <wctype.h>
-
-#ifdef __cplusplus
-
-#undef iswalnum
-#undef iswalpha
-#undef iswblank
-#undef iswcntrl
-#undef iswdigit
-#undef iswgraph
-#undef iswlower
-#undef iswprint
-#undef iswpunct
-#undef iswspace
-#undef iswupper
-#undef iswxdigit
-#undef iswctype
-#undef wctype
-#undef towlower
-#undef towupper
-#undef towctrans
-#undef wctrans
-
-#endif // __cplusplus
-
-#endif // _LIBCPP_WCTYPE_H