llvm12: sync with llvmorg-12.0.0-rc2
- update lib/include - update lib/libcxx - update lib/libcxxabi - update lib/libunwind - (no changes) src/libcxx.zig - (no changes) src/libunwind.zig
This commit is contained in:
committed by
Andrew Kelley
parent
b706b9bce7
commit
659f712ae8
@@ -11,7 +11,7 @@
|
||||
#define _LIBCPP___BIT_REFERENCE
|
||||
|
||||
#include <__config>
|
||||
#include <bit>
|
||||
#include <__bits>
|
||||
#include <algorithm>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
@@ -239,8 +239,8 @@ __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));
|
||||
return _VSTD::__find_bool_true(__first, static_cast<typename _Cp::size_type>(__last - __first));
|
||||
return _VSTD::__find_bool_false(__first, static_cast<typename _Cp::size_type>(__last - __first));
|
||||
}
|
||||
|
||||
// count
|
||||
@@ -313,8 +313,8 @@ 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));
|
||||
return _VSTD::__count_bool_true(__first, static_cast<typename _Cp::size_type>(__last - __first));
|
||||
return _VSTD::__count_bool_false(__first, static_cast<typename _Cp::size_type>(__last - __first));
|
||||
}
|
||||
|
||||
// fill_n
|
||||
@@ -387,9 +387,9 @@ fill_n(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n, bool __v
|
||||
if (__n > 0)
|
||||
{
|
||||
if (__value_)
|
||||
__fill_n_true(__first, __n);
|
||||
_VSTD::__fill_n_true(__first, __n);
|
||||
else
|
||||
__fill_n_false(__first, __n);
|
||||
_VSTD::__fill_n_false(__first, __n);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -538,8 +538,8 @@ __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);
|
||||
return _VSTD::__copy_aligned(__first, __last, __result);
|
||||
return _VSTD::__copy_unaligned(__first, __last, __result);
|
||||
}
|
||||
|
||||
// copy_backward
|
||||
@@ -685,8 +685,8 @@ __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);
|
||||
return _VSTD::__copy_backward_aligned(__first, __last, __result);
|
||||
return _VSTD::__copy_backward_unaligned(__first, __last, __result);
|
||||
}
|
||||
|
||||
// move
|
||||
@@ -868,8 +868,8 @@ swap_ranges(__bit_iterator<__C1, false> __first1, __bit_iterator<__C1, false> __
|
||||
__bit_iterator<__C2, false> __first2)
|
||||
{
|
||||
if (__first1.__ctz_ == __first2.__ctz_)
|
||||
return __swap_ranges_aligned(__first1, __last1, __first2);
|
||||
return __swap_ranges_unaligned(__first1, __last1, __first2);
|
||||
return _VSTD::__swap_ranges_aligned(__first1, __last1, __first2);
|
||||
return _VSTD::__swap_ranges_unaligned(__first1, __last1, __first2);
|
||||
}
|
||||
|
||||
// rotate
|
||||
@@ -1083,8 +1083,8 @@ 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);
|
||||
return _VSTD::__equal_aligned(__first1, __last1, __first2);
|
||||
return _VSTD::__equal_unaligned(__first1, __last1, __first2);
|
||||
}
|
||||
|
||||
template <class _Cp, bool _IsConst,
|
||||
|
||||
146
lib/libcxx/include/__bits
Normal file
146
lib/libcxx/include/__bits
Normal file
@@ -0,0 +1,146 @@
|
||||
// -*- C++ -*-
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef _LIBCPP___BITS
|
||||
#define _LIBCPP___BITS
|
||||
|
||||
#include <__config>
|
||||
|
||||
#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_COMPILER_MSVC
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_ctz(unsigned __x) _NOEXCEPT { return __builtin_ctz(__x); }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_ctz(unsigned long __x) _NOEXCEPT { return __builtin_ctzl(__x); }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_ctz(unsigned long long __x) _NOEXCEPT { return __builtin_ctzll(__x); }
|
||||
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_clz(unsigned __x) _NOEXCEPT { return __builtin_clz(__x); }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_clz(unsigned long __x) _NOEXCEPT { return __builtin_clzl(__x); }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_clz(unsigned long long __x) _NOEXCEPT { return __builtin_clzll(__x); }
|
||||
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_popcount(unsigned __x) _NOEXCEPT { return __builtin_popcount(__x); }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_popcount(unsigned long __x) _NOEXCEPT { return __builtin_popcountl(__x); }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_popcount(unsigned long long __x) _NOEXCEPT { return __builtin_popcountll(__x); }
|
||||
|
||||
#else // _LIBCPP_COMPILER_MSVC
|
||||
|
||||
// Precondition: __x != 0
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
int __libcpp_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 __libcpp_ctz(unsigned long __x) {
|
||||
static_assert(sizeof(unsigned long) == sizeof(unsigned), "");
|
||||
return __ctz(static_cast<unsigned>(__x));
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
int __libcpp_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 __libcpp_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 __libcpp_clz(unsigned long __x) {
|
||||
static_assert(sizeof(unsigned) == sizeof(unsigned long), "");
|
||||
return __libcpp_clz(static_cast<unsigned>(__x));
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
int __libcpp_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 __libcpp_popcount(unsigned __x) {
|
||||
static_assert(sizeof(unsigned) == 4, "");
|
||||
return __popcnt(__x);
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_popcount(unsigned long __x) {
|
||||
static_assert(sizeof(unsigned long) == 4, "");
|
||||
return __popcnt(__x);
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_popcount(unsigned long long __x) {
|
||||
static_assert(sizeof(unsigned long long) == 8, "");
|
||||
return __popcnt64(__x);
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_COMPILER_MSVC
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP__BITS
|
||||
@@ -49,8 +49,10 @@
|
||||
# define _LIBCPP_STD_VER 14
|
||||
# elif __cplusplus <= 201703L
|
||||
# define _LIBCPP_STD_VER 17
|
||||
# elif __cplusplus <= 202002L
|
||||
# define _LIBCPP_STD_VER 20
|
||||
# else
|
||||
# define _LIBCPP_STD_VER 18 // current year, or date of c++2a ratification
|
||||
# define _LIBCPP_STD_VER 21 // current year, or date of c++2b ratification
|
||||
# endif
|
||||
#endif // _LIBCPP_STD_VER
|
||||
|
||||
@@ -262,14 +264,14 @@
|
||||
# endif // __LONG_LONG_SUPPORTED
|
||||
#endif // __FreeBSD__
|
||||
|
||||
#ifdef __NetBSD__
|
||||
#if defined(__NetBSD__) || defined(__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 // __NetBSD__
|
||||
#endif // defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
|
||||
#if defined(_WIN32)
|
||||
# define _LIBCPP_WIN32API
|
||||
@@ -310,7 +312,7 @@
|
||||
# endif
|
||||
#endif // __sun__
|
||||
|
||||
#if defined(__CloudABI__)
|
||||
#if defined(__OpenBSD__) || defined(__CloudABI__)
|
||||
// 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,
|
||||
@@ -368,6 +370,9 @@
|
||||
# define _LIBCPP_HAS_ALIGNED_ALLOC
|
||||
# define _LIBCPP_HAS_QUICK_EXIT
|
||||
# define _LIBCPP_HAS_TIMESPEC_GET
|
||||
# elif defined(__OpenBSD__)
|
||||
# define _LIBCPP_HAS_ALIGNED_ALLOC
|
||||
# define _LIBCPP_HAS_TIMESPEC_GET
|
||||
# elif defined(__linux__)
|
||||
# if !defined(_LIBCPP_HAS_MUSL_LIBC)
|
||||
# if _LIBCPP_GLIBC_PREREQ(2, 15) || defined(__BIONIC__)
|
||||
@@ -713,7 +718,7 @@ typedef __char32_t char32_t;
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
|
||||
# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) && __has_attribute(__type_visibility__)
|
||||
# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
|
||||
# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __attribute__ ((__visibility__("default")))
|
||||
# else
|
||||
# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
|
||||
@@ -880,18 +885,30 @@ typedef unsigned int char32_t;
|
||||
#endif
|
||||
|
||||
// _LIBCPP_DEBUG_LEVEL is always defined to one of [0, 1, 2] at this point
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 1
|
||||
# define _LIBCPP_DISABLE_EXTERN_TEMPLATE
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 1 && !defined(_LIBCPP_DISABLE_EXTERN_TEMPLATE)
|
||||
# define _LIBCPP_EXTERN_TEMPLATE(...)
|
||||
#endif
|
||||
|
||||
#ifdef _LIBCPP_DISABLE_EXTERN_TEMPLATE
|
||||
#define _LIBCPP_EXTERN_TEMPLATE(...)
|
||||
# define _LIBCPP_EXTERN_TEMPLATE(...)
|
||||
# define _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(...)
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_EXTERN_TEMPLATE
|
||||
#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
|
||||
#endif
|
||||
|
||||
// When the Debug mode is enabled, we disable extern declarations because we
|
||||
// don't want to use the functions compiled in the library, which might not
|
||||
// have had the debug mode enabled when built. However, some extern declarations
|
||||
// need to be used, because code correctness depends on it (several instances
|
||||
// in the <locale>). Those special declarations are declared with
|
||||
// _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE, which is enabled even
|
||||
// when the debug mode is enabled.
|
||||
#ifndef _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE
|
||||
# define _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(...) extern template __VA_ARGS__;
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_EXTERN_TEMPLATE_DEFINE
|
||||
#define _LIBCPP_EXTERN_TEMPLATE_DEFINE(...) template __VA_ARGS__;
|
||||
#endif
|
||||
@@ -1082,7 +1099,7 @@ typedef unsigned int char32_t;
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_ASAN
|
||||
_LIBCPP_FUNC_VIS extern "C" void __sanitizer_annotate_contiguous_container(
|
||||
extern "C" _LIBCPP_FUNC_VIS void __sanitizer_annotate_contiguous_container(
|
||||
const void *, const void *, const void *, const void *);
|
||||
#endif
|
||||
|
||||
@@ -1107,6 +1124,7 @@ _LIBCPP_FUNC_VIS extern "C" void __sanitizer_annotate_contiguous_container(
|
||||
# if defined(__FreeBSD__) || \
|
||||
defined(__wasi__) || \
|
||||
defined(__NetBSD__) || \
|
||||
defined(__OpenBSD__) || \
|
||||
defined(__NuttX__) || \
|
||||
defined(__linux__) || \
|
||||
defined(__GNU__) || \
|
||||
@@ -1202,14 +1220,15 @@ _LIBCPP_FUNC_VIS extern "C" void __sanitizer_annotate_contiguous_container(
|
||||
// Some systems do not provide gets() in their C library, for security reasons.
|
||||
#ifndef _LIBCPP_C_HAS_NO_GETS
|
||||
# if defined(_LIBCPP_MSVCRT) || \
|
||||
(defined(__FreeBSD_version) && __FreeBSD_version >= 1300043)
|
||||
(defined(__FreeBSD_version) && __FreeBSD_version >= 1300043) || \
|
||||
defined(__OpenBSD__)
|
||||
# define _LIBCPP_C_HAS_NO_GETS
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(__BIONIC__) || defined(__CloudABI__) || defined(__NuttX__) || \
|
||||
defined(__Fuchsia__) || defined(__wasi__) || defined(_LIBCPP_HAS_MUSL_LIBC) || \
|
||||
defined(__MVS__)
|
||||
defined(__MVS__) || defined(__OpenBSD__)
|
||||
#define _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
|
||||
#endif
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#cmakedefine _LIBCPP_NO_VCRUNTIME
|
||||
#cmakedefine _LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION @_LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION@
|
||||
#cmakedefine _LIBCPP_ABI_NAMESPACE @_LIBCPP_ABI_NAMESPACE@
|
||||
#cmakedefine _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY
|
||||
#cmakedefine _LIBCPP_HAS_PARALLEL_ALGORITHMS
|
||||
#cmakedefine _LIBCPP_HAS_NO_RANDOM_DEVICE
|
||||
#cmakedefine _LIBCPP_HAS_NO_LOCALIZATION
|
||||
|
||||
@@ -308,7 +308,7 @@ struct __invoke_return
|
||||
#endif // !defined(_LIBCPP_CXX03_LANG)
|
||||
|
||||
|
||||
template <class _Ret>
|
||||
template <class _Ret, bool = is_void<_Ret>::value>
|
||||
struct __invoke_void_return_wrapper
|
||||
{
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
@@ -339,8 +339,8 @@ struct __invoke_void_return_wrapper
|
||||
#endif
|
||||
};
|
||||
|
||||
template <>
|
||||
struct __invoke_void_return_wrapper<void>
|
||||
template <class _Ret>
|
||||
struct __invoke_void_return_wrapper<_Ret, true>
|
||||
{
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <class ..._Args>
|
||||
@@ -382,20 +382,23 @@ private:
|
||||
|
||||
public:
|
||||
// construct/copy/destroy
|
||||
_LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) _NOEXCEPT
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
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_;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
operator type&() const _NOEXCEPT {return *__f_;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
type& get() const _NOEXCEPT {return *__f_;}
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
// invoke
|
||||
template <class... _ArgTypes>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
typename __invoke_of<type&, _ArgTypes...>::type
|
||||
operator() (_ArgTypes&&... __args) const {
|
||||
return _VSTD::__invoke(get(), _VSTD::forward<_ArgTypes>(__args)...);
|
||||
@@ -510,7 +513,7 @@ public:
|
||||
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
reference_wrapper<_Tp>
|
||||
ref(_Tp& __t) _NOEXCEPT
|
||||
{
|
||||
@@ -518,7 +521,7 @@ ref(_Tp& __t) _NOEXCEPT
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
reference_wrapper<_Tp>
|
||||
ref(reference_wrapper<_Tp> __t) _NOEXCEPT
|
||||
{
|
||||
@@ -526,7 +529,7 @@ ref(reference_wrapper<_Tp> __t) _NOEXCEPT
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
reference_wrapper<const _Tp>
|
||||
cref(const _Tp& __t) _NOEXCEPT
|
||||
{
|
||||
@@ -534,7 +537,7 @@ cref(const _Tp& __t) _NOEXCEPT
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
reference_wrapper<const _Tp>
|
||||
cref(reference_wrapper<_Tp> __t) _NOEXCEPT
|
||||
{
|
||||
|
||||
@@ -21,28 +21,30 @@
|
||||
#include <locale.h>
|
||||
#if defined(_LIBCPP_MSVCRT_LIKE)
|
||||
# include <cstring>
|
||||
# include <support/win32/locale_win32.h>
|
||||
# include <__support/win32/locale_win32.h>
|
||||
#elif defined(__NuttX__)
|
||||
# include <support/nuttx/xlocale.h>
|
||||
# include <__support/nuttx/xlocale.h>
|
||||
#elif defined(_AIX) || defined(__MVS__)
|
||||
# include <support/ibm/xlocale.h>
|
||||
# include <__support/ibm/xlocale.h>
|
||||
#elif defined(__ANDROID__)
|
||||
# include <support/android/locale_bionic.h>
|
||||
# include <__support/android/locale_bionic.h>
|
||||
#elif defined(__sun__)
|
||||
# include <xlocale.h>
|
||||
# include <support/solaris/xlocale.h>
|
||||
# include <__support/solaris/xlocale.h>
|
||||
#elif defined(_NEWLIB_VERSION)
|
||||
# include <support/newlib/xlocale.h>
|
||||
# include <__support/newlib/xlocale.h>
|
||||
#elif defined(__OpenBSD__)
|
||||
# include <__support/openbsd/xlocale.h>
|
||||
#elif (defined(__APPLE__) || defined(__FreeBSD__) \
|
||||
|| defined(__EMSCRIPTEN__) || defined(__IBMCPP__))
|
||||
# include <xlocale.h>
|
||||
#elif defined(__Fuchsia__)
|
||||
# include <support/fuchsia/xlocale.h>
|
||||
# include <__support/fuchsia/xlocale.h>
|
||||
#elif defined(__wasi__)
|
||||
// WASI libc uses musl's locales support.
|
||||
# include <support/musl/xlocale.h>
|
||||
# include <__support/musl/xlocale.h>
|
||||
#elif defined(_LIBCPP_HAS_MUSL_LIBC)
|
||||
# include <support/musl/xlocale.h>
|
||||
# include <__support/musl/xlocale.h>
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
@@ -337,8 +339,8 @@ collate<_CharT>::do_hash(const char_type* __lo, const char_type* __hi) const
|
||||
return static_cast<long>(__h);
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS collate<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS collate<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS collate<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS collate<wchar_t>)
|
||||
|
||||
// template <class CharT> class collate_byname;
|
||||
|
||||
@@ -1076,7 +1078,7 @@ protected:
|
||||
// template <> class codecvt<char16_t, char, mbstate_t> // deprecated in C++20
|
||||
|
||||
template <>
|
||||
class _LIBCPP_TYPE_VIS _LIBCPP_DEPRECATED_IN_CXX20 codecvt<char16_t, char, mbstate_t>
|
||||
class _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_TYPE_VIS codecvt<char16_t, char, mbstate_t>
|
||||
: public locale::facet,
|
||||
public codecvt_base
|
||||
{
|
||||
@@ -1252,7 +1254,7 @@ protected:
|
||||
// template <> class codecvt<char32_t, char, mbstate_t> // deprecated in C++20
|
||||
|
||||
template <>
|
||||
class _LIBCPP_TYPE_VIS _LIBCPP_DEPRECATED_IN_CXX20 codecvt<char32_t, char, mbstate_t>
|
||||
class _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_TYPE_VIS codecvt<char32_t, char, mbstate_t>
|
||||
: public locale::facet,
|
||||
public codecvt_base
|
||||
{
|
||||
@@ -1449,13 +1451,13 @@ codecvt_byname<_InternT, _ExternT, _StateT>::~codecvt_byname()
|
||||
}
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<wchar_t, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_DEPRECATED_IN_CXX20 codecvt_byname<char16_t, char, mbstate_t>) // deprecated in C++20
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_DEPRECATED_IN_CXX20 codecvt_byname<char32_t, char, mbstate_t>) // deprecated in C++20
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<wchar_t, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char16_t, char, mbstate_t>) // deprecated in C++20
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char32_t, char, mbstate_t>) // deprecated in C++20
|
||||
#ifndef _LIBCPP_NO_HAS_CHAR8_T
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char16_t, char8_t, mbstate_t>) // C++20
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char32_t, char8_t, mbstate_t>) // C++20
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char16_t, char8_t, mbstate_t>) // C++20
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char32_t, char8_t, mbstate_t>) // C++20
|
||||
#endif
|
||||
|
||||
template <size_t _Np>
|
||||
|
||||
@@ -24,564 +24,376 @@ _LIBCPP_PUSH_MACROS
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp, class = void>
|
||||
struct __has_pointer_type : false_type {};
|
||||
#define _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(NAME, PROPERTY) \
|
||||
template <class _Tp, class = void> struct NAME : false_type { }; \
|
||||
template <class _Tp> struct NAME<_Tp, typename __void_t<typename _Tp:: PROPERTY >::type> : true_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 _LIBCPP_NODEBUG_TYPE typename _Dp::pointer type;
|
||||
// __pointer
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_pointer, pointer);
|
||||
template <class _Tp, class _Alloc,
|
||||
class _RawAlloc = typename remove_reference<_Alloc>::type,
|
||||
bool = __has_pointer<_RawAlloc>::value>
|
||||
struct __pointer {
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename _RawAlloc::pointer;
|
||||
};
|
||||
template <class _Tp, class _Alloc, class _RawAlloc>
|
||||
struct __pointer<_Tp, _Alloc, _RawAlloc, false> {
|
||||
using type _LIBCPP_NODEBUG_TYPE = _Tp*;
|
||||
};
|
||||
|
||||
template <class _Tp, class _Dp>
|
||||
struct __pointer_type<_Tp, _Dp, false>
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG_TYPE _Tp* type;
|
||||
// __const_pointer
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_const_pointer, const_pointer);
|
||||
template <class _Tp, class _Ptr, class _Alloc,
|
||||
bool = __has_const_pointer<_Alloc>::value>
|
||||
struct __const_pointer {
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::const_pointer;
|
||||
};
|
||||
|
||||
} // __pointer_type_imp
|
||||
|
||||
template <class _Tp, class _Dp>
|
||||
struct __pointer_type
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG_TYPE 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 _LIBCPP_NODEBUG_TYPE typename _Alloc::const_pointer type;
|
||||
};
|
||||
|
||||
template <class _Tp, class _Ptr, class _Alloc>
|
||||
struct __const_pointer<_Tp, _Ptr, _Alloc, false>
|
||||
{
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
typedef _LIBCPP_NODEBUG_TYPE typename pointer_traits<_Ptr>::template rebind<const _Tp> type;
|
||||
struct __const_pointer<_Tp, _Ptr, _Alloc, false> {
|
||||
#ifdef _LIBCPP_CXX03_LANG
|
||||
using type = typename pointer_traits<_Ptr>::template rebind<const _Tp>::other;
|
||||
#else
|
||||
typedef typename pointer_traits<_Ptr>::template rebind<const _Tp>::other type;
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename pointer_traits<_Ptr>::template rebind<const _Tp>;
|
||||
#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 _LIBCPP_NODEBUG_TYPE typename _Alloc::void_pointer type;
|
||||
// __void_pointer
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_void_pointer, void_pointer);
|
||||
template <class _Ptr, class _Alloc,
|
||||
bool = __has_void_pointer<_Alloc>::value>
|
||||
struct __void_pointer {
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::void_pointer;
|
||||
};
|
||||
|
||||
template <class _Ptr, class _Alloc>
|
||||
struct __void_pointer<_Ptr, _Alloc, false>
|
||||
{
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
typedef _LIBCPP_NODEBUG_TYPE typename pointer_traits<_Ptr>::template rebind<void> type;
|
||||
struct __void_pointer<_Ptr, _Alloc, false> {
|
||||
#ifdef _LIBCPP_CXX03_LANG
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename pointer_traits<_Ptr>::template rebind<void>::other;
|
||||
#else
|
||||
typedef _LIBCPP_NODEBUG_TYPE typename pointer_traits<_Ptr>::template rebind<void>::other type;
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename pointer_traits<_Ptr>::template rebind<void>;
|
||||
#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 _LIBCPP_NODEBUG_TYPE typename _Alloc::const_void_pointer type;
|
||||
// __const_void_pointer
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_const_void_pointer, const_void_pointer);
|
||||
template <class _Ptr, class _Alloc,
|
||||
bool = __has_const_void_pointer<_Alloc>::value>
|
||||
struct __const_void_pointer {
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::const_void_pointer;
|
||||
};
|
||||
|
||||
template <class _Ptr, class _Alloc>
|
||||
struct __const_void_pointer<_Ptr, _Alloc, false>
|
||||
{
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
typedef _LIBCPP_NODEBUG_TYPE typename pointer_traits<_Ptr>::template rebind<const void> type;
|
||||
struct __const_void_pointer<_Ptr, _Alloc, false> {
|
||||
#ifdef _LIBCPP_CXX03_LANG
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename pointer_traits<_Ptr>::template rebind<const void>::other;
|
||||
#else
|
||||
typedef _LIBCPP_NODEBUG_TYPE typename pointer_traits<_Ptr>::template rebind<const void>::other type;
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename pointer_traits<_Ptr>::template rebind<const void>;
|
||||
#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 {};
|
||||
|
||||
// __size_type
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_size_type, size_type);
|
||||
template <class _Alloc, class _DiffType, bool = __has_size_type<_Alloc>::value>
|
||||
struct __size_type
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG_TYPE typename make_unsigned<_DiffType>::type type;
|
||||
};
|
||||
|
||||
struct __size_type : make_unsigned<_DiffType> { };
|
||||
template <class _Alloc, class _DiffType>
|
||||
struct __size_type<_Alloc, _DiffType, true>
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::size_type type;
|
||||
struct __size_type<_Alloc, _DiffType, true> {
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::size_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 {};
|
||||
// __alloc_traits_difference_type
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_alloc_traits_difference_type, difference_type);
|
||||
template <class _Alloc, class _Ptr, bool = __has_alloc_traits_difference_type<_Alloc>::value>
|
||||
struct __alloc_traits_difference_type {
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename pointer_traits<_Ptr>::difference_type;
|
||||
};
|
||||
template <class _Alloc, class _Ptr>
|
||||
struct __alloc_traits_difference_type<_Alloc, _Ptr, true> {
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::difference_type;
|
||||
};
|
||||
|
||||
// __propagate_on_container_copy_assignment
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_propagate_on_container_copy_assignment, propagate_on_container_copy_assignment);
|
||||
template <class _Alloc, bool = __has_propagate_on_container_copy_assignment<_Alloc>::value>
|
||||
struct __propagate_on_container_copy_assignment
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG_TYPE false_type type;
|
||||
};
|
||||
|
||||
struct __propagate_on_container_copy_assignment : false_type { };
|
||||
template <class _Alloc>
|
||||
struct __propagate_on_container_copy_assignment<_Alloc, true>
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::propagate_on_container_copy_assignment type;
|
||||
struct __propagate_on_container_copy_assignment<_Alloc, true> {
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::propagate_on_container_copy_assignment;
|
||||
};
|
||||
|
||||
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 {};
|
||||
|
||||
// __propagate_on_container_move_assignment
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_propagate_on_container_move_assignment, propagate_on_container_move_assignment);
|
||||
template <class _Alloc, bool = __has_propagate_on_container_move_assignment<_Alloc>::value>
|
||||
struct __propagate_on_container_move_assignment
|
||||
{
|
||||
typedef false_type type;
|
||||
};
|
||||
|
||||
struct __propagate_on_container_move_assignment : false_type { };
|
||||
template <class _Alloc>
|
||||
struct __propagate_on_container_move_assignment<_Alloc, true>
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::propagate_on_container_move_assignment type;
|
||||
struct __propagate_on_container_move_assignment<_Alloc, true> {
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::propagate_on_container_move_assignment;
|
||||
};
|
||||
|
||||
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 {};
|
||||
|
||||
// __propagate_on_container_swap
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_propagate_on_container_swap, propagate_on_container_swap);
|
||||
template <class _Alloc, bool = __has_propagate_on_container_swap<_Alloc>::value>
|
||||
struct __propagate_on_container_swap
|
||||
{
|
||||
typedef false_type type;
|
||||
};
|
||||
|
||||
struct __propagate_on_container_swap : false_type { };
|
||||
template <class _Alloc>
|
||||
struct __propagate_on_container_swap<_Alloc, true>
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::propagate_on_container_swap type;
|
||||
struct __propagate_on_container_swap<_Alloc, true> {
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::propagate_on_container_swap;
|
||||
};
|
||||
|
||||
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 {};
|
||||
|
||||
// __is_always_equal
|
||||
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_is_always_equal, is_always_equal);
|
||||
template <class _Alloc, bool = __has_is_always_equal<_Alloc>::value>
|
||||
struct __is_always_equal
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG_TYPE typename _VSTD::is_empty<_Alloc>::type type;
|
||||
};
|
||||
|
||||
struct __is_always_equal : is_empty<_Alloc> { };
|
||||
template <class _Alloc>
|
||||
struct __is_always_equal<_Alloc, true>
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG_TYPE 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(...);
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
template <class _Xp> static char __test(typename _Xp::template rebind<_Up>::other* = 0);
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
public:
|
||||
static const bool value = sizeof(__test<_Tp>(0)) == 1;
|
||||
struct __is_always_equal<_Alloc, true> {
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::is_always_equal;
|
||||
};
|
||||
|
||||
// __allocator_traits_rebind
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
template <class _Tp, class _Up, class = void>
|
||||
struct __has_rebind_other : false_type { };
|
||||
template <class _Tp, class _Up>
|
||||
struct __has_rebind_other<_Tp, _Up, false>
|
||||
{
|
||||
static const bool value = false;
|
||||
};
|
||||
struct __has_rebind_other<_Tp, _Up, typename __void_t<
|
||||
typename _Tp::template rebind<_Up>::other
|
||||
>::type> : true_type { };
|
||||
|
||||
template <class _Tp, class _Up, bool = __has_rebind_other<_Tp, _Up>::value>
|
||||
struct __allocator_traits_rebind
|
||||
{
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
typedef _LIBCPP_NODEBUG_TYPE typename _Tp::template rebind<_Up>::other type;
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
struct __allocator_traits_rebind {
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename _Tp::template rebind<_Up>::other;
|
||||
};
|
||||
|
||||
template <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up>
|
||||
struct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, true>
|
||||
{
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
typedef _LIBCPP_NODEBUG_TYPE typename _Alloc<_Tp, _Args...>::template rebind<_Up>::other type;
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
struct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, true> {
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename _Alloc<_Tp, _Args...>::template rebind<_Up>::other;
|
||||
};
|
||||
|
||||
template <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up>
|
||||
struct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, false>
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG_TYPE _Alloc<_Up, _Args...> type;
|
||||
struct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, false> {
|
||||
using type _LIBCPP_NODEBUG_TYPE = _Alloc<_Up, _Args...>;
|
||||
};
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
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());
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
|
||||
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
|
||||
: decltype(_VSTD::__has_allocate_hint_test(declval<_Alloc>(),
|
||||
declval<_SizeType>(),
|
||||
declval<_ConstVoidPtr>()))
|
||||
{
|
||||
};
|
||||
|
||||
#else // _LIBCPP_CXX03_LANG
|
||||
|
||||
template <class _Alloc, class _SizeType, class _ConstVoidPtr>
|
||||
struct __has_allocate_hint
|
||||
: true_type
|
||||
{
|
||||
};
|
||||
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
template<class _Alloc, class _Tp>
|
||||
using __allocator_traits_rebind_t = typename __allocator_traits_rebind<_Alloc, _Tp>::type;
|
||||
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
template <class _Alloc, class ..._Args,
|
||||
class = decltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Args>()...))>
|
||||
static true_type __test_has_construct(int);
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
|
||||
template <class _Alloc, class...>
|
||||
static false_type __test_has_construct(...);
|
||||
// __has_allocate_hint
|
||||
template <class _Alloc, class _SizeType, class _ConstVoidPtr, class = void>
|
||||
struct __has_allocate_hint : false_type { };
|
||||
|
||||
template <class _Alloc, class _SizeType, class _ConstVoidPtr>
|
||||
struct __has_allocate_hint<_Alloc, _SizeType, _ConstVoidPtr, decltype(
|
||||
(void)declval<_Alloc>().allocate(declval<_SizeType>(), declval<_ConstVoidPtr>())
|
||||
)> : true_type { };
|
||||
|
||||
// __has_construct
|
||||
template <class, class _Alloc, class ..._Args>
|
||||
struct __has_construct_impl : false_type { };
|
||||
|
||||
template <class _Alloc, class ..._Args>
|
||||
struct __has_construct : decltype(__test_has_construct<_Alloc, _Args...>(0)) {};
|
||||
struct __has_construct_impl<decltype(
|
||||
(void)declval<_Alloc>().construct(declval<_Args>()...)
|
||||
), _Alloc, _Args...> : true_type { };
|
||||
|
||||
#if !defined(_LIBCPP_CXX03_LANG)
|
||||
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
template <class _Alloc, class _Pointer>
|
||||
auto
|
||||
__has_destroy_test(_Alloc&& __a, _Pointer&& __p)
|
||||
-> decltype(__a.destroy(__p), true_type());
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
|
||||
template <class _Alloc, class _Pointer>
|
||||
auto
|
||||
__has_destroy_test(const _Alloc& __a, _Pointer&& __p)
|
||||
-> false_type;
|
||||
|
||||
template <class _Alloc, class _Pointer>
|
||||
struct __has_destroy
|
||||
: decltype(_VSTD::__has_destroy_test(declval<_Alloc>(),
|
||||
declval<_Pointer>()))
|
||||
{
|
||||
};
|
||||
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
template <class _Alloc>
|
||||
auto
|
||||
__has_max_size_test(_Alloc&& __a)
|
||||
-> decltype(__a.max_size(), true_type());
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
|
||||
template <class _Alloc>
|
||||
auto
|
||||
__has_max_size_test(const volatile _Alloc& __a)
|
||||
-> false_type;
|
||||
|
||||
template <class _Alloc>
|
||||
struct __has_max_size
|
||||
: decltype(_VSTD::__has_max_size_test(declval<_Alloc&>()))
|
||||
{
|
||||
};
|
||||
|
||||
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
|
||||
: decltype(_VSTD::__has_select_on_container_copy_construction_test(declval<_Alloc&>()))
|
||||
{
|
||||
};
|
||||
|
||||
#else // _LIBCPP_CXX03_LANG
|
||||
template <class _Alloc, class ..._Args>
|
||||
struct __has_construct : __has_construct_impl<void, _Alloc, _Args...> { };
|
||||
|
||||
// __has_destroy
|
||||
template <class _Alloc, class _Pointer, class = void>
|
||||
struct __has_destroy : false_type {};
|
||||
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> : true_type {};
|
||||
struct __has_destroy<_Alloc, _Pointer, decltype(
|
||||
(void)declval<_Alloc>().destroy(declval<_Pointer>())
|
||||
)> : true_type { };
|
||||
|
||||
// __has_max_size
|
||||
template <class _Alloc, class = void>
|
||||
struct __has_max_size : false_type { };
|
||||
|
||||
template <class _Alloc>
|
||||
struct __has_max_size
|
||||
: true_type
|
||||
{
|
||||
};
|
||||
struct __has_max_size<_Alloc, decltype(
|
||||
(void)declval<_Alloc&>().max_size()
|
||||
)> : true_type { };
|
||||
|
||||
// __has_select_on_container_copy_construction
|
||||
template <class _Alloc, class = void>
|
||||
struct __has_select_on_container_copy_construction : false_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 _LIBCPP_NODEBUG_TYPE typename pointer_traits<_Ptr>::difference_type type;
|
||||
};
|
||||
|
||||
template <class _Alloc, class _Ptr>
|
||||
struct __alloc_traits_difference_type<_Alloc, _Ptr, true>
|
||||
{
|
||||
typedef _LIBCPP_NODEBUG_TYPE 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,
|
||||
bool = __has_construct<_Alloc, typename _Alloc::value_type*, typename _Alloc::value_type&&>::value && !__is_default_allocator<_Alloc>::value
|
||||
>
|
||||
struct __is_cpp17_move_insertable;
|
||||
template <class _Alloc>
|
||||
struct __is_cpp17_move_insertable<_Alloc, true> : true_type {};
|
||||
template <class _Alloc>
|
||||
struct __is_cpp17_move_insertable<_Alloc, false> : is_move_constructible<typename _Alloc::value_type> {};
|
||||
|
||||
template <class _Alloc,
|
||||
bool = __has_construct<_Alloc, typename _Alloc::value_type*, const typename _Alloc::value_type&>::value && !__is_default_allocator<_Alloc>::value
|
||||
>
|
||||
struct __is_cpp17_copy_insertable;
|
||||
template <class _Alloc>
|
||||
struct __is_cpp17_copy_insertable<_Alloc, true> : __is_cpp17_move_insertable<_Alloc> {};
|
||||
template <class _Alloc>
|
||||
struct __is_cpp17_copy_insertable<_Alloc, false> : integral_constant<bool,
|
||||
is_copy_constructible<typename _Alloc::value_type>::value &&
|
||||
__is_cpp17_move_insertable<_Alloc>::value>
|
||||
{};
|
||||
|
||||
struct __has_select_on_container_copy_construction<_Alloc, decltype(
|
||||
(void)declval<_Alloc>().select_on_container_copy_construction()
|
||||
)> : true_type { };
|
||||
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
|
||||
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;
|
||||
using allocator_type = _Alloc;
|
||||
using value_type = typename allocator_type::value_type;
|
||||
using pointer = typename __pointer<value_type, allocator_type>::type;
|
||||
using const_pointer = typename __const_pointer<value_type, pointer, allocator_type>::type;
|
||||
using void_pointer = typename __void_pointer<pointer, allocator_type>::type;
|
||||
using const_void_pointer = typename __const_void_pointer<pointer, allocator_type>::type;
|
||||
using difference_type = typename __alloc_traits_difference_type<allocator_type, pointer>::type;
|
||||
using size_type = typename __size_type<allocator_type, difference_type>::type;
|
||||
using propagate_on_container_copy_assignment = typename __propagate_on_container_copy_assignment<allocator_type>::type;
|
||||
using propagate_on_container_move_assignment = typename __propagate_on_container_move_assignment<allocator_type>::type;
|
||||
using propagate_on_container_swap = typename __propagate_on_container_swap<allocator_type>::type;
|
||||
using is_always_equal = typename __is_always_equal<allocator_type>::type;
|
||||
|
||||
#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> >;
|
||||
template <class _Tp>
|
||||
using rebind_alloc = __allocator_traits_rebind_t<allocator_type, _Tp>;
|
||||
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;};
|
||||
template <class _Tp>
|
||||
struct rebind_alloc {
|
||||
using other = __allocator_traits_rebind_t<allocator_type, _Tp>;
|
||||
};
|
||||
template <class _Tp>
|
||||
struct rebind_traits {
|
||||
using other = allocator_traits<typename rebind_alloc<_Tp>::other>;
|
||||
};
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
|
||||
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static pointer allocate(allocator_type& __a, size_type __n)
|
||||
{return __a.allocate(__n);}
|
||||
static pointer allocate(allocator_type& __a, size_type __n) {
|
||||
return __a.allocate(__n);
|
||||
}
|
||||
|
||||
template <class _Ap = _Alloc, class =
|
||||
_EnableIf<__has_allocate_hint<_Ap, size_type, const_void_pointer>::value> >
|
||||
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
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>());}
|
||||
static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer __hint) {
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
return __a.allocate(__n, __hint);
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
}
|
||||
template <class _Ap = _Alloc, class = void, class =
|
||||
_EnableIf<!__has_allocate_hint<_Ap, size_type, const_void_pointer>::value> >
|
||||
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer) {
|
||||
return __a.allocate(__n);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT
|
||||
{__a.deallocate(__p, __n);}
|
||||
|
||||
template <class _Tp, class... _Args>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args)
|
||||
{__construct(__has_construct<allocator_type, _Tp*, _Args...>(),
|
||||
__a, __p, _VSTD::forward<_Args>(__args)...);}
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static void destroy(allocator_type& __a, _Tp* __p)
|
||||
{__destroy(__has_destroy<allocator_type, _Tp*>(), __a, __p);}
|
||||
static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT {
|
||||
__a.deallocate(__p, __n);
|
||||
}
|
||||
|
||||
template <class _Tp, class... _Args, class =
|
||||
_EnableIf<__has_construct<allocator_type, _Tp*, _Args...>::value> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static size_type max_size(const allocator_type& __a) _NOEXCEPT
|
||||
{return __max_size(__has_max_size<const allocator_type>(), __a);}
|
||||
|
||||
static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args) {
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
__a.construct(__p, _VSTD::forward<_Args>(__args)...);
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
}
|
||||
template <class _Tp, class... _Args, class = void, class =
|
||||
_EnableIf<!__has_construct<allocator_type, _Tp*, _Args...>::value> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
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);}
|
||||
|
||||
private:
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static pointer __allocate(allocator_type& __a, size_type __n,
|
||||
const_void_pointer __hint, true_type)
|
||||
{
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
return __a.allocate(__n, __hint);
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static pointer __allocate(allocator_type& __a, size_type __n,
|
||||
const_void_pointer, false_type)
|
||||
{return __a.allocate(__n);}
|
||||
|
||||
template <class _Tp, class... _Args>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static void __construct(true_type, allocator_type& __a, _Tp* __p, _Args&&... __args)
|
||||
{
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
__a.construct(__p, _VSTD::forward<_Args>(__args)...);
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
}
|
||||
|
||||
template <class _Tp, class... _Args>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static void __construct(false_type, allocator_type&, _Tp* __p, _Args&&... __args)
|
||||
{
|
||||
static void construct(allocator_type&, _Tp* __p, _Args&&... __args) {
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
_VSTD::construct_at(__p, _VSTD::forward<_Args>(__args)...);
|
||||
_VSTD::construct_at(__p, _VSTD::forward<_Args>(__args)...);
|
||||
#else
|
||||
::new ((void*)__p) _Tp(_VSTD::forward<_Args>(__args)...);
|
||||
::new ((void*)__p) _Tp(_VSTD::forward<_Args>(__args)...);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static void __destroy(true_type, allocator_type& __a, _Tp* __p)
|
||||
{
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
__a.destroy(__p);
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
}
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static void __destroy(false_type, allocator_type&, _Tp* __p)
|
||||
{
|
||||
template <class _Tp, class =
|
||||
_EnableIf<__has_destroy<allocator_type, _Tp*>::value> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static void destroy(allocator_type& __a, _Tp* __p) {
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
__a.destroy(__p);
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
}
|
||||
template <class _Tp, class = void, class =
|
||||
_EnableIf<!__has_destroy<allocator_type, _Tp*>::value> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static void destroy(allocator_type&, _Tp* __p) {
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
_VSTD::destroy_at(__p);
|
||||
_VSTD::destroy_at(__p);
|
||||
#else
|
||||
__p->~_Tp();
|
||||
__p->~_Tp();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
template <class _Ap = _Alloc, class =
|
||||
_EnableIf<__has_max_size<const _Ap>::value> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static size_type __max_size(true_type, const allocator_type& __a) _NOEXCEPT
|
||||
{
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
return __a.max_size();
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
}
|
||||
static size_type max_size(const allocator_type& __a) _NOEXCEPT {
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
|
||||
return __a.max_size();
|
||||
_LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
}
|
||||
template <class _Ap = _Alloc, class = void, class =
|
||||
_EnableIf<!__has_max_size<const _Ap>::value> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static size_type max_size(const allocator_type&) _NOEXCEPT {
|
||||
return numeric_limits<size_type>::max() / sizeof(value_type);
|
||||
}
|
||||
|
||||
template <class _Ap = _Alloc, class =
|
||||
_EnableIf<__has_select_on_container_copy_construction<const _Ap>::value> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static size_type __max_size(false_type, const allocator_type&) _NOEXCEPT
|
||||
{return numeric_limits<size_type>::max() / sizeof(value_type);}
|
||||
|
||||
static allocator_type select_on_container_copy_construction(const allocator_type& __a) {
|
||||
return __a.select_on_container_copy_construction();
|
||||
}
|
||||
template <class _Ap = _Alloc, class = void, class =
|
||||
_EnableIf<!__has_select_on_container_copy_construction<const _Ap>::value> >
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static allocator_type
|
||||
__select_on_container_copy_construction(true_type, const allocator_type& __a)
|
||||
{return __a.select_on_container_copy_construction();}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static allocator_type
|
||||
__select_on_container_copy_construction(false_type, const allocator_type& __a)
|
||||
{return __a;}
|
||||
static allocator_type select_on_container_copy_construction(const allocator_type& __a) {
|
||||
return __a;
|
||||
}
|
||||
};
|
||||
|
||||
template <class _Traits, class _Tp>
|
||||
struct __rebind_alloc_helper
|
||||
{
|
||||
struct __rebind_alloc_helper {
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
typedef _LIBCPP_NODEBUG_TYPE typename _Traits::template rebind_alloc<_Tp> type;
|
||||
using type _LIBCPP_NODEBUG_TYPE = typename _Traits::template rebind_alloc<_Tp>;
|
||||
#else
|
||||
typedef typename _Traits::template rebind_alloc<_Tp>::other type;
|
||||
using type = typename _Traits::template rebind_alloc<_Tp>::other;
|
||||
#endif
|
||||
};
|
||||
|
||||
// __is_default_allocator
|
||||
template <class _Tp>
|
||||
struct __is_default_allocator : false_type { };
|
||||
|
||||
template <class _Tp>
|
||||
struct __is_default_allocator<_VSTD::allocator<_Tp> > : true_type { };
|
||||
|
||||
// __is_cpp17_move_insertable
|
||||
template <class _Alloc, class = void>
|
||||
struct __is_cpp17_move_insertable
|
||||
: is_move_constructible<typename _Alloc::value_type>
|
||||
{ };
|
||||
|
||||
template <class _Alloc>
|
||||
struct __is_cpp17_move_insertable<_Alloc, _EnableIf<
|
||||
!__is_default_allocator<_Alloc>::value &&
|
||||
__has_construct<_Alloc, typename _Alloc::value_type*, typename _Alloc::value_type&&>::value
|
||||
> > : true_type { };
|
||||
|
||||
// __is_cpp17_copy_insertable
|
||||
template <class _Alloc, class = void>
|
||||
struct __is_cpp17_copy_insertable
|
||||
: integral_constant<bool,
|
||||
is_copy_constructible<typename _Alloc::value_type>::value &&
|
||||
__is_cpp17_move_insertable<_Alloc>::value
|
||||
>
|
||||
{ };
|
||||
|
||||
template <class _Alloc>
|
||||
struct __is_cpp17_copy_insertable<_Alloc, _EnableIf<
|
||||
!__is_default_allocator<_Alloc>::value &&
|
||||
__has_construct<_Alloc, typename _Alloc::value_type*, const typename _Alloc::value_type&>::value
|
||||
> >
|
||||
: __is_cpp17_move_insertable<_Alloc>
|
||||
{ };
|
||||
|
||||
#undef _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
@@ -418,7 +418,7 @@ condition_variable::wait_until(unique_lock<mutex>& __lk,
|
||||
if (__t <= __now)
|
||||
return cv_status::timeout;
|
||||
|
||||
__clock_tp_ns __t_ns = __clock_tp_ns(__safe_nanosecond_cast(__t.time_since_epoch()));
|
||||
__clock_tp_ns __t_ns = __clock_tp_ns(_VSTD::__safe_nanosecond_cast(__t.time_since_epoch()));
|
||||
|
||||
__do_timed_wait(__lk, __t_ns);
|
||||
return _Clock::now() < __t ? cv_status::no_timeout : cv_status::timeout;
|
||||
@@ -451,13 +451,13 @@ condition_variable::wait_for(unique_lock<mutex>& __lk,
|
||||
|
||||
#if defined(_LIBCPP_HAS_COND_CLOCKWAIT)
|
||||
using __clock_tp_ns = time_point<steady_clock, nanoseconds>;
|
||||
__ns_rep __now_count_ns = __safe_nanosecond_cast(__c_now.time_since_epoch()).count();
|
||||
__ns_rep __now_count_ns = _VSTD::__safe_nanosecond_cast(__c_now.time_since_epoch()).count();
|
||||
#else
|
||||
using __clock_tp_ns = time_point<system_clock, nanoseconds>;
|
||||
__ns_rep __now_count_ns = __safe_nanosecond_cast(system_clock::now().time_since_epoch()).count();
|
||||
__ns_rep __now_count_ns = _VSTD::__safe_nanosecond_cast(system_clock::now().time_since_epoch()).count();
|
||||
#endif
|
||||
|
||||
__ns_rep __d_ns_count = __safe_nanosecond_cast(__d).count();
|
||||
__ns_rep __d_ns_count = _VSTD::__safe_nanosecond_cast(__d).count();
|
||||
|
||||
if (__now_count_ns > numeric_limits<__ns_rep>::max() - __d_ns_count) {
|
||||
__do_timed_wait(__lk, __clock_tp_ns::max());
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// -*- C++ -*-
|
||||
//===------------------- support/android/locale_bionic.h ------------------===//
|
||||
//===-----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@@ -28,13 +28,13 @@ extern "C" {
|
||||
#include <android/api-level.h>
|
||||
#include <android/ndk-version.h>
|
||||
#if __ANDROID_API__ < 21
|
||||
#include <support/xlocale/__posix_l_fallback.h>
|
||||
#include <__support/xlocale/__posix_l_fallback.h>
|
||||
#endif
|
||||
// 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>
|
||||
#include <__support/xlocale/__strtonum_fallback.h>
|
||||
#elif __ANDROID_API__ < 26
|
||||
|
||||
#if defined(__cplusplus)
|
||||
@@ -1,5 +1,5 @@
|
||||
// -*- C++ -*-
|
||||
//===------------------- support/fuchsia/xlocale.h ------------------------===//
|
||||
//===-----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@@ -14,8 +14,8 @@
|
||||
|
||||
#include <cstdlib>
|
||||
#include <cwchar>
|
||||
#include <support/xlocale/__posix_l_fallback.h>
|
||||
#include <support/xlocale/__strtonum_fallback.h>
|
||||
#include <__support/xlocale/__posix_l_fallback.h>
|
||||
#include <__support/xlocale/__strtonum_fallback.h>
|
||||
|
||||
#endif // defined(__Fuchsia__)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// -*- C++ -*-
|
||||
//===--------------------- support/ibm/limits.h ---------------------------===//
|
||||
//===-----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@@ -1,5 +1,5 @@
|
||||
// -*- C++ -*-
|
||||
//===------------------- support/ibm/locale_mgmt_aix.h --------------------===//
|
||||
//===-----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@@ -1,5 +1,5 @@
|
||||
// -*- C++ -*-
|
||||
//===----------------------- support/ibm/support.h ----------------------===//
|
||||
//===-----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@@ -1,5 +1,5 @@
|
||||
// -*- C++ -*-
|
||||
//===--------------------- support/ibm/xlocale.h -------------------===//
|
||||
//===-----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@@ -9,7 +9,8 @@
|
||||
|
||||
#ifndef _LIBCPP_SUPPORT_IBM_XLOCALE_H
|
||||
#define _LIBCPP_SUPPORT_IBM_XLOCALE_H
|
||||
#include <support/ibm/locale_mgmt_aix.h>
|
||||
|
||||
#include <__support/ibm/locale_mgmt_aix.h>
|
||||
|
||||
#include "cstdlib"
|
||||
|
||||
@@ -218,7 +219,7 @@ size_t strftime_l(char *__s, size_t __size, const char *__fmt,
|
||||
#elif defined(__MVS__)
|
||||
#include <wctype.h>
|
||||
// POSIX routines
|
||||
#include <support/xlocale/__posix_l_fallback.h>
|
||||
#include <__support/xlocale/__posix_l_fallback.h>
|
||||
#endif // defined(__MVS__)
|
||||
|
||||
// The following are not POSIX routines. These are quick-and-dirty hacks
|
||||
@@ -1,5 +1,5 @@
|
||||
// -*- C++ -*-
|
||||
//===------------------- support/musl/xlocale.h ------------------------===//
|
||||
//===-----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@@ -17,9 +17,9 @@
|
||||
#include <ctype.h>
|
||||
#if !defined(__NEWLIB__) || __NEWLIB__ < 2 || \
|
||||
__NEWLIB__ == 2 && __NEWLIB_MINOR__ < 5
|
||||
#include <support/xlocale/__nop_locale_mgmt.h>
|
||||
#include <support/xlocale/__posix_l_fallback.h>
|
||||
#include <support/xlocale/__strtonum_fallback.h>
|
||||
#include <__support/xlocale/__nop_locale_mgmt.h>
|
||||
#include <__support/xlocale/__posix_l_fallback.h>
|
||||
#include <__support/xlocale/__strtonum_fallback.h>
|
||||
#endif
|
||||
|
||||
#endif // _NEWLIB_VERSION
|
||||
@@ -1,5 +1,5 @@
|
||||
// -*- C++ -*-
|
||||
//===-------------------- support/nuttx/xlocale.h -------------------------===//
|
||||
//===-----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@@ -11,8 +11,8 @@
|
||||
#define _LIBCPP_SUPPORT_NUTTX_XLOCALE_H
|
||||
|
||||
#if defined(__NuttX__)
|
||||
#include <support/xlocale/__posix_l_fallback.h>
|
||||
#include <support/xlocale/__strtonum_fallback.h>
|
||||
#include <__support/xlocale/__posix_l_fallback.h>
|
||||
#include <__support/xlocale/__strtonum_fallback.h>
|
||||
#endif // __NuttX__
|
||||
|
||||
#endif
|
||||
19
lib/libcxx/include/__support/openbsd/xlocale.h
Normal file
19
lib/libcxx/include/__support/openbsd/xlocale.h
Normal file
@@ -0,0 +1,19 @@
|
||||
// -*- C++ -*-
|
||||
//===-----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef _LIBCPP_SUPPORT_OPENBSD_XLOCALE_H
|
||||
#define _LIBCPP_SUPPORT_OPENBSD_XLOCALE_H
|
||||
|
||||
#include <cstdlib>
|
||||
#include <clocale>
|
||||
#include <cwctype>
|
||||
#include <ctype.h>
|
||||
#include <__support/xlocale/__strtonum_fallback.h>
|
||||
|
||||
#endif
|
||||
@@ -1,5 +1,5 @@
|
||||
// -*- C++ -*-
|
||||
//===------------------ support/win32/limits_msvc_win32.h -----------------===//
|
||||
//===-----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@@ -1,5 +1,5 @@
|
||||
// -*- C++ -*-
|
||||
//===--------------------- support/win32/locale_win32.h -------------------===//
|
||||
//===-----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@@ -1,5 +1,5 @@
|
||||
// -*- C++ -*-
|
||||
//===------------ support/xlocale/__nop_locale_mgmt.h -----------------===//
|
||||
//===-----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@@ -1,5 +1,5 @@
|
||||
// -*- C++ -*-
|
||||
//===--------------- support/xlocale/__posix_l_fallback.h -----------------===//
|
||||
//===-----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@@ -1,5 +1,5 @@
|
||||
// -*- C++ -*-
|
||||
//===-------------- support/xlocale/__strtonum_fallback.h -----------------===//
|
||||
//===-----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@@ -17,7 +17,7 @@
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef __MVS__
|
||||
# include <support/ibm/nanosleep.h>
|
||||
# include <__support/ibm/nanosleep.h>
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
|
||||
|
||||
@@ -108,10 +108,10 @@ __tree_sub_invariant(_NodePtr __x)
|
||||
if (__x->__right_ && !__x->__right_->__is_black_)
|
||||
return 0;
|
||||
}
|
||||
unsigned __h = __tree_sub_invariant(__x->__left_);
|
||||
unsigned __h = _VSTD::__tree_sub_invariant(__x->__left_);
|
||||
if (__h == 0)
|
||||
return 0; // invalid left subtree
|
||||
if (__h != __tree_sub_invariant(__x->__right_))
|
||||
if (__h != _VSTD::__tree_sub_invariant(__x->__right_))
|
||||
return 0; // invalid or different height right subtree
|
||||
return __h + __x->__is_black_; // return black height of this node
|
||||
}
|
||||
@@ -128,13 +128,13 @@ __tree_invariant(_NodePtr __root)
|
||||
// check __x->__parent_ consistency
|
||||
if (__root->__parent_ == nullptr)
|
||||
return false;
|
||||
if (!__tree_is_left_child(__root))
|
||||
if (!_VSTD::__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;
|
||||
return _VSTD::__tree_sub_invariant(__root) != 0;
|
||||
}
|
||||
|
||||
// Returns: pointer to the left-most node under __x.
|
||||
@@ -168,8 +168,8 @@ _NodePtr
|
||||
__tree_next(_NodePtr __x) _NOEXCEPT
|
||||
{
|
||||
if (__x->__right_ != nullptr)
|
||||
return __tree_min(__x->__right_);
|
||||
while (!__tree_is_left_child(__x))
|
||||
return _VSTD::__tree_min(__x->__right_);
|
||||
while (!_VSTD::__tree_is_left_child(__x))
|
||||
__x = __x->__parent_unsafe();
|
||||
return __x->__parent_unsafe();
|
||||
}
|
||||
@@ -180,8 +180,8 @@ _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))
|
||||
return static_cast<_EndNodePtr>(_VSTD::__tree_min(__x->__right_));
|
||||
while (!_VSTD::__tree_is_left_child(__x))
|
||||
__x = __x->__parent_unsafe();
|
||||
return static_cast<_EndNodePtr>(__x->__parent_);
|
||||
}
|
||||
@@ -195,9 +195,9 @@ _NodePtr
|
||||
__tree_prev_iter(_EndNodePtr __x) _NOEXCEPT
|
||||
{
|
||||
if (__x->__left_ != nullptr)
|
||||
return __tree_max(__x->__left_);
|
||||
return _VSTD::__tree_max(__x->__left_);
|
||||
_NodePtr __xx = static_cast<_NodePtr>(__x);
|
||||
while (__tree_is_left_child(__xx))
|
||||
while (_VSTD::__tree_is_left_child(__xx))
|
||||
__xx = __xx->__parent_unsafe();
|
||||
return __xx->__parent_unsafe();
|
||||
}
|
||||
@@ -237,7 +237,7 @@ __tree_left_rotate(_NodePtr __x) _NOEXCEPT
|
||||
if (__x->__right_ != nullptr)
|
||||
__x->__right_->__set_parent(__x);
|
||||
__y->__parent_ = __x->__parent_;
|
||||
if (__tree_is_left_child(__x))
|
||||
if (_VSTD::__tree_is_left_child(__x))
|
||||
__x->__parent_->__left_ = __y;
|
||||
else
|
||||
__x->__parent_unsafe()->__right_ = __y;
|
||||
@@ -257,7 +257,7 @@ __tree_right_rotate(_NodePtr __x) _NOEXCEPT
|
||||
if (__x->__left_ != nullptr)
|
||||
__x->__left_->__set_parent(__x);
|
||||
__y->__parent_ = __x->__parent_;
|
||||
if (__tree_is_left_child(__x))
|
||||
if (_VSTD::__tree_is_left_child(__x))
|
||||
__x->__parent_->__left_ = __y;
|
||||
else
|
||||
__x->__parent_unsafe()->__right_ = __y;
|
||||
@@ -281,7 +281,7 @@ __tree_balance_after_insert(_NodePtr __root, _NodePtr __x) _NOEXCEPT
|
||||
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()))
|
||||
if (_VSTD::__tree_is_left_child(__x->__parent_unsafe()))
|
||||
{
|
||||
_NodePtr __y = __x->__parent_unsafe()->__parent_unsafe()->__right_;
|
||||
if (__y != nullptr && !__y->__is_black_)
|
||||
@@ -294,16 +294,16 @@ __tree_balance_after_insert(_NodePtr __root, _NodePtr __x) _NOEXCEPT
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!__tree_is_left_child(__x))
|
||||
if (!_VSTD::__tree_is_left_child(__x))
|
||||
{
|
||||
__x = __x->__parent_unsafe();
|
||||
__tree_left_rotate(__x);
|
||||
_VSTD::__tree_left_rotate(__x);
|
||||
}
|
||||
__x = __x->__parent_unsafe();
|
||||
__x->__is_black_ = true;
|
||||
__x = __x->__parent_unsafe();
|
||||
__x->__is_black_ = false;
|
||||
__tree_right_rotate(__x);
|
||||
_VSTD::__tree_right_rotate(__x);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -320,16 +320,16 @@ __tree_balance_after_insert(_NodePtr __root, _NodePtr __x) _NOEXCEPT
|
||||
}
|
||||
else
|
||||
{
|
||||
if (__tree_is_left_child(__x))
|
||||
if (_VSTD::__tree_is_left_child(__x))
|
||||
{
|
||||
__x = __x->__parent_unsafe();
|
||||
__tree_right_rotate(__x);
|
||||
_VSTD::__tree_right_rotate(__x);
|
||||
}
|
||||
__x = __x->__parent_unsafe();
|
||||
__x->__is_black_ = true;
|
||||
__x = __x->__parent_unsafe();
|
||||
__x->__is_black_ = false;
|
||||
__tree_left_rotate(__x);
|
||||
_VSTD::__tree_left_rotate(__x);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -352,7 +352,7 @@ __tree_remove(_NodePtr __root, _NodePtr __z) _NOEXCEPT
|
||||
// __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);
|
||||
__z : _VSTD::__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)
|
||||
@@ -360,7 +360,7 @@ __tree_remove(_NodePtr __root, _NodePtr __z) _NOEXCEPT
|
||||
// link __x to __y's parent, and find __w
|
||||
if (__x != nullptr)
|
||||
__x->__parent_ = __y->__parent_;
|
||||
if (__tree_is_left_child(__y))
|
||||
if (_VSTD::__tree_is_left_child(__y))
|
||||
{
|
||||
__y->__parent_->__left_ = __x;
|
||||
if (__y != __root)
|
||||
@@ -381,7 +381,7 @@ __tree_remove(_NodePtr __root, _NodePtr __z) _NOEXCEPT
|
||||
{
|
||||
// __z->__left_ != nulptr but __z->__right_ might == __x == nullptr
|
||||
__y->__parent_ = __z->__parent_;
|
||||
if (__tree_is_left_child(__z))
|
||||
if (_VSTD::__tree_is_left_child(__z))
|
||||
__y->__parent_->__left_ = __y;
|
||||
else
|
||||
__y->__parent_unsafe()->__right_ = __y;
|
||||
@@ -421,13 +421,13 @@ __tree_remove(_NodePtr __root, _NodePtr __z) _NOEXCEPT
|
||||
// with a non-null black child).
|
||||
while (true)
|
||||
{
|
||||
if (!__tree_is_left_child(__w)) // if x is left child
|
||||
if (!_VSTD::__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());
|
||||
_VSTD::__tree_left_rotate(__w->__parent_unsafe());
|
||||
// __x is still valid
|
||||
// reset __root only if necessary
|
||||
if (__root == __w->__left_)
|
||||
@@ -448,7 +448,7 @@ __tree_remove(_NodePtr __root, _NodePtr __z) _NOEXCEPT
|
||||
break;
|
||||
}
|
||||
// reset sibling, and it still can't be null
|
||||
__w = __tree_is_left_child(__x) ?
|
||||
__w = _VSTD::__tree_is_left_child(__x) ?
|
||||
__x->__parent_unsafe()->__right_ :
|
||||
__x->__parent_->__left_;
|
||||
// continue;
|
||||
@@ -460,7 +460,7 @@ __tree_remove(_NodePtr __root, _NodePtr __z) _NOEXCEPT
|
||||
// __w left child is non-null and red
|
||||
__w->__left_->__is_black_ = true;
|
||||
__w->__is_black_ = false;
|
||||
__tree_right_rotate(__w);
|
||||
_VSTD::__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();
|
||||
@@ -469,7 +469,7 @@ __tree_remove(_NodePtr __root, _NodePtr __z) _NOEXCEPT
|
||||
__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());
|
||||
_VSTD::__tree_left_rotate(__w->__parent_unsafe());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -479,7 +479,7 @@ __tree_remove(_NodePtr __root, _NodePtr __z) _NOEXCEPT
|
||||
{
|
||||
__w->__is_black_ = true;
|
||||
__w->__parent_unsafe()->__is_black_ = false;
|
||||
__tree_right_rotate(__w->__parent_unsafe());
|
||||
_VSTD::__tree_right_rotate(__w->__parent_unsafe());
|
||||
// __x is still valid
|
||||
// reset __root only if necessary
|
||||
if (__root == __w->__right_)
|
||||
@@ -500,7 +500,7 @@ __tree_remove(_NodePtr __root, _NodePtr __z) _NOEXCEPT
|
||||
break;
|
||||
}
|
||||
// reset sibling, and it still can't be null
|
||||
__w = __tree_is_left_child(__x) ?
|
||||
__w = _VSTD::__tree_is_left_child(__x) ?
|
||||
__x->__parent_unsafe()->__right_ :
|
||||
__x->__parent_->__left_;
|
||||
// continue;
|
||||
@@ -512,7 +512,7 @@ __tree_remove(_NodePtr __root, _NodePtr __z) _NOEXCEPT
|
||||
// __w right child is non-null and red
|
||||
__w->__right_->__is_black_ = true;
|
||||
__w->__is_black_ = false;
|
||||
__tree_left_rotate(__w);
|
||||
_VSTD::__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();
|
||||
@@ -521,7 +521,7 @@ __tree_remove(_NodePtr __root, _NodePtr __z) _NOEXCEPT
|
||||
__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());
|
||||
_VSTD::__tree_right_rotate(__w->__parent_unsafe());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -839,7 +839,7 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__tree_iterator& operator++() {
|
||||
__ptr_ = static_cast<__iter_pointer>(
|
||||
__tree_next_iter<__end_node_pointer>(static_cast<__node_base_pointer>(__ptr_)));
|
||||
_VSTD::__tree_next_iter<__end_node_pointer>(static_cast<__node_base_pointer>(__ptr_)));
|
||||
return *this;
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -848,7 +848,7 @@ public:
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__tree_iterator& operator--() {
|
||||
__ptr_ = static_cast<__iter_pointer>(__tree_prev_iter<__node_base_pointer>(
|
||||
__ptr_ = static_cast<__iter_pointer>(_VSTD::__tree_prev_iter<__node_base_pointer>(
|
||||
static_cast<__end_node_pointer>(__ptr_)));
|
||||
return *this;
|
||||
}
|
||||
@@ -920,7 +920,7 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__tree_const_iterator& operator++() {
|
||||
__ptr_ = static_cast<__iter_pointer>(
|
||||
__tree_next_iter<__end_node_pointer>(static_cast<__node_base_pointer>(__ptr_)));
|
||||
_VSTD::__tree_next_iter<__end_node_pointer>(static_cast<__node_base_pointer>(__ptr_)));
|
||||
return *this;
|
||||
}
|
||||
|
||||
@@ -930,7 +930,7 @@ public:
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__tree_const_iterator& operator--() {
|
||||
__ptr_ = static_cast<__iter_pointer>(__tree_prev_iter<__node_base_pointer>(
|
||||
__ptr_ = static_cast<__iter_pointer>(_VSTD::__tree_prev_iter<__node_base_pointer>(
|
||||
static_cast<__end_node_pointer>(__ptr_)));
|
||||
return *this;
|
||||
}
|
||||
@@ -1590,20 +1590,20 @@ __tree<_Tp, _Compare, _Allocator>::_DetachedTreeCache::__detach_next(__node_poin
|
||||
{
|
||||
if (__cache->__parent_ == nullptr)
|
||||
return nullptr;
|
||||
if (__tree_is_left_child(static_cast<__node_base_pointer>(__cache)))
|
||||
if (_VSTD::__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_));
|
||||
return static_cast<__node_pointer>(_VSTD::__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_));
|
||||
return static_cast<__node_pointer>(_VSTD::__tree_leaf(__cache->__left_));
|
||||
}
|
||||
|
||||
template <class _Tp, class _Compare, class _Allocator>
|
||||
@@ -2078,7 +2078,7 @@ void __tree<_Tp, _Compare, _Allocator>::__insert_node_at(
|
||||
__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);
|
||||
_VSTD::__tree_balance_after_insert(__end_node()->__left_, __child);
|
||||
++size();
|
||||
}
|
||||
|
||||
@@ -2248,8 +2248,8 @@ __tree<_Tp, _Compare, _Allocator>::__remove_node_pointer(__node_pointer __ptr) _
|
||||
if (__begin_node() == __ptr)
|
||||
__begin_node() = __r.__ptr_;
|
||||
--size();
|
||||
__tree_remove(__end_node()->__left_,
|
||||
static_cast<__node_base_pointer>(__ptr));
|
||||
_VSTD::__tree_remove(__end_node()->__left_,
|
||||
static_cast<__node_base_pointer>(__ptr));
|
||||
return __r;
|
||||
}
|
||||
|
||||
@@ -2627,7 +2627,7 @@ __tree<_Tp, _Compare, _Allocator>::__equal_range_unique(const _Key& __k)
|
||||
return _Pp(iterator(__rt),
|
||||
iterator(
|
||||
__rt->__right_ != nullptr ?
|
||||
static_cast<__iter_pointer>(__tree_min(__rt->__right_))
|
||||
static_cast<__iter_pointer>(_VSTD::__tree_min(__rt->__right_))
|
||||
: __result));
|
||||
}
|
||||
return _Pp(iterator(__result), iterator(__result));
|
||||
@@ -2655,7 +2655,7 @@ __tree<_Tp, _Compare, _Allocator>::__equal_range_unique(const _Key& __k) const
|
||||
return _Pp(const_iterator(__rt),
|
||||
const_iterator(
|
||||
__rt->__right_ != nullptr ?
|
||||
static_cast<__iter_pointer>(__tree_min(__rt->__right_))
|
||||
static_cast<__iter_pointer>(_VSTD::__tree_min(__rt->__right_))
|
||||
: __result));
|
||||
}
|
||||
return _Pp(const_iterator(__result), const_iterator(__result));
|
||||
@@ -2724,8 +2724,8 @@ __tree<_Tp, _Compare, _Allocator>::remove(const_iterator __p) _NOEXCEPT
|
||||
__begin_node() = static_cast<__iter_pointer>(__np->__parent_);
|
||||
}
|
||||
--size();
|
||||
__tree_remove(__end_node()->__left_,
|
||||
static_cast<__node_base_pointer>(__np));
|
||||
_VSTD::__tree_remove(__end_node()->__left_,
|
||||
static_cast<__node_base_pointer>(__np));
|
||||
return __node_holder(__np, _Dp(__node_alloc(), true));
|
||||
}
|
||||
|
||||
|
||||
@@ -267,7 +267,7 @@ template <class InputIterator, class OutputIterator, class BinaryPredicate>
|
||||
unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
|
||||
|
||||
template <class BidirectionalIterator>
|
||||
void
|
||||
constexpr void // constexpr in C++20
|
||||
reverse(BidirectionalIterator first, BidirectionalIterator last);
|
||||
|
||||
template <class BidirectionalIterator, class OutputIterator>
|
||||
@@ -301,12 +301,22 @@ template<class RandomAccessIterator, class UniformRandomNumberGenerator>
|
||||
void shuffle(RandomAccessIterator first, RandomAccessIterator last,
|
||||
UniformRandomNumberGenerator&& g);
|
||||
|
||||
template<class ForwardIterator>
|
||||
constexpr ForwardIterator
|
||||
shift_left(ForwardIterator first, ForwardIterator last,
|
||||
typename iterator_traits<ForwardIterator>::difference_type n); // C++20
|
||||
|
||||
template<class ForwardIterator>
|
||||
constexpr ForwardIterator
|
||||
shift_right(ForwardIterator first, ForwardIterator last,
|
||||
typename iterator_traits<ForwardIterator>::difference_type n); // C++20
|
||||
|
||||
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
|
||||
constexpr ForwardIterator // constexpr in C++20
|
||||
partition(ForwardIterator first, ForwardIterator last, Predicate pred);
|
||||
|
||||
template <class InputIterator, class OutputIterator1,
|
||||
@@ -616,19 +626,19 @@ template <class InputIterator1, class InputIterator2, class Compare>
|
||||
InputIterator2 first2, InputIterator2 last2, Compare comp);
|
||||
|
||||
template <class BidirectionalIterator>
|
||||
bool
|
||||
constexpr bool // constexpr in C++20
|
||||
next_permutation(BidirectionalIterator first, BidirectionalIterator last);
|
||||
|
||||
template <class BidirectionalIterator, class Compare>
|
||||
bool
|
||||
constexpr bool // constexpr in C++20
|
||||
next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
|
||||
|
||||
template <class BidirectionalIterator>
|
||||
bool
|
||||
constexpr bool // constexpr in C++20
|
||||
prev_permutation(BidirectionalIterator first, BidirectionalIterator last);
|
||||
|
||||
template <class BidirectionalIterator, class Compare>
|
||||
bool
|
||||
constexpr bool // constexpr in C++20
|
||||
prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
|
||||
|
||||
} // std
|
||||
@@ -2311,7 +2321,7 @@ unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __res
|
||||
// reverse
|
||||
|
||||
template <class _BidirectionalIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
void
|
||||
__reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
|
||||
{
|
||||
@@ -2325,7 +2335,7 @@ __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirec
|
||||
}
|
||||
|
||||
template <class _RandomAccessIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
void
|
||||
__reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag)
|
||||
{
|
||||
@@ -2335,7 +2345,7 @@ __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_ac
|
||||
}
|
||||
|
||||
template <class _BidirectionalIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
void
|
||||
reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
|
||||
{
|
||||
@@ -3029,9 +3039,17 @@ private:
|
||||
|
||||
public:
|
||||
// constructors and reset functions
|
||||
explicit uniform_int_distribution(result_type __a = 0,
|
||||
result_type __b = numeric_limits<result_type>::max())
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
uniform_int_distribution() : uniform_int_distribution(0) {}
|
||||
explicit uniform_int_distribution(
|
||||
result_type __a, result_type __b = numeric_limits<result_type>::max())
|
||||
: __p_(param_type(__a, __b)) {}
|
||||
#else
|
||||
explicit uniform_int_distribution(
|
||||
result_type __a = 0,
|
||||
result_type __b = numeric_limits<result_type>::max())
|
||||
: __p_(param_type(__a, __b)) {}
|
||||
#endif
|
||||
explicit uniform_int_distribution(const param_type& __p) : __p_(__p) {}
|
||||
void reset() {}
|
||||
|
||||
@@ -3251,6 +3269,111 @@ template<class _RandomAccessIterator, class _UniformRandomNumberGenerator>
|
||||
}
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
|
||||
// shift_left, shift_right
|
||||
|
||||
template <class _ForwardIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY constexpr
|
||||
_ForwardIterator
|
||||
shift_left(_ForwardIterator __first, _ForwardIterator __last,
|
||||
typename iterator_traits<_ForwardIterator>::difference_type __n)
|
||||
{
|
||||
if (__n == 0) {
|
||||
return __last;
|
||||
}
|
||||
|
||||
_ForwardIterator __m = __first;
|
||||
if constexpr (__is_cpp17_random_access_iterator<_ForwardIterator>::value) {
|
||||
if (__n >= __last - __first) {
|
||||
return __first;
|
||||
}
|
||||
__m += __n;
|
||||
} else {
|
||||
for (; __n > 0; --__n) {
|
||||
if (__m == __last) {
|
||||
return __first;
|
||||
}
|
||||
++__m;
|
||||
}
|
||||
}
|
||||
return _VSTD::move(__m, __last, __first);
|
||||
}
|
||||
|
||||
template <class _ForwardIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY constexpr
|
||||
_ForwardIterator
|
||||
shift_right(_ForwardIterator __first, _ForwardIterator __last,
|
||||
typename iterator_traits<_ForwardIterator>::difference_type __n)
|
||||
{
|
||||
if (__n == 0) {
|
||||
return __first;
|
||||
}
|
||||
|
||||
if constexpr (__is_cpp17_random_access_iterator<_ForwardIterator>::value) {
|
||||
decltype(__n) __d = __last - __first;
|
||||
if (__n >= __d) {
|
||||
return __last;
|
||||
}
|
||||
_ForwardIterator __m = __first + (__d - __n);
|
||||
return _VSTD::move_backward(__first, __m, __last);
|
||||
} else if constexpr (__is_cpp17_bidirectional_iterator<_ForwardIterator>::value) {
|
||||
_ForwardIterator __m = __last;
|
||||
for (; __n > 0; --__n) {
|
||||
if (__m == __first) {
|
||||
return __last;
|
||||
}
|
||||
--__m;
|
||||
}
|
||||
return _VSTD::move_backward(__first, __m, __last);
|
||||
} else {
|
||||
_ForwardIterator __ret = __first;
|
||||
for (; __n > 0; --__n) {
|
||||
if (__ret == __last) {
|
||||
return __last;
|
||||
}
|
||||
++__ret;
|
||||
}
|
||||
|
||||
// We have an __n-element scratch space from __first to __ret.
|
||||
// Slide an __n-element window [__trail, __lead) from left to right.
|
||||
// We're essentially doing swap_ranges(__first, __ret, __trail, __lead)
|
||||
// over and over; but once __lead reaches __last we needn't bother
|
||||
// to save the values of elements [__trail, __last).
|
||||
|
||||
auto __trail = __first;
|
||||
auto __lead = __ret;
|
||||
while (__trail != __ret) {
|
||||
if (__lead == __last) {
|
||||
_VSTD::move(__first, __trail, __ret);
|
||||
return __ret;
|
||||
}
|
||||
++__trail;
|
||||
++__lead;
|
||||
}
|
||||
|
||||
_ForwardIterator __mid = __first;
|
||||
while (true) {
|
||||
if (__lead == __last) {
|
||||
__trail = _VSTD::move(__mid, __ret, __trail);
|
||||
_VSTD::move(__first, __mid, __trail);
|
||||
return __ret;
|
||||
}
|
||||
swap(*__mid, *__trail);
|
||||
++__mid;
|
||||
++__trail;
|
||||
++__lead;
|
||||
if (__mid == __ret) {
|
||||
__mid = __first;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_STD_VER > 17
|
||||
|
||||
// is_partitioned
|
||||
|
||||
template <class _InputIterator, class _Predicate>
|
||||
_LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred)
|
||||
@@ -3270,7 +3393,7 @@ is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred)
|
||||
// partition
|
||||
|
||||
template <class _Predicate, class _ForwardIterator>
|
||||
_ForwardIterator
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
|
||||
__partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
|
||||
{
|
||||
while (true)
|
||||
@@ -3293,7 +3416,7 @@ __partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred
|
||||
}
|
||||
|
||||
template <class _Predicate, class _BidirectionalIterator>
|
||||
_BidirectionalIterator
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 _BidirectionalIterator
|
||||
__partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
|
||||
bidirectional_iterator_tag)
|
||||
{
|
||||
@@ -3318,7 +3441,7 @@ __partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Pred
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Predicate>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_ForwardIterator
|
||||
partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
|
||||
{
|
||||
@@ -4483,7 +4606,7 @@ __buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator
|
||||
value_type* __p = __buff;
|
||||
for (_BidirectionalIterator __i = __first; __i != __middle; __d.template __incr<value_type>(), (void) ++__i, (void) ++__p)
|
||||
::new ((void*)__p) value_type(_VSTD::move(*__i));
|
||||
_VSTD::__half_inplace_merge(__buff, __p, __middle, __last, __first, __comp);
|
||||
_VSTD::__half_inplace_merge<_Compare>(__buff, __p, __middle, __last, __first, __comp);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -4492,9 +4615,10 @@ __buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator
|
||||
::new ((void*)__p) value_type(_VSTD::move(*__i));
|
||||
typedef reverse_iterator<_BidirectionalIterator> _RBi;
|
||||
typedef reverse_iterator<value_type*> _Rv;
|
||||
_VSTD::__half_inplace_merge(_Rv(__p), _Rv(__buff),
|
||||
typedef __invert<_Compare> _Inverted;
|
||||
_VSTD::__half_inplace_merge<_Inverted>(_Rv(__p), _Rv(__buff),
|
||||
_RBi(__middle), _RBi(__first),
|
||||
_RBi(__last), _VSTD::__invert<_Compare>(__comp));
|
||||
_RBi(__last), _Inverted(__comp));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5636,7 +5760,7 @@ lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
// next_permutation
|
||||
|
||||
template <class _Compare, class _BidirectionalIterator>
|
||||
bool
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
__next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
|
||||
{
|
||||
_BidirectionalIterator __i = __last;
|
||||
@@ -5663,7 +5787,7 @@ __next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last
|
||||
}
|
||||
|
||||
template <class _BidirectionalIterator, class _Compare>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
bool
|
||||
next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
|
||||
{
|
||||
@@ -5672,7 +5796,7 @@ next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last,
|
||||
}
|
||||
|
||||
template <class _BidirectionalIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
bool
|
||||
next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
|
||||
{
|
||||
@@ -5683,7 +5807,7 @@ next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
|
||||
// prev_permutation
|
||||
|
||||
template <class _Compare, class _BidirectionalIterator>
|
||||
bool
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
__prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
|
||||
{
|
||||
_BidirectionalIterator __i = __last;
|
||||
@@ -5710,7 +5834,7 @@ __prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last
|
||||
}
|
||||
|
||||
template <class _BidirectionalIterator, class _Compare>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
bool
|
||||
prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
|
||||
{
|
||||
@@ -5719,7 +5843,7 @@ prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last,
|
||||
}
|
||||
|
||||
template <class _BidirectionalIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
bool
|
||||
prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
|
||||
{
|
||||
|
||||
@@ -500,7 +500,7 @@ to_array(_Tp (&__arr)[_Size]) noexcept(is_nothrow_constructible_v<_Tp, _Tp&>) {
|
||||
static_assert(
|
||||
is_constructible_v<_Tp, _Tp&>,
|
||||
"[array.creation]/1: to_array requires copy constructible elements.");
|
||||
return __to_array_lvalue_impl(__arr, make_index_sequence<_Size>());
|
||||
return _VSTD::__to_array_lvalue_impl(__arr, make_index_sequence<_Size>());
|
||||
}
|
||||
|
||||
template <typename _Tp, size_t _Size>
|
||||
@@ -512,8 +512,8 @@ to_array(_Tp(&&__arr)[_Size]) noexcept(is_nothrow_move_constructible_v<_Tp>) {
|
||||
static_assert(
|
||||
is_move_constructible_v<_Tp>,
|
||||
"[array.creation]/4: to_array requires move constructible elements.");
|
||||
return __to_array_rvalue_impl(_VSTD::move(__arr),
|
||||
make_index_sequence<_Size>());
|
||||
return _VSTD::__to_array_rvalue_impl(_VSTD::move(__arr),
|
||||
make_index_sequence<_Size>());
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_STD_VER > 17
|
||||
|
||||
@@ -55,13 +55,14 @@ namespace std {
|
||||
*/
|
||||
|
||||
#include <__config>
|
||||
#include <__bits>
|
||||
#include <limits>
|
||||
#include <type_traits>
|
||||
#include <version>
|
||||
#include <__debug>
|
||||
|
||||
#if defined(__IBMCPP__)
|
||||
#include "support/ibm/support.h"
|
||||
#include "__support/ibm/support.h"
|
||||
#endif
|
||||
#if defined(_LIBCPP_COMPILER_MSVC)
|
||||
#include <intrin.h>
|
||||
@@ -76,122 +77,6 @@ _LIBCPP_PUSH_MACROS
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#ifndef _LIBCPP_COMPILER_MSVC
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_ctz(unsigned __x) _NOEXCEPT { return __builtin_ctz(__x); }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_ctz(unsigned long __x) _NOEXCEPT { return __builtin_ctzl(__x); }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_ctz(unsigned long long __x) _NOEXCEPT { return __builtin_ctzll(__x); }
|
||||
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_clz(unsigned __x) _NOEXCEPT { return __builtin_clz(__x); }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_clz(unsigned long __x) _NOEXCEPT { return __builtin_clzl(__x); }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_clz(unsigned long long __x) _NOEXCEPT { return __builtin_clzll(__x); }
|
||||
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_popcount(unsigned __x) _NOEXCEPT { return __builtin_popcount(__x); }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_popcount(unsigned long __x) _NOEXCEPT { return __builtin_popcountl(__x); }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
int __libcpp_popcount(unsigned long long __x) _NOEXCEPT { return __builtin_popcountll(__x); }
|
||||
|
||||
#else // _LIBCPP_COMPILER_MSVC
|
||||
|
||||
// Precondition: __x != 0
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
int __libcpp_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 __libcpp_ctz(unsigned long __x) {
|
||||
static_assert(sizeof(unsigned long) == sizeof(unsigned), "");
|
||||
return __ctz(static_cast<unsigned>(__x));
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
int __libcpp_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 __libcpp_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 __libcpp_clz(unsigned long __x) {
|
||||
static_assert(sizeof(unsigned) == sizeof(unsigned long), "");
|
||||
return __libcpp_clz(static_cast<unsigned>(__x));
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
int __libcpp_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 __libcpp_popcount(unsigned __x) {
|
||||
static_assert(sizeof(unsigned) == 4, "");
|
||||
return __popcnt(__x);
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_popcount(unsigned long __x) {
|
||||
static_assert(sizeof(unsigned long) == 4, "");
|
||||
return __popcnt(__x);
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_popcount(unsigned long long __x) {
|
||||
static_assert(sizeof(unsigned long long) == 8, "");
|
||||
return __popcnt64(__x);
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_COMPILER_MSVC
|
||||
|
||||
template <class _Tp>
|
||||
using __bitop_unsigned_integer _LIBCPP_NODEBUG_TYPE = integral_constant<bool,
|
||||
|
||||
@@ -990,7 +990,7 @@ inline
|
||||
size_t
|
||||
bitset<_Size>::count() const _NOEXCEPT
|
||||
{
|
||||
return static_cast<size_t>(__count_bool_true(base::__make_iter(0), _Size));
|
||||
return static_cast<size_t>(_VSTD::__count_bool_true(base::__make_iter(0), _Size));
|
||||
}
|
||||
|
||||
template <size_t _Size>
|
||||
|
||||
@@ -157,6 +157,11 @@ concept __same_as_impl = _VSTD::_IsSame<_Tp, _Up>::value;
|
||||
template<class _Tp, class _Up>
|
||||
concept same_as = __same_as_impl<_Tp, _Up> && __same_as_impl<_Up, _Tp>;
|
||||
|
||||
// [concept.destructible]
|
||||
|
||||
template<class _Tp>
|
||||
concept destructible = _VSTD::is_nothrow_destructible_v<_Tp>;
|
||||
|
||||
#endif //_LIBCPP_STD_VER > 17 && defined(__cpp_concepts) && __cpp_concepts >= 201811L
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
@@ -251,6 +251,10 @@
|
||||
|
||||
#include <__debug>
|
||||
|
||||
#if defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
|
||||
# error "The Filesystem library is not supported by this configuration of libc++"
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
@@ -568,9 +572,19 @@ struct __can_convert_char<char32_t> {
|
||||
template <class _ECharT>
|
||||
typename enable_if<__can_convert_char<_ECharT>::value, bool>::type
|
||||
__is_separator(_ECharT __e) {
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
return __e == _ECharT('/') || __e == _ECharT('\\');
|
||||
#else
|
||||
return __e == _ECharT('/');
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef _LIBCPP_NO_HAS_CHAR8_T
|
||||
typedef u8string __u8_string;
|
||||
#else
|
||||
typedef string __u8_string;
|
||||
#endif
|
||||
|
||||
struct _NullSentinel {};
|
||||
|
||||
template <class _Tp>
|
||||
@@ -672,6 +686,21 @@ 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> {};
|
||||
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
typedef wstring __path_string;
|
||||
typedef wchar_t __path_value;
|
||||
#else
|
||||
typedef string __path_string;
|
||||
typedef char __path_value;
|
||||
#endif
|
||||
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
_LIBCPP_FUNC_VIS
|
||||
size_t __wide_to_char(const wstring&, char*, size_t);
|
||||
_LIBCPP_FUNC_VIS
|
||||
size_t __char_to_wide(const string&, wchar_t*, size_t);
|
||||
#endif
|
||||
|
||||
template <class _ECharT>
|
||||
struct _PathCVT;
|
||||
|
||||
@@ -682,24 +711,40 @@ struct _PathCVT {
|
||||
"Char type not convertible");
|
||||
|
||||
typedef __narrow_to_utf8<sizeof(_ECharT) * __CHAR_BIT__> _Narrower;
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
typedef __widen_from_utf8<sizeof(wchar_t) * __CHAR_BIT__> _Widener;
|
||||
#endif
|
||||
|
||||
static void __append_range(string& __dest, _ECharT const* __b,
|
||||
static void __append_range(__path_string& __dest, _ECharT const* __b,
|
||||
_ECharT const* __e) {
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
string __utf8;
|
||||
_Narrower()(back_inserter(__utf8), __b, __e);
|
||||
_Widener()(back_inserter(__dest), __utf8.data(), __utf8.data() + __utf8.size());
|
||||
#else
|
||||
_Narrower()(back_inserter(__dest), __b, __e);
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _Iter>
|
||||
static void __append_range(string& __dest, _Iter __b, _Iter __e) {
|
||||
static void __append_range(__path_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);
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
string __utf8;
|
||||
_Narrower()(back_inserter(__utf8), __tmp.data(),
|
||||
__tmp.data() + __tmp.length());
|
||||
_Widener()(back_inserter(__dest), __utf8.data(), __utf8.data() + __utf8.size());
|
||||
#else
|
||||
_Narrower()(back_inserter(__dest), __tmp.data(),
|
||||
__tmp.data() + __tmp.length());
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _Iter>
|
||||
static void __append_range(string& __dest, _Iter __b, _NullSentinel) {
|
||||
static void __append_range(__path_string& __dest, _Iter __b, _NullSentinel) {
|
||||
static_assert(!is_same<_Iter, _ECharT*>::value, "Call const overload");
|
||||
const _ECharT __sentinel = _ECharT{};
|
||||
if (*__b == __sentinel)
|
||||
@@ -707,12 +752,19 @@ struct _PathCVT {
|
||||
basic_string<_ECharT> __tmp;
|
||||
for (; *__b != __sentinel; ++__b)
|
||||
__tmp.push_back(*__b);
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
string __utf8;
|
||||
_Narrower()(back_inserter(__utf8), __tmp.data(),
|
||||
__tmp.data() + __tmp.length());
|
||||
_Widener()(back_inserter(__dest), __utf8.data(), __utf8.data() + __utf8.size());
|
||||
#else
|
||||
_Narrower()(back_inserter(__dest), __tmp.data(),
|
||||
__tmp.data() + __tmp.length());
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _Source>
|
||||
static void __append_source(string& __dest, _Source const& __s) {
|
||||
static void __append_source(__path_string& __dest, _Source const& __s) {
|
||||
using _Traits = __is_pathable<_Source>;
|
||||
__append_range(__dest, _Traits::__range_begin(__s),
|
||||
_Traits::__range_end(__s));
|
||||
@@ -721,36 +773,132 @@ struct _PathCVT {
|
||||
#endif // !_LIBCPP_HAS_NO_LOCALIZATION
|
||||
|
||||
template <>
|
||||
struct _PathCVT<char> {
|
||||
struct _PathCVT<__path_value> {
|
||||
|
||||
template <class _Iter>
|
||||
static typename enable_if<__is_exactly_cpp17_input_iterator<_Iter>::value>::type
|
||||
__append_range(string& __dest, _Iter __b, _Iter __e) {
|
||||
__append_range(__path_string& __dest, _Iter __b, _Iter __e) {
|
||||
for (; __b != __e; ++__b)
|
||||
__dest.push_back(*__b);
|
||||
}
|
||||
|
||||
template <class _Iter>
|
||||
static typename enable_if<__is_cpp17_forward_iterator<_Iter>::value>::type
|
||||
__append_range(string& __dest, _Iter __b, _Iter __e) {
|
||||
__append_range(__path_string& __dest, _Iter __b, _Iter __e) {
|
||||
__dest.__append_forward_unsafe(__b, __e);
|
||||
}
|
||||
|
||||
template <class _Iter>
|
||||
static void __append_range(string& __dest, _Iter __b, _NullSentinel) {
|
||||
static void __append_range(__path_string& __dest, _Iter __b, _NullSentinel) {
|
||||
const char __sentinel = char{};
|
||||
for (; *__b != __sentinel; ++__b)
|
||||
__dest.push_back(*__b);
|
||||
}
|
||||
|
||||
template <class _Source>
|
||||
static void __append_source(string& __dest, _Source const& __s) {
|
||||
static void __append_source(__path_string& __dest, _Source const& __s) {
|
||||
using _Traits = __is_pathable<_Source>;
|
||||
__append_range(__dest, _Traits::__range_begin(__s),
|
||||
_Traits::__range_end(__s));
|
||||
}
|
||||
};
|
||||
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
template <>
|
||||
struct _PathCVT<char> {
|
||||
|
||||
static void
|
||||
__append_string(__path_string& __dest, const basic_string<char> &__str) {
|
||||
size_t __size = __char_to_wide(__str, nullptr, 0);
|
||||
size_t __pos = __dest.size();
|
||||
__dest.resize(__pos + __size);
|
||||
__char_to_wide(__str, const_cast<__path_value*>(__dest.data()) + __pos, __size);
|
||||
}
|
||||
|
||||
template <class _Iter>
|
||||
static typename enable_if<__is_exactly_cpp17_input_iterator<_Iter>::value>::type
|
||||
__append_range(__path_string& __dest, _Iter __b, _Iter __e) {
|
||||
basic_string<char> __tmp(__b, __e);
|
||||
__append_string(__dest, __tmp);
|
||||
}
|
||||
|
||||
template <class _Iter>
|
||||
static typename enable_if<__is_cpp17_forward_iterator<_Iter>::value>::type
|
||||
__append_range(__path_string& __dest, _Iter __b, _Iter __e) {
|
||||
basic_string<char> __tmp(__b, __e);
|
||||
__append_string(__dest, __tmp);
|
||||
}
|
||||
|
||||
template <class _Iter>
|
||||
static void __append_range(__path_string& __dest, _Iter __b, _NullSentinel) {
|
||||
const char __sentinel = char{};
|
||||
basic_string<char> __tmp;
|
||||
for (; *__b != __sentinel; ++__b)
|
||||
__tmp.push_back(*__b);
|
||||
__append_string(__dest, __tmp);
|
||||
}
|
||||
|
||||
template <class _Source>
|
||||
static void __append_source(__path_string& __dest, _Source const& __s) {
|
||||
using _Traits = __is_pathable<_Source>;
|
||||
__append_range(__dest, _Traits::__range_begin(__s),
|
||||
_Traits::__range_end(__s));
|
||||
}
|
||||
};
|
||||
|
||||
template <class _ECharT>
|
||||
struct _PathExport {
|
||||
typedef __narrow_to_utf8<sizeof(wchar_t) * __CHAR_BIT__> _Narrower;
|
||||
typedef __widen_from_utf8<sizeof(_ECharT) * __CHAR_BIT__> _Widener;
|
||||
|
||||
template <class _Str>
|
||||
static void __append(_Str& __dest, const __path_string& __src) {
|
||||
string __utf8;
|
||||
_Narrower()(back_inserter(__utf8), __src.data(), __src.data() + __src.size());
|
||||
_Widener()(back_inserter(__dest), __utf8.data(), __utf8.data() + __utf8.size());
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct _PathExport<char> {
|
||||
template <class _Str>
|
||||
static void __append(_Str& __dest, const __path_string& __src) {
|
||||
size_t __size = __wide_to_char(__src, nullptr, 0);
|
||||
size_t __pos = __dest.size();
|
||||
__dest.resize(__size);
|
||||
__wide_to_char(__src, const_cast<char*>(__dest.data()) + __pos, __size);
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct _PathExport<wchar_t> {
|
||||
template <class _Str>
|
||||
static void __append(_Str& __dest, const __path_string& __src) {
|
||||
__dest.append(__src.begin(), __src.end());
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct _PathExport<char16_t> {
|
||||
template <class _Str>
|
||||
static void __append(_Str& __dest, const __path_string& __src) {
|
||||
__dest.append(__src.begin(), __src.end());
|
||||
}
|
||||
};
|
||||
|
||||
#ifndef _LIBCPP_NO_HAS_CHAR8_T
|
||||
template <>
|
||||
struct _PathExport<char8_t> {
|
||||
typedef __narrow_to_utf8<sizeof(wchar_t) * __CHAR_BIT__> _Narrower;
|
||||
|
||||
template <class _Str>
|
||||
static void __append(_Str& __dest, const __path_string& __src) {
|
||||
_Narrower()(back_inserter(__dest), __src.data(), __src.data() + __src.size());
|
||||
}
|
||||
};
|
||||
#endif /* !_LIBCPP_NO_HAS_CHAR8_T */
|
||||
#endif /* _LIBCPP_WIN32API */
|
||||
|
||||
class _LIBCPP_TYPE_VIS path {
|
||||
template <class _SourceOrIter, class _Tp = path&>
|
||||
using _EnableIfPathable =
|
||||
@@ -763,10 +911,15 @@ class _LIBCPP_TYPE_VIS path {
|
||||
using _SourceCVT = _PathCVT<_SourceChar<_Tp> >;
|
||||
|
||||
public:
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
typedef wchar_t value_type;
|
||||
static constexpr value_type preferred_separator = L'\\';
|
||||
#else
|
||||
typedef char value_type;
|
||||
typedef basic_string<value_type> string_type;
|
||||
typedef _VSTD::string_view __string_view;
|
||||
static constexpr value_type preferred_separator = '/';
|
||||
#endif
|
||||
typedef basic_string<value_type> string_type;
|
||||
typedef basic_string_view<value_type> __string_view;
|
||||
|
||||
enum class _LIBCPP_ENUM_VIS format : unsigned char {
|
||||
auto_format,
|
||||
@@ -967,7 +1120,12 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void clear() noexcept { __pn_.clear(); }
|
||||
|
||||
path& make_preferred() { return *this; }
|
||||
path& make_preferred() {
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
_VSTD::replace(__pn_.begin(), __pn_.end(), L'/', L'\\');
|
||||
#endif
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
path& remove_filename() {
|
||||
@@ -1000,6 +1158,56 @@ public:
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY operator string_type() const { return __pn_; }
|
||||
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
_LIBCPP_INLINE_VISIBILITY _VSTD::wstring wstring() const { return __pn_; }
|
||||
|
||||
_VSTD::wstring generic_wstring() const { return __pn_; }
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
|
||||
template <class _ECharT, class _Traits = char_traits<_ECharT>,
|
||||
class _Allocator = allocator<_ECharT> >
|
||||
basic_string<_ECharT, _Traits, _Allocator>
|
||||
string(const _Allocator& __a = _Allocator()) const {
|
||||
using _Str = basic_string<_ECharT, _Traits, _Allocator>;
|
||||
_Str __s(__a);
|
||||
__s.reserve(__pn_.size());
|
||||
_PathExport<_ECharT>::__append(__s, __pn_);
|
||||
return __s;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _VSTD::string string() const {
|
||||
return string<char>();
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY __u8_string u8string() const {
|
||||
using _CVT = __narrow_to_utf8<sizeof(wchar_t) * __CHAR_BIT__>;
|
||||
__u8_string __s;
|
||||
__s.reserve(__pn_.size());
|
||||
_CVT()(back_inserter(__s), __pn_.data(), __pn_.data() + __pn_.size());
|
||||
return __s;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _VSTD::u16string u16string() const {
|
||||
return string<char16_t>();
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY _VSTD::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);
|
||||
}
|
||||
|
||||
_VSTD::string generic_string() const { return generic_string<char>(); }
|
||||
_VSTD::u16string generic_u16string() const { return generic_string<char16_t>(); }
|
||||
_VSTD::u32string generic_u32string() const { return generic_string<char32_t>(); }
|
||||
__u8_string generic_u8string() const { return u8string(); }
|
||||
#endif /* !_LIBCPP_HAS_NO_LOCALIZATION */
|
||||
#else /* _LIBCPP_WIN32API */
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _VSTD::string string() const { return __pn_; }
|
||||
#ifndef _LIBCPP_NO_HAS_CHAR8_T
|
||||
_LIBCPP_INLINE_VISIBILITY _VSTD::u8string u8string() const { return _VSTD::u8string(__pn_.begin(), __pn_.end()); }
|
||||
@@ -1029,7 +1237,7 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY _VSTD::u32string u32string() const {
|
||||
return string<char32_t>();
|
||||
}
|
||||
#endif
|
||||
#endif /* !_LIBCPP_HAS_NO_LOCALIZATION */
|
||||
|
||||
// generic format observers
|
||||
_VSTD::string generic_string() const { return __pn_; }
|
||||
@@ -1050,7 +1258,8 @@ public:
|
||||
_VSTD::wstring generic_wstring() const { return string<wchar_t>(); }
|
||||
_VSTD::u16string generic_u16string() const { return string<char16_t>(); }
|
||||
_VSTD::u32string generic_u32string() const { return string<char32_t>(); }
|
||||
#endif
|
||||
#endif /* !_LIBCPP_HAS_NO_LOCALIZATION */
|
||||
#endif /* !_LIBCPP_WIN32API */
|
||||
|
||||
private:
|
||||
int __compare(__string_view) const;
|
||||
@@ -1157,8 +1366,8 @@ public:
|
||||
#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
|
||||
template <class _CharT, class _Traits>
|
||||
_LIBCPP_INLINE_VISIBILITY friend
|
||||
typename enable_if<is_same<_CharT, char>::value &&
|
||||
is_same<_Traits, char_traits<char> >::value,
|
||||
typename enable_if<is_same<_CharT, value_type>::value &&
|
||||
is_same<_Traits, char_traits<value_type> >::value,
|
||||
basic_ostream<_CharT, _Traits>&>::type
|
||||
operator<<(basic_ostream<_CharT, _Traits>& __os, const path& __p) {
|
||||
__os << _VSTD::__quoted(__p.native());
|
||||
@@ -1167,8 +1376,8 @@ public:
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
_LIBCPP_INLINE_VISIBILITY friend
|
||||
typename enable_if<!is_same<_CharT, char>::value ||
|
||||
!is_same<_Traits, char_traits<char> >::value,
|
||||
typename enable_if<!is_same<_CharT, value_type>::value ||
|
||||
!is_same<_Traits, char_traits<value_type> >::value,
|
||||
basic_ostream<_CharT, _Traits>&>::type
|
||||
operator<<(basic_ostream<_CharT, _Traits>& __os, const path& __p) {
|
||||
__os << _VSTD::__quoted(__p.string<_CharT, _Traits>());
|
||||
@@ -1226,24 +1435,6 @@ inline _LIBCPP_INLINE_VISIBILITY void swap(path& __lhs, path& __rhs) noexcept {
|
||||
_LIBCPP_FUNC_VIS
|
||||
size_t hash_value(const path& __p) noexcept;
|
||||
|
||||
template <class _Source>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_DEPRECATED_WITH_CHAR8_T
|
||||
typename enable_if<__is_pathable<_Source>::value, path>::type
|
||||
u8path(const _Source& __s) {
|
||||
static_assert(
|
||||
#ifndef _LIBCPP_NO_HAS_CHAR8_T
|
||||
is_same<typename __is_pathable<_Source>::__char_type, char8_t>::value ||
|
||||
#endif
|
||||
is_same<typename __is_pathable<_Source>::__char_type, char>::value,
|
||||
"u8path(Source const&) requires Source have a character type of type "
|
||||
"'char'"
|
||||
#ifndef _LIBCPP_NO_HAS_CHAR8_T
|
||||
" or 'char8_t'"
|
||||
#endif
|
||||
);
|
||||
return path(__s);
|
||||
}
|
||||
|
||||
template <class _InputIt>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_DEPRECATED_WITH_CHAR8_T
|
||||
typename enable_if<__is_pathable<_InputIt>::value, path>::type
|
||||
@@ -1254,11 +1445,60 @@ _LIBCPP_INLINE_VISIBILITY _LIBCPP_DEPRECATED_WITH_CHAR8_T
|
||||
#endif
|
||||
is_same<typename __is_pathable<_InputIt>::__char_type, char>::value,
|
||||
"u8path(Iter, Iter) requires Iter have a value_type of type 'char'"
|
||||
#ifndef _LIBCPP_NO_HAS_CHAR8_T
|
||||
" or 'char8_t'"
|
||||
#endif
|
||||
);
|
||||
" or 'char8_t'");
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
string __tmp(__f, __l);
|
||||
using _CVT = __widen_from_utf8<sizeof(wchar_t) * __CHAR_BIT__>;
|
||||
_VSTD::wstring __w;
|
||||
__w.reserve(__tmp.size());
|
||||
_CVT()(back_inserter(__w), __tmp.data(), __tmp.data() + __tmp.size());
|
||||
return path(__w);
|
||||
#else
|
||||
return path(__f, __l);
|
||||
#endif /* !_LIBCPP_WIN32API */
|
||||
}
|
||||
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
template <class _InputIt>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_DEPRECATED_WITH_CHAR8_T
|
||||
typename enable_if<__is_pathable<_InputIt>::value, path>::type
|
||||
u8path(_InputIt __f, _NullSentinel) {
|
||||
static_assert(
|
||||
#ifndef _LIBCPP_NO_HAS_CHAR8_T
|
||||
is_same<typename __is_pathable<_InputIt>::__char_type, char8_t>::value ||
|
||||
#endif
|
||||
is_same<typename __is_pathable<_InputIt>::__char_type, char>::value,
|
||||
"u8path(Iter, Iter) requires Iter have a value_type of type 'char'"
|
||||
" or 'char8_t'");
|
||||
string __tmp;
|
||||
const char __sentinel = char{};
|
||||
for (; *__f != __sentinel; ++__f)
|
||||
__tmp.push_back(*__f);
|
||||
using _CVT = __widen_from_utf8<sizeof(wchar_t) * __CHAR_BIT__>;
|
||||
_VSTD::wstring __w;
|
||||
__w.reserve(__tmp.size());
|
||||
_CVT()(back_inserter(__w), __tmp.data(), __tmp.data() + __tmp.size());
|
||||
return path(__w);
|
||||
}
|
||||
#endif /* _LIBCPP_WIN32API */
|
||||
|
||||
template <class _Source>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_DEPRECATED_WITH_CHAR8_T
|
||||
typename enable_if<__is_pathable<_Source>::value, path>::type
|
||||
u8path(const _Source& __s) {
|
||||
static_assert(
|
||||
#ifndef _LIBCPP_NO_HAS_CHAR8_T
|
||||
is_same<typename __is_pathable<_Source>::__char_type, char8_t>::value ||
|
||||
#endif
|
||||
is_same<typename __is_pathable<_Source>::__char_type, char>::value,
|
||||
"u8path(Source const&) requires Source have a character type of type "
|
||||
"'char' or 'char8_t'");
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
using _Traits = __is_pathable<_Source>;
|
||||
return u8path(__unwrap_iter(_Traits::__range_begin(__s)), __unwrap_iter(_Traits::__range_end(__s)));
|
||||
#else
|
||||
return path(__s);
|
||||
#endif
|
||||
}
|
||||
|
||||
class _LIBCPP_TYPE_VIS path::iterator {
|
||||
|
||||
@@ -186,7 +186,10 @@ typedef basic_fstream<wchar_t> wfstream;
|
||||
#include <__locale>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <filesystem>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
|
||||
# include <filesystem>
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
@@ -235,7 +238,7 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
basic_filebuf* open(const string& __s, ios_base::openmode __mode);
|
||||
|
||||
#if _LIBCPP_STD_VER >= 17
|
||||
#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
|
||||
_LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
|
||||
basic_filebuf* open(const _VSTD_FS::path& __p, ios_base::openmode __mode) {
|
||||
return open(__p.c_str(), __mode);
|
||||
@@ -1151,7 +1154,7 @@ public:
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_ifstream(const string& __s, ios_base::openmode __mode = ios_base::in);
|
||||
#if _LIBCPP_STD_VER >= 17
|
||||
#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
|
||||
_LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_ifstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::in)
|
||||
: basic_ifstream(__p.c_str(), __mode) {}
|
||||
@@ -1177,7 +1180,7 @@ public:
|
||||
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
|
||||
#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
|
||||
_LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
|
||||
void open(const filesystem::path& __p,
|
||||
ios_base::openmode __mode = ios_base::in) {
|
||||
@@ -1365,7 +1368,7 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_ofstream(const string& __s, ios_base::openmode __mode = ios_base::out);
|
||||
|
||||
#if _LIBCPP_STD_VER >= 17
|
||||
#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
|
||||
_LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_ofstream(const filesystem::path& __p, ios_base::openmode __mode = ios_base::out)
|
||||
: basic_ofstream(__p.c_str(), __mode) {}
|
||||
@@ -1392,7 +1395,7 @@ public:
|
||||
#endif
|
||||
void open(const string& __s, ios_base::openmode __mode = ios_base::out);
|
||||
|
||||
#if _LIBCPP_STD_VER >= 17
|
||||
#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
|
||||
_LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_INLINE_VISIBILITY
|
||||
void open(const filesystem::path& __p, ios_base::openmode __mode = ios_base::out)
|
||||
{ return open(__p.c_str(), __mode); }
|
||||
@@ -1579,7 +1582,7 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_fstream(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
|
||||
|
||||
#if _LIBCPP_STD_VER >= 17
|
||||
#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
|
||||
_LIBCPP_AVAILABILITY_FILESYSTEM _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) {}
|
||||
@@ -1607,7 +1610,7 @@ public:
|
||||
#endif
|
||||
void open(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
|
||||
|
||||
#if _LIBCPP_STD_VER >= 17
|
||||
#if _LIBCPP_STD_VER >= 17 && !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
|
||||
_LIBCPP_AVAILABILITY_FILESYSTEM _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); }
|
||||
|
||||
@@ -213,7 +213,8 @@ public:
|
||||
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 F>
|
||||
constexpr unspecified not_fn(F&& f); // C++17, constexpr in C++20
|
||||
|
||||
template<class T> struct is_bind_expression;
|
||||
template<class T> struct is_placeholder;
|
||||
@@ -226,11 +227,12 @@ template <class T> inline constexpr int is_placeholder_v
|
||||
|
||||
|
||||
template<class Fn, class... BoundArgs>
|
||||
unspecified bind(Fn&&, BoundArgs&&...);
|
||||
constexpr unspecified bind(Fn&&, BoundArgs&&...); // constexpr in C++20
|
||||
template<class R, class Fn, class... BoundArgs>
|
||||
unspecified bind(Fn&&, BoundArgs&&...);
|
||||
constexpr unspecified bind(Fn&&, BoundArgs&&...); // constexpr in C++20
|
||||
|
||||
template<class F, class... Args>
|
||||
constexpr // constexpr in C++20
|
||||
invoke_result_t<F, Args...> invoke(F&& f, Args&&... args) // C++17
|
||||
noexcept(is_nothrow_invocable_v<F, Args...>);
|
||||
|
||||
@@ -376,7 +378,8 @@ public:
|
||||
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::*);
|
||||
template<class R, class T>
|
||||
constexpr unspecified mem_fn(R T::*); // constexpr in C++20
|
||||
|
||||
class bad_function_call
|
||||
: public exception
|
||||
@@ -1288,12 +1291,13 @@ private:
|
||||
type __f_;
|
||||
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY __mem_fn(type __f) _NOEXCEPT : __f_(__f) {}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
__mem_fn(type __f) _NOEXCEPT : __f_(__f) {}
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
// invoke
|
||||
template <class... _ArgTypes>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
typename __invoke_return<type, _ArgTypes...>::type
|
||||
operator() (_ArgTypes&&... __args) const {
|
||||
return _VSTD::__invoke(__f_, _VSTD::forward<_ArgTypes>(__args)...);
|
||||
@@ -1401,7 +1405,7 @@ public:
|
||||
};
|
||||
|
||||
template<class _Rp, class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
__mem_fn<_Rp _Tp::*>
|
||||
mem_fn(_Rp _Tp::* __pm) _NOEXCEPT
|
||||
{
|
||||
@@ -2344,9 +2348,9 @@ class _LIBCPP_TEMPLATE_VIS function<_Rp(_ArgTypes...)>
|
||||
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;
|
||||
static const bool value = is_void<_Rp>::value ||
|
||||
__is_core_convertible<typename __invoke_of<_Fp, _ArgTypes...>::type,
|
||||
_Rp>::value;
|
||||
};
|
||||
template <class _Fp>
|
||||
struct __callable<_Fp, false>
|
||||
@@ -2701,7 +2705,7 @@ typename _EnableIf
|
||||
__mu(_Ti& __ti, tuple<_Uj...>& __uj)
|
||||
{
|
||||
typedef typename __make_tuple_indices<sizeof...(_Uj)>::type __indices;
|
||||
return __mu_expand(__ti, __uj, __indices());
|
||||
return _VSTD::__mu_expand(__ti, __uj, __indices());
|
||||
}
|
||||
|
||||
template <bool IsPh, class _Ti, class _Uj>
|
||||
@@ -2873,13 +2877,13 @@ public:
|
||||
!is_same<typename remove_reference<_Gp>::type,
|
||||
__bind>::value
|
||||
>::type>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
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
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type
|
||||
operator()(_Args&& ...__args)
|
||||
{
|
||||
@@ -2888,7 +2892,7 @@ public:
|
||||
}
|
||||
|
||||
template <class ..._Args>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type
|
||||
operator()(_Args&& ...__args) const
|
||||
{
|
||||
@@ -2918,13 +2922,13 @@ public:
|
||||
!is_same<typename remove_reference<_Gp>::type,
|
||||
__bind_r>::value
|
||||
>::type>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
explicit __bind_r(_Gp&& __f, _BA&& ...__bound_args)
|
||||
: base(_VSTD::forward<_Gp>(__f),
|
||||
_VSTD::forward<_BA>(__bound_args)...) {}
|
||||
|
||||
template <class ..._Args>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
typename enable_if
|
||||
<
|
||||
is_convertible<typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type,
|
||||
@@ -2938,7 +2942,7 @@ public:
|
||||
}
|
||||
|
||||
template <class ..._Args>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
typename enable_if
|
||||
<
|
||||
is_convertible<typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type,
|
||||
@@ -2956,7 +2960,7 @@ 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
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
__bind<_Fp, _BoundArgs...>
|
||||
bind(_Fp&& __f, _BoundArgs&&... __bound_args)
|
||||
{
|
||||
@@ -2965,7 +2969,7 @@ bind(_Fp&& __f, _BoundArgs&&... __bound_args)
|
||||
}
|
||||
|
||||
template<class _Rp, class _Fp, class ..._BoundArgs>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
__bind_r<_Rp, _Fp, _BoundArgs...>
|
||||
bind(_Fp&& __f, _BoundArgs&&... __bound_args)
|
||||
{
|
||||
@@ -2978,7 +2982,7 @@ bind(_Fp&& __f, _BoundArgs&&... __bound_args)
|
||||
#if _LIBCPP_STD_VER > 14
|
||||
|
||||
template <class _Fn, class ..._Args>
|
||||
invoke_result_t<_Fn, _Args...>
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 invoke_result_t<_Fn, _Args...>
|
||||
invoke(_Fn&& __f, _Args&&... __args)
|
||||
noexcept(is_nothrow_invocable_v<_Fn, _Args...>)
|
||||
{
|
||||
@@ -2993,21 +2997,21 @@ public:
|
||||
__not_fn_imp() = delete;
|
||||
|
||||
template <class ..._Args>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
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
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
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
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
auto operator()(_Args&& ...__args) const&
|
||||
noexcept(noexcept(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...)))
|
||||
-> decltype( !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))
|
||||
@@ -3015,7 +3019,7 @@ public:
|
||||
|
||||
|
||||
template <class ..._Args>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
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)...))
|
||||
@@ -3024,17 +3028,17 @@ public:
|
||||
private:
|
||||
template <class _RawFunc,
|
||||
class = enable_if_t<!is_same<decay_t<_RawFunc>, __not_fn_imp>::value>>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
explicit __not_fn_imp(_RawFunc&& __rf)
|
||||
: __fd(_VSTD::forward<_RawFunc>(__rf)) {}
|
||||
|
||||
template <class _RawFunc>
|
||||
friend inline _LIBCPP_INLINE_VISIBILITY
|
||||
friend inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
__not_fn_imp<decay_t<_RawFunc>> not_fn(_RawFunc&&);
|
||||
};
|
||||
|
||||
template <class _RawFunc>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
__not_fn_imp<decay_t<_RawFunc>> not_fn(_RawFunc&& __fn) {
|
||||
return __not_fn_imp<decay_t<_RawFunc>>(_VSTD::forward<_RawFunc>(__fn));
|
||||
}
|
||||
@@ -3131,13 +3135,13 @@ __search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
||||
template<class _ForwardIterator, class _BinaryPredicate = equal_to<>>
|
||||
class _LIBCPP_TYPE_VIS default_searcher {
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
default_searcher(_ForwardIterator __f, _ForwardIterator __l,
|
||||
_BinaryPredicate __p = _BinaryPredicate())
|
||||
: __first_(__f), __last_(__l), __pred_(__p) {}
|
||||
|
||||
template <typename _ForwardIterator2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
pair<_ForwardIterator2, _ForwardIterator2>
|
||||
operator () (_ForwardIterator2 __f, _ForwardIterator2 __l) const
|
||||
{
|
||||
|
||||
@@ -1681,7 +1681,7 @@ 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)...);
|
||||
return _VSTD::__invoke(__f_.first(), _VSTD::forward<_ArgTypes>(__arg)...);
|
||||
}
|
||||
|
||||
template <class _Callable> class __packaged_task_function;
|
||||
@@ -2184,7 +2184,7 @@ private:
|
||||
_Rp
|
||||
__execute(__tuple_indices<_Indices...>)
|
||||
{
|
||||
return __invoke(_VSTD::move(_VSTD::get<0>(__f_)), _VSTD::move(_VSTD::get<_Indices>(__f_))...);
|
||||
return _VSTD::__invoke(_VSTD::move(_VSTD::get<0>(__f_)), _VSTD::move(_VSTD::get<_Indices>(__f_))...);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -2204,16 +2204,16 @@ async(launch __policy, _Fp&& __f, _Args&&... __args)
|
||||
{
|
||||
#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))...));
|
||||
return _VSTD::__make_async_assoc_state<_Rp>(_BF(_VSTD::__decay_copy(_VSTD::forward<_Fp>(__f)),
|
||||
_VSTD::__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 _VSTD::__make_deferred_assoc_state<_Rp>(_BF(_VSTD::__decay_copy(_VSTD::forward<_Fp>(__f)),
|
||||
_VSTD::__decay_copy(_VSTD::forward<_Args>(__args))...));
|
||||
return future<_Rp>{};
|
||||
}
|
||||
|
||||
|
||||
@@ -527,7 +527,7 @@ __quoted_output ( basic_ostream<_CharT, _Traits> &__os,
|
||||
__str.push_back(*__first);
|
||||
}
|
||||
__str.push_back(__delim);
|
||||
return __put_character_sequence(__os, __str.data(), __str.size());
|
||||
return _VSTD::__put_character_sequence(__os, __str.data(), __str.size());
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _String>
|
||||
|
||||
@@ -105,11 +105,11 @@ template<> class numeric_limits<cv long double>;
|
||||
#include <type_traits>
|
||||
|
||||
#if defined(_LIBCPP_COMPILER_MSVC)
|
||||
#include "support/win32/limits_msvc_win32.h"
|
||||
#include "__support/win32/limits_msvc_win32.h"
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
|
||||
#if defined(__IBMCPP__)
|
||||
#include "support/ibm/limits.h"
|
||||
#include "__support/ibm/limits.h"
|
||||
#endif // __IBMCPP__
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
|
||||
@@ -92,7 +92,11 @@ public:
|
||||
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 = new Codecvt); // before C++14
|
||||
explicit wstring_convert(Codecvt* pcvt = new Codecvt); // before C++20
|
||||
wstring_convert() : wstring_convert(new Codecvt) {} // C++20
|
||||
explicit wstring_convert(Codecvt* pcvt); // C++20
|
||||
|
||||
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());
|
||||
@@ -121,8 +125,14 @@ class wbuffer_convert
|
||||
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(streambuf* bytebuf = 0, Codecvt* pcvt = new Codecvt,
|
||||
state_type state = state_type()); // before C++14
|
||||
explicit wbuffer_convert(streambuf* bytebuf = nullptr, Codecvt* pcvt = new Codecvt,
|
||||
state_type state = state_type()); // before C++20
|
||||
wbuffer_convert() : wbuffer_convert(nullptr) {} // C++20
|
||||
explicit wbuffer_convert(streambuf* bytebuf, Codecvt* pcvt = new Codecvt,
|
||||
state_type state = state_type()); // C++20
|
||||
|
||||
wbuffer_convert(const wbuffer_convert&) = delete; // C++14
|
||||
wbuffer_convert & operator=(const wbuffer_convert &) = delete; // C++14
|
||||
~wbuffer_convert(); // C++14
|
||||
@@ -557,8 +567,8 @@ __num_get<_CharT>::__stage2_float_loop(_CharT __ct, bool& __in_units, char& __ex
|
||||
return 0;
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_get<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_get<wchar_t>)
|
||||
|
||||
template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> >
|
||||
class _LIBCPP_TEMPLATE_VIS num_get
|
||||
@@ -1095,8 +1105,8 @@ num_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e,
|
||||
return __b;
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_get<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_get<wchar_t>)
|
||||
|
||||
struct _LIBCPP_TYPE_VIS __num_put_base
|
||||
{
|
||||
@@ -1245,8 +1255,8 @@ __num_put<_CharT>::__widen_and_group_float(char* __nb, char* __np, char* __ne,
|
||||
__op = __ob + (__np - __nb);
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_put<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_put<wchar_t>)
|
||||
|
||||
template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> >
|
||||
class _LIBCPP_TEMPLATE_VIS num_put
|
||||
@@ -1567,7 +1577,7 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
|
||||
__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 (__nb == nullptr)
|
||||
if (__nc == -1)
|
||||
__throw_bad_alloc();
|
||||
__nbh.reset(__nb);
|
||||
}
|
||||
@@ -1618,7 +1628,7 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
|
||||
__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 (__nb == nullptr)
|
||||
if (__nc == -1)
|
||||
__throw_bad_alloc();
|
||||
__nbh.reset(__nb);
|
||||
}
|
||||
@@ -1672,8 +1682,8 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
|
||||
return __pad_and_output(__s, __o, __op, __oe, __iob, __fl);
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_put<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_put<wchar_t>)
|
||||
|
||||
template <class _CharT, class _InputIterator>
|
||||
_LIBCPP_HIDDEN
|
||||
@@ -2358,8 +2368,8 @@ time_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e,
|
||||
return __b;
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get<wchar_t>)
|
||||
|
||||
class _LIBCPP_TYPE_VIS __time_get
|
||||
{
|
||||
@@ -2458,8 +2468,8 @@ private:
|
||||
virtual const string_type& __X() const {return this->__X_;}
|
||||
};
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get_byname<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get_byname<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get_byname<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get_byname<wchar_t>)
|
||||
|
||||
class _LIBCPP_TYPE_VIS __time_put
|
||||
{
|
||||
@@ -2571,8 +2581,8 @@ time_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base&,
|
||||
return _VSTD::copy(__nb, __ne, __s);
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(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
|
||||
@@ -2592,8 +2602,8 @@ protected:
|
||||
~time_put_byname() {}
|
||||
};
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put_byname<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put_byname<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put_byname<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put_byname<wchar_t>)
|
||||
|
||||
// money_base
|
||||
|
||||
@@ -2659,10 +2669,10 @@ template <class _CharT, bool _International>
|
||||
const bool
|
||||
moneypunct<_CharT, _International>::intl;
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<char, false>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<char, true>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<wchar_t, false>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<wchar_t, true>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<char, false>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<char, true>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<wchar_t, false>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<wchar_t, true>)
|
||||
|
||||
// moneypunct_byname
|
||||
|
||||
@@ -2716,10 +2726,10 @@ 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_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<char, false>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<char, true>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<wchar_t, false>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<wchar_t, true>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<char, false>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<char, true>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<wchar_t, false>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<wchar_t, true>)
|
||||
|
||||
// money_get
|
||||
|
||||
@@ -2775,8 +2785,8 @@ __money_get<_CharT>::__gather_info(bool __intl, const locale& __loc,
|
||||
}
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_get<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_get<wchar_t>)
|
||||
|
||||
template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> >
|
||||
class _LIBCPP_TEMPLATE_VIS money_get
|
||||
@@ -3158,8 +3168,8 @@ money_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e,
|
||||
return __b;
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_get<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_get<wchar_t>)
|
||||
|
||||
// money_put
|
||||
|
||||
@@ -3333,8 +3343,8 @@ __money_put<_CharT>::__format(char_type* __mb, char_type*& __mi, char_type*& __m
|
||||
__mi = __mb;
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_put<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_put<wchar_t>)
|
||||
|
||||
template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> >
|
||||
class _LIBCPP_TEMPLATE_VIS money_put
|
||||
@@ -3392,17 +3402,17 @@ money_put<_CharT, _OutputIterator>::do_put(iter_type __s, bool __intl,
|
||||
char* __bb = __buf;
|
||||
char_type __digits[__bs];
|
||||
char_type* __db = __digits;
|
||||
size_t __n = static_cast<size_t>(snprintf(__bb, __bs, "%.0Lf", __units));
|
||||
int __n = snprintf(__bb, __bs, "%.0Lf", __units);
|
||||
unique_ptr<char, void(*)(void*)> __hn(nullptr, free);
|
||||
unique_ptr<char_type, void(*)(void*)> __hd(0, free);
|
||||
// secure memory for digit storage
|
||||
if (__n > __bs-1)
|
||||
if (static_cast<size_t>(__n) > __bs-1)
|
||||
{
|
||||
__n = static_cast<size_t>(__libcpp_asprintf_l(&__bb, _LIBCPP_GET_C_LOCALE, "%.0Lf", __units));
|
||||
if (__bb == nullptr)
|
||||
__n = __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)));
|
||||
__hd.reset((char_type*)malloc(static_cast<size_t>(__n) * sizeof(char_type)));
|
||||
if (__hd == nullptr)
|
||||
__throw_bad_alloc();
|
||||
__db = __hd.get();
|
||||
@@ -3424,9 +3434,9 @@ money_put<_CharT, _OutputIterator>::do_put(iter_type __s, bool __intl,
|
||||
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
|
||||
size_t __exn = __n > __fd ?
|
||||
(static_cast<size_t>(__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)
|
||||
{
|
||||
@@ -3486,8 +3496,8 @@ money_put<_CharT, _OutputIterator>::do_put(iter_type __s, bool __intl,
|
||||
return __pad_and_output(__s, __mb, __mi, __me, __iob, __fl);
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_put<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_put<wchar_t>)
|
||||
|
||||
// messages
|
||||
|
||||
@@ -3602,8 +3612,8 @@ messages<_CharT>::do_close(catalog __c) const
|
||||
#endif // _LIBCPP_HAS_CATOPEN
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages<wchar_t>)
|
||||
|
||||
template <class _CharT>
|
||||
class _LIBCPP_TEMPLATE_VIS messages_byname
|
||||
@@ -3626,8 +3636,8 @@ protected:
|
||||
~messages_byname() {}
|
||||
};
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages_byname<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages_byname<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages_byname<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages_byname<wchar_t>)
|
||||
|
||||
template<class _Codecvt, class _Elem = wchar_t,
|
||||
class _Wide_alloc = allocator<_Elem>,
|
||||
@@ -3650,8 +3660,17 @@ private:
|
||||
wstring_convert(const wstring_convert& __wc);
|
||||
wstring_convert& operator=(const wstring_convert& __wc);
|
||||
public:
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_EXPLICIT_AFTER_CXX11 wstring_convert(_Codecvt* __pcvt = new _Codecvt);
|
||||
wstring_convert() : wstring_convert(new _Codecvt) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit wstring_convert(_Codecvt* __pcvt);
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_EXPLICIT_AFTER_CXX11
|
||||
wstring_convert(_Codecvt* __pcvt = new _Codecvt);
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
wstring_convert(_Codecvt* __pcvt, state_type __state);
|
||||
_LIBCPP_EXPLICIT_AFTER_CXX11 wstring_convert(const byte_string& __byte_err,
|
||||
@@ -3918,9 +3937,20 @@ private:
|
||||
|
||||
wbuffer_convert(const wbuffer_convert&);
|
||||
wbuffer_convert& operator=(const wbuffer_convert&);
|
||||
|
||||
public:
|
||||
_LIBCPP_EXPLICIT_AFTER_CXX11 wbuffer_convert(streambuf* __bytebuf = nullptr,
|
||||
_Codecvt* __pcvt = new _Codecvt, state_type __state = state_type());
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
wbuffer_convert() : wbuffer_convert(nullptr) {}
|
||||
explicit wbuffer_convert(streambuf* __bytebuf,
|
||||
_Codecvt* __pcvt = new _Codecvt,
|
||||
state_type __state = state_type());
|
||||
#else
|
||||
_LIBCPP_EXPLICIT_AFTER_CXX11
|
||||
wbuffer_convert(streambuf* __bytebuf = nullptr,
|
||||
_Codecvt* __pcvt = new _Codecvt,
|
||||
state_type __state = state_type());
|
||||
#endif
|
||||
|
||||
~wbuffer_convert();
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
|
||||
@@ -1286,9 +1286,7 @@ struct __compressed_pair_elem<_Tp, _Idx, true> : private _Tp {
|
||||
template <class _T1, class _T2>
|
||||
class __compressed_pair : private __compressed_pair_elem<_T1, 0>,
|
||||
private __compressed_pair_elem<_T2, 1> {
|
||||
typedef _LIBCPP_NODEBUG_TYPE __compressed_pair_elem<_T1, 0> _Base1;
|
||||
typedef _LIBCPP_NODEBUG_TYPE __compressed_pair_elem<_T2, 1> _Base2;
|
||||
|
||||
public:
|
||||
// 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
|
||||
@@ -1298,7 +1296,9 @@ class __compressed_pair : private __compressed_pair_elem<_T1, 0>,
|
||||
"The current implementation is NOT ABI-compatible with the previous "
|
||||
"implementation for this configuration");
|
||||
|
||||
public:
|
||||
typedef _LIBCPP_NODEBUG_TYPE __compressed_pair_elem<_T1, 0> _Base1;
|
||||
typedef _LIBCPP_NODEBUG_TYPE __compressed_pair_elem<_T2, 1> _Base2;
|
||||
|
||||
template <bool _Dummy = true,
|
||||
class = typename enable_if<
|
||||
__dependent_type<is_default_constructible<_T1>, _Dummy>::value &&
|
||||
@@ -1344,6 +1344,15 @@ public:
|
||||
return static_cast<_Base2 const&>(*this).__get();
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
static _Base1* __get_first_base(__compressed_pair* __pair) _NOEXCEPT {
|
||||
return static_cast<_Base1*>(__pair);
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
static _Base2* __get_second_base(__compressed_pair* __pair) _NOEXCEPT {
|
||||
return static_cast<_Base2*>(__pair);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void swap(__compressed_pair& __x)
|
||||
_NOEXCEPT_(__is_nothrow_swappable<_T1>::value &&
|
||||
@@ -1453,7 +1462,7 @@ class _LIBCPP_UNIQUE_PTR_TRIVIAL_ABI _LIBCPP_TEMPLATE_VIS unique_ptr {
|
||||
public:
|
||||
typedef _Tp element_type;
|
||||
typedef _Dp deleter_type;
|
||||
typedef _LIBCPP_NODEBUG_TYPE typename __pointer_type<_Tp, deleter_type>::type pointer;
|
||||
typedef _LIBCPP_NODEBUG_TYPE typename __pointer<_Tp, deleter_type>::type pointer;
|
||||
|
||||
static_assert(!is_rvalue_reference<deleter_type>::value,
|
||||
"the specified deleter type cannot be an rvalue reference");
|
||||
@@ -1661,7 +1670,7 @@ class _LIBCPP_UNIQUE_PTR_TRIVIAL_ABI _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;
|
||||
typedef typename __pointer<_Tp, deleter_type>::type pointer;
|
||||
|
||||
private:
|
||||
__compressed_pair<pointer, deleter_type> __ptr_;
|
||||
@@ -2574,43 +2583,81 @@ template <class _Tp, class _Alloc>
|
||||
struct __shared_ptr_emplace
|
||||
: __shared_weak_count
|
||||
{
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
explicit __shared_ptr_emplace(_Alloc __a)
|
||||
: __data_(_VSTD::move(__a), __value_init_tag())
|
||||
{ }
|
||||
|
||||
template <class ..._Args>
|
||||
template<class ..._Args>
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
explicit __shared_ptr_emplace(_Alloc __a, _Args&& ...__args)
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
: __data_(piecewise_construct, _VSTD::forward_as_tuple(__a),
|
||||
_VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...))
|
||||
: __storage_(_VSTD::move(__a))
|
||||
{
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
using _TpAlloc = typename __allocator_traits_rebind<_Alloc, _Tp>::type;
|
||||
_TpAlloc __tmp(*__get_alloc());
|
||||
allocator_traits<_TpAlloc>::construct(__tmp, __get_elem(), _VSTD::forward<_Args>(__args)...);
|
||||
#else
|
||||
: __data_(__a, _Tp(_VSTD::forward<_Args>(__args)...))
|
||||
::new ((void*)__get_elem()) _Tp(_VSTD::forward<_Args>(__args)...);
|
||||
#endif
|
||||
{ }
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
_Tp* __get_elem() _NOEXCEPT { return _VSTD::addressof(__data_.second()); }
|
||||
_Alloc* __get_alloc() _NOEXCEPT { return __storage_.__get_alloc(); }
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
_Alloc* __get_alloc() _NOEXCEPT { return _VSTD::addressof(__data_.first()); }
|
||||
_Tp* __get_elem() _NOEXCEPT { return __storage_.__get_elem(); }
|
||||
|
||||
private:
|
||||
virtual void __on_zero_shared() _NOEXCEPT {
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
using _TpAlloc = typename __allocator_traits_rebind<_Alloc, _Tp>::type;
|
||||
_TpAlloc __tmp(*__get_alloc());
|
||||
allocator_traits<_TpAlloc>::destroy(__tmp, __get_elem());
|
||||
#else
|
||||
__get_elem()->~_Tp();
|
||||
#endif
|
||||
}
|
||||
|
||||
virtual void __on_zero_shared_weak() _NOEXCEPT {
|
||||
using _ControlBlockAlloc = typename __allocator_traits_rebind<_Alloc, __shared_ptr_emplace>::type;
|
||||
using _ControlBlockPointer = typename allocator_traits<_ControlBlockAlloc>::pointer;
|
||||
_ControlBlockAlloc __tmp(*__get_alloc());
|
||||
__get_alloc()->~_Alloc();
|
||||
__storage_.~_Storage();
|
||||
allocator_traits<_ControlBlockAlloc>::deallocate(__tmp,
|
||||
pointer_traits<_ControlBlockPointer>::pointer_to(*this), 1);
|
||||
}
|
||||
|
||||
__compressed_pair<_Alloc, _Tp> __data_;
|
||||
// This class implements the control block for non-array shared pointers created
|
||||
// through `std::allocate_shared` and `std::make_shared`.
|
||||
//
|
||||
// In previous versions of the library, we used a compressed pair to store
|
||||
// both the _Alloc and the _Tp. This implies using EBO, which is incompatible
|
||||
// with Allocator construction for _Tp. To allow implementing P0674 in C++20,
|
||||
// we now use a properly aligned char buffer while making sure that we maintain
|
||||
// the same layout that we had when we used a compressed pair.
|
||||
using _CompressedPair = __compressed_pair<_Alloc, _Tp>;
|
||||
struct _ALIGNAS_TYPE(_CompressedPair) _Storage {
|
||||
char __blob_[sizeof(_CompressedPair)];
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI explicit _Storage(_Alloc&& __a) {
|
||||
::new ((void*)__get_alloc()) _Alloc(_VSTD::move(__a));
|
||||
}
|
||||
_LIBCPP_HIDE_FROM_ABI ~_Storage() {
|
||||
__get_alloc()->~_Alloc();
|
||||
}
|
||||
_Alloc* __get_alloc() _NOEXCEPT {
|
||||
_CompressedPair *__as_pair = reinterpret_cast<_CompressedPair*>(__blob_);
|
||||
typename _CompressedPair::_Base1* __first = _CompressedPair::__get_first_base(__as_pair);
|
||||
_Alloc *__alloc = reinterpret_cast<_Alloc*>(__first);
|
||||
return __alloc;
|
||||
}
|
||||
_LIBCPP_NO_CFI _Tp* __get_elem() _NOEXCEPT {
|
||||
_CompressedPair *__as_pair = reinterpret_cast<_CompressedPair*>(__blob_);
|
||||
typename _CompressedPair::_Base2* __second = _CompressedPair::__get_second_base(__as_pair);
|
||||
_Tp *__elem = reinterpret_cast<_Tp*>(__second);
|
||||
return __elem;
|
||||
}
|
||||
};
|
||||
|
||||
static_assert(_LIBCPP_ALIGNOF(_Storage) == _LIBCPP_ALIGNOF(_CompressedPair), "");
|
||||
static_assert(sizeof(_Storage) == sizeof(_CompressedPair), "");
|
||||
_Storage __storage_;
|
||||
};
|
||||
|
||||
struct __shared_ptr_dummy_rebind_allocator_type;
|
||||
|
||||
@@ -522,6 +522,7 @@ module std [system] {
|
||||
}
|
||||
|
||||
// FIXME: These should be private.
|
||||
module __bits { header "__bits" export * }
|
||||
module __bit_reference { header "__bit_reference" export * }
|
||||
module __debug { header "__debug" export * }
|
||||
module __errc { header "__errc" export * }
|
||||
|
||||
@@ -626,7 +626,7 @@ private:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void __execute(__tuple_indices<_Indices...>)
|
||||
{
|
||||
__invoke(_VSTD::get<0>(_VSTD::move(__f_)), _VSTD::get<_Indices>(_VSTD::move(__f_))...);
|
||||
_VSTD::__invoke(_VSTD::get<0>(_VSTD::move(__f_)), _VSTD::get<_Indices>(_VSTD::move(__f_))...);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -49,11 +49,11 @@ new_handler get_new_handler() noexcept;
|
||||
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); // replaceable, nodiscard in C++20
|
||||
void* operator new(std::size_t size, std::align_val_t alignment); // replaceable, C++17, nodiscard in C++20
|
||||
void* operator new(std::size_t size, const std::nothrow_t&) noexcept; // replaceable, nodiscard in C++20
|
||||
void* operator new(std::size_t size, std::align_val_t alignment,
|
||||
const std::nothrow_t&) noexcept; // replaceable, C++17, nodiscard in C++2a
|
||||
const std::nothrow_t&) noexcept; // replaceable, C++17, nodiscard in C++20
|
||||
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
|
||||
@@ -63,12 +63,12 @@ void operator delete(void* ptr, const std::nothrow_t&) noexcept; // repla
|
||||
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); // replaceable, nodiscard in C++20
|
||||
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
|
||||
std::align_val_t alignment) noexcept; // replaceable, C++17, nodiscard in C++20
|
||||
void* operator new[](std::size_t size, const std::nothrow_t&) noexcept; // replaceable, nodiscard in C++20
|
||||
void* operator new[](std::size_t size, std::align_val_t alignment,
|
||||
const std::nothrow_t&) noexcept; // replaceable, C++17, nodiscard in C++2a
|
||||
const std::nothrow_t&) noexcept; // replaceable, C++17, nodiscard in C++20
|
||||
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,
|
||||
@@ -79,8 +79,8 @@ void operator delete[](void* ptr, const std::nothrow_t&) noexcept; // repla
|
||||
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 new (std::size_t size, void* ptr) noexcept; // nodiscard in C++20
|
||||
void* operator new[](std::size_t size, void* ptr) noexcept; // nodiscard in C++20
|
||||
void operator delete (void* ptr, void*) noexcept;
|
||||
void operator delete[](void* ptr, void*) noexcept;
|
||||
|
||||
|
||||
@@ -112,18 +112,11 @@ protected:
|
||||
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);
|
||||
priority_queue() : priority_queue(Compare()) {} // C++20
|
||||
explicit priority_queue(const Compare& x) : priority_queue(x, Container()) {}
|
||||
priority_queue(const Compare& x, const Container&);
|
||||
explicit priority_queue(const Compare& x = Compare(), Container&&= Container()); // before C++20
|
||||
priority_queue(const Compare& x, Container&&); // C++20
|
||||
template <class InputIterator>
|
||||
priority_queue(InputIterator first, InputIterator last,
|
||||
const Compare& comp = Compare());
|
||||
@@ -474,7 +467,7 @@ public:
|
||||
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);
|
||||
priority_queue(const value_compare& __comp, container_type&& __c);
|
||||
#endif
|
||||
template <class _InputIter>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
|
||||
@@ -36,7 +36,9 @@ public:
|
||||
static constexpr result_type default_seed = 1u;
|
||||
|
||||
// constructors and seeding functions
|
||||
explicit linear_congruential_engine(result_type s = default_seed);
|
||||
explicit linear_congruential_engine(result_type s = default_seed); // before C++20
|
||||
linear_congruential_engine() : linear_congruential_engine(default_seed) {} // C++20
|
||||
explicit linear_congruential_engine(result_type s); // C++20
|
||||
template<class Sseq> explicit linear_congruential_engine(Sseq& q);
|
||||
void seed(result_type s = default_seed);
|
||||
template<class Sseq> void seed(Sseq& q);
|
||||
@@ -96,7 +98,9 @@ public:
|
||||
static constexpr result_type default_seed = 5489u;
|
||||
|
||||
// constructors and seeding functions
|
||||
explicit mersenne_twister_engine(result_type value = default_seed);
|
||||
explicit mersenne_twister_engine(result_type s = default_seed); // before C++20
|
||||
mersenne_twister_engine() : mersenne_twister_engine(default_seed) {} // C++20
|
||||
explicit mersenne_twister_engine(result_type s); // C++20
|
||||
template<class Sseq> explicit mersenne_twister_engine(Sseq& q);
|
||||
void seed(result_type value = default_seed);
|
||||
template<class Sseq> void seed(Sseq& q);
|
||||
@@ -154,7 +158,9 @@ public:
|
||||
static constexpr result_type default_seed = 19780503u;
|
||||
|
||||
// constructors and seeding functions
|
||||
explicit subtract_with_carry_engine(result_type value = default_seed);
|
||||
explicit subtract_with_carry_engine(result_type value = default_seed); // before C++20
|
||||
subtract_with_carry_engine() : subtract_with_carry_engine(default_seed) {} // C++20
|
||||
explicit subtract_with_carry_engine(result_type value); // C++20
|
||||
template<class Sseq> explicit subtract_with_carry_engine(Sseq& q);
|
||||
void seed(result_type value = default_seed);
|
||||
template<class Sseq> void seed(Sseq& q);
|
||||
@@ -385,7 +391,9 @@ public:
|
||||
static constexpr result_type max() { return numeric_limits<result_type>::max(); }
|
||||
|
||||
// constructors
|
||||
explicit random_device(const string& token = "/dev/urandom");
|
||||
explicit random_device(const string& token = implementation-defined); // before C++20
|
||||
random_device() : random_device(implementation-defined) {} // C++20
|
||||
explicit random_device(const string& token); // C++20
|
||||
|
||||
// generating functions
|
||||
result_type operator()();
|
||||
@@ -456,7 +464,10 @@ public:
|
||||
|
||||
// constructors and reset functions
|
||||
explicit uniform_int_distribution(IntType a = 0,
|
||||
IntType b = numeric_limits<IntType>::max());
|
||||
IntType b = numeric_limits<IntType>::max()); // before C++20
|
||||
uniform_int_distribution() : uniform_int_distribution(0) {} // C++20
|
||||
explicit uniform_int_distribution(IntType a,
|
||||
IntType b = numeric_limits<IntType>::max()); // C++20
|
||||
explicit uniform_int_distribution(const param_type& parm);
|
||||
void reset();
|
||||
|
||||
@@ -515,7 +526,9 @@ public:
|
||||
};
|
||||
|
||||
// constructors and reset functions
|
||||
explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0);
|
||||
explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0); // before C++20
|
||||
uniform_real_distribution() : uniform_real_distribution(0.0) {} // C++20
|
||||
explicit uniform_real_distribution(RealType a, RealType b = 1.0); // C++20
|
||||
explicit uniform_real_distribution(const param_type& parm);
|
||||
void reset();
|
||||
|
||||
@@ -571,7 +584,9 @@ public:
|
||||
};
|
||||
|
||||
// constructors and reset functions
|
||||
explicit bernoulli_distribution(double p = 0.5);
|
||||
explicit bernoulli_distribution(double p = 0.5); // before C++20
|
||||
bernoulli_distribution() : bernoulli_distribution(0.5) {} // C++20
|
||||
explicit bernoulli_distribution(double p); // C++20
|
||||
explicit bernoulli_distribution(const param_type& parm);
|
||||
void reset();
|
||||
|
||||
@@ -628,7 +643,9 @@ public:
|
||||
};
|
||||
|
||||
// constructors and reset functions
|
||||
explicit binomial_distribution(IntType t = 1, double p = 0.5);
|
||||
explicit binomial_distribution(IntType t = 1, double p = 0.5); // before C++20
|
||||
binomial_distribution() : binomial_distribution(1) {} // C++20
|
||||
explicit binomial_distribution(IntType t, double p = 0.5); // C++20
|
||||
explicit binomial_distribution(const param_type& parm);
|
||||
void reset();
|
||||
|
||||
@@ -685,7 +702,9 @@ public:
|
||||
};
|
||||
|
||||
// constructors and reset functions
|
||||
explicit geometric_distribution(double p = 0.5);
|
||||
explicit geometric_distribution(double p = 0.5); // before C++20
|
||||
geometric_distribution() : geometric_distribution(0.5) {} // C++20
|
||||
explicit geometric_distribution(double p); // C++20
|
||||
explicit geometric_distribution(const param_type& parm);
|
||||
void reset();
|
||||
|
||||
@@ -742,7 +761,9 @@ public:
|
||||
};
|
||||
|
||||
// constructor and reset functions
|
||||
explicit negative_binomial_distribution(result_type k = 1, double p = 0.5);
|
||||
explicit negative_binomial_distribution(IntType k = 1, double p = 0.5); // before C++20
|
||||
negative_binomial_distribution() : negative_binomial_distribution(1) {} // C++20
|
||||
explicit negative_binomial_distribution(IntType k, double p = 0.5); // C++20
|
||||
explicit negative_binomial_distribution(const param_type& parm);
|
||||
void reset();
|
||||
|
||||
@@ -799,7 +820,9 @@ public:
|
||||
};
|
||||
|
||||
// constructors and reset functions
|
||||
explicit poisson_distribution(double mean = 1.0);
|
||||
explicit poisson_distribution(double mean = 1.0); // before C++20
|
||||
poisson_distribution() : poisson_distribution(1.0) {} // C++20
|
||||
explicit poisson_distribution(double mean); // C++20
|
||||
explicit poisson_distribution(const param_type& parm);
|
||||
void reset();
|
||||
|
||||
@@ -855,7 +878,9 @@ public:
|
||||
};
|
||||
|
||||
// constructors and reset functions
|
||||
explicit exponential_distribution(result_type lambda = 1.0);
|
||||
explicit exponential_distribution(RealType lambda = 1.0); // before C++20
|
||||
exponential_distribution() : exponential_distribution(1.0) {} // C++20
|
||||
explicit exponential_distribution(RealType lambda); // C++20
|
||||
explicit exponential_distribution(const param_type& parm);
|
||||
void reset();
|
||||
|
||||
@@ -912,7 +937,9 @@ public:
|
||||
};
|
||||
|
||||
// constructors and reset functions
|
||||
explicit gamma_distribution(result_type alpha = 1, result_type beta = 1);
|
||||
explicit gamma_distribution(RealType alpha = 0.0, RealType beta = 1.0); // before C++20
|
||||
gamma_distribution() : gamma_distribution(0.0) {} // C++20
|
||||
explicit gamma_distribution(RealType alpha, RealType beta = 1.0); // C++20
|
||||
explicit gamma_distribution(const param_type& parm);
|
||||
void reset();
|
||||
|
||||
@@ -970,7 +997,9 @@ public:
|
||||
};
|
||||
|
||||
// constructor and reset functions
|
||||
explicit weibull_distribution(result_type a = 1, result_type b = 1);
|
||||
explicit weibull_distribution(RealType a = 1.0, RealType b = 1.0); // before C++20
|
||||
weibull_distribution() : weibull_distribution(1.0) {} // C++20
|
||||
explicit weibull_distribution(RealType a, RealType b = 1.0); // C++20
|
||||
explicit weibull_distribution(const param_type& parm);
|
||||
void reset();
|
||||
|
||||
@@ -1028,7 +1057,9 @@ public:
|
||||
};
|
||||
|
||||
// constructor and reset functions
|
||||
explicit extreme_value_distribution(result_type a = 0, result_type b = 1);
|
||||
explicit extreme_value_distribution(RealType a = 0.0, RealType b = 1.0); // before C++20
|
||||
extreme_value_distribution() : extreme_value_distribution(0.0) {} // C++20
|
||||
explicit extreme_value_distribution(RealType a, RealType b = 1.0); // C++20
|
||||
explicit extreme_value_distribution(const param_type& parm);
|
||||
void reset();
|
||||
|
||||
@@ -1086,7 +1117,9 @@ public:
|
||||
};
|
||||
|
||||
// constructors and reset functions
|
||||
explicit normal_distribution(result_type mean = 0, result_type stddev = 1);
|
||||
explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0); // before C++20
|
||||
normal_distribution() : normal_distribution(0.0) {} // C++20
|
||||
explicit normal_distribution(RealType mean, RealType stddev = 1.0); // C++20
|
||||
explicit normal_distribution(const param_type& parm);
|
||||
void reset();
|
||||
|
||||
@@ -1144,7 +1177,9 @@ public:
|
||||
};
|
||||
|
||||
// constructor and reset functions
|
||||
explicit lognormal_distribution(result_type m = 0, result_type s = 1);
|
||||
explicit lognormal_distribution(RealType mean = 0.0, RealType stddev = 1.0); // before C++20
|
||||
lognormal_distribution() : lognormal_distribution(0.0) {} // C++20
|
||||
explicit lognormal_distribution(RealType mean, RealType stddev = 1.0); // C++20
|
||||
explicit lognormal_distribution(const param_type& parm);
|
||||
void reset();
|
||||
|
||||
@@ -1201,7 +1236,9 @@ public:
|
||||
};
|
||||
|
||||
// constructor and reset functions
|
||||
explicit chi_squared_distribution(result_type n = 1);
|
||||
explicit chi_squared_distribution(RealType n = 1.0); // before C++20
|
||||
chi_squared_distribution() : chi_squared_distribution(1.0) {} // C++20
|
||||
explicit chi_squared_distribution(RealType n); // C++20
|
||||
explicit chi_squared_distribution(const param_type& parm);
|
||||
void reset();
|
||||
|
||||
@@ -1258,7 +1295,9 @@ public:
|
||||
};
|
||||
|
||||
// constructor and reset functions
|
||||
explicit cauchy_distribution(result_type a = 0, result_type b = 1);
|
||||
explicit cauchy_distribution(RealType a = 0.0, RealType b = 1.0); // before C++20
|
||||
cauchy_distribution() : cauchy_distribution(0.0) {} // C++20
|
||||
explicit cauchy_distribution(RealType a, RealType b = 1.0); // C++20
|
||||
explicit cauchy_distribution(const param_type& parm);
|
||||
void reset();
|
||||
|
||||
@@ -1316,7 +1355,9 @@ public:
|
||||
};
|
||||
|
||||
// constructor and reset functions
|
||||
explicit fisher_f_distribution(result_type m = 1, result_type n = 1);
|
||||
explicit fisher_f_distribution(RealType m = 1.0, RealType n = 1.0); // before C++20
|
||||
fisher_f_distribution() : fisher_f_distribution(1.0) {} // C++20
|
||||
explicit fisher_f_distribution(RealType m, RealType n = 1.0); // C++20
|
||||
explicit fisher_f_distribution(const param_type& parm);
|
||||
void reset();
|
||||
|
||||
@@ -1373,7 +1414,9 @@ public:
|
||||
};
|
||||
|
||||
// constructor and reset functions
|
||||
explicit student_t_distribution(result_type n = 1);
|
||||
explicit student_t_distribution(RealType n = 1.0); // before C++20
|
||||
student_t_distribution() : student_t_distribution(1.0) {} // C++20
|
||||
explicit student_t_distribution(RealType n); // C++20
|
||||
explicit student_t_distribution(const param_type& parm);
|
||||
void reset();
|
||||
|
||||
@@ -1875,9 +1918,17 @@ public:
|
||||
static _LIBCPP_CONSTEXPR const result_type default_seed = 1u;
|
||||
|
||||
// constructors and seeding functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit linear_congruential_engine(result_type __s = default_seed)
|
||||
{seed(__s);}
|
||||
linear_congruential_engine() : linear_congruential_engine(default_seed) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit linear_congruential_engine(result_type __s) { seed(__s); }
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit linear_congruential_engine(result_type __s = default_seed) {
|
||||
seed(__s);
|
||||
}
|
||||
#endif
|
||||
template<class _Sseq>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit linear_congruential_engine(_Sseq& __q,
|
||||
@@ -2124,9 +2175,17 @@ public:
|
||||
static _LIBCPP_CONSTEXPR const result_type default_seed = 5489u;
|
||||
|
||||
// constructors and seeding functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit mersenne_twister_engine(result_type __sd = default_seed)
|
||||
{seed(__sd);}
|
||||
mersenne_twister_engine() : mersenne_twister_engine(default_seed) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit mersenne_twister_engine(result_type __sd) { seed(__sd); }
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit mersenne_twister_engine(result_type __sd = default_seed) {
|
||||
seed(__sd);
|
||||
}
|
||||
#endif
|
||||
template<class _Sseq>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit mersenne_twister_engine(_Sseq& __q,
|
||||
@@ -2582,9 +2641,17 @@ public:
|
||||
static _LIBCPP_CONSTEXPR const result_type default_seed = 19780503u;
|
||||
|
||||
// constructors and seeding functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit subtract_with_carry_engine(result_type __sd = default_seed)
|
||||
{seed(__sd);}
|
||||
subtract_with_carry_engine() : subtract_with_carry_engine(default_seed) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit subtract_with_carry_engine(result_type __sd) { seed(__sd); }
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit subtract_with_carry_engine(result_type __sd = default_seed) {
|
||||
seed(__sd);
|
||||
}
|
||||
#endif
|
||||
template<class _Sseq>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit subtract_with_carry_engine(_Sseq& __q,
|
||||
@@ -3524,7 +3591,12 @@ public:
|
||||
static _LIBCPP_CONSTEXPR result_type max() { return _Max;}
|
||||
|
||||
// constructors
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
random_device() : random_device("/dev/urandom") {}
|
||||
explicit random_device(const string& __token);
|
||||
#else
|
||||
explicit random_device(const string& __token = "/dev/urandom");
|
||||
#endif
|
||||
~random_device();
|
||||
|
||||
// generating functions
|
||||
@@ -3758,9 +3830,16 @@ private:
|
||||
|
||||
public:
|
||||
// constructors and reset functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
uniform_real_distribution() : uniform_real_distribution(0) {}
|
||||
explicit uniform_real_distribution(result_type __a, result_type __b = 1)
|
||||
: __p_(param_type(__a, __b)) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit uniform_real_distribution(result_type __a = 0, result_type __b = 1)
|
||||
: __p_(param_type(__a, __b)) {}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit uniform_real_distribution(const param_type& __p) : __p_(__p) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -3876,9 +3955,15 @@ private:
|
||||
|
||||
public:
|
||||
// constructors and reset functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit bernoulli_distribution(double __p = 0.5)
|
||||
: __p_(param_type(__p)) {}
|
||||
bernoulli_distribution() : bernoulli_distribution(0.5) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit bernoulli_distribution(double __p) : __p_(param_type(__p)) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit bernoulli_distribution(double __p = 0.5) : __p_(param_type(__p)) {}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit bernoulli_distribution(const param_type& __p) : __p_(__p) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -3994,9 +4079,17 @@ private:
|
||||
|
||||
public:
|
||||
// constructors and reset functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
binomial_distribution() : binomial_distribution(1) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit binomial_distribution(result_type __t, double __p = 0.5)
|
||||
: __p_(param_type(__t, __p)) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit binomial_distribution(result_type __t = 1, double __p = 0.5)
|
||||
: __p_(param_type(__t, __p)) {}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit binomial_distribution(const param_type& __p) : __p_(__p) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -4176,9 +4269,17 @@ private:
|
||||
|
||||
public:
|
||||
// constructors and reset functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
exponential_distribution() : exponential_distribution(1) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit exponential_distribution(result_type __lambda)
|
||||
: __p_(param_type(__lambda)) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit exponential_distribution(result_type __lambda = 1)
|
||||
: __p_(param_type(__lambda)) {}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit exponential_distribution(const param_type& __p) : __p_(__p) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -4299,9 +4400,18 @@ private:
|
||||
|
||||
public:
|
||||
// constructors and reset functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit normal_distribution(result_type __mean = 0, result_type __stddev = 1)
|
||||
normal_distribution() : normal_distribution(0) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit normal_distribution(result_type __mean, result_type __stddev = 1)
|
||||
: __p_(param_type(__mean, __stddev)), _V_hot_(false) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit normal_distribution(result_type __mean = 0,
|
||||
result_type __stddev = 1)
|
||||
: __p_(param_type(__mean, __stddev)), _V_hot_(false) {}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit normal_distribution(const param_type& __p)
|
||||
: __p_(__p), _V_hot_(false) {}
|
||||
@@ -4479,9 +4589,18 @@ private:
|
||||
|
||||
public:
|
||||
// constructor and reset functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit lognormal_distribution(result_type __m = 0, result_type __s = 1)
|
||||
lognormal_distribution() : lognormal_distribution(0) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit lognormal_distribution(result_type __m, result_type __s = 1)
|
||||
: __p_(param_type(__m, __s)) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit lognormal_distribution(result_type __m = 0,
|
||||
result_type __s = 1)
|
||||
: __p_(param_type(__m, __s)) {}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit lognormal_distribution(const param_type& __p)
|
||||
: __p_(__p) {}
|
||||
@@ -4599,8 +4718,17 @@ private:
|
||||
|
||||
public:
|
||||
// constructors and reset functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit poisson_distribution(double __mean = 1.0) : __p_(__mean) {}
|
||||
poisson_distribution() : poisson_distribution(1.0) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit poisson_distribution(double __mean)
|
||||
: __p_(__mean) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit poisson_distribution(double __mean = 1.0)
|
||||
: __p_(__mean) {}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit poisson_distribution(const param_type& __p) : __p_(__p) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -4828,9 +4956,17 @@ private:
|
||||
|
||||
public:
|
||||
// constructor and reset functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
weibull_distribution() : weibull_distribution(1) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit weibull_distribution(result_type __a, result_type __b = 1)
|
||||
: __p_(param_type(__a, __b)) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit weibull_distribution(result_type __a = 1, result_type __b = 1)
|
||||
: __p_(param_type(__a, __b)) {}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit weibull_distribution(const param_type& __p)
|
||||
: __p_(__p) {}
|
||||
@@ -4944,9 +5080,18 @@ private:
|
||||
|
||||
public:
|
||||
// constructor and reset functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit extreme_value_distribution(result_type __a = 0, result_type __b = 1)
|
||||
extreme_value_distribution() : extreme_value_distribution(0) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit extreme_value_distribution(result_type __a, result_type __b = 1)
|
||||
: __p_(param_type(__a, __b)) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit extreme_value_distribution(result_type __a = 0,
|
||||
result_type __b = 1)
|
||||
: __p_(param_type(__a, __b)) {}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit extreme_value_distribution(const param_type& __p)
|
||||
: __p_(__p) {}
|
||||
@@ -5067,9 +5212,18 @@ private:
|
||||
|
||||
public:
|
||||
// constructors and reset functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit gamma_distribution(result_type __alpha = 1, result_type __beta = 1)
|
||||
gamma_distribution() : gamma_distribution(1) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit gamma_distribution(result_type __alpha, result_type __beta = 1)
|
||||
: __p_(param_type(__alpha, __beta)) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit gamma_distribution(result_type __alpha = 1,
|
||||
result_type __beta = 1)
|
||||
: __p_(param_type(__alpha, __beta)) {}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit gamma_distribution(const param_type& __p)
|
||||
: __p_(__p) {}
|
||||
@@ -5241,9 +5395,18 @@ private:
|
||||
|
||||
public:
|
||||
// constructor and reset functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit negative_binomial_distribution(result_type __k = 1, double __p = 0.5)
|
||||
negative_binomial_distribution() : negative_binomial_distribution(1) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit negative_binomial_distribution(result_type __k, double __p = 0.5)
|
||||
: __p_(__k, __p) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit negative_binomial_distribution(result_type __k = 1,
|
||||
double __p = 0.5)
|
||||
: __p_(__k, __p) {}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit negative_binomial_distribution(const param_type& __p) : __p_(__p) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -5374,8 +5537,17 @@ private:
|
||||
|
||||
public:
|
||||
// constructors and reset functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit geometric_distribution(double __p = 0.5) : __p_(__p) {}
|
||||
geometric_distribution() : geometric_distribution(0.5) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit geometric_distribution(double __p)
|
||||
: __p_(__p) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit geometric_distribution(double __p = 0.5)
|
||||
: __p_(__p) {}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit geometric_distribution(const param_type& __p) : __p_(__p) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -5478,9 +5650,17 @@ private:
|
||||
|
||||
public:
|
||||
// constructor and reset functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
chi_squared_distribution() : chi_squared_distribution(1) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit chi_squared_distribution(result_type __n)
|
||||
: __p_(param_type(__n)) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit chi_squared_distribution(result_type __n = 1)
|
||||
: __p_(param_type(__n)) {}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit chi_squared_distribution(const param_type& __p)
|
||||
: __p_(__p) {}
|
||||
@@ -5590,9 +5770,17 @@ private:
|
||||
|
||||
public:
|
||||
// constructor and reset functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
cauchy_distribution() : cauchy_distribution(0) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit cauchy_distribution(result_type __a, result_type __b = 1)
|
||||
: __p_(param_type(__a, __b)) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit cauchy_distribution(result_type __a = 0, result_type __b = 1)
|
||||
: __p_(param_type(__a, __b)) {}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit cauchy_distribution(const param_type& __p)
|
||||
: __p_(__p) {}
|
||||
@@ -5715,9 +5903,17 @@ private:
|
||||
|
||||
public:
|
||||
// constructor and reset functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
fisher_f_distribution() : fisher_f_distribution(1) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit fisher_f_distribution(result_type __m, result_type __n = 1)
|
||||
: __p_(param_type(__m, __n)) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit fisher_f_distribution(result_type __m = 1, result_type __n = 1)
|
||||
: __p_(param_type(__m, __n)) {}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit fisher_f_distribution(const param_type& __p)
|
||||
: __p_(__p) {}
|
||||
@@ -5836,9 +6032,17 @@ private:
|
||||
|
||||
public:
|
||||
// constructor and reset functions
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
student_t_distribution() : student_t_distribution(1) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit student_t_distribution(result_type __n)
|
||||
: __p_(param_type(__n)) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit student_t_distribution(result_type __n = 1)
|
||||
: __p_(param_type(__n)) {}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit student_t_distribution(const param_type& __p)
|
||||
: __p_(__p) {}
|
||||
|
||||
@@ -455,7 +455,9 @@ public:
|
||||
typedef basic_string<char_type> string_type;
|
||||
|
||||
// construct/copy/destroy:
|
||||
explicit match_results(const Allocator& a = Allocator());
|
||||
explicit match_results(const Allocator& a = Allocator()); // before C++20
|
||||
match_results() : match_results(Allocator()) {} // C++20
|
||||
explicit match_results(const Allocator& a); // C++20
|
||||
match_results(const match_results& m);
|
||||
match_results(match_results&& m) noexcept;
|
||||
match_results& operator=(const match_results& m);
|
||||
@@ -5357,7 +5359,13 @@ public:
|
||||
typedef basic_string<char_type> string_type;
|
||||
|
||||
// construct/copy/destroy:
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
match_results() : match_results(allocator_type()) {}
|
||||
explicit match_results(const allocator_type& __a);
|
||||
#else
|
||||
explicit match_results(const allocator_type& __a = allocator_type());
|
||||
#endif
|
||||
|
||||
// match_results(const match_results&) = default;
|
||||
// match_results& operator=(const match_results&) = default;
|
||||
// match_results(match_results&& __m) = default;
|
||||
|
||||
@@ -25,8 +25,10 @@ public:
|
||||
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);
|
||||
// 27.8.1.1 [stringbuf.cons], constructors:
|
||||
explicit basic_stringbuf(ios_base::openmode which = ios_base::in | ios_base::out); // before C++20
|
||||
basic_stringbuf() : basic_stringbuf(ios_base::in | ios_base::out) {} // C++20
|
||||
explicit basic_stringbuf(ios_base::openmode which); // C++20
|
||||
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);
|
||||
@@ -71,7 +73,10 @@ public:
|
||||
typedef Allocator allocator_type;
|
||||
|
||||
// 27.8.2.1 Constructors:
|
||||
explicit basic_istringstream(ios_base::openmode which = ios_base::in);
|
||||
explicit basic_istringstream(ios_base::openmode which = ios_base::in); // before C++20
|
||||
basic_istringstream() : basic_istringstream(ios_base::in) {} // C++20
|
||||
explicit basic_istringstream(ios_base::openmode which); // C++20
|
||||
|
||||
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);
|
||||
@@ -107,7 +112,10 @@ public:
|
||||
typedef Allocator allocator_type;
|
||||
|
||||
// 27.8.3.1 Constructors/destructor:
|
||||
explicit basic_ostringstream(ios_base::openmode which = ios_base::out);
|
||||
explicit basic_ostringstream(ios_base::openmode which = ios_base::out); // before C++20
|
||||
basic_ostringstream() : basic_ostringstream(ios_base::out) {} // C++20
|
||||
explicit basic_ostringstream(ios_base::openmode which); // C++20
|
||||
|
||||
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);
|
||||
@@ -143,7 +151,10 @@ public:
|
||||
typedef Allocator allocator_type;
|
||||
|
||||
// constructors/destructor
|
||||
explicit basic_stringstream(ios_base::openmode which = ios_base::out|ios_base::in);
|
||||
explicit basic_stringstream(ios_base::openmode which = ios_base::out | ios_base::in); // before C++20
|
||||
basic_stringstream() : basic_stringstream(ios_base::out | ios_base::in) {} // C++20
|
||||
explicit basic_stringstream(ios_base::openmode which); // C++20
|
||||
|
||||
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);
|
||||
@@ -207,11 +218,20 @@ private:
|
||||
ios_base::openmode __mode_;
|
||||
|
||||
public:
|
||||
// 27.8.1.1 Constructors:
|
||||
// 30.8.2.1 [stringbuf.cons], constructors
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_stringbuf(ios_base::openmode __wch = ios_base::in | ios_base::out)
|
||||
: __hm_(nullptr), __mode_(__wch)
|
||||
{ }
|
||||
basic_stringbuf() : basic_stringbuf(ios_base::in | ios_base::out) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_stringbuf(ios_base::openmode __wch)
|
||||
: __hm_(nullptr), __mode_(__wch) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_stringbuf(ios_base::openmode __wch = ios_base::in |
|
||||
ios_base::out)
|
||||
: __hm_(nullptr), __mode_(__wch) {}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_stringbuf(const string_type& __s,
|
||||
@@ -622,12 +642,20 @@ private:
|
||||
basic_stringbuf<char_type, traits_type, allocator_type> __sb_;
|
||||
|
||||
public:
|
||||
// 27.8.2.1 Constructors:
|
||||
// 30.8.3.1 [istringstream.cons], constructors
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
basic_istringstream() : basic_istringstream(ios_base::in) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_istringstream(ios_base::openmode __wch)
|
||||
: basic_istream<_CharT, _Traits>(&__sb_), __sb_(__wch | ios_base::in) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_istringstream(ios_base::openmode __wch = ios_base::in)
|
||||
: basic_istream<_CharT, _Traits>(&__sb_)
|
||||
, __sb_(__wch | ios_base::in)
|
||||
{ }
|
||||
: basic_istream<_CharT, _Traits>(&__sb_), __sb_(__wch | ios_base::in) {}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_istringstream(const string_type& __s,
|
||||
ios_base::openmode __wch = ios_base::in)
|
||||
@@ -699,12 +727,21 @@ private:
|
||||
basic_stringbuf<char_type, traits_type, allocator_type> __sb_;
|
||||
|
||||
public:
|
||||
// 27.8.2.1 Constructors:
|
||||
// 30.8.4.1 [ostringstream.cons], constructors
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostringstream() : basic_ostringstream(ios_base::out) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_ostringstream(ios_base::openmode __wch)
|
||||
: basic_ostream<_CharT, _Traits>(&__sb_),
|
||||
__sb_(__wch | ios_base::out) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_ostringstream(ios_base::openmode __wch = ios_base::out)
|
||||
: basic_ostream<_CharT, _Traits>(&__sb_)
|
||||
, __sb_(__wch | ios_base::out)
|
||||
{ }
|
||||
: basic_ostream<_CharT, _Traits>(&__sb_),
|
||||
__sb_(__wch | ios_base::out) {}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_ostringstream(const string_type& __s,
|
||||
@@ -778,12 +815,20 @@ private:
|
||||
basic_stringbuf<char_type, traits_type, allocator_type> __sb_;
|
||||
|
||||
public:
|
||||
// 27.8.2.1 Constructors:
|
||||
// 30.8.5.1 [stringstream.cons], constructors
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_stringstream(ios_base::openmode __wch = ios_base::in | ios_base::out)
|
||||
: basic_iostream<_CharT, _Traits>(&__sb_)
|
||||
, __sb_(__wch)
|
||||
{ }
|
||||
basic_stringstream() : basic_stringstream(ios_base::in | ios_base::out) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_stringstream(ios_base::openmode __wch)
|
||||
: basic_iostream<_CharT, _Traits>(&__sb_), __sb_(__wch) {}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_stringstream(ios_base::openmode __wch = ios_base::in |
|
||||
ios_base::out)
|
||||
: basic_iostream<_CharT, _Traits>(&__sb_), __sb_(__wch) {}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_stringstream(const string_type& __s,
|
||||
|
||||
@@ -317,12 +317,16 @@ public:
|
||||
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 starts_with(basic_string_view<charT, traits> sv) const noexcept; // C++20
|
||||
bool starts_with(charT c) const noexcept; // C++20
|
||||
bool starts_with(const charT* s) const; // C++20
|
||||
bool ends_with(basic_string_view<charT, traits> sv) const noexcept; // C++20
|
||||
bool ends_with(charT c) const noexcept; // C++20
|
||||
bool ends_with(const charT* s) const; // C++20
|
||||
|
||||
constexpr bool contains(basic_string_view<charT, traits> sv) const noexcept; // C++2b
|
||||
constexpr bool contains(charT c) const noexcept; // C++2b
|
||||
constexpr bool contains(const charT* s) const; // C++2b
|
||||
|
||||
bool __invariants() const;
|
||||
};
|
||||
@@ -1433,6 +1437,20 @@ public:
|
||||
{ return ends_with(__self_view(__s)); }
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_STD_VER > 20
|
||||
constexpr _LIBCPP_INLINE_VISIBILITY
|
||||
bool contains(__self_view __sv) const noexcept
|
||||
{ return __self_view(data(), size()).contains(__sv); }
|
||||
|
||||
constexpr _LIBCPP_INLINE_VISIBILITY
|
||||
bool contains(value_type __c) const noexcept
|
||||
{ return __self_view(data(), size()).contains(__c); }
|
||||
|
||||
constexpr _LIBCPP_INLINE_VISIBILITY
|
||||
bool contains(const value_type* __s) const
|
||||
{ return __self_view(data(), size()).contains(__s); }
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY bool __invariants() const;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY void __clear_and_shrink() _NOEXCEPT;
|
||||
|
||||
@@ -142,12 +142,16 @@ namespace std {
|
||||
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
|
||||
constexpr bool starts_with(basic_string_view s) const noexcept; // C++20
|
||||
constexpr bool starts_with(charT c) const noexcept; // C++20
|
||||
constexpr bool starts_with(const charT* s) const; // C++20
|
||||
constexpr bool ends_with(basic_string_view s) const noexcept; // C++20
|
||||
constexpr bool ends_with(charT c) const noexcept; // C++20
|
||||
constexpr bool ends_with(const charT* s) const; // C++20
|
||||
|
||||
constexpr bool contains(basic_string_view s) const noexcept; // C++2b
|
||||
constexpr bool contains(charT c) const noexcept; // C++2b
|
||||
constexpr bool contains(const charT* s) const; // C++2b
|
||||
|
||||
private:
|
||||
const_pointer data_; // exposition only
|
||||
@@ -622,6 +626,20 @@ public:
|
||||
{ return ends_with(basic_string_view(__s)); }
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_STD_VER > 20
|
||||
constexpr _LIBCPP_INLINE_VISIBILITY
|
||||
bool contains(basic_string_view __sv) const noexcept
|
||||
{ return find(__sv) != npos; }
|
||||
|
||||
constexpr _LIBCPP_INLINE_VISIBILITY
|
||||
bool contains(value_type __c) const noexcept
|
||||
{ return find(__c) != npos; }
|
||||
|
||||
constexpr _LIBCPP_INLINE_VISIBILITY
|
||||
bool contains(const value_type* __s) const
|
||||
{ return find(__s) != npos; }
|
||||
#endif
|
||||
|
||||
private:
|
||||
const value_type* __data;
|
||||
size_type __size;
|
||||
|
||||
@@ -17,7 +17,10 @@ class strstreambuf
|
||||
: public basic_streambuf<char>
|
||||
{
|
||||
public:
|
||||
explicit strstreambuf(streamsize alsize_arg = 0);
|
||||
explicit strstreambuf(streamsize alsize_arg = 0); // before C++20
|
||||
strstreambuf() : strstreambuf(0) {} // C++20
|
||||
explicit strstreambuf(streamsize alsize_arg); // C++20
|
||||
|
||||
strstreambuf(void* (*palloc_arg)(size_t), void (*pfree_arg)(void*));
|
||||
strstreambuf(char* gnext_arg, streamsize n, char* pbeg_arg = nullptr);
|
||||
strstreambuf(const char* gnext_arg, streamsize n);
|
||||
@@ -140,7 +143,12 @@ class _LIBCPP_TYPE_VIS strstreambuf
|
||||
: public streambuf
|
||||
{
|
||||
public:
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
strstreambuf() : strstreambuf(0) {}
|
||||
explicit strstreambuf(streamsize __alsize);
|
||||
#else
|
||||
explicit strstreambuf(streamsize __alsize = 0);
|
||||
#endif
|
||||
strstreambuf(void* (*__palloc)(size_t), void (*__pfree)(void*));
|
||||
strstreambuf(char* __gnext, streamsize __n, char* __pbeg = nullptr);
|
||||
strstreambuf(const char* __gnext, streamsize __n);
|
||||
|
||||
@@ -51,6 +51,7 @@ namespace std
|
||||
template <class T> struct is_arithmetic;
|
||||
template <class T> struct is_fundamental;
|
||||
template <class T> struct is_member_pointer;
|
||||
template <class T> struct is_scoped_enum; // C++2b
|
||||
template <class T> struct is_scalar;
|
||||
template <class T> struct is_object;
|
||||
template <class T> struct is_compound;
|
||||
@@ -284,6 +285,8 @@ namespace std
|
||||
= is_compound<T>::value; // C++17
|
||||
template <class T> inline constexpr bool is_member_pointer_v
|
||||
= is_member_pointer<T>::value; // C++17
|
||||
template <class T> inline constexpr bool is_scoped_enum_v
|
||||
= is_scoped_enum<T>::value; // C++2b
|
||||
|
||||
// See C++14 20.10.4.3, type properties
|
||||
template <class T> inline constexpr bool is_const_v
|
||||
@@ -1662,6 +1665,21 @@ _LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_base_of_v
|
||||
= is_base_of<_Bp, _Dp>::value;
|
||||
#endif
|
||||
|
||||
// __is_core_convertible
|
||||
|
||||
// [conv.general]/3 says "E is convertible to T" whenever "T t=E;" is well-formed.
|
||||
// We can't test for that, but we can test implicit convertibility by passing it
|
||||
// to a function. Notice that __is_core_convertible<void,void> is false,
|
||||
// and __is_core_convertible<immovable-type,immovable-type> is true in C++17 and later.
|
||||
|
||||
template <class _Tp, class _Up, class = void>
|
||||
struct __is_core_convertible : public false_type {};
|
||||
|
||||
template <class _Tp, class _Up>
|
||||
struct __is_core_convertible<_Tp, _Up, decltype(
|
||||
static_cast<void(*)(_Up)>(0) ( static_cast<_Tp(*)()>(0)() )
|
||||
)> : public true_type {};
|
||||
|
||||
// is_convertible
|
||||
|
||||
#if __has_feature(is_convertible_to) && !defined(_LIBCPP_USE_IS_CONVERTIBLE_FALLBACK)
|
||||
@@ -3584,7 +3602,7 @@ auto __invoke_constexpr(__any, _Args&& ...__args) -> __nat;
|
||||
template <class _Fp, class _A0, class ..._Args,
|
||||
class = __enable_if_bullet1<_Fp, _A0>>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 auto
|
||||
__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
|
||||
_LIBCPP_INVOKE_RETURN((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...))
|
||||
|
||||
@@ -3598,7 +3616,7 @@ _LIBCPP_INVOKE_RETURN((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__a
|
||||
template <class _Fp, class _A0, class ..._Args,
|
||||
class = __enable_if_bullet2<_Fp, _A0>>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 auto
|
||||
__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
|
||||
_LIBCPP_INVOKE_RETURN((__a0.get().*__f)(_VSTD::forward<_Args>(__args)...))
|
||||
|
||||
@@ -3612,7 +3630,7 @@ _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
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 auto
|
||||
__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
|
||||
_LIBCPP_INVOKE_RETURN(((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...))
|
||||
|
||||
@@ -3628,7 +3646,7 @@ _LIBCPP_INVOKE_RETURN(((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(
|
||||
template <class _Fp, class _A0,
|
||||
class = __enable_if_bullet4<_Fp, _A0>>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 auto
|
||||
__invoke(_Fp&& __f, _A0&& __a0)
|
||||
_LIBCPP_INVOKE_RETURN(_VSTD::forward<_A0>(__a0).*__f)
|
||||
|
||||
@@ -3642,7 +3660,7 @@ _LIBCPP_INVOKE_RETURN(_VSTD::forward<_A0>(__a0).*__f)
|
||||
template <class _Fp, class _A0,
|
||||
class = __enable_if_bullet5<_Fp, _A0>>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 auto
|
||||
__invoke(_Fp&& __f, _A0&& __a0)
|
||||
_LIBCPP_INVOKE_RETURN(__a0.get().*__f)
|
||||
|
||||
@@ -3656,7 +3674,7 @@ _LIBCPP_INVOKE_RETURN(__a0.get().*__f)
|
||||
template <class _Fp, class _A0,
|
||||
class = __enable_if_bullet6<_Fp, _A0>>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 auto
|
||||
__invoke(_Fp&& __f, _A0&& __a0)
|
||||
_LIBCPP_INVOKE_RETURN((*_VSTD::forward<_A0>(__a0)).*__f)
|
||||
|
||||
@@ -3671,7 +3689,7 @@ _LIBCPP_INVOKE_RETURN((*_VSTD::forward<_A0>(__a0)).*__f)
|
||||
|
||||
template <class _Fp, class ..._Args>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 auto
|
||||
__invoke(_Fp&& __f, _Args&& ...__args)
|
||||
_LIBCPP_INVOKE_RETURN(_VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...))
|
||||
|
||||
@@ -4177,6 +4195,25 @@ struct __has_operator_addressof
|
||||
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
|
||||
// is_scoped_enum [meta.unary.prop]
|
||||
|
||||
#if _LIBCPP_STD_VER > 20
|
||||
template <class _Tp, bool = is_enum_v<_Tp> >
|
||||
struct __is_scoped_enum_helper : false_type {};
|
||||
|
||||
template <class _Tp>
|
||||
struct __is_scoped_enum_helper<_Tp, true>
|
||||
: public bool_constant<!is_convertible_v<_Tp, underlying_type_t<_Tp> > > {};
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_TEMPLATE_VIS is_scoped_enum
|
||||
: public __is_scoped_enum_helper<_Tp> {};
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool is_scoped_enum_v =
|
||||
is_scoped_enum<_Tp>::value;
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_STD_VER > 14
|
||||
|
||||
template <class... _Args>
|
||||
|
||||
@@ -169,6 +169,9 @@ namespace std {
|
||||
template <class Visitor, class... Variants>
|
||||
constexpr see below visit(Visitor&&, Variants&&...);
|
||||
|
||||
template <class R, class Visitor, class... Variants>
|
||||
constexpr R visit(Visitor&&, Variants&&...); // since C++20
|
||||
|
||||
// 20.7.7, class monostate
|
||||
struct monostate;
|
||||
|
||||
@@ -583,6 +586,16 @@ struct __variant {
|
||||
__make_value_visitor(_VSTD::forward<_Visitor>(__visitor)),
|
||||
_VSTD::forward<_Vs>(__vs)...);
|
||||
}
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
template <class _Rp, class _Visitor, class... _Vs>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
static constexpr _Rp __visit_value(_Visitor&& __visitor,
|
||||
_Vs&&... __vs) {
|
||||
return __visit_alt(
|
||||
__make_value_visitor<_Rp>(_VSTD::forward<_Visitor>(__visitor)),
|
||||
_VSTD::forward<_Vs>(__vs)...);
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
template <class _Visitor, class... _Values>
|
||||
@@ -605,11 +618,42 @@ private:
|
||||
_Visitor&& __visitor;
|
||||
};
|
||||
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
template <class _Rp, class _Visitor>
|
||||
struct __value_visitor_return_type {
|
||||
template <class... _Alts>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr _Rp operator()(_Alts&&... __alts) const {
|
||||
__std_visit_exhaustive_visitor_check<
|
||||
_Visitor,
|
||||
decltype((_VSTD::forward<_Alts>(__alts).__value))...>();
|
||||
if constexpr (is_void_v<_Rp>) {
|
||||
_VSTD::__invoke_constexpr(_VSTD::forward<_Visitor>(__visitor),
|
||||
_VSTD::forward<_Alts>(__alts).__value...);
|
||||
}
|
||||
else {
|
||||
return _VSTD::__invoke_constexpr(_VSTD::forward<_Visitor>(__visitor),
|
||||
_VSTD::forward<_Alts>(__alts).__value...);
|
||||
}
|
||||
}
|
||||
|
||||
_Visitor&& __visitor;
|
||||
};
|
||||
#endif
|
||||
|
||||
template <class _Visitor>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
static constexpr auto __make_value_visitor(_Visitor&& __visitor) {
|
||||
return __value_visitor<_Visitor>{_VSTD::forward<_Visitor>(__visitor)};
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
template <class _Rp, class _Visitor>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
static constexpr auto __make_value_visitor(_Visitor&& __visitor) {
|
||||
return __value_visitor_return_type<_Rp, _Visitor>{_VSTD::forward<_Visitor>(__visitor)};
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
} // namespace __visitation
|
||||
@@ -1591,21 +1635,38 @@ constexpr bool operator>=(const variant<_Types...>& __lhs,
|
||||
__lhs.index(), __convert_to_bool<greater_equal<>>{}, __lhs, __rhs);
|
||||
}
|
||||
|
||||
template <class... _Vs>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
|
||||
constexpr void __throw_if_valueless(_Vs&&... __vs) {
|
||||
const bool __valueless = (... || __vs.valueless_by_exception());
|
||||
if (__valueless) {
|
||||
__throw_bad_variant_access();
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
_VSTD::__throw_if_valueless(_VSTD::forward<_Vs>(__vs)...);
|
||||
return __variant::__visit_value(_VSTD::forward<_Visitor>(__visitor),
|
||||
_VSTD::forward<_Vs>(__vs)...);
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
template <class _Rp, class _Visitor, class... _Vs>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
|
||||
constexpr _Rp visit(_Visitor&& __visitor, _Vs&&... __vs) {
|
||||
using __variant_detail::__visitation::__variant;
|
||||
_VSTD::__throw_if_valueless(_VSTD::forward<_Vs>(__vs)...);
|
||||
return __variant::__visit_value<_Rp>(_VSTD::forward<_Visitor>(__visitor),
|
||||
_VSTD::forward<_Vs>(__vs)...);
|
||||
}
|
||||
#endif
|
||||
|
||||
struct _LIBCPP_TEMPLATE_VIS monostate {};
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
|
||||
@@ -15,15 +15,16 @@
|
||||
|
||||
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_allocator_traits_is_always_equal 201411L <deque> <forward_list> <list>
|
||||
<map> <memory> <scoped_allocator>
|
||||
<set> <string> <unordered_map>
|
||||
<unordered_set> <vector>
|
||||
__cpp_lib_any 201606L <any>
|
||||
__cpp_lib_apply 201603L <tuple>
|
||||
__cpp_lib_array_constexpr 201811L <iterator> <array>
|
||||
__cpp_lib_array_constexpr 201811L <array> <iterator>
|
||||
201603L // C++17
|
||||
__cpp_lib_as_const 201510L <utility>
|
||||
__cpp_lib_assume_aligned 201811L <memory>
|
||||
__cpp_lib_atomic_flag_test 201907L <atomic>
|
||||
__cpp_lib_atomic_float 201711L <atomic>
|
||||
__cpp_lib_atomic_is_always_lock_free 201603L <atomic>
|
||||
@@ -32,9 +33,12 @@ __cpp_lib_atomic_ref 201806L <atomic>
|
||||
__cpp_lib_atomic_shared_ptr 201711L <atomic>
|
||||
__cpp_lib_atomic_value_initialization 201911L <atomic> <memory>
|
||||
__cpp_lib_atomic_wait 201907L <atomic>
|
||||
__cpp_lib_bind_front 201811L <functional>
|
||||
__cpp_lib_barrier 201907L <barrier>
|
||||
__cpp_lib_bind_front 201907L <functional>
|
||||
__cpp_lib_bit_cast 201806L <bit>
|
||||
__cpp_lib_bitops 201907L <bit>
|
||||
__cpp_lib_bool_constant 201505L <type_traits>
|
||||
__cpp_lib_bounded_array_traits 201902L <type_traits>
|
||||
__cpp_lib_boyer_moore_searcher 201603L <functional>
|
||||
__cpp_lib_byte 201603L <cstddef>
|
||||
__cpp_lib_char8_t 201811L <atomic> <filesystem> <istream>
|
||||
@@ -44,21 +48,29 @@ __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_concepts 202002L <concepts>
|
||||
__cpp_lib_constexpr_algorithms 201806L <algorithm>
|
||||
__cpp_lib_constexpr_complex 201711L <complex>
|
||||
__cpp_lib_constexpr_dynamic_alloc 201907L <memory>
|
||||
__cpp_lib_constexpr_misc 201811L <array> <functional> <iterator>
|
||||
<string_view> <tuple> <utility>
|
||||
__cpp_lib_constexpr_functional 201907L <functional>
|
||||
__cpp_lib_constexpr_iterator 201811L <iterator>
|
||||
__cpp_lib_constexpr_memory 201811L <memory>
|
||||
__cpp_lib_constexpr_numeric 201911L <numeric>
|
||||
__cpp_lib_constexpr_swap_algorithms 201806L <algorithm>
|
||||
__cpp_lib_constexpr_string 201907L <string>
|
||||
__cpp_lib_constexpr_string_view 201811L <string_view>
|
||||
__cpp_lib_constexpr_tuple 201811L <tuple>
|
||||
__cpp_lib_constexpr_utility 201811L <utility>
|
||||
__cpp_lib_constexpr_vector 201907L <vector>
|
||||
__cpp_lib_coroutine 201902L <coroutine>
|
||||
__cpp_lib_destroying_delete 201806L <new>
|
||||
__cpp_lib_enable_shared_from_this 201603L <memory>
|
||||
__cpp_lib_endian 201907L <bit>
|
||||
__cpp_lib_erase_if 202002L <string> <deque> <forward_list>
|
||||
<list> <vector> <map>
|
||||
<set> <unordered_map> <unordered_set>
|
||||
__cpp_lib_erase_if 202002L <deque> <forward_list> <list>
|
||||
<map> <set> <string>
|
||||
<unordered_map> <unordered_set> <vector>
|
||||
__cpp_lib_exchange_function 201304L <utility>
|
||||
__cpp_lib_execution 201603L <execution>
|
||||
__cpp_lib_execution 201902L <execution>
|
||||
201603L // C++17
|
||||
__cpp_lib_filesystem 201703L <filesystem>
|
||||
__cpp_lib_gcd_lcm 201606L <numeric>
|
||||
__cpp_lib_generic_associative_lookup 201304L <map> <set>
|
||||
@@ -68,16 +80,23 @@ __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_int_pow2 202002L <bit>
|
||||
__cpp_lib_integer_comparison_functions 202002L <utility>
|
||||
__cpp_lib_integer_sequence 201304L <utility>
|
||||
__cpp_lib_integral_constant_callable 201304L <type_traits>
|
||||
__cpp_lib_interpolate 201902L <numeric>
|
||||
__cpp_lib_interpolate 201902L <cmath> <numeric>
|
||||
__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_layout_compatible 201907L <type_traits>
|
||||
__cpp_lib_is_nothrow_convertible 201806L <type_traits>
|
||||
__cpp_lib_is_null_pointer 201309L <type_traits>
|
||||
__cpp_lib_is_pointer_interconvertible 201907L <type_traits>
|
||||
__cpp_lib_is_scoped_enum 202011L <type_traits>
|
||||
__cpp_lib_is_swappable 201603L <type_traits>
|
||||
__cpp_lib_jthread 201911L <stop_token> <thread>
|
||||
__cpp_lib_latch 201907L <latch>
|
||||
__cpp_lib_launder 201606L <new>
|
||||
__cpp_lib_list_remove_return_type 201806L <forward_list> <list>
|
||||
__cpp_lib_logical_traits 201510L <type_traits>
|
||||
@@ -90,40 +109,55 @@ __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>
|
||||
__cpp_lib_nonmember_container_access 201411L <array> <deque> <forward_list>
|
||||
<iterator> <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_polymorphic_allocator 201902L <memory>
|
||||
__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_remove_cvref 201711L <type_traits>
|
||||
__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_semaphore 201907L <semaphore>
|
||||
__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_shift 201806L <algorithm>
|
||||
__cpp_lib_smart_ptr_for_overwrite 202002L <memory>
|
||||
__cpp_lib_source_location 201907L <source_location>
|
||||
__cpp_lib_span 202002L <span>
|
||||
__cpp_lib_ssize 201902L <iterator>
|
||||
__cpp_lib_stacktrace 202011L <stacktrace>
|
||||
__cpp_lib_starts_ends_with 201711L <string> <string_view>
|
||||
__cpp_lib_stdatomic_h 202011L <stdatomic.h>
|
||||
__cpp_lib_string_contains 202011L <string> <string_view>
|
||||
__cpp_lib_string_udls 201304L <string>
|
||||
__cpp_lib_string_view 201606L <string> <string_view>
|
||||
__cpp_lib_three_way_comparison 201711L <compare>
|
||||
__cpp_lib_string_view 201803L <string> <string_view>
|
||||
201606L // C++17
|
||||
__cpp_lib_syncbuf 201803L <syncstream>
|
||||
__cpp_lib_three_way_comparison 201907L <compare>
|
||||
__cpp_lib_to_address 201711L <memory>
|
||||
__cpp_lib_to_array 201907L <array>
|
||||
__cpp_lib_to_chars 201611L <utility>
|
||||
__cpp_lib_transformation_trait_aliases 201304L <type_traits>
|
||||
__cpp_lib_transparent_operators 201510L <functional>
|
||||
__cpp_lib_transparent_operators 201510L <functional> <memory>
|
||||
201210L // C++14
|
||||
__cpp_lib_tuple_element_t 201402L <tuple>
|
||||
__cpp_lib_tuples_by_type 201304L <utility> <tuple>
|
||||
__cpp_lib_tuples_by_type 201304L <tuple> <utility>
|
||||
__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_unwrap_ref 201811L <functional>
|
||||
__cpp_lib_variant 201606L <variant>
|
||||
__cpp_lib_void_t 201411L <type_traits>
|
||||
|
||||
@@ -226,6 +260,7 @@ __cpp_lib_void_t 201411L <type_traits>
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
# undef __cpp_lib_array_constexpr
|
||||
# define __cpp_lib_array_constexpr 201811L
|
||||
// # define __cpp_lib_assume_aligned 201811L
|
||||
# if !defined(_LIBCPP_HAS_NO_THREADS)
|
||||
# define __cpp_lib_atomic_flag_test 201907L
|
||||
# endif
|
||||
@@ -247,36 +282,83 @@ __cpp_lib_void_t 201411L <type_traits>
|
||||
# if !defined(_LIBCPP_HAS_NO_THREADS)
|
||||
# define __cpp_lib_atomic_wait 201907L
|
||||
# endif
|
||||
// # define __cpp_lib_bind_front 201811L
|
||||
# if !defined(_LIBCPP_HAS_NO_THREADS)
|
||||
# define __cpp_lib_barrier 201907L
|
||||
# endif
|
||||
// # define __cpp_lib_bind_front 201907L
|
||||
// # define __cpp_lib_bit_cast 201806L
|
||||
// # define __cpp_lib_bitops 201907L
|
||||
# define __cpp_lib_bounded_array_traits 201902L
|
||||
# if !defined(_LIBCPP_NO_HAS_CHAR8_T)
|
||||
# define __cpp_lib_char8_t 201811L
|
||||
# endif
|
||||
// # define __cpp_lib_concepts 201806L
|
||||
// # define __cpp_lib_concepts 202002L
|
||||
// # define __cpp_lib_constexpr_algorithms 201806L
|
||||
// # define __cpp_lib_constexpr_complex 201711L
|
||||
# define __cpp_lib_constexpr_dynamic_alloc 201907L
|
||||
// # define __cpp_lib_constexpr_misc 201811L
|
||||
# define __cpp_lib_constexpr_functional 201907L
|
||||
// # define __cpp_lib_constexpr_iterator 201811L
|
||||
// # define __cpp_lib_constexpr_memory 201811L
|
||||
# define __cpp_lib_constexpr_numeric 201911L
|
||||
// # define __cpp_lib_constexpr_swap_algorithms 201806L
|
||||
// # define __cpp_lib_constexpr_string 201907L
|
||||
// # define __cpp_lib_constexpr_string_view 201811L
|
||||
// # define __cpp_lib_constexpr_tuple 201811L
|
||||
# define __cpp_lib_constexpr_utility 201811L
|
||||
// # define __cpp_lib_constexpr_vector 201907L
|
||||
// # define __cpp_lib_coroutine 201902L
|
||||
# if _LIBCPP_STD_VER > 17 && defined(__cpp_impl_destroying_delete) && __cpp_impl_destroying_delete >= 201806L
|
||||
# define __cpp_lib_destroying_delete 201806L
|
||||
# endif
|
||||
# define __cpp_lib_endian 201907L
|
||||
# define __cpp_lib_erase_if 202002L
|
||||
# undef __cpp_lib_execution
|
||||
// # define __cpp_lib_execution 201902L
|
||||
# define __cpp_lib_generic_unordered_lookup 201811L
|
||||
# define __cpp_lib_int_pow2 202002L
|
||||
// # define __cpp_lib_integer_comparison_functions 202002L
|
||||
# define __cpp_lib_interpolate 201902L
|
||||
# if !defined(_LIBCPP_HAS_NO_BUILTIN_IS_CONSTANT_EVALUATED)
|
||||
# define __cpp_lib_is_constant_evaluated 201811L
|
||||
# endif
|
||||
// # define __cpp_lib_is_layout_compatible 201907L
|
||||
# define __cpp_lib_is_nothrow_convertible 201806L
|
||||
// # define __cpp_lib_is_pointer_interconvertible 201907L
|
||||
# if !defined(_LIBCPP_HAS_NO_THREADS)
|
||||
// # define __cpp_lib_jthread 201911L
|
||||
# endif
|
||||
# if !defined(_LIBCPP_HAS_NO_THREADS)
|
||||
# define __cpp_lib_latch 201907L
|
||||
# endif
|
||||
# define __cpp_lib_list_remove_return_type 201806L
|
||||
# if defined(__cpp_concepts) && __cpp_concepts >= 201811L
|
||||
# define __cpp_lib_math_constants 201907L
|
||||
# endif
|
||||
// # define __cpp_lib_polymorphic_allocator 201902L
|
||||
// # define __cpp_lib_ranges 201811L
|
||||
# define __cpp_lib_remove_cvref 201711L
|
||||
# if !defined(_LIBCPP_HAS_NO_THREADS)
|
||||
# define __cpp_lib_semaphore 201907L
|
||||
# endif
|
||||
# define __cpp_lib_shift 201806L
|
||||
// # define __cpp_lib_smart_ptr_for_overwrite 202002L
|
||||
// # define __cpp_lib_source_location 201907L
|
||||
# define __cpp_lib_span 202002L
|
||||
// # define __cpp_lib_three_way_comparison 201711L
|
||||
# define __cpp_lib_ssize 201902L
|
||||
# define __cpp_lib_starts_ends_with 201711L
|
||||
# undef __cpp_lib_string_view
|
||||
# define __cpp_lib_string_view 201803L
|
||||
// # define __cpp_lib_syncbuf 201803L
|
||||
// # define __cpp_lib_three_way_comparison 201907L
|
||||
# define __cpp_lib_to_address 201711L
|
||||
# define __cpp_lib_to_array 201907L
|
||||
# define __cpp_lib_unwrap_ref 201811L
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_STD_VER > 20
|
||||
# define __cpp_lib_is_scoped_enum 202011L
|
||||
// # define __cpp_lib_stacktrace 202011L
|
||||
// # define __cpp_lib_stdatomic_h 202011L
|
||||
# define __cpp_lib_string_contains 202011L
|
||||
#endif
|
||||
|
||||
#endif // _LIBCPP_VERSIONH
|
||||
|
||||
@@ -19,6 +19,12 @@
|
||||
#include <linux/futex.h>
|
||||
#include <sys/syscall.h>
|
||||
|
||||
// libc++ uses SYS_futex as a universal syscall name. However, on 32 bit architectures
|
||||
// with a 64 bit time_t, we need to specify SYS_futex_time64.
|
||||
#if !defined(SYS_futex) && defined(SYS_futex_time64)
|
||||
# define SYS_futex SYS_futex_time64
|
||||
#endif
|
||||
|
||||
#else // <- Add other operating systems here
|
||||
|
||||
// Baseline needs no new headers
|
||||
|
||||
@@ -33,6 +33,10 @@
|
||||
# endif
|
||||
#endif // defined(_LIBCPP_WIN32API)
|
||||
|
||||
#if __has_include(<mach/mach_time.h>)
|
||||
# include <mach/mach_time.h>
|
||||
#endif
|
||||
|
||||
#if defined(__ELF__) && defined(_LIBCPP_LINK_RT_LIB)
|
||||
# pragma comment(lib, "rt")
|
||||
#endif
|
||||
@@ -121,6 +125,59 @@ system_clock::from_time_t(time_t t) _NOEXCEPT
|
||||
|
||||
#if defined(__APPLE__)
|
||||
|
||||
// TODO(ldionne):
|
||||
// This old implementation of steady_clock is retained until Chrome drops supports
|
||||
// for macOS < 10.12. The issue is that they link libc++ statically into their
|
||||
// application, which means that libc++ must support being built for such deployment
|
||||
// targets. See https://llvm.org/D74489 for details.
|
||||
#if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200) || \
|
||||
(defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 100000) || \
|
||||
(defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 100000) || \
|
||||
(defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 30000)
|
||||
# define _LIBCPP_USE_OLD_MACH_ABSOLUTE_TIME
|
||||
#endif
|
||||
|
||||
#if defined(_LIBCPP_USE_OLD_MACH_ABSOLUTE_TIME)
|
||||
|
||||
// mach_absolute_time() * MachInfo.numer / MachInfo.denom is the number of
|
||||
// nanoseconds since the computer booted up. MachInfo.numer and MachInfo.denom
|
||||
// are run time constants supplied by the OS. This clock has no relationship
|
||||
// to the Gregorian calendar. It's main use is as a high resolution timer.
|
||||
|
||||
// MachInfo.numer / MachInfo.denom is often 1 on the latest equipment. Specialize
|
||||
// for that case as an optimization.
|
||||
|
||||
static steady_clock::rep steady_simplified() {
|
||||
return static_cast<steady_clock::rep>(mach_absolute_time());
|
||||
}
|
||||
static double compute_steady_factor() {
|
||||
mach_timebase_info_data_t MachInfo;
|
||||
mach_timebase_info(&MachInfo);
|
||||
return static_cast<double>(MachInfo.numer) / MachInfo.denom;
|
||||
}
|
||||
|
||||
static steady_clock::rep steady_full() {
|
||||
static const double factor = compute_steady_factor();
|
||||
return static_cast<steady_clock::rep>(mach_absolute_time() * factor);
|
||||
}
|
||||
|
||||
typedef steady_clock::rep (*FP)();
|
||||
|
||||
static FP init_steady_clock() {
|
||||
mach_timebase_info_data_t MachInfo;
|
||||
mach_timebase_info(&MachInfo);
|
||||
if (MachInfo.numer == MachInfo.denom)
|
||||
return &steady_simplified;
|
||||
return &steady_full;
|
||||
}
|
||||
|
||||
static steady_clock::time_point __libcpp_steady_clock_now() {
|
||||
static FP fp = init_steady_clock();
|
||||
return steady_clock::time_point(steady_clock::duration(fp()));
|
||||
}
|
||||
|
||||
#else // vvvvv default behavior for Apple platforms vvvvv
|
||||
|
||||
// On Apple platforms, only CLOCK_UPTIME_RAW, CLOCK_MONOTONIC_RAW or
|
||||
// mach_absolute_time are able to time functions in the nanosecond range.
|
||||
// Furthermore, only CLOCK_MONOTONIC_RAW is truly monotonic, because it
|
||||
@@ -133,6 +190,8 @@ static steady_clock::time_point __libcpp_steady_clock_now() {
|
||||
return steady_clock::time_point(seconds(tp.tv_sec) + nanoseconds(tp.tv_nsec));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#elif defined(_LIBCPP_WIN32API)
|
||||
|
||||
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms644905(v=vs.85).aspx says:
|
||||
@@ -153,7 +212,10 @@ static steady_clock::time_point __libcpp_steady_clock_now() {
|
||||
|
||||
LARGE_INTEGER counter;
|
||||
(void) QueryPerformanceCounter(&counter);
|
||||
return steady_clock::time_point(steady_clock::duration(counter.QuadPart * nano::den / freq.QuadPart));
|
||||
auto seconds = counter.QuadPart / freq.QuadPart;
|
||||
auto fractions = counter.QuadPart % freq.QuadPart;
|
||||
auto dur = seconds * nano::den + fractions * nano::den / freq.QuadPart;
|
||||
return steady_clock::time_point(steady_clock::duration(dur));
|
||||
}
|
||||
|
||||
#elif defined(CLOCK_MONOTONIC)
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "__config"
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#define NOMINMAX
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <dirent.h>
|
||||
@@ -72,16 +73,20 @@ static pair<string_view, file_type> posix_readdir(DIR* dir_stream,
|
||||
}
|
||||
}
|
||||
#else
|
||||
// defined(_LIBCPP_WIN32API)
|
||||
|
||||
static file_type get_file_type(const WIN32_FIND_DATA& data) {
|
||||
//auto attrs = data.dwFileAttributes;
|
||||
// FIXME(EricWF)
|
||||
return file_type::unknown;
|
||||
static file_type get_file_type(const WIN32_FIND_DATAW& data) {
|
||||
if (data.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT &&
|
||||
data.dwReserved0 == IO_REPARSE_TAG_SYMLINK)
|
||||
return file_type::symlink;
|
||||
if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||
return file_type::directory;
|
||||
return file_type::regular;
|
||||
}
|
||||
static uintmax_t get_file_size(const WIN32_FIND_DATA& data) {
|
||||
return (data.nFileSizeHigh * (MAXDWORD + 1)) + data.nFileSizeLow;
|
||||
static uintmax_t get_file_size(const WIN32_FIND_DATAW& data) {
|
||||
return (static_cast<uint64_t>(data.nFileSizeHigh) << 32) + data.nFileSizeLow;
|
||||
}
|
||||
static file_time_type get_write_time(const WIN32_FIND_DATA& data) {
|
||||
static file_time_type get_write_time(const WIN32_FIND_DATAW& data) {
|
||||
ULARGE_INTEGER tmp;
|
||||
const FILETIME& time = data.ftLastWriteTime;
|
||||
tmp.u.LowPart = time.dwLowDateTime;
|
||||
@@ -110,15 +115,21 @@ public:
|
||||
|
||||
__dir_stream(const path& root, directory_options opts, error_code& ec)
|
||||
: __stream_(INVALID_HANDLE_VALUE), __root_(root) {
|
||||
__stream_ = ::FindFirstFile(root.c_str(), &__data_);
|
||||
if (root.native().empty()) {
|
||||
ec = make_error_code(errc::no_such_file_or_directory);
|
||||
return;
|
||||
}
|
||||
__stream_ = ::FindFirstFileW((root / "*").c_str(), &__data_);
|
||||
if (__stream_ == INVALID_HANDLE_VALUE) {
|
||||
ec = error_code(::GetLastError(), generic_category());
|
||||
ec = detail::make_windows_error(GetLastError());
|
||||
const bool ignore_permission_denied =
|
||||
bool(opts & directory_options::skip_permission_denied);
|
||||
if (ignore_permission_denied && ec.value() == ERROR_ACCESS_DENIED)
|
||||
ec.clear();
|
||||
return;
|
||||
}
|
||||
if (!assign())
|
||||
advance(ec);
|
||||
}
|
||||
|
||||
~__dir_stream() noexcept {
|
||||
@@ -130,35 +141,39 @@ public:
|
||||
bool good() const noexcept { return __stream_ != INVALID_HANDLE_VALUE; }
|
||||
|
||||
bool advance(error_code& ec) {
|
||||
while (::FindNextFile(__stream_, &__data_)) {
|
||||
if (!strcmp(__data_.cFileName, ".") || strcmp(__data_.cFileName, ".."))
|
||||
continue;
|
||||
// FIXME: Cache more of this
|
||||
//directory_entry::__cached_data cdata;
|
||||
//cdata.__type_ = get_file_type(__data_);
|
||||
//cdata.__size_ = get_file_size(__data_);
|
||||
//cdata.__write_time_ = get_write_time(__data_);
|
||||
__entry_.__assign_iter_entry(
|
||||
__root_ / __data_.cFileName,
|
||||
directory_entry::__create_iter_result(detail::get_file_type(__data)));
|
||||
return true;
|
||||
while (::FindNextFileW(__stream_, &__data_)) {
|
||||
if (assign())
|
||||
return true;
|
||||
}
|
||||
ec = error_code(::GetLastError(), generic_category());
|
||||
close();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool assign() {
|
||||
if (!wcscmp(__data_.cFileName, L".") || !wcscmp(__data_.cFileName, L".."))
|
||||
return false;
|
||||
// FIXME: Cache more of this
|
||||
//directory_entry::__cached_data cdata;
|
||||
//cdata.__type_ = get_file_type(__data_);
|
||||
//cdata.__size_ = get_file_size(__data_);
|
||||
//cdata.__write_time_ = get_write_time(__data_);
|
||||
__entry_.__assign_iter_entry(
|
||||
__root_ / __data_.cFileName,
|
||||
directory_entry::__create_iter_result(detail::get_file_type(__data_)));
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
error_code close() noexcept {
|
||||
error_code ec;
|
||||
if (!::FindClose(__stream_))
|
||||
ec = error_code(::GetLastError(), generic_category());
|
||||
ec = detail::make_windows_error(GetLastError());
|
||||
__stream_ = INVALID_HANDLE_VALUE;
|
||||
return ec;
|
||||
}
|
||||
|
||||
HANDLE __stream_{INVALID_HANDLE_VALUE};
|
||||
WIN32_FIND_DATA __data_;
|
||||
WIN32_FIND_DATAW __data_;
|
||||
|
||||
public:
|
||||
path __root_;
|
||||
|
||||
@@ -17,11 +17,13 @@
|
||||
#include "cstdlib"
|
||||
#include "ctime"
|
||||
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/statvfs.h>
|
||||
#include <sys/time.h> // for ::utimes as used in __last_write_time
|
||||
#include <fcntl.h> /* values for fchmodat */
|
||||
#if !defined(_LIBCPP_WIN32API)
|
||||
# include <unistd.h>
|
||||
# include <sys/stat.h>
|
||||
# include <sys/statvfs.h>
|
||||
# include <sys/time.h> // for ::utimes as used in __last_write_time
|
||||
# include <fcntl.h> /* values for fchmodat */
|
||||
#endif
|
||||
|
||||
#include "../include/apple_availability.h"
|
||||
|
||||
@@ -38,9 +40,21 @@
|
||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||
#endif
|
||||
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
#define PS(x) (L##x)
|
||||
#else
|
||||
#define PS(x) (x)
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM
|
||||
|
||||
namespace detail {
|
||||
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
// Non anonymous, to allow access from two translation units.
|
||||
errc __win_err_to_errc(int err);
|
||||
#endif
|
||||
|
||||
namespace {
|
||||
|
||||
static string format_string_imp(const char* msg, ...) {
|
||||
@@ -94,8 +108,8 @@ static string format_string_imp(const char* msg, ...) {
|
||||
return result;
|
||||
}
|
||||
|
||||
const char* unwrap(string const& s) { return s.c_str(); }
|
||||
const char* unwrap(path const& p) { return p.native().c_str(); }
|
||||
const path::value_type* unwrap(path::string_type const& s) { return s.c_str(); }
|
||||
const path::value_type* unwrap(path const& p) { return p.native().c_str(); }
|
||||
template <class Arg>
|
||||
Arg const& unwrap(Arg const& a) {
|
||||
static_assert(!is_class<Arg>::value, "cannot pass class here");
|
||||
@@ -112,6 +126,12 @@ error_code capture_errno() {
|
||||
return error_code(errno, generic_category());
|
||||
}
|
||||
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
error_code make_windows_error(int err) {
|
||||
return make_error_code(__win_err_to_errc(err));
|
||||
}
|
||||
#endif
|
||||
|
||||
template <class T>
|
||||
T error_value();
|
||||
template <>
|
||||
@@ -120,6 +140,12 @@ template <>
|
||||
bool error_value<bool>() {
|
||||
return false;
|
||||
}
|
||||
#if __SIZEOF_SIZE_T__ != __SIZEOF_LONG_LONG__
|
||||
template <>
|
||||
size_t error_value<size_t>() {
|
||||
return size_t(-1);
|
||||
}
|
||||
#endif
|
||||
template <>
|
||||
uintmax_t error_value<uintmax_t>() {
|
||||
return uintmax_t(-1);
|
||||
|
||||
@@ -17,9 +17,15 @@
|
||||
|
||||
#include "filesystem_common.h"
|
||||
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/statvfs.h>
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# define NOMINMAX
|
||||
# include <windows.h>
|
||||
#else
|
||||
# include <unistd.h>
|
||||
# include <sys/stat.h>
|
||||
# include <sys/statvfs.h>
|
||||
#endif
|
||||
#include <time.h>
|
||||
#include <fcntl.h> /* values for fchmodat */
|
||||
|
||||
@@ -45,6 +51,17 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM
|
||||
|
||||
namespace {
|
||||
|
||||
bool isSeparator(path::value_type C) {
|
||||
if (C == '/')
|
||||
return true;
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
if (C == '\\')
|
||||
return true;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
namespace parser {
|
||||
|
||||
using string_view_t = path::__string_view;
|
||||
@@ -171,11 +188,14 @@ public:
|
||||
switch (State) {
|
||||
case PS_BeforeBegin:
|
||||
case PS_AtEnd:
|
||||
return "";
|
||||
return PS("");
|
||||
case PS_InRootDir:
|
||||
return "/";
|
||||
if (RawEntry[0] == '\\')
|
||||
return PS("\\");
|
||||
else
|
||||
return PS("/");
|
||||
case PS_InTrailingSep:
|
||||
return "";
|
||||
return PS("");
|
||||
case PS_InRootName:
|
||||
case PS_InFilenames:
|
||||
return RawEntry;
|
||||
@@ -262,29 +282,29 @@ private:
|
||||
}
|
||||
|
||||
PosPtr consumeSeparator(PosPtr P, PosPtr End) const noexcept {
|
||||
if (P == End || *P != '/')
|
||||
if (P == End || !isSeparator(*P))
|
||||
return nullptr;
|
||||
const int Inc = P < End ? 1 : -1;
|
||||
P += Inc;
|
||||
while (P != End && *P == '/')
|
||||
while (P != End && isSeparator(*P))
|
||||
P += Inc;
|
||||
return P;
|
||||
}
|
||||
|
||||
PosPtr consumeName(PosPtr P, PosPtr End) const noexcept {
|
||||
if (P == End || *P == '/')
|
||||
if (P == End || isSeparator(*P))
|
||||
return nullptr;
|
||||
const int Inc = P < End ? 1 : -1;
|
||||
P += Inc;
|
||||
while (P != End && *P != '/')
|
||||
while (P != End && !isSeparator(*P))
|
||||
P += Inc;
|
||||
return P;
|
||||
}
|
||||
};
|
||||
|
||||
string_view_pair separate_filename(string_view_t const& s) {
|
||||
if (s == "." || s == ".." || s.empty())
|
||||
return string_view_pair{s, ""};
|
||||
if (s == PS(".") || s == PS("..") || s.empty())
|
||||
return string_view_pair{s, PS("")};
|
||||
auto pos = s.find_last_of('.');
|
||||
if (pos == string_view_t::npos || pos == 0)
|
||||
return string_view_pair{s, string_view_t{}};
|
||||
@@ -300,6 +320,73 @@ string_view_t createView(PosPtr S, PosPtr E) noexcept {
|
||||
|
||||
// POSIX HELPERS
|
||||
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
namespace detail {
|
||||
|
||||
errc __win_err_to_errc(int err) {
|
||||
constexpr struct {
|
||||
DWORD win;
|
||||
errc errc;
|
||||
} win_error_mapping[] = {
|
||||
{ERROR_ACCESS_DENIED, errc::permission_denied},
|
||||
{ERROR_ALREADY_EXISTS, errc::file_exists},
|
||||
{ERROR_BAD_NETPATH, errc::no_such_file_or_directory},
|
||||
{ERROR_BAD_UNIT, errc::no_such_device},
|
||||
{ERROR_BROKEN_PIPE, errc::broken_pipe},
|
||||
{ERROR_BUFFER_OVERFLOW, errc::filename_too_long},
|
||||
{ERROR_BUSY, errc::device_or_resource_busy},
|
||||
{ERROR_BUSY_DRIVE, errc::device_or_resource_busy},
|
||||
{ERROR_CANNOT_MAKE, errc::permission_denied},
|
||||
{ERROR_CANTOPEN, errc::io_error},
|
||||
{ERROR_CANTREAD, errc::io_error},
|
||||
{ERROR_CANTWRITE, errc::io_error},
|
||||
{ERROR_CURRENT_DIRECTORY, errc::permission_denied},
|
||||
{ERROR_DEV_NOT_EXIST, errc::no_such_device},
|
||||
{ERROR_DEVICE_IN_USE, errc::device_or_resource_busy},
|
||||
{ERROR_DIR_NOT_EMPTY, errc::directory_not_empty},
|
||||
{ERROR_DIRECTORY, errc::invalid_argument},
|
||||
{ERROR_DISK_FULL, errc::no_space_on_device},
|
||||
{ERROR_FILE_EXISTS, errc::file_exists},
|
||||
{ERROR_FILE_NOT_FOUND, errc::no_such_file_or_directory},
|
||||
{ERROR_HANDLE_DISK_FULL, errc::no_space_on_device},
|
||||
{ERROR_INVALID_ACCESS, errc::permission_denied},
|
||||
{ERROR_INVALID_DRIVE, errc::no_such_device},
|
||||
{ERROR_INVALID_FUNCTION, errc::function_not_supported},
|
||||
{ERROR_INVALID_HANDLE, errc::invalid_argument},
|
||||
{ERROR_INVALID_NAME, errc::no_such_file_or_directory},
|
||||
{ERROR_INVALID_PARAMETER, errc::invalid_argument},
|
||||
{ERROR_LOCK_VIOLATION, errc::no_lock_available},
|
||||
{ERROR_LOCKED, errc::no_lock_available},
|
||||
{ERROR_NEGATIVE_SEEK, errc::invalid_argument},
|
||||
{ERROR_NOACCESS, errc::permission_denied},
|
||||
{ERROR_NOT_ENOUGH_MEMORY, errc::not_enough_memory},
|
||||
{ERROR_NOT_READY, errc::resource_unavailable_try_again},
|
||||
{ERROR_NOT_SAME_DEVICE, errc::cross_device_link},
|
||||
{ERROR_NOT_SUPPORTED, errc::not_supported},
|
||||
{ERROR_OPEN_FAILED, errc::io_error},
|
||||
{ERROR_OPEN_FILES, errc::device_or_resource_busy},
|
||||
{ERROR_OPERATION_ABORTED, errc::operation_canceled},
|
||||
{ERROR_OUTOFMEMORY, errc::not_enough_memory},
|
||||
{ERROR_PATH_NOT_FOUND, errc::no_such_file_or_directory},
|
||||
{ERROR_READ_FAULT, errc::io_error},
|
||||
{ERROR_REPARSE_TAG_INVALID, errc::invalid_argument},
|
||||
{ERROR_RETRY, errc::resource_unavailable_try_again},
|
||||
{ERROR_SEEK, errc::io_error},
|
||||
{ERROR_SHARING_VIOLATION, errc::permission_denied},
|
||||
{ERROR_TOO_MANY_OPEN_FILES, errc::too_many_files_open},
|
||||
{ERROR_WRITE_FAULT, errc::io_error},
|
||||
{ERROR_WRITE_PROTECT, errc::permission_denied},
|
||||
};
|
||||
|
||||
for (const auto &pair : win_error_mapping)
|
||||
if (pair.win == static_cast<DWORD>(err))
|
||||
return pair.errc;
|
||||
return errc::invalid_argument;
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
#endif
|
||||
|
||||
namespace detail {
|
||||
namespace {
|
||||
|
||||
@@ -495,19 +582,25 @@ _FilesystemClock::time_point _FilesystemClock::now() noexcept {
|
||||
|
||||
filesystem_error::~filesystem_error() {}
|
||||
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
#define PS_FMT "%ls"
|
||||
#else
|
||||
#define PS_FMT "%s"
|
||||
#endif
|
||||
|
||||
void filesystem_error::__create_what(int __num_paths) {
|
||||
const char* derived_what = system_error::what();
|
||||
__storage_->__what_ = [&]() -> string {
|
||||
const char* p1 = path1().native().empty() ? "\"\"" : path1().c_str();
|
||||
const char* p2 = path2().native().empty() ? "\"\"" : path2().c_str();
|
||||
const path::value_type* p1 = path1().native().empty() ? PS("\"\"") : path1().c_str();
|
||||
const path::value_type* p2 = path2().native().empty() ? PS("\"\"") : path2().c_str();
|
||||
switch (__num_paths) {
|
||||
default:
|
||||
return detail::format_string("filesystem error: %s", derived_what);
|
||||
case 1:
|
||||
return detail::format_string("filesystem error: %s [%s]", derived_what,
|
||||
return detail::format_string("filesystem error: %s [" PS_FMT "]", derived_what,
|
||||
p1);
|
||||
case 2:
|
||||
return detail::format_string("filesystem error: %s [%s] [%s]",
|
||||
return detail::format_string("filesystem error: %s [" PS_FMT "] [" PS_FMT "]",
|
||||
derived_what, p1, p2);
|
||||
}
|
||||
}();
|
||||
@@ -541,7 +634,11 @@ path __canonical(path const& orig_p, error_code* ec) {
|
||||
return err.report(capture_errno());
|
||||
return {hold.get()};
|
||||
#else
|
||||
char buff[PATH_MAX + 1];
|
||||
#if defined(__MVS__) && !defined(PATH_MAX)
|
||||
char buff[ _XOPEN_PATH_MAX + 1 ];
|
||||
#else
|
||||
char buff[PATH_MAX + 1];
|
||||
#endif
|
||||
char* ret;
|
||||
if ((ret = ::realpath(p.c_str(), buff)) == nullptr)
|
||||
return err.report(capture_errno());
|
||||
@@ -1222,10 +1319,10 @@ path __temp_directory_path(error_code* ec) {
|
||||
error_code m_ec;
|
||||
file_status st = detail::posix_stat(p, &m_ec);
|
||||
if (!status_known(st))
|
||||
return err.report(m_ec, "cannot access path \"%s\"", p);
|
||||
return err.report(m_ec, "cannot access path \"" PS_FMT "\"", p);
|
||||
|
||||
if (!exists(st) || !is_directory(st))
|
||||
return err.report(errc::not_a_directory, "path \"%s\" is not a directory",
|
||||
return err.report(errc::not_a_directory, "path \"" PS_FMT "\" is not a directory",
|
||||
p);
|
||||
|
||||
return p;
|
||||
@@ -1281,7 +1378,7 @@ path& path::replace_extension(path const& replacement) {
|
||||
}
|
||||
if (!replacement.empty()) {
|
||||
if (replacement.native()[0] != '.') {
|
||||
__pn_ += ".";
|
||||
__pn_ += PS(".");
|
||||
}
|
||||
__pn_.append(replacement.__pn_);
|
||||
}
|
||||
@@ -1311,7 +1408,7 @@ string_view_t path::__root_path_raw() const {
|
||||
auto PP = PathParser::CreateBegin(__pn_);
|
||||
if (PP.State == PathParser::PS_InRootName) {
|
||||
auto NextCh = PP.peek();
|
||||
if (NextCh && *NextCh == '/') {
|
||||
if (NextCh && isSeparator(*NextCh)) {
|
||||
++PP;
|
||||
return createView(__pn_.data(), &PP.RawEntry.back());
|
||||
}
|
||||
@@ -1403,12 +1500,16 @@ enum PathPartKind : unsigned char {
|
||||
static PathPartKind ClassifyPathPart(string_view_t Part) {
|
||||
if (Part.empty())
|
||||
return PK_TrailingSep;
|
||||
if (Part == ".")
|
||||
if (Part == PS("."))
|
||||
return PK_Dot;
|
||||
if (Part == "..")
|
||||
if (Part == PS(".."))
|
||||
return PK_DotDot;
|
||||
if (Part == "/")
|
||||
if (Part == PS("/"))
|
||||
return PK_RootSep;
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
if (Part == PS("\\"))
|
||||
return PK_RootSep;
|
||||
#endif
|
||||
return PK_Filename;
|
||||
}
|
||||
|
||||
@@ -1456,7 +1557,7 @@ path path::lexically_normal() const {
|
||||
NewPathSize -= Parts.back().first.size();
|
||||
Parts.pop_back();
|
||||
} else if (LastKind != PK_RootSep)
|
||||
AddPart(PK_DotDot, "..");
|
||||
AddPart(PK_DotDot, PS(".."));
|
||||
MaybeNeedTrailingSep = LastKind == PK_Filename;
|
||||
break;
|
||||
}
|
||||
@@ -1471,7 +1572,7 @@ path path::lexically_normal() const {
|
||||
}
|
||||
// [fs.path.generic]p6.8: If the path is empty, add a dot.
|
||||
if (Parts.empty())
|
||||
return ".";
|
||||
return PS(".");
|
||||
|
||||
// [fs.path.generic]p6.7: If the last filename is dot-dot, remove any
|
||||
// trailing directory-separator.
|
||||
@@ -1483,7 +1584,7 @@ path path::lexically_normal() const {
|
||||
Result /= PK.first;
|
||||
|
||||
if (NeedTrailingSep)
|
||||
Result /= "";
|
||||
Result /= PS("");
|
||||
|
||||
return Result;
|
||||
}
|
||||
@@ -1492,9 +1593,9 @@ static int DetermineLexicalElementCount(PathParser PP) {
|
||||
int Count = 0;
|
||||
for (; PP; ++PP) {
|
||||
auto Elem = *PP;
|
||||
if (Elem == "..")
|
||||
if (Elem == PS(".."))
|
||||
--Count;
|
||||
else if (Elem != "." && Elem != "")
|
||||
else if (Elem != PS(".") && Elem != PS(""))
|
||||
++Count;
|
||||
}
|
||||
return Count;
|
||||
@@ -1541,15 +1642,15 @@ path path::lexically_relative(const path& base) const {
|
||||
return {};
|
||||
|
||||
// if n == 0 and (a == end() || a->empty()), returns path("."); otherwise
|
||||
if (ElemCount == 0 && (PP.atEnd() || *PP == ""))
|
||||
return ".";
|
||||
if (ElemCount == 0 && (PP.atEnd() || *PP == PS("")))
|
||||
return PS(".");
|
||||
|
||||
// return a path constructed with 'n' dot-dot elements, followed by the the
|
||||
// elements of '*this' after the mismatch.
|
||||
path Result;
|
||||
// FIXME: Reserve enough room in Result that it won't have to re-allocate.
|
||||
while (ElemCount--)
|
||||
Result /= "..";
|
||||
Result /= PS("..");
|
||||
for (; PP; ++PP)
|
||||
Result /= *PP;
|
||||
return Result;
|
||||
@@ -1562,7 +1663,7 @@ static int CompareRootName(PathParser *LHS, PathParser *RHS) {
|
||||
return 0;
|
||||
|
||||
auto GetRootName = [](PathParser *Parser) -> string_view_t {
|
||||
return Parser->inRootName() ? **Parser : "";
|
||||
return Parser->inRootName() ? **Parser : PS("");
|
||||
};
|
||||
int res = GetRootName(LHS).compare(GetRootName(RHS));
|
||||
ConsumeRootName(LHS);
|
||||
@@ -1671,6 +1772,36 @@ path::iterator& path::iterator::__decrement() {
|
||||
return *this;
|
||||
}
|
||||
|
||||
#if defined(_LIBCPP_WIN32API)
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// Windows path conversions
|
||||
size_t __wide_to_char(const wstring &str, char *out, size_t outlen) {
|
||||
if (str.empty())
|
||||
return 0;
|
||||
ErrorHandler<size_t> err("__wide_to_char", nullptr);
|
||||
UINT codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;
|
||||
BOOL used_default = FALSE;
|
||||
int ret = WideCharToMultiByte(codepage, 0, str.data(), str.size(), out,
|
||||
outlen, nullptr, &used_default);
|
||||
if (ret <= 0 || used_default)
|
||||
return err.report(errc::illegal_byte_sequence);
|
||||
return ret;
|
||||
}
|
||||
|
||||
size_t __char_to_wide(const string &str, wchar_t *out, size_t outlen) {
|
||||
if (str.empty())
|
||||
return 0;
|
||||
ErrorHandler<size_t> err("__char_to_wide", nullptr);
|
||||
UINT codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;
|
||||
int ret = MultiByteToWideChar(codepage, MB_ERR_INVALID_CHARS, str.data(),
|
||||
str.size(), out, outlen);
|
||||
if (ret <= 0)
|
||||
return err.report(errc::illegal_byte_sequence);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// directory entry definitions
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
#include "cwctype"
|
||||
#include "__sso_allocator"
|
||||
#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
|
||||
#include "support/win32/locale_win32.h"
|
||||
#include "__support/win32/locale_win32.h"
|
||||
#elif !defined(__BIONIC__) && !defined(__NuttX__)
|
||||
#include <langinfo.h>
|
||||
#endif
|
||||
@@ -6334,8 +6334,8 @@ template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS messages_byname<wchar_t>
|
||||
|
||||
template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<char, char, mbstate_t>;
|
||||
template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<wchar_t, char, mbstate_t>;
|
||||
template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS _LIBCPP_DEPRECATED_IN_CXX20 codecvt_byname<char16_t, char, mbstate_t>;
|
||||
template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS _LIBCPP_DEPRECATED_IN_CXX20 codecvt_byname<char32_t, char, mbstate_t>;
|
||||
template class _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<char16_t, char, mbstate_t>;
|
||||
template class _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<char32_t, char, mbstate_t>;
|
||||
#ifndef _LIBCPP_NO_HAS_CHAR8_T
|
||||
template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<char16_t, char8_t, mbstate_t>;
|
||||
template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<char32_t, char8_t, mbstate_t>;
|
||||
|
||||
@@ -130,8 +130,7 @@ _LIBCPP_WEAK
|
||||
void
|
||||
operator delete(void* ptr) _NOEXCEPT
|
||||
{
|
||||
if (ptr)
|
||||
::free(ptr);
|
||||
::free(ptr);
|
||||
}
|
||||
|
||||
_LIBCPP_WEAK
|
||||
@@ -252,9 +251,7 @@ _LIBCPP_WEAK
|
||||
void
|
||||
operator delete(void* ptr, std::align_val_t) _NOEXCEPT
|
||||
{
|
||||
if (ptr) {
|
||||
std::__libcpp_aligned_free(ptr);
|
||||
}
|
||||
std::__libcpp_aligned_free(ptr);
|
||||
}
|
||||
|
||||
_LIBCPP_WEAK
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#define _CRT_RAND_S
|
||||
#endif // defined(_LIBCPP_USING_WIN32_RANDOM)
|
||||
|
||||
#include "limits"
|
||||
#include "random"
|
||||
#include "system_error"
|
||||
|
||||
@@ -29,6 +30,10 @@
|
||||
#elif defined(_LIBCPP_USING_DEV_RANDOM)
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#if __has_include(<sys/ioctl.h>) && __has_include(<linux/random.h>)
|
||||
#include <sys/ioctl.h>
|
||||
#include <linux/random.h>
|
||||
#endif
|
||||
#elif defined(_LIBCPP_USING_NACL_RANDOM)
|
||||
#include <nacl/nacl_random.h>
|
||||
#endif
|
||||
@@ -172,7 +177,23 @@ random_device::operator()()
|
||||
double
|
||||
random_device::entropy() const _NOEXCEPT
|
||||
{
|
||||
#if defined(_LIBCPP_USING_DEV_RANDOM) && defined(RNDGETENTCNT)
|
||||
int ent;
|
||||
if (::ioctl(__f_, RNDGETENTCNT, &ent) < 0)
|
||||
return 0;
|
||||
|
||||
if (ent < 0)
|
||||
return 0;
|
||||
|
||||
if (ent > std::numeric_limits<result_type>::digits)
|
||||
return std::numeric_limits<result_type>::digits;
|
||||
|
||||
return ent;
|
||||
#elif defined(__OpenBSD__)
|
||||
return std::numeric_limits<result_type>::digits;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
#ifdef __sun__
|
||||
|
||||
#include "support/solaris/xlocale.h"
|
||||
#include "__support/solaris/xlocale.h"
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/localedef.h>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// -*- C++ -*-
|
||||
//===-------------------- support/win32/locale_win32.cpp ------------------===//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// -*- C++ -*-
|
||||
//===----------------------- support/win32/support.h ----------------------===//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// -*- C++ -*-
|
||||
//===-------------------- support/win32/thread_win32.cpp ------------------===//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
|
||||
Reference in New Issue
Block a user