mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 05:44:20 +00:00
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:
parent
b706b9bce7
commit
659f712ae8
88 changed files with 9835 additions and 6658 deletions
|
|
@ -160,6 +160,9 @@ __DEVICE__ double scalbln(double, long);
|
|||
__DEVICE__ float scalbln(float, long);
|
||||
__DEVICE__ double scalbn(double, int);
|
||||
__DEVICE__ float scalbn(float, int);
|
||||
#ifdef _MSC_VER
|
||||
__DEVICE__ bool signbit(long double);
|
||||
#endif
|
||||
__DEVICE__ bool signbit(double);
|
||||
__DEVICE__ bool signbit(float);
|
||||
__DEVICE__ double sin(double);
|
||||
|
|
|
|||
35
lib/include/__clang_hip_cmath.h
vendored
35
lib/include/__clang_hip_cmath.h
vendored
|
|
@ -624,6 +624,41 @@ _GLIBCXX_END_NAMESPACE_VERSION
|
|||
} // namespace std
|
||||
#endif
|
||||
|
||||
// Define device-side math functions from <ymath.h> on MSVC.
|
||||
#if defined(_MSC_VER)
|
||||
|
||||
// Before VS2019, `<ymath.h>` is also included in `<limits>` and other headers.
|
||||
// But, from VS2019, it's only included in `<complex>`. Need to include
|
||||
// `<ymath.h>` here to ensure C functions declared there won't be markded as
|
||||
// `__host__` and `__device__` through `<complex>` wrapper.
|
||||
#include <ymath.h>
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif // defined(__cplusplus)
|
||||
__DEVICE__ __attribute__((overloadable)) double _Cosh(double x, double y) {
|
||||
return cosh(x) * y;
|
||||
}
|
||||
__DEVICE__ __attribute__((overloadable)) float _FCosh(float x, float y) {
|
||||
return coshf(x) * y;
|
||||
}
|
||||
__DEVICE__ __attribute__((overloadable)) short _Dtest(double *p) {
|
||||
return fpclassify(*p);
|
||||
}
|
||||
__DEVICE__ __attribute__((overloadable)) short _FDtest(float *p) {
|
||||
return fpclassify(*p);
|
||||
}
|
||||
__DEVICE__ __attribute__((overloadable)) double _Sinh(double x, double y) {
|
||||
return sinh(x) * y;
|
||||
}
|
||||
__DEVICE__ __attribute__((overloadable)) float _FSinh(float x, float y) {
|
||||
return sinhf(x) * y;
|
||||
}
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif // defined(__cplusplus)
|
||||
#endif // defined(_MSC_VER)
|
||||
|
||||
#pragma pop_macro("__DEVICE__")
|
||||
|
||||
#endif // __CLANG_HIP_CMATH_H__
|
||||
|
|
|
|||
40
lib/include/altivec.h
vendored
40
lib/include/altivec.h
vendored
|
|
@ -8281,6 +8281,46 @@ vec_sel(vector double __a, vector double __b, vector unsigned long long __c) {
|
|||
((vector long long)__b & (vector long long)__c);
|
||||
return (vector double)__res;
|
||||
}
|
||||
|
||||
static __inline__ vector bool long long __ATTRS_o_ai
|
||||
vec_sel(vector bool long long __a, vector bool long long __b,
|
||||
vector bool long long __c) {
|
||||
return (__a & ~__c) | (__b & __c);
|
||||
}
|
||||
|
||||
static __inline__ vector bool long long __ATTRS_o_ai
|
||||
vec_sel(vector bool long long __a, vector bool long long __b,
|
||||
vector unsigned long long __c) {
|
||||
return (__a & ~(vector bool long long)__c) |
|
||||
(__b & (vector bool long long)__c);
|
||||
}
|
||||
|
||||
static __inline__ vector signed long long __ATTRS_o_ai
|
||||
vec_sel(vector signed long long __a, vector signed long long __b,
|
||||
vector bool long long __c) {
|
||||
return (__a & ~(vector signed long long)__c) |
|
||||
(__b & (vector signed long long)__c);
|
||||
}
|
||||
|
||||
static __inline__ vector signed long long __ATTRS_o_ai
|
||||
vec_sel(vector signed long long __a, vector signed long long __b,
|
||||
vector unsigned long long __c) {
|
||||
return (__a & ~(vector signed long long)__c) |
|
||||
(__b & (vector signed long long)__c);
|
||||
}
|
||||
|
||||
static __inline__ vector unsigned long long __ATTRS_o_ai
|
||||
vec_sel(vector unsigned long long __a, vector unsigned long long __b,
|
||||
vector bool long long __c) {
|
||||
return (__a & ~(vector unsigned long long)__c) |
|
||||
(__b & (vector unsigned long long)__c);
|
||||
}
|
||||
|
||||
static __inline__ vector unsigned long long __ATTRS_o_ai
|
||||
vec_sel(vector unsigned long long __a, vector unsigned long long __b,
|
||||
vector unsigned long long __c) {
|
||||
return (__a & ~__c) | (__b & __c);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* vec_vsel */
|
||||
|
|
|
|||
11
lib/include/amxintrin.h
vendored
11
lib/include/amxintrin.h
vendored
|
|
@ -251,23 +251,28 @@ typedef struct __tile1024i_str {
|
|||
_tile1024i tile;
|
||||
} __tile1024i;
|
||||
|
||||
__DEFAULT_FN_ATTRS_INT8
|
||||
__DEFAULT_FN_ATTRS_TILE
|
||||
static void __tile_loadd(__tile1024i *dst, const void *base,
|
||||
__SIZE_TYPE__ stride) {
|
||||
dst->tile = _tile_loadd_internal(dst->row, dst->col, base, stride);
|
||||
}
|
||||
|
||||
__DEFAULT_FN_ATTRS_INT8
|
||||
static void __tile_dpbsud(__tile1024i *dst, __tile1024i src1,
|
||||
static void __tile_dpbssd(__tile1024i *dst, __tile1024i src1,
|
||||
__tile1024i src2) {
|
||||
dst->tile = _tile_dpbssd_internal(src1.row, src2.col, src1.col, dst->tile,
|
||||
src1.tile, src2.tile);
|
||||
}
|
||||
|
||||
__DEFAULT_FN_ATTRS_INT8
|
||||
__DEFAULT_FN_ATTRS_TILE
|
||||
static void __tile_stored(void *base, __SIZE_TYPE__ stride, __tile1024i src) {
|
||||
_tile_stored_internal(src.row, src.col, base, stride, src.tile);
|
||||
}
|
||||
|
||||
__DEFAULT_FN_ATTRS_TILE
|
||||
static void __tile_zero(__tile1024i *dst) {
|
||||
dst->tile = __builtin_ia32_tilezero_internal(dst->row, dst->col);
|
||||
}
|
||||
|
||||
#endif /* __x86_64__ */
|
||||
#endif /* __AMXINTRIN_H */
|
||||
|
|
|
|||
26
lib/include/arm_acle.h
vendored
26
lib/include/arm_acle.h
vendored
|
|
@ -639,6 +639,32 @@ __jcvt(double __a) {
|
|||
}
|
||||
#endif
|
||||
|
||||
/* Armv8.7-A load/store 64-byte intrinsics */
|
||||
#if __ARM_64BIT_STATE && defined(__ARM_FEATURE_LS64)
|
||||
typedef struct {
|
||||
uint64_t val[8];
|
||||
} data512_t;
|
||||
|
||||
static __inline__ data512_t __attribute__((__always_inline__, __nodebug__))
|
||||
__arm_ld64b(const void *__addr) {
|
||||
data512_t __value;
|
||||
__builtin_arm_ld64b(__addr, __value.val);
|
||||
return __value;
|
||||
}
|
||||
static __inline__ void __attribute__((__always_inline__, __nodebug__))
|
||||
__arm_st64b(void *__addr, data512_t __value) {
|
||||
__builtin_arm_st64b(__addr, __value.val);
|
||||
}
|
||||
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
|
||||
__arm_st64bv(void *__addr, data512_t __value) {
|
||||
return __builtin_arm_st64bv(__addr, __value.val);
|
||||
}
|
||||
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
|
||||
__arm_st64bv0(void *__addr, data512_t __value) {
|
||||
return __builtin_arm_st64bv0(__addr, __value.val);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* 10.1 Special register intrinsics */
|
||||
#define __arm_rsr(sysreg) __builtin_arm_rsr(sysreg)
|
||||
#define __arm_rsr64(sysreg) __builtin_arm_rsr64(sysreg)
|
||||
|
|
|
|||
12006
lib/include/arm_neon.h
vendored
12006
lib/include/arm_neon.h
vendored
File diff suppressed because it is too large
Load diff
16
lib/include/avx512fintrin.h
vendored
16
lib/include/avx512fintrin.h
vendored
|
|
@ -9297,9 +9297,12 @@ _mm512_mask_abs_pd(__m512d __W, __mmask8 __K, __m512d __A)
|
|||
|
||||
/* Vector-reduction arithmetic accepts vectors as inputs and produces scalars as
|
||||
* outputs. This class of vector operation forms the basis of many scientific
|
||||
* computations. In vector-reduction arithmetic, the evaluation off is
|
||||
* computations. In vector-reduction arithmetic, the evaluation order is
|
||||
* independent of the order of the input elements of V.
|
||||
|
||||
* For floating point types, we always assume the elements are reassociable even
|
||||
* if -fast-math is off.
|
||||
|
||||
* Used bisection method. At each step, we partition the vector with previous
|
||||
* step in half, and the operation is performed on its two halves.
|
||||
* This takes log2(n) steps where n is the number of elements in the vector.
|
||||
|
|
@ -9345,8 +9348,11 @@ _mm512_mask_reduce_or_epi64(__mmask8 __M, __m512i __W) {
|
|||
return __builtin_ia32_reduce_or_q512(__W);
|
||||
}
|
||||
|
||||
// -0.0 is used to ignore the start value since it is the neutral value of
|
||||
// floating point addition. For more information, please refer to
|
||||
// https://llvm.org/docs/LangRef.html#llvm-vector-reduce-fadd-intrinsic
|
||||
static __inline__ double __DEFAULT_FN_ATTRS512 _mm512_reduce_add_pd(__m512d __W) {
|
||||
return __builtin_ia32_reduce_fadd_pd512(0.0, __W);
|
||||
return __builtin_ia32_reduce_fadd_pd512(-0.0, __W);
|
||||
}
|
||||
|
||||
static __inline__ double __DEFAULT_FN_ATTRS512 _mm512_reduce_mul_pd(__m512d __W) {
|
||||
|
|
@ -9356,7 +9362,7 @@ static __inline__ double __DEFAULT_FN_ATTRS512 _mm512_reduce_mul_pd(__m512d __W)
|
|||
static __inline__ double __DEFAULT_FN_ATTRS512
|
||||
_mm512_mask_reduce_add_pd(__mmask8 __M, __m512d __W) {
|
||||
__W = _mm512_maskz_mov_pd(__M, __W);
|
||||
return __builtin_ia32_reduce_fadd_pd512(0.0, __W);
|
||||
return __builtin_ia32_reduce_fadd_pd512(-0.0, __W);
|
||||
}
|
||||
|
||||
static __inline__ double __DEFAULT_FN_ATTRS512
|
||||
|
|
@ -9411,7 +9417,7 @@ _mm512_mask_reduce_or_epi32(__mmask16 __M, __m512i __W) {
|
|||
|
||||
static __inline__ float __DEFAULT_FN_ATTRS512
|
||||
_mm512_reduce_add_ps(__m512 __W) {
|
||||
return __builtin_ia32_reduce_fadd_ps512(0.0f, __W);
|
||||
return __builtin_ia32_reduce_fadd_ps512(-0.0f, __W);
|
||||
}
|
||||
|
||||
static __inline__ float __DEFAULT_FN_ATTRS512
|
||||
|
|
@ -9422,7 +9428,7 @@ _mm512_reduce_mul_ps(__m512 __W) {
|
|||
static __inline__ float __DEFAULT_FN_ATTRS512
|
||||
_mm512_mask_reduce_add_ps(__mmask16 __M, __m512 __W) {
|
||||
__W = _mm512_maskz_mov_ps(__M, __W);
|
||||
return __builtin_ia32_reduce_fadd_ps512(0.0f, __W);
|
||||
return __builtin_ia32_reduce_fadd_ps512(-0.0f, __W);
|
||||
}
|
||||
|
||||
static __inline__ float __DEFAULT_FN_ATTRS512
|
||||
|
|
|
|||
6
lib/include/avxintrin.h
vendored
6
lib/include/avxintrin.h
vendored
|
|
@ -2245,7 +2245,7 @@ _mm256_cvttps_epi32(__m256 __a)
|
|||
|
||||
/// Returns the first element of the input vector of [4 x double].
|
||||
///
|
||||
/// \headerfile <avxintrin.h>
|
||||
/// \headerfile <x86intrin.h>
|
||||
///
|
||||
/// This intrinsic is a utility function and does not correspond to a specific
|
||||
/// instruction.
|
||||
|
|
@ -2261,7 +2261,7 @@ _mm256_cvtsd_f64(__m256d __a)
|
|||
|
||||
/// Returns the first element of the input vector of [8 x i32].
|
||||
///
|
||||
/// \headerfile <avxintrin.h>
|
||||
/// \headerfile <x86intrin.h>
|
||||
///
|
||||
/// This intrinsic is a utility function and does not correspond to a specific
|
||||
/// instruction.
|
||||
|
|
@ -2278,7 +2278,7 @@ _mm256_cvtsi256_si32(__m256i __a)
|
|||
|
||||
/// Returns the first element of the input vector of [8 x float].
|
||||
///
|
||||
/// \headerfile <avxintrin.h>
|
||||
/// \headerfile <x86intrin.h>
|
||||
///
|
||||
/// This intrinsic is a utility function and does not correspond to a specific
|
||||
/// instruction.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/*===---- complex - CUDA wrapper for <algorithm> ----------------------------===
|
||||
/*===---- algorithm - CUDA wrapper for <algorithm> -------------------------===
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/*===---- complex - CUDA wrapper for <new> ------------------------------===
|
||||
/*===---- new - CUDA wrapper for <new> -------------------------------------===
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
|
|||
2
lib/include/emmintrin.h
vendored
2
lib/include/emmintrin.h
vendored
|
|
@ -4025,7 +4025,7 @@ _mm_storeu_si128(__m128i_u *__p, __m128i __b)
|
|||
///
|
||||
/// \param __p
|
||||
/// A pointer to a 64-bit memory location. The address of the memory
|
||||
/// location does not have to be algned.
|
||||
/// location does not have to be aligned.
|
||||
/// \param __b
|
||||
/// A 128-bit integer vector containing the value to be stored.
|
||||
static __inline__ void __DEFAULT_FN_ATTRS
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@ static void demangling_terminate_handler()
|
|||
exception_header + 1;
|
||||
const __shim_type_info* thrown_type =
|
||||
static_cast<const __shim_type_info*>(exception_header->exceptionType);
|
||||
#if !defined(LIBCXXABI_NON_DEMANGLING_TERMINATE)
|
||||
// Try to get demangled name of thrown_type
|
||||
int status;
|
||||
char buf[1024];
|
||||
|
|
@ -52,6 +53,9 @@ static void demangling_terminate_handler()
|
|||
const char* name = __cxa_demangle(thrown_type->name(), buf, &len, &status);
|
||||
if (status != 0)
|
||||
name = thrown_type->name();
|
||||
#else
|
||||
const char* name = thrown_type->name();
|
||||
#endif
|
||||
// If the uncaught exception can be caught with std::exception&
|
||||
const __shim_type_info* catch_type =
|
||||
static_cast<const __shim_type_info*>(&typeid(std::exception));
|
||||
|
|
|
|||
|
|
@ -684,27 +684,21 @@ static void scan_eh_tab(scan_results &results, _Unwind_Action actions,
|
|||
return;
|
||||
}
|
||||
landingPad = (uintptr_t)lpStart + landingPad;
|
||||
results.landingPad = landingPad;
|
||||
#else // __USING_SJLJ_EXCEPTIONS__
|
||||
++landingPad;
|
||||
#endif // __USING_SJLJ_EXCEPTIONS__
|
||||
if (actionEntry == 0)
|
||||
{
|
||||
// Found a cleanup
|
||||
// If this is a type 1 or type 2 search, there are no handlers
|
||||
// If this is a type 3 search, you want to install the cleanup.
|
||||
if ((actions & _UA_CLEANUP_PHASE) && !(actions & _UA_HANDLER_FRAME))
|
||||
{
|
||||
results.ttypeIndex = 0; // Redundant but clarifying
|
||||
results.landingPad = landingPad;
|
||||
results.reason = _URC_HANDLER_FOUND;
|
||||
return;
|
||||
}
|
||||
// No handler here
|
||||
results.reason = _URC_CONTINUE_UNWIND;
|
||||
results.reason = actions & _UA_SEARCH_PHASE
|
||||
? _URC_CONTINUE_UNWIND
|
||||
: _URC_HANDLER_FOUND;
|
||||
return;
|
||||
}
|
||||
// Convert 1-based byte offset into
|
||||
const uint8_t* action = actionTableStart + (actionEntry - 1);
|
||||
bool hasCleanup = false;
|
||||
// Scan action entries until you find a matching handler, cleanup, or the end of action list
|
||||
while (true)
|
||||
{
|
||||
|
|
@ -720,27 +714,17 @@ static void scan_eh_tab(scan_results &results, _Unwind_Action actions,
|
|||
native_exception, unwind_exception);
|
||||
if (catchType == 0)
|
||||
{
|
||||
// Found catch (...) catches everything, including foreign exceptions
|
||||
// If this is a type 1 search save state and return _URC_HANDLER_FOUND
|
||||
// If this is a type 2 search save state and return _URC_HANDLER_FOUND
|
||||
// If this is a type 3 search !_UA_FORCE_UNWIND, we should have found this in phase 1!
|
||||
// If this is a type 3 search _UA_FORCE_UNWIND, ignore handler and continue scan
|
||||
if ((actions & _UA_SEARCH_PHASE) || (actions & _UA_HANDLER_FRAME))
|
||||
{
|
||||
// Save state and return _URC_HANDLER_FOUND
|
||||
results.ttypeIndex = ttypeIndex;
|
||||
results.actionRecord = actionRecord;
|
||||
results.landingPad = landingPad;
|
||||
results.adjustedPtr = get_thrown_object_ptr(unwind_exception);
|
||||
results.reason = _URC_HANDLER_FOUND;
|
||||
return;
|
||||
}
|
||||
else if (!(actions & _UA_FORCE_UNWIND))
|
||||
{
|
||||
// It looks like the exception table has changed
|
||||
// on us. Likely stack corruption!
|
||||
call_terminate(native_exception, unwind_exception);
|
||||
}
|
||||
// Found catch (...) catches everything, including
|
||||
// foreign exceptions. This is search phase, cleanup
|
||||
// phase with foreign exception, or forced unwinding.
|
||||
assert(actions & (_UA_SEARCH_PHASE | _UA_HANDLER_FRAME |
|
||||
_UA_FORCE_UNWIND));
|
||||
results.ttypeIndex = ttypeIndex;
|
||||
results.actionRecord = actionRecord;
|
||||
results.adjustedPtr =
|
||||
get_thrown_object_ptr(unwind_exception);
|
||||
results.reason = _URC_HANDLER_FOUND;
|
||||
return;
|
||||
}
|
||||
// Else this is a catch (T) clause and will never
|
||||
// catch a foreign exception
|
||||
|
|
@ -757,36 +741,25 @@ static void scan_eh_tab(scan_results &results, _Unwind_Action actions,
|
|||
}
|
||||
if (catchType->can_catch(excpType, adjustedPtr))
|
||||
{
|
||||
// Found a matching handler
|
||||
// If this is a type 1 search save state and return _URC_HANDLER_FOUND
|
||||
// If this is a type 3 search and !_UA_FORCE_UNWIND, we should have found this in phase 1!
|
||||
// If this is a type 3 search and _UA_FORCE_UNWIND, ignore handler and continue scan
|
||||
if (actions & _UA_SEARCH_PHASE)
|
||||
{
|
||||
// Save state and return _URC_HANDLER_FOUND
|
||||
results.ttypeIndex = ttypeIndex;
|
||||
results.actionRecord = actionRecord;
|
||||
results.landingPad = landingPad;
|
||||
results.adjustedPtr = adjustedPtr;
|
||||
results.reason = _URC_HANDLER_FOUND;
|
||||
return;
|
||||
}
|
||||
else if (!(actions & _UA_FORCE_UNWIND))
|
||||
{
|
||||
// It looks like the exception table has changed
|
||||
// on us. Likely stack corruption!
|
||||
call_terminate(native_exception, unwind_exception);
|
||||
}
|
||||
// Found a matching handler. This is either search
|
||||
// phase or forced unwinding.
|
||||
assert(actions &
|
||||
(_UA_SEARCH_PHASE | _UA_FORCE_UNWIND));
|
||||
results.ttypeIndex = ttypeIndex;
|
||||
results.actionRecord = actionRecord;
|
||||
results.adjustedPtr = adjustedPtr;
|
||||
results.reason = _URC_HANDLER_FOUND;
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Scan next action ...
|
||||
}
|
||||
else if (ttypeIndex < 0)
|
||||
{
|
||||
// Found an exception spec. If this is a foreign exception,
|
||||
// it is always caught.
|
||||
if (native_exception)
|
||||
{
|
||||
// Found an exception specification.
|
||||
if (actions & _UA_FORCE_UNWIND) {
|
||||
// Skip if forced unwinding.
|
||||
} else if (native_exception) {
|
||||
// Does the exception spec catch this native exception?
|
||||
__cxa_exception* exception_header = (__cxa_exception*)(unwind_exception+1) - 1;
|
||||
void* adjustedPtr = get_thrown_object_ptr(unwind_exception);
|
||||
|
|
@ -801,77 +774,38 @@ static void scan_eh_tab(scan_results &results, _Unwind_Action actions,
|
|||
ttypeEncoding, excpType,
|
||||
adjustedPtr, unwind_exception))
|
||||
{
|
||||
// native exception caught by exception spec
|
||||
// If this is a type 1 search, save state and return _URC_HANDLER_FOUND
|
||||
// If this is a type 3 search !_UA_FORCE_UNWIND, we should have found this in phase 1!
|
||||
// If this is a type 3 search _UA_FORCE_UNWIND, ignore handler and continue scan
|
||||
if (actions & _UA_SEARCH_PHASE)
|
||||
{
|
||||
// Save state and return _URC_HANDLER_FOUND
|
||||
results.ttypeIndex = ttypeIndex;
|
||||
results.actionRecord = actionRecord;
|
||||
results.landingPad = landingPad;
|
||||
results.adjustedPtr = adjustedPtr;
|
||||
results.reason = _URC_HANDLER_FOUND;
|
||||
return;
|
||||
}
|
||||
else if (!(actions & _UA_FORCE_UNWIND))
|
||||
{
|
||||
// It looks like the exception table has changed
|
||||
// on us. Likely stack corruption!
|
||||
call_terminate(native_exception, unwind_exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// foreign exception caught by exception spec
|
||||
// If this is a type 1 search, save state and return _URC_HANDLER_FOUND
|
||||
// If this is a type 2 search, save state and return _URC_HANDLER_FOUND
|
||||
// If this is a type 3 search !_UA_FORCE_UNWIND, we should have found this in phase 1!
|
||||
// If this is a type 3 search _UA_FORCE_UNWIND, ignore handler and continue scan
|
||||
if ((actions & _UA_SEARCH_PHASE) || (actions & _UA_HANDLER_FRAME))
|
||||
{
|
||||
// Save state and return _URC_HANDLER_FOUND
|
||||
// Native exception caught by exception
|
||||
// specification.
|
||||
assert(actions & _UA_SEARCH_PHASE);
|
||||
results.ttypeIndex = ttypeIndex;
|
||||
results.actionRecord = actionRecord;
|
||||
results.landingPad = landingPad;
|
||||
results.adjustedPtr = get_thrown_object_ptr(unwind_exception);
|
||||
results.adjustedPtr = adjustedPtr;
|
||||
results.reason = _URC_HANDLER_FOUND;
|
||||
return;
|
||||
}
|
||||
else if (!(actions & _UA_FORCE_UNWIND))
|
||||
{
|
||||
// It looks like the exception table has changed
|
||||
// on us. Likely stack corruption!
|
||||
call_terminate(native_exception, unwind_exception);
|
||||
}
|
||||
}
|
||||
// Scan next action ...
|
||||
}
|
||||
else // ttypeIndex == 0
|
||||
{
|
||||
// Found a cleanup
|
||||
// If this is a type 1 search, ignore it and continue scan
|
||||
// If this is a type 2 search, ignore it and continue scan
|
||||
// If this is a type 3 search, save state and return _URC_HANDLER_FOUND
|
||||
if ((actions & _UA_CLEANUP_PHASE) && !(actions & _UA_HANDLER_FRAME))
|
||||
{
|
||||
// Save state and return _URC_HANDLER_FOUND
|
||||
} else {
|
||||
// foreign exception caught by exception spec
|
||||
results.ttypeIndex = ttypeIndex;
|
||||
results.actionRecord = actionRecord;
|
||||
results.landingPad = landingPad;
|
||||
results.adjustedPtr = get_thrown_object_ptr(unwind_exception);
|
||||
results.adjustedPtr =
|
||||
get_thrown_object_ptr(unwind_exception);
|
||||
results.reason = _URC_HANDLER_FOUND;
|
||||
return;
|
||||
}
|
||||
// Scan next action ...
|
||||
} else {
|
||||
hasCleanup = true;
|
||||
}
|
||||
const uint8_t* temp = action;
|
||||
int64_t actionOffset = readSLEB128(&temp);
|
||||
if (actionOffset == 0)
|
||||
{
|
||||
// End of action list, no matching handler or cleanup found
|
||||
results.reason = _URC_CONTINUE_UNWIND;
|
||||
// End of action list. If this is phase 2 and we have found
|
||||
// a cleanup (ttypeIndex=0), return _URC_HANDLER_FOUND;
|
||||
// otherwise return _URC_CONTINUE_UNWIND.
|
||||
results.reason = hasCleanup && actions & _UA_CLEANUP_PHASE
|
||||
? _URC_HANDLER_FOUND
|
||||
: _URC_CONTINUE_UNWIND;
|
||||
return;
|
||||
}
|
||||
// Go to next action
|
||||
|
|
@ -962,78 +896,51 @@ __gxx_personality_v0
|
|||
bool native_exception = (exceptionClass & get_vendor_and_language) ==
|
||||
(kOurExceptionClass & get_vendor_and_language);
|
||||
scan_results results;
|
||||
// Process a catch handler for a native exception first.
|
||||
if (actions == (_UA_CLEANUP_PHASE | _UA_HANDLER_FRAME) &&
|
||||
native_exception) {
|
||||
// Reload the results from the phase 1 cache.
|
||||
__cxa_exception* exception_header =
|
||||
(__cxa_exception*)(unwind_exception + 1) - 1;
|
||||
results.ttypeIndex = exception_header->handlerSwitchValue;
|
||||
results.actionRecord = exception_header->actionRecord;
|
||||
results.languageSpecificData = exception_header->languageSpecificData;
|
||||
results.landingPad =
|
||||
reinterpret_cast<uintptr_t>(exception_header->catchTemp);
|
||||
results.adjustedPtr = exception_header->adjustedPtr;
|
||||
|
||||
// Jump to the handler.
|
||||
set_registers(unwind_exception, context, results);
|
||||
return _URC_INSTALL_CONTEXT;
|
||||
}
|
||||
|
||||
// In other cases we need to scan LSDA.
|
||||
scan_eh_tab(results, actions, native_exception, unwind_exception, context);
|
||||
if (results.reason == _URC_CONTINUE_UNWIND ||
|
||||
results.reason == _URC_FATAL_PHASE1_ERROR)
|
||||
return results.reason;
|
||||
|
||||
if (actions & _UA_SEARCH_PHASE)
|
||||
{
|
||||
// Phase 1 search: All we're looking for in phase 1 is a handler that
|
||||
// halts unwinding
|
||||
scan_eh_tab(results, actions, native_exception, unwind_exception, context);
|
||||
if (results.reason == _URC_HANDLER_FOUND)
|
||||
{
|
||||
// Found one. Can we cache the results somewhere to optimize phase 2?
|
||||
if (native_exception)
|
||||
{
|
||||
__cxa_exception* exception_header = (__cxa_exception*)(unwind_exception+1) - 1;
|
||||
exception_header->handlerSwitchValue = static_cast<int>(results.ttypeIndex);
|
||||
exception_header->actionRecord = results.actionRecord;
|
||||
exception_header->languageSpecificData = results.languageSpecificData;
|
||||
exception_header->catchTemp = reinterpret_cast<void*>(results.landingPad);
|
||||
exception_header->adjustedPtr = results.adjustedPtr;
|
||||
}
|
||||
return _URC_HANDLER_FOUND;
|
||||
assert(results.reason == _URC_HANDLER_FOUND);
|
||||
if (native_exception) {
|
||||
// For a native exception, cache the LSDA result.
|
||||
__cxa_exception* exc = (__cxa_exception*)(unwind_exception + 1) - 1;
|
||||
exc->handlerSwitchValue = static_cast<int>(results.ttypeIndex);
|
||||
exc->actionRecord = results.actionRecord;
|
||||
exc->languageSpecificData = results.languageSpecificData;
|
||||
exc->catchTemp = reinterpret_cast<void*>(results.landingPad);
|
||||
exc->adjustedPtr = results.adjustedPtr;
|
||||
}
|
||||
// Did not find a catching-handler. Return the results of the scan
|
||||
// (normally _URC_CONTINUE_UNWIND, but could have been _URC_FATAL_PHASE1_ERROR
|
||||
// if we were called improperly).
|
||||
return results.reason;
|
||||
return _URC_HANDLER_FOUND;
|
||||
}
|
||||
if (actions & _UA_CLEANUP_PHASE)
|
||||
{
|
||||
// Phase 2 search:
|
||||
// Did we find a catching handler in phase 1?
|
||||
if (actions & _UA_HANDLER_FRAME)
|
||||
{
|
||||
// Yes, phase 1 said we have a catching handler here.
|
||||
// Did we cache the results of the scan?
|
||||
if (native_exception)
|
||||
{
|
||||
// Yes, reload the results from the cache.
|
||||
__cxa_exception* exception_header = (__cxa_exception*)(unwind_exception+1) - 1;
|
||||
results.ttypeIndex = exception_header->handlerSwitchValue;
|
||||
results.actionRecord = exception_header->actionRecord;
|
||||
results.languageSpecificData = exception_header->languageSpecificData;
|
||||
results.landingPad = reinterpret_cast<uintptr_t>(exception_header->catchTemp);
|
||||
results.adjustedPtr = exception_header->adjustedPtr;
|
||||
}
|
||||
else
|
||||
{
|
||||
// No, do the scan again to reload the results.
|
||||
scan_eh_tab(results, actions, native_exception, unwind_exception, context);
|
||||
// Phase 1 told us we would find a handler. Now in Phase 2 we
|
||||
// didn't find a handler. The eh table should not be changing!
|
||||
if (results.reason != _URC_HANDLER_FOUND)
|
||||
call_terminate(native_exception, unwind_exception);
|
||||
}
|
||||
// Jump to the handler
|
||||
set_registers(unwind_exception, context, results);
|
||||
return _URC_INSTALL_CONTEXT;
|
||||
}
|
||||
// Either we didn't do a phase 1 search (due to forced unwinding), or
|
||||
// phase 1 reported no catching-handlers.
|
||||
// Search for a (non-catching) cleanup
|
||||
scan_eh_tab(results, actions, native_exception, unwind_exception, context);
|
||||
if (results.reason == _URC_HANDLER_FOUND)
|
||||
{
|
||||
// Found a non-catching handler. Jump to it:
|
||||
set_registers(unwind_exception, context, results);
|
||||
return _URC_INSTALL_CONTEXT;
|
||||
}
|
||||
// Did not find a cleanup. Return the results of the scan
|
||||
// (normally _URC_CONTINUE_UNWIND, but could have been _URC_FATAL_PHASE2_ERROR
|
||||
// if we were called improperly).
|
||||
return results.reason;
|
||||
}
|
||||
// We were called improperly: neither a phase 1 or phase 2 search
|
||||
return _URC_FATAL_PHASE1_ERROR;
|
||||
|
||||
assert(actions & _UA_CLEANUP_PHASE);
|
||||
assert(results.reason == _URC_HANDLER_FOUND);
|
||||
set_registers(unwind_exception, context, results);
|
||||
return _URC_INSTALL_CONTEXT;
|
||||
}
|
||||
|
||||
#if defined(__SEH__) && !defined(__USING_SJLJ_EXCEPTIONS__)
|
||||
|
|
|
|||
|
|
@ -96,7 +96,6 @@
|
|||
X(InitListExpr) \
|
||||
X(FoldExpr) \
|
||||
X(ThrowExpr) \
|
||||
X(UUIDOfExpr) \
|
||||
X(BoolExpr) \
|
||||
X(StringLiteral) \
|
||||
X(LambdaExpr) \
|
||||
|
|
@ -2035,21 +2034,6 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
// MSVC __uuidof extension, generated by clang in -fms-extensions mode.
|
||||
class UUIDOfExpr : public Node {
|
||||
Node *Operand;
|
||||
public:
|
||||
UUIDOfExpr(Node *Operand_) : Node(KUUIDOfExpr), Operand(Operand_) {}
|
||||
|
||||
template<typename Fn> void match(Fn F) const { F(Operand); }
|
||||
|
||||
void printLeft(OutputStream &S) const override {
|
||||
S << "__uuidof(";
|
||||
Operand->print(S);
|
||||
S << ")";
|
||||
}
|
||||
};
|
||||
|
||||
class BoolExpr : public Node {
|
||||
bool Value;
|
||||
|
||||
|
|
@ -5013,6 +4997,43 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
|
|||
}
|
||||
}
|
||||
return nullptr;
|
||||
case 'u': {
|
||||
++First;
|
||||
Node *Name = getDerived().parseSourceName(/*NameState=*/nullptr);
|
||||
if (!Name)
|
||||
return nullptr;
|
||||
// Special case legacy __uuidof mangling. The 't' and 'z' appear where the
|
||||
// standard encoding expects a <template-arg>, and would be otherwise be
|
||||
// interpreted as <type> node 'short' or 'ellipsis'. However, neither
|
||||
// __uuidof(short) nor __uuidof(...) can actually appear, so there is no
|
||||
// actual conflict here.
|
||||
if (Name->getBaseName() == "__uuidof") {
|
||||
if (numLeft() < 2)
|
||||
return nullptr;
|
||||
if (*First == 't') {
|
||||
++First;
|
||||
Node *Ty = getDerived().parseType();
|
||||
if (!Ty)
|
||||
return nullptr;
|
||||
return make<CallExpr>(Name, makeNodeArray(&Ty, &Ty + 1));
|
||||
}
|
||||
if (*First == 'z') {
|
||||
++First;
|
||||
Node *Ex = getDerived().parseExpr();
|
||||
if (!Ex)
|
||||
return nullptr;
|
||||
return make<CallExpr>(Name, makeNodeArray(&Ex, &Ex + 1));
|
||||
}
|
||||
}
|
||||
size_t ExprsBegin = Names.size();
|
||||
while (!consumeIf('E')) {
|
||||
Node *E = getDerived().parseTemplateArg();
|
||||
if (E == nullptr)
|
||||
return E;
|
||||
Names.push_back(E);
|
||||
}
|
||||
return make<CallExpr>(Name, popTrailingNodeArray(ExprsBegin));
|
||||
}
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
|
|
@ -5024,21 +5045,6 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
|
|||
case '9':
|
||||
return getDerived().parseUnresolvedName();
|
||||
}
|
||||
|
||||
if (consumeIf("u8__uuidoft")) {
|
||||
Node *Ty = getDerived().parseType();
|
||||
if (!Ty)
|
||||
return nullptr;
|
||||
return make<UUIDOfExpr>(Ty);
|
||||
}
|
||||
|
||||
if (consumeIf("u8__uuidofz")) {
|
||||
Node *Ex = getDerived().parseExpr();
|
||||
if (!Ex)
|
||||
return nullptr;
|
||||
return make<UUIDOfExpr>(Ex);
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -93,8 +93,7 @@ _LIBCXXABI_WEAK
|
|||
void
|
||||
operator delete(void* ptr) _NOEXCEPT
|
||||
{
|
||||
if (ptr)
|
||||
::free(ptr);
|
||||
::free(ptr);
|
||||
}
|
||||
|
||||
_LIBCXXABI_WEAK
|
||||
|
|
@ -215,9 +214,7 @@ _LIBCXXABI_WEAK
|
|||
void
|
||||
operator delete(void* ptr, std::align_val_t) _NOEXCEPT
|
||||
{
|
||||
if (ptr) {
|
||||
std::__libcpp_aligned_free(ptr);
|
||||
}
|
||||
std::__libcpp_aligned_free(ptr);
|
||||
}
|
||||
|
||||
_LIBCXXABI_WEAK
|
||||
|
|
|
|||
|
|
@ -25,8 +25,12 @@
|
|||
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_SPARC 31
|
||||
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_HEXAGON 34
|
||||
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_RISCV 64
|
||||
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_VE 143
|
||||
|
||||
#if defined(_LIBUNWIND_IS_NATIVE_ONLY)
|
||||
# if defined(__linux__)
|
||||
# define _LIBUNWIND_TARGET_LINUX 1
|
||||
# endif
|
||||
# if defined(__i386__)
|
||||
# define _LIBUNWIND_TARGET_I386
|
||||
# define _LIBUNWIND_CONTEXT_SIZE 8
|
||||
|
|
@ -135,6 +139,11 @@
|
|||
# error "Unsupported RISC-V ABI"
|
||||
# endif
|
||||
# define _LIBUNWIND_HIGHEST_DWARF_REGISTER _LIBUNWIND_HIGHEST_DWARF_REGISTER_RISCV
|
||||
# elif defined(__ve__)
|
||||
# define _LIBUNWIND_TARGET_VE 1
|
||||
# define _LIBUNWIND_CONTEXT_SIZE 67
|
||||
# define _LIBUNWIND_CURSOR_SIZE 79
|
||||
# define _LIBUNWIND_HIGHEST_DWARF_REGISTER _LIBUNWIND_HIGHEST_DWARF_REGISTER_VE
|
||||
# else
|
||||
# error "Unsupported architecture."
|
||||
# endif
|
||||
|
|
@ -151,6 +160,7 @@
|
|||
# define _LIBUNWIND_TARGET_SPARC 1
|
||||
# define _LIBUNWIND_TARGET_HEXAGON 1
|
||||
# define _LIBUNWIND_TARGET_RISCV 1
|
||||
# define _LIBUNWIND_TARGET_VE 1
|
||||
# define _LIBUNWIND_CONTEXT_SIZE 167
|
||||
# define _LIBUNWIND_CURSOR_SIZE 179
|
||||
# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 287
|
||||
|
|
|
|||
|
|
@ -947,4 +947,156 @@ enum {
|
|||
UNW_RISCV_F31 = 63,
|
||||
};
|
||||
|
||||
// VE register numbers
|
||||
enum {
|
||||
UNW_VE_S0 = 0,
|
||||
UNW_VE_S1 = 1,
|
||||
UNW_VE_S2 = 2,
|
||||
UNW_VE_S3 = 3,
|
||||
UNW_VE_S4 = 4,
|
||||
UNW_VE_S5 = 5,
|
||||
UNW_VE_S6 = 6,
|
||||
UNW_VE_S7 = 7,
|
||||
UNW_VE_S8 = 8,
|
||||
UNW_VE_S9 = 9,
|
||||
UNW_VE_S10 = 10,
|
||||
UNW_VE_S11 = 11,
|
||||
UNW_VE_S12 = 12,
|
||||
UNW_VE_S13 = 13,
|
||||
UNW_VE_S14 = 14,
|
||||
UNW_VE_S15 = 15,
|
||||
UNW_VE_S16 = 16,
|
||||
UNW_VE_S17 = 17,
|
||||
UNW_VE_S18 = 18,
|
||||
UNW_VE_S19 = 19,
|
||||
UNW_VE_S20 = 20,
|
||||
UNW_VE_S21 = 21,
|
||||
UNW_VE_S22 = 22,
|
||||
UNW_VE_S23 = 23,
|
||||
UNW_VE_S24 = 24,
|
||||
UNW_VE_S25 = 25,
|
||||
UNW_VE_S26 = 26,
|
||||
UNW_VE_S27 = 27,
|
||||
UNW_VE_S28 = 28,
|
||||
UNW_VE_S29 = 29,
|
||||
UNW_VE_S30 = 30,
|
||||
UNW_VE_S31 = 31,
|
||||
UNW_VE_S32 = 32,
|
||||
UNW_VE_S33 = 33,
|
||||
UNW_VE_S34 = 34,
|
||||
UNW_VE_S35 = 35,
|
||||
UNW_VE_S36 = 36,
|
||||
UNW_VE_S37 = 37,
|
||||
UNW_VE_S38 = 38,
|
||||
UNW_VE_S39 = 39,
|
||||
UNW_VE_S40 = 40,
|
||||
UNW_VE_S41 = 41,
|
||||
UNW_VE_S42 = 42,
|
||||
UNW_VE_S43 = 43,
|
||||
UNW_VE_S44 = 44,
|
||||
UNW_VE_S45 = 45,
|
||||
UNW_VE_S46 = 46,
|
||||
UNW_VE_S47 = 47,
|
||||
UNW_VE_S48 = 48,
|
||||
UNW_VE_S49 = 49,
|
||||
UNW_VE_S50 = 50,
|
||||
UNW_VE_S51 = 51,
|
||||
UNW_VE_S52 = 52,
|
||||
UNW_VE_S53 = 53,
|
||||
UNW_VE_S54 = 54,
|
||||
UNW_VE_S55 = 55,
|
||||
UNW_VE_S56 = 56,
|
||||
UNW_VE_S57 = 57,
|
||||
UNW_VE_S58 = 58,
|
||||
UNW_VE_S59 = 59,
|
||||
UNW_VE_S60 = 60,
|
||||
UNW_VE_S61 = 61,
|
||||
UNW_VE_S62 = 62,
|
||||
UNW_VE_S63 = 63,
|
||||
UNW_VE_V0 = 64 + 0,
|
||||
UNW_VE_V1 = 64 + 1,
|
||||
UNW_VE_V2 = 64 + 2,
|
||||
UNW_VE_V3 = 64 + 3,
|
||||
UNW_VE_V4 = 64 + 4,
|
||||
UNW_VE_V5 = 64 + 5,
|
||||
UNW_VE_V6 = 64 + 6,
|
||||
UNW_VE_V7 = 64 + 7,
|
||||
UNW_VE_V8 = 64 + 8,
|
||||
UNW_VE_V9 = 64 + 9,
|
||||
UNW_VE_V10 = 64 + 10,
|
||||
UNW_VE_V11 = 64 + 11,
|
||||
UNW_VE_V12 = 64 + 12,
|
||||
UNW_VE_V13 = 64 + 13,
|
||||
UNW_VE_V14 = 64 + 14,
|
||||
UNW_VE_V15 = 64 + 15,
|
||||
UNW_VE_V16 = 64 + 16,
|
||||
UNW_VE_V17 = 64 + 17,
|
||||
UNW_VE_V18 = 64 + 18,
|
||||
UNW_VE_V19 = 64 + 19,
|
||||
UNW_VE_V20 = 64 + 20,
|
||||
UNW_VE_V21 = 64 + 21,
|
||||
UNW_VE_V22 = 64 + 22,
|
||||
UNW_VE_V23 = 64 + 23,
|
||||
UNW_VE_V24 = 64 + 24,
|
||||
UNW_VE_V25 = 64 + 25,
|
||||
UNW_VE_V26 = 64 + 26,
|
||||
UNW_VE_V27 = 64 + 27,
|
||||
UNW_VE_V28 = 64 + 28,
|
||||
UNW_VE_V29 = 64 + 29,
|
||||
UNW_VE_V30 = 64 + 30,
|
||||
UNW_VE_V31 = 64 + 31,
|
||||
UNW_VE_V32 = 64 + 32,
|
||||
UNW_VE_V33 = 64 + 33,
|
||||
UNW_VE_V34 = 64 + 34,
|
||||
UNW_VE_V35 = 64 + 35,
|
||||
UNW_VE_V36 = 64 + 36,
|
||||
UNW_VE_V37 = 64 + 37,
|
||||
UNW_VE_V38 = 64 + 38,
|
||||
UNW_VE_V39 = 64 + 39,
|
||||
UNW_VE_V40 = 64 + 40,
|
||||
UNW_VE_V41 = 64 + 41,
|
||||
UNW_VE_V42 = 64 + 42,
|
||||
UNW_VE_V43 = 64 + 43,
|
||||
UNW_VE_V44 = 64 + 44,
|
||||
UNW_VE_V45 = 64 + 45,
|
||||
UNW_VE_V46 = 64 + 46,
|
||||
UNW_VE_V47 = 64 + 47,
|
||||
UNW_VE_V48 = 64 + 48,
|
||||
UNW_VE_V49 = 64 + 49,
|
||||
UNW_VE_V50 = 64 + 50,
|
||||
UNW_VE_V51 = 64 + 51,
|
||||
UNW_VE_V52 = 64 + 52,
|
||||
UNW_VE_V53 = 64 + 53,
|
||||
UNW_VE_V54 = 64 + 54,
|
||||
UNW_VE_V55 = 64 + 55,
|
||||
UNW_VE_V56 = 64 + 56,
|
||||
UNW_VE_V57 = 64 + 57,
|
||||
UNW_VE_V58 = 64 + 58,
|
||||
UNW_VE_V59 = 64 + 59,
|
||||
UNW_VE_V60 = 64 + 60,
|
||||
UNW_VE_V61 = 64 + 61,
|
||||
UNW_VE_V62 = 64 + 62,
|
||||
UNW_VE_V63 = 64 + 63,
|
||||
UNW_VE_VM0 = 128 + 0,
|
||||
UNW_VE_VM1 = 128 + 1,
|
||||
UNW_VE_VM2 = 128 + 2,
|
||||
UNW_VE_VM3 = 128 + 3,
|
||||
UNW_VE_VM4 = 128 + 4,
|
||||
UNW_VE_VM5 = 128 + 5,
|
||||
UNW_VE_VM6 = 128 + 6,
|
||||
UNW_VE_VM7 = 128 + 7,
|
||||
UNW_VE_VM8 = 128 + 8,
|
||||
UNW_VE_VM9 = 128 + 9,
|
||||
UNW_VE_VM10 = 128 + 10,
|
||||
UNW_VE_VM11 = 128 + 11,
|
||||
UNW_VE_VM12 = 128 + 12,
|
||||
UNW_VE_VM13 = 128 + 13,
|
||||
UNW_VE_VM14 = 128 + 14,
|
||||
UNW_VE_VM15 = 128 + 15, // = 143
|
||||
|
||||
// Following registers don't have DWARF register numbers.
|
||||
UNW_VE_VIXR = 144,
|
||||
UNW_VE_VL = 145,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ enum {
|
|||
REGISTERS_SPARC,
|
||||
REGISTERS_HEXAGON,
|
||||
REGISTERS_RISCV,
|
||||
REGISTERS_VE,
|
||||
};
|
||||
|
||||
#if defined(_LIBUNWIND_TARGET_I386)
|
||||
|
|
@ -3983,6 +3984,447 @@ inline void Registers_riscv::setVectorRegister(int, v128) {
|
|||
_LIBUNWIND_ABORT("no riscv vector register support yet");
|
||||
}
|
||||
#endif // _LIBUNWIND_TARGET_RISCV
|
||||
|
||||
#if defined(_LIBUNWIND_TARGET_VE)
|
||||
/// Registers_ve holds the register state of a thread in a VE process.
|
||||
class _LIBUNWIND_HIDDEN Registers_ve {
|
||||
public:
|
||||
Registers_ve();
|
||||
Registers_ve(const void *registers);
|
||||
|
||||
bool validRegister(int num) const;
|
||||
uint64_t getRegister(int num) const;
|
||||
void setRegister(int num, uint64_t value);
|
||||
bool validFloatRegister(int num) const;
|
||||
double getFloatRegister(int num) const;
|
||||
void setFloatRegister(int num, double value);
|
||||
bool validVectorRegister(int num) const;
|
||||
v128 getVectorRegister(int num) const;
|
||||
void setVectorRegister(int num, v128 value);
|
||||
static const char *getRegisterName(int num);
|
||||
void jumpto();
|
||||
static int lastDwarfRegNum() { return _LIBUNWIND_HIGHEST_DWARF_REGISTER_VE; }
|
||||
static int getArch() { return REGISTERS_VE; }
|
||||
|
||||
uint64_t getSP() const { return _registers.__s[11]; }
|
||||
void setSP(uint64_t value) { _registers.__s[11] = value; }
|
||||
uint64_t getIP() const { return _registers.__ic; }
|
||||
void setIP(uint64_t value) { _registers.__ic = value; }
|
||||
|
||||
private:
|
||||
// FIXME: Need to store not only scalar registers but also vector and vector
|
||||
// mask registers. VEOS uses mcontext_t defined in ucontext.h. It takes
|
||||
// 524288 bytes (65536*8 bytes), though. Currently, we use libunwind for
|
||||
// SjLj exception support only, so Registers_ve is not implemented completely.
|
||||
struct ve_thread_state_t {
|
||||
uint64_t __s[64]; // s0-s64
|
||||
uint64_t __ic; // Instruction counter (IC)
|
||||
uint64_t __vixr; // Vector Index Register
|
||||
uint64_t __vl; // Vector Length Register
|
||||
};
|
||||
|
||||
ve_thread_state_t _registers; // total 67 registers
|
||||
|
||||
// Currently no vector register is preserved.
|
||||
};
|
||||
|
||||
inline Registers_ve::Registers_ve(const void *registers) {
|
||||
static_assert((check_fit<Registers_ve, unw_context_t>::does_fit),
|
||||
"ve registers do not fit into unw_context_t");
|
||||
memcpy(&_registers, static_cast<const uint8_t *>(registers),
|
||||
sizeof(_registers));
|
||||
static_assert(sizeof(_registers) == 536,
|
||||
"expected vector register offset to be 536");
|
||||
}
|
||||
|
||||
inline Registers_ve::Registers_ve() {
|
||||
memset(&_registers, 0, sizeof(_registers));
|
||||
}
|
||||
|
||||
inline bool Registers_ve::validRegister(int regNum) const {
|
||||
if (regNum >= UNW_VE_S0 && regNum <= UNW_VE_S63)
|
||||
return true;
|
||||
|
||||
switch (regNum) {
|
||||
case UNW_REG_IP:
|
||||
case UNW_REG_SP:
|
||||
case UNW_VE_VIXR:
|
||||
case UNW_VE_VL:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
inline uint64_t Registers_ve::getRegister(int regNum) const {
|
||||
if (regNum >= UNW_VE_S0 && regNum <= UNW_VE_S63)
|
||||
return _registers.__s[regNum - UNW_VE_S0];
|
||||
|
||||
switch (regNum) {
|
||||
case UNW_REG_IP:
|
||||
return _registers.__ic;
|
||||
case UNW_REG_SP:
|
||||
return _registers.__s[11];
|
||||
case UNW_VE_VIXR:
|
||||
return _registers.__vixr;
|
||||
case UNW_VE_VL:
|
||||
return _registers.__vl;
|
||||
}
|
||||
_LIBUNWIND_ABORT("unsupported ve register");
|
||||
}
|
||||
|
||||
inline void Registers_ve::setRegister(int regNum, uint64_t value) {
|
||||
if (regNum >= UNW_VE_S0 && regNum <= UNW_VE_S63) {
|
||||
_registers.__s[regNum - UNW_VE_S0] = value;
|
||||
return;
|
||||
}
|
||||
|
||||
switch (regNum) {
|
||||
case UNW_REG_IP:
|
||||
_registers.__ic = value;
|
||||
return;
|
||||
case UNW_REG_SP:
|
||||
_registers.__s[11] = value;
|
||||
return;
|
||||
case UNW_VE_VIXR:
|
||||
_registers.__vixr = value;
|
||||
return;
|
||||
case UNW_VE_VL:
|
||||
_registers.__vl = value;
|
||||
return;
|
||||
}
|
||||
_LIBUNWIND_ABORT("unsupported ve register");
|
||||
}
|
||||
|
||||
inline bool Registers_ve::validFloatRegister(int /* regNum */) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
inline double Registers_ve::getFloatRegister(int /* regNum */) const {
|
||||
_LIBUNWIND_ABORT("VE doesn't have float registers");
|
||||
}
|
||||
|
||||
inline void Registers_ve::setFloatRegister(int /* regNum */,
|
||||
double /* value */) {
|
||||
_LIBUNWIND_ABORT("VE doesn't have float registers");
|
||||
}
|
||||
|
||||
inline bool Registers_ve::validVectorRegister(int /* regNum */) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
inline v128 Registers_ve::getVectorRegister(int /* regNum */) const {
|
||||
_LIBUNWIND_ABORT("VE vector support not implemented");
|
||||
}
|
||||
|
||||
inline void Registers_ve::setVectorRegister(int /* regNum */,
|
||||
v128 /* value */) {
|
||||
_LIBUNWIND_ABORT("VE vector support not implemented");
|
||||
}
|
||||
|
||||
inline const char *Registers_ve::getRegisterName(int regNum) {
|
||||
switch (regNum) {
|
||||
case UNW_REG_IP:
|
||||
return "ip";
|
||||
case UNW_REG_SP:
|
||||
return "sp";
|
||||
case UNW_VE_VIXR:
|
||||
return "vixr";
|
||||
case UNW_VE_VL:
|
||||
return "vl";
|
||||
case UNW_VE_S0:
|
||||
return "s0";
|
||||
case UNW_VE_S1:
|
||||
return "s1";
|
||||
case UNW_VE_S2:
|
||||
return "s2";
|
||||
case UNW_VE_S3:
|
||||
return "s3";
|
||||
case UNW_VE_S4:
|
||||
return "s4";
|
||||
case UNW_VE_S5:
|
||||
return "s5";
|
||||
case UNW_VE_S6:
|
||||
return "s6";
|
||||
case UNW_VE_S7:
|
||||
return "s7";
|
||||
case UNW_VE_S8:
|
||||
return "s8";
|
||||
case UNW_VE_S9:
|
||||
return "s9";
|
||||
case UNW_VE_S10:
|
||||
return "s10";
|
||||
case UNW_VE_S11:
|
||||
return "s11";
|
||||
case UNW_VE_S12:
|
||||
return "s12";
|
||||
case UNW_VE_S13:
|
||||
return "s13";
|
||||
case UNW_VE_S14:
|
||||
return "s14";
|
||||
case UNW_VE_S15:
|
||||
return "s15";
|
||||
case UNW_VE_S16:
|
||||
return "s16";
|
||||
case UNW_VE_S17:
|
||||
return "s17";
|
||||
case UNW_VE_S18:
|
||||
return "s18";
|
||||
case UNW_VE_S19:
|
||||
return "s19";
|
||||
case UNW_VE_S20:
|
||||
return "s20";
|
||||
case UNW_VE_S21:
|
||||
return "s21";
|
||||
case UNW_VE_S22:
|
||||
return "s22";
|
||||
case UNW_VE_S23:
|
||||
return "s23";
|
||||
case UNW_VE_S24:
|
||||
return "s24";
|
||||
case UNW_VE_S25:
|
||||
return "s25";
|
||||
case UNW_VE_S26:
|
||||
return "s26";
|
||||
case UNW_VE_S27:
|
||||
return "s27";
|
||||
case UNW_VE_S28:
|
||||
return "s28";
|
||||
case UNW_VE_S29:
|
||||
return "s29";
|
||||
case UNW_VE_S30:
|
||||
return "s30";
|
||||
case UNW_VE_S31:
|
||||
return "s31";
|
||||
case UNW_VE_S32:
|
||||
return "s32";
|
||||
case UNW_VE_S33:
|
||||
return "s33";
|
||||
case UNW_VE_S34:
|
||||
return "s34";
|
||||
case UNW_VE_S35:
|
||||
return "s35";
|
||||
case UNW_VE_S36:
|
||||
return "s36";
|
||||
case UNW_VE_S37:
|
||||
return "s37";
|
||||
case UNW_VE_S38:
|
||||
return "s38";
|
||||
case UNW_VE_S39:
|
||||
return "s39";
|
||||
case UNW_VE_S40:
|
||||
return "s40";
|
||||
case UNW_VE_S41:
|
||||
return "s41";
|
||||
case UNW_VE_S42:
|
||||
return "s42";
|
||||
case UNW_VE_S43:
|
||||
return "s43";
|
||||
case UNW_VE_S44:
|
||||
return "s44";
|
||||
case UNW_VE_S45:
|
||||
return "s45";
|
||||
case UNW_VE_S46:
|
||||
return "s46";
|
||||
case UNW_VE_S47:
|
||||
return "s47";
|
||||
case UNW_VE_S48:
|
||||
return "s48";
|
||||
case UNW_VE_S49:
|
||||
return "s49";
|
||||
case UNW_VE_S50:
|
||||
return "s50";
|
||||
case UNW_VE_S51:
|
||||
return "s51";
|
||||
case UNW_VE_S52:
|
||||
return "s52";
|
||||
case UNW_VE_S53:
|
||||
return "s53";
|
||||
case UNW_VE_S54:
|
||||
return "s54";
|
||||
case UNW_VE_S55:
|
||||
return "s55";
|
||||
case UNW_VE_S56:
|
||||
return "s56";
|
||||
case UNW_VE_S57:
|
||||
return "s57";
|
||||
case UNW_VE_S58:
|
||||
return "s58";
|
||||
case UNW_VE_S59:
|
||||
return "s59";
|
||||
case UNW_VE_S60:
|
||||
return "s60";
|
||||
case UNW_VE_S61:
|
||||
return "s61";
|
||||
case UNW_VE_S62:
|
||||
return "s62";
|
||||
case UNW_VE_S63:
|
||||
return "s63";
|
||||
case UNW_VE_V0:
|
||||
return "v0";
|
||||
case UNW_VE_V1:
|
||||
return "v1";
|
||||
case UNW_VE_V2:
|
||||
return "v2";
|
||||
case UNW_VE_V3:
|
||||
return "v3";
|
||||
case UNW_VE_V4:
|
||||
return "v4";
|
||||
case UNW_VE_V5:
|
||||
return "v5";
|
||||
case UNW_VE_V6:
|
||||
return "v6";
|
||||
case UNW_VE_V7:
|
||||
return "v7";
|
||||
case UNW_VE_V8:
|
||||
return "v8";
|
||||
case UNW_VE_V9:
|
||||
return "v9";
|
||||
case UNW_VE_V10:
|
||||
return "v10";
|
||||
case UNW_VE_V11:
|
||||
return "v11";
|
||||
case UNW_VE_V12:
|
||||
return "v12";
|
||||
case UNW_VE_V13:
|
||||
return "v13";
|
||||
case UNW_VE_V14:
|
||||
return "v14";
|
||||
case UNW_VE_V15:
|
||||
return "v15";
|
||||
case UNW_VE_V16:
|
||||
return "v16";
|
||||
case UNW_VE_V17:
|
||||
return "v17";
|
||||
case UNW_VE_V18:
|
||||
return "v18";
|
||||
case UNW_VE_V19:
|
||||
return "v19";
|
||||
case UNW_VE_V20:
|
||||
return "v20";
|
||||
case UNW_VE_V21:
|
||||
return "v21";
|
||||
case UNW_VE_V22:
|
||||
return "v22";
|
||||
case UNW_VE_V23:
|
||||
return "v23";
|
||||
case UNW_VE_V24:
|
||||
return "v24";
|
||||
case UNW_VE_V25:
|
||||
return "v25";
|
||||
case UNW_VE_V26:
|
||||
return "v26";
|
||||
case UNW_VE_V27:
|
||||
return "v27";
|
||||
case UNW_VE_V28:
|
||||
return "v28";
|
||||
case UNW_VE_V29:
|
||||
return "v29";
|
||||
case UNW_VE_V30:
|
||||
return "v30";
|
||||
case UNW_VE_V31:
|
||||
return "v31";
|
||||
case UNW_VE_V32:
|
||||
return "v32";
|
||||
case UNW_VE_V33:
|
||||
return "v33";
|
||||
case UNW_VE_V34:
|
||||
return "v34";
|
||||
case UNW_VE_V35:
|
||||
return "v35";
|
||||
case UNW_VE_V36:
|
||||
return "v36";
|
||||
case UNW_VE_V37:
|
||||
return "v37";
|
||||
case UNW_VE_V38:
|
||||
return "v38";
|
||||
case UNW_VE_V39:
|
||||
return "v39";
|
||||
case UNW_VE_V40:
|
||||
return "v40";
|
||||
case UNW_VE_V41:
|
||||
return "v41";
|
||||
case UNW_VE_V42:
|
||||
return "v42";
|
||||
case UNW_VE_V43:
|
||||
return "v43";
|
||||
case UNW_VE_V44:
|
||||
return "v44";
|
||||
case UNW_VE_V45:
|
||||
return "v45";
|
||||
case UNW_VE_V46:
|
||||
return "v46";
|
||||
case UNW_VE_V47:
|
||||
return "v47";
|
||||
case UNW_VE_V48:
|
||||
return "v48";
|
||||
case UNW_VE_V49:
|
||||
return "v49";
|
||||
case UNW_VE_V50:
|
||||
return "v50";
|
||||
case UNW_VE_V51:
|
||||
return "v51";
|
||||
case UNW_VE_V52:
|
||||
return "v52";
|
||||
case UNW_VE_V53:
|
||||
return "v53";
|
||||
case UNW_VE_V54:
|
||||
return "v54";
|
||||
case UNW_VE_V55:
|
||||
return "v55";
|
||||
case UNW_VE_V56:
|
||||
return "v56";
|
||||
case UNW_VE_V57:
|
||||
return "v57";
|
||||
case UNW_VE_V58:
|
||||
return "v58";
|
||||
case UNW_VE_V59:
|
||||
return "v59";
|
||||
case UNW_VE_V60:
|
||||
return "v60";
|
||||
case UNW_VE_V61:
|
||||
return "v61";
|
||||
case UNW_VE_V62:
|
||||
return "v62";
|
||||
case UNW_VE_V63:
|
||||
return "v63";
|
||||
case UNW_VE_VM0:
|
||||
return "vm0";
|
||||
case UNW_VE_VM1:
|
||||
return "vm1";
|
||||
case UNW_VE_VM2:
|
||||
return "vm2";
|
||||
case UNW_VE_VM3:
|
||||
return "vm3";
|
||||
case UNW_VE_VM4:
|
||||
return "vm4";
|
||||
case UNW_VE_VM5:
|
||||
return "vm5";
|
||||
case UNW_VE_VM6:
|
||||
return "vm6";
|
||||
case UNW_VE_VM7:
|
||||
return "vm7";
|
||||
case UNW_VE_VM8:
|
||||
return "vm8";
|
||||
case UNW_VE_VM9:
|
||||
return "vm9";
|
||||
case UNW_VE_VM10:
|
||||
return "vm10";
|
||||
case UNW_VE_VM11:
|
||||
return "vm11";
|
||||
case UNW_VE_VM12:
|
||||
return "vm12";
|
||||
case UNW_VE_VM13:
|
||||
return "vm13";
|
||||
case UNW_VE_VM14:
|
||||
return "vm14";
|
||||
case UNW_VE_VM15:
|
||||
return "vm15";
|
||||
}
|
||||
return "unknown register";
|
||||
}
|
||||
#endif // _LIBUNWIND_TARGET_VE
|
||||
|
||||
} // namespace libunwind
|
||||
|
||||
#endif // __REGISTERS_HPP__
|
||||
|
|
|
|||
|
|
@ -32,11 +32,23 @@ struct _Unwind_FunctionContext {
|
|||
// next function in stack of handlers
|
||||
struct _Unwind_FunctionContext *prev;
|
||||
|
||||
#if defined(__ve__)
|
||||
// VE requires to store 64 bit pointers in the buffer for SjLj execption.
|
||||
// We expand the size of values defined here. This size must be matched
|
||||
// to the size returned by TargetMachine::getSjLjDataSize().
|
||||
|
||||
// set by calling function before registering to be the landing pad
|
||||
uint64_t resumeLocation;
|
||||
|
||||
// set by personality handler to be parameters passed to landing pad function
|
||||
uint64_t resumeParameters[4];
|
||||
#else
|
||||
// set by calling function before registering to be the landing pad
|
||||
uint32_t resumeLocation;
|
||||
|
||||
// set by personality handler to be parameters passed to landing pad function
|
||||
uint32_t resumeParameters[4];
|
||||
#endif
|
||||
|
||||
// set by calling function before registering
|
||||
_Unwind_Personality_Fn personality; // arm offset=24
|
||||
|
|
|
|||
|
|
@ -925,6 +925,25 @@ private:
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(_LIBUNWIND_TARGET_LINUX) && defined(_LIBUNWIND_TARGET_AARCH64)
|
||||
bool setInfoForSigReturn() {
|
||||
R dummy;
|
||||
return setInfoForSigReturn(dummy);
|
||||
}
|
||||
int stepThroughSigReturn() {
|
||||
R dummy;
|
||||
return stepThroughSigReturn(dummy);
|
||||
}
|
||||
bool setInfoForSigReturn(Registers_arm64 &);
|
||||
int stepThroughSigReturn(Registers_arm64 &);
|
||||
template <typename Registers> bool setInfoForSigReturn(Registers &) {
|
||||
return false;
|
||||
}
|
||||
template <typename Registers> int stepThroughSigReturn(Registers &) {
|
||||
return UNW_STEP_END;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND)
|
||||
bool getInfoFromFdeCie(const typename CFI_Parser<A>::FDE_Info &fdeInfo,
|
||||
const typename CFI_Parser<A>::CIE_Info &cieInfo,
|
||||
|
|
@ -1179,6 +1198,9 @@ private:
|
|||
unw_proc_info_t _info;
|
||||
bool _unwindInfoMissing;
|
||||
bool _isSignalFrame;
|
||||
#if defined(_LIBUNWIND_TARGET_LINUX) && defined(_LIBUNWIND_TARGET_AARCH64)
|
||||
bool _isSigReturn = false;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -1873,7 +1895,11 @@ bool UnwindCursor<A, R>::getInfoFromSEH(pint_t pc) {
|
|||
|
||||
template <typename A, typename R>
|
||||
void UnwindCursor<A, R>::setInfoBasedOnIPRegister(bool isReturnAddress) {
|
||||
pint_t pc = (pint_t)this->getReg(UNW_REG_IP);
|
||||
#if defined(_LIBUNWIND_TARGET_LINUX) && defined(_LIBUNWIND_TARGET_AARCH64)
|
||||
_isSigReturn = false;
|
||||
#endif
|
||||
|
||||
pint_t pc = static_cast<pint_t>(this->getReg(UNW_REG_IP));
|
||||
#if defined(_LIBUNWIND_ARM_EHABI)
|
||||
// Remove the thumb bit so the IP represents the actual instruction address.
|
||||
// This matches the behaviour of _Unwind_GetIP on arm.
|
||||
|
|
@ -1971,10 +1997,77 @@ void UnwindCursor<A, R>::setInfoBasedOnIPRegister(bool isReturnAddress) {
|
|||
}
|
||||
#endif // #if defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND)
|
||||
|
||||
#if defined(_LIBUNWIND_TARGET_LINUX) && defined(_LIBUNWIND_TARGET_AARCH64)
|
||||
if (setInfoForSigReturn())
|
||||
return;
|
||||
#endif
|
||||
|
||||
// no unwind info, flag that we can't reliably unwind
|
||||
_unwindInfoMissing = true;
|
||||
}
|
||||
|
||||
#if defined(_LIBUNWIND_TARGET_LINUX) && defined(_LIBUNWIND_TARGET_AARCH64)
|
||||
template <typename A, typename R>
|
||||
bool UnwindCursor<A, R>::setInfoForSigReturn(Registers_arm64 &) {
|
||||
// Look for the sigreturn trampoline. The trampoline's body is two
|
||||
// specific instructions (see below). Typically the trampoline comes from the
|
||||
// vDSO[1] (i.e. the __kernel_rt_sigreturn function). A libc might provide its
|
||||
// own restorer function, though, or user-mode QEMU might write a trampoline
|
||||
// onto the stack.
|
||||
//
|
||||
// This special code path is a fallback that is only used if the trampoline
|
||||
// lacks proper (e.g. DWARF) unwind info. On AArch64, a new DWARF register
|
||||
// constant for the PC needs to be defined before DWARF can handle a signal
|
||||
// trampoline. This code may segfault if the target PC is unreadable, e.g.:
|
||||
// - The PC points at a function compiled without unwind info, and which is
|
||||
// part of an execute-only mapping (e.g. using -Wl,--execute-only).
|
||||
// - The PC is invalid and happens to point to unreadable or unmapped memory.
|
||||
//
|
||||
// [1] https://github.com/torvalds/linux/blob/master/arch/arm64/kernel/vdso/sigreturn.S
|
||||
const pint_t pc = static_cast<pint_t>(this->getReg(UNW_REG_IP));
|
||||
// Look for instructions: mov x8, #0x8b; svc #0x0
|
||||
if (_addressSpace.get32(pc) == 0xd2801168 &&
|
||||
_addressSpace.get32(pc + 4) == 0xd4000001) {
|
||||
_info = {};
|
||||
_isSigReturn = true;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
template <typename A, typename R>
|
||||
int UnwindCursor<A, R>::stepThroughSigReturn(Registers_arm64 &) {
|
||||
// In the signal trampoline frame, sp points to an rt_sigframe[1], which is:
|
||||
// - 128-byte siginfo struct
|
||||
// - ucontext struct:
|
||||
// - 8-byte long (uc_flags)
|
||||
// - 8-byte pointer (uc_link)
|
||||
// - 24-byte stack_t
|
||||
// - 128-byte signal set
|
||||
// - 8 bytes of padding because sigcontext has 16-byte alignment
|
||||
// - sigcontext/mcontext_t
|
||||
// [1] https://github.com/torvalds/linux/blob/master/arch/arm64/kernel/signal.c
|
||||
const pint_t kOffsetSpToSigcontext = (128 + 8 + 8 + 24 + 128 + 8); // 304
|
||||
|
||||
// Offsets from sigcontext to each register.
|
||||
const pint_t kOffsetGprs = 8; // offset to "__u64 regs[31]" field
|
||||
const pint_t kOffsetSp = 256; // offset to "__u64 sp" field
|
||||
const pint_t kOffsetPc = 264; // offset to "__u64 pc" field
|
||||
|
||||
pint_t sigctx = _registers.getSP() + kOffsetSpToSigcontext;
|
||||
|
||||
for (int i = 0; i <= 30; ++i) {
|
||||
uint64_t value = _addressSpace.get64(sigctx + kOffsetGprs +
|
||||
static_cast<pint_t>(i * 8));
|
||||
_registers.setRegister(UNW_ARM64_X0 + i, value);
|
||||
}
|
||||
_registers.setSP(_addressSpace.get64(sigctx + kOffsetSp));
|
||||
_registers.setIP(_addressSpace.get64(sigctx + kOffsetPc));
|
||||
_isSignalFrame = true;
|
||||
return UNW_STEP_SUCCESS;
|
||||
}
|
||||
#endif // defined(_LIBUNWIND_TARGET_LINUX) && defined(_LIBUNWIND_TARGET_AARCH64)
|
||||
|
||||
template <typename A, typename R>
|
||||
int UnwindCursor<A, R>::step() {
|
||||
// Bottom of stack is defined is when unwind info cannot be found.
|
||||
|
|
@ -1983,20 +2076,27 @@ int UnwindCursor<A, R>::step() {
|
|||
|
||||
// Use unwinding info to modify register set as if function returned.
|
||||
int result;
|
||||
#if defined(_LIBUNWIND_TARGET_LINUX) && defined(_LIBUNWIND_TARGET_AARCH64)
|
||||
if (_isSigReturn) {
|
||||
result = this->stepThroughSigReturn();
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
#if defined(_LIBUNWIND_SUPPORT_COMPACT_UNWIND)
|
||||
result = this->stepWithCompactEncoding();
|
||||
result = this->stepWithCompactEncoding();
|
||||
#elif defined(_LIBUNWIND_SUPPORT_SEH_UNWIND)
|
||||
result = this->stepWithSEHData();
|
||||
result = this->stepWithSEHData();
|
||||
#elif defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND)
|
||||
result = this->stepWithDwarfFDE();
|
||||
result = this->stepWithDwarfFDE();
|
||||
#elif defined(_LIBUNWIND_ARM_EHABI)
|
||||
result = this->stepWithEHABI();
|
||||
result = this->stepWithEHABI();
|
||||
#else
|
||||
#error Need _LIBUNWIND_SUPPORT_COMPACT_UNWIND or \
|
||||
_LIBUNWIND_SUPPORT_SEH_UNWIND or \
|
||||
_LIBUNWIND_SUPPORT_DWARF_UNWIND or \
|
||||
_LIBUNWIND_ARM_EHABI
|
||||
#endif
|
||||
}
|
||||
|
||||
// update info based on new PC
|
||||
if (result == UNW_STEP_SUCCESS) {
|
||||
|
|
|
|||
|
|
@ -62,6 +62,8 @@ _LIBUNWIND_HIDDEN int __unw_init_local(unw_cursor_t *cursor,
|
|||
# define REGISTER_KIND Registers_sparc
|
||||
#elif defined(__riscv) && __riscv_xlen == 64
|
||||
# define REGISTER_KIND Registers_riscv
|
||||
#elif defined(__ve__)
|
||||
# define REGISTER_KIND Registers_ve
|
||||
#else
|
||||
# error Architecture not supported
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue