[libc++][NFC] Merge identical char_traits functions into a base class (#97700)
This commit is contained in:
parent
9374f83a73
commit
2da0055924
@ -170,31 +170,72 @@ struct _LIBCPP_TEMPLATE_VIS char_traits<char> {
|
|||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT { return int_type(EOF); }
|
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT { return int_type(EOF); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <class _CharT, class _IntT, _IntT _EOFVal>
|
||||||
|
struct __char_traits_base {
|
||||||
|
using char_type = _CharT;
|
||||||
|
using int_type = _IntT;
|
||||||
|
using off_type = streamoff;
|
||||||
|
using state_type = mbstate_t;
|
||||||
|
#if _LIBCPP_STD_VER >= 20
|
||||||
|
using comparison_category = strong_ordering;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// There are different aliases for the different char types, but they are all aliases to this type
|
||||||
|
using pos_type = fpos<mbstate_t>;
|
||||||
|
|
||||||
|
_LIBCPP_HIDE_FROM_ABI static inline _LIBCPP_CONSTEXPR_SINCE_CXX17 void
|
||||||
|
assign(char_type& __lhs, const char_type& __rhs) _NOEXCEPT {
|
||||||
|
__lhs = __rhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR bool eq(char_type __lhs, char_type __rhs) _NOEXCEPT {
|
||||||
|
return __lhs == __rhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR bool lt(char_type __lhs, char_type __rhs) _NOEXCEPT {
|
||||||
|
return __lhs < __rhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX20 char_type*
|
||||||
|
move(char_type* __dest, const char_type* __src, size_t __n) _NOEXCEPT {
|
||||||
|
return std::__constexpr_memmove(__dest, __src, __element_count(__n));
|
||||||
|
}
|
||||||
|
|
||||||
|
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX20 char_type*
|
||||||
|
copy(char_type* __dest, const char_type* __src, size_t __n) _NOEXCEPT {
|
||||||
|
_LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(!std::__is_pointer_in_range(__dest, __dest + __n, __src),
|
||||||
|
"char_traits::copy: source and destination ranges overlap");
|
||||||
|
return std::__constexpr_memmove(__dest, __src, __element_count(__n));
|
||||||
|
}
|
||||||
|
|
||||||
|
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX20 char_type*
|
||||||
|
assign(char_type* __str, size_t __n, char_type __fill_char) _NOEXCEPT {
|
||||||
|
std::fill_n(__str, __n, __fill_char);
|
||||||
|
return __str;
|
||||||
|
}
|
||||||
|
|
||||||
|
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT {
|
||||||
|
return char_type(__c);
|
||||||
|
}
|
||||||
|
|
||||||
|
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT { return int_type(__c); }
|
||||||
|
|
||||||
|
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR bool eq_int_type(int_type __lhs, int_type __rhs) _NOEXCEPT {
|
||||||
|
return __lhs == __rhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT { return _EOFVal; }
|
||||||
|
|
||||||
|
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT {
|
||||||
|
return eq_int_type(__c, eof()) ? static_cast<int_type>(~eof()) : __c;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// char_traits<wchar_t>
|
// char_traits<wchar_t>
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
||||||
template <>
|
template <>
|
||||||
struct _LIBCPP_TEMPLATE_VIS char_traits<wchar_t> {
|
struct _LIBCPP_TEMPLATE_VIS char_traits<wchar_t> : __char_traits_base<wchar_t, wint_t, static_cast<wint_t>(WEOF)> {
|
||||||
using char_type = wchar_t;
|
|
||||||
using int_type = wint_t;
|
|
||||||
using off_type = streamoff;
|
|
||||||
using pos_type = streampos;
|
|
||||||
using state_type = mbstate_t;
|
|
||||||
# if _LIBCPP_STD_VER >= 20
|
|
||||||
using comparison_category = strong_ordering;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 void
|
|
||||||
assign(char_type& __c1, const char_type& __c2) _NOEXCEPT {
|
|
||||||
__c1 = __c2;
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT {
|
|
||||||
return __c1 == __c2;
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT {
|
|
||||||
return __c1 < __c2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 int
|
static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 int
|
||||||
compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT {
|
compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT {
|
||||||
if (__n == 0)
|
if (__n == 0)
|
||||||
@ -212,63 +253,14 @@ struct _LIBCPP_TEMPLATE_VIS char_traits<wchar_t> {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
return std::__constexpr_wmemchr(__s, __a, __n);
|
return std::__constexpr_wmemchr(__s, __a, __n);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 char_type*
|
|
||||||
move(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT {
|
|
||||||
return std::__constexpr_memmove(__s1, __s2, __element_count(__n));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 char_type*
|
|
||||||
copy(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT {
|
|
||||||
_LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(!std::__is_pointer_in_range(__s1, __s1 + __n, __s2),
|
|
||||||
"char_traits::copy: source and destination ranges overlap");
|
|
||||||
std::__constexpr_memmove(__s1, __s2, __element_count(__n));
|
|
||||||
return __s1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 char_type*
|
|
||||||
assign(char_type* __s, size_t __n, char_type __a) _NOEXCEPT {
|
|
||||||
std::fill_n(__s, __n, __a);
|
|
||||||
return __s;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT {
|
|
||||||
return eq_int_type(__c, eof()) ? ~eof() : __c;
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT {
|
|
||||||
return char_type(__c);
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT {
|
|
||||||
return int_type(__c);
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT {
|
|
||||||
return __c1 == __c2;
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT { return int_type(WEOF); }
|
|
||||||
};
|
};
|
||||||
#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_CHAR8_T
|
#ifndef _LIBCPP_HAS_NO_CHAR8_T
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct _LIBCPP_TEMPLATE_VIS char_traits<char8_t> {
|
struct _LIBCPP_TEMPLATE_VIS char_traits<char8_t>
|
||||||
using char_type = char8_t;
|
: __char_traits_base<char8_t, unsigned int, static_cast<unsigned int>(EOF)> {
|
||||||
using int_type = unsigned int;
|
|
||||||
using off_type = streamoff;
|
|
||||||
using pos_type = u8streampos;
|
|
||||||
using state_type = mbstate_t;
|
|
||||||
# if _LIBCPP_STD_VER >= 20
|
|
||||||
using comparison_category = strong_ordering;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI constexpr void assign(char_type& __c1, const char_type& __c2) noexcept {
|
|
||||||
__c1 = __c2;
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI constexpr bool eq(char_type __c1, char_type __c2) noexcept {
|
|
||||||
return __c1 == __c2;
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI constexpr bool lt(char_type __c1, char_type __c2) noexcept { return __c1 < __c2; }
|
|
||||||
|
|
||||||
static _LIBCPP_HIDE_FROM_ABI constexpr int
|
static _LIBCPP_HIDE_FROM_ABI constexpr int
|
||||||
compare(const char_type* __s1, const char_type* __s2, size_t __n) noexcept {
|
compare(const char_type* __s1, const char_type* __s2, size_t __n) noexcept {
|
||||||
return std::__constexpr_memcmp(__s1, __s2, __element_count(__n));
|
return std::__constexpr_memcmp(__s1, __s2, __element_count(__n));
|
||||||
@ -282,61 +274,13 @@ struct _LIBCPP_TEMPLATE_VIS char_traits<char8_t> {
|
|||||||
find(const char_type* __s, size_t __n, const char_type& __a) noexcept {
|
find(const char_type* __s, size_t __n, const char_type& __a) noexcept {
|
||||||
return std::__constexpr_memchr(__s, __a, __n);
|
return std::__constexpr_memchr(__s, __a, __n);
|
||||||
}
|
}
|
||||||
|
|
||||||
static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 char_type*
|
|
||||||
move(char_type* __s1, const char_type* __s2, size_t __n) noexcept {
|
|
||||||
return std::__constexpr_memmove(__s1, __s2, __element_count(__n));
|
|
||||||
}
|
|
||||||
|
|
||||||
static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 char_type*
|
|
||||||
copy(char_type* __s1, const char_type* __s2, size_t __n) noexcept {
|
|
||||||
_LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(!std::__is_pointer_in_range(__s1, __s1 + __n, __s2),
|
|
||||||
"char_traits::copy: source and destination ranges overlap");
|
|
||||||
std::__constexpr_memmove(__s1, __s2, __element_count(__n));
|
|
||||||
return __s1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 char_type*
|
|
||||||
assign(char_type* __s, size_t __n, char_type __a) noexcept {
|
|
||||||
std::fill_n(__s, __n, __a);
|
|
||||||
return __s;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI constexpr int_type not_eof(int_type __c) noexcept {
|
|
||||||
return eq_int_type(__c, eof()) ? ~eof() : __c;
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI constexpr char_type to_char_type(int_type __c) noexcept { return char_type(__c); }
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI constexpr int_type to_int_type(char_type __c) noexcept { return int_type(__c); }
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI constexpr bool eq_int_type(int_type __c1, int_type __c2) noexcept {
|
|
||||||
return __c1 == __c2;
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI constexpr int_type eof() noexcept { return int_type(EOF); }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // _LIBCPP_HAS_NO_CHAR8_T
|
#endif // _LIBCPP_HAS_NO_CHAR8_T
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct _LIBCPP_TEMPLATE_VIS char_traits<char16_t> {
|
struct _LIBCPP_TEMPLATE_VIS char_traits<char16_t>
|
||||||
using char_type = char16_t;
|
: __char_traits_base<char16_t, uint_least16_t, static_cast<uint_least16_t>(0xFFFF)> {
|
||||||
using int_type = uint_least16_t;
|
|
||||||
using off_type = streamoff;
|
|
||||||
using pos_type = u16streampos;
|
|
||||||
using state_type = mbstate_t;
|
|
||||||
#if _LIBCPP_STD_VER >= 20
|
|
||||||
using comparison_category = strong_ordering;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 void
|
|
||||||
assign(char_type& __c1, const char_type& __c2) _NOEXCEPT {
|
|
||||||
__c1 = __c2;
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT {
|
|
||||||
return __c1 == __c2;
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT {
|
|
||||||
return __c1 < __c2;
|
|
||||||
}
|
|
||||||
|
|
||||||
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX17 int
|
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX17 int
|
||||||
compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
|
compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
|
||||||
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX17 size_t length(const char_type* __s) _NOEXCEPT;
|
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX17 size_t length(const char_type* __s) _NOEXCEPT;
|
||||||
@ -349,38 +293,6 @@ struct _LIBCPP_TEMPLATE_VIS char_traits<char16_t> {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
return __match;
|
return __match;
|
||||||
}
|
}
|
||||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static char_type*
|
|
||||||
move(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT {
|
|
||||||
return std::__constexpr_memmove(__s1, __s2, __element_count(__n));
|
|
||||||
}
|
|
||||||
|
|
||||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static char_type*
|
|
||||||
copy(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT {
|
|
||||||
_LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(!std::__is_pointer_in_range(__s1, __s1 + __n, __s2),
|
|
||||||
"char_traits::copy: source and destination ranges overlap");
|
|
||||||
std::__constexpr_memmove(__s1, __s2, __element_count(__n));
|
|
||||||
return __s1;
|
|
||||||
}
|
|
||||||
|
|
||||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static char_type*
|
|
||||||
assign(char_type* __s, size_t __n, char_type __a) _NOEXCEPT {
|
|
||||||
std::fill_n(__s, __n, __a);
|
|
||||||
return __s;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT {
|
|
||||||
return eq_int_type(__c, eof()) ? ~eof() : __c;
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT {
|
|
||||||
return char_type(__c);
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT {
|
|
||||||
return int_type(__c);
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT {
|
|
||||||
return __c1 == __c2;
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT { return int_type(0xFFFF); }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline _LIBCPP_CONSTEXPR_SINCE_CXX17 int
|
inline _LIBCPP_CONSTEXPR_SINCE_CXX17 int
|
||||||
@ -402,27 +314,8 @@ inline _LIBCPP_CONSTEXPR_SINCE_CXX17 size_t char_traits<char16_t>::length(const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct _LIBCPP_TEMPLATE_VIS char_traits<char32_t> {
|
struct _LIBCPP_TEMPLATE_VIS char_traits<char32_t>
|
||||||
using char_type = char32_t;
|
: __char_traits_base<char32_t, uint_least32_t, static_cast<uint_least32_t>(0xFFFFFFFF)> {
|
||||||
using int_type = uint_least32_t;
|
|
||||||
using off_type = streamoff;
|
|
||||||
using pos_type = u32streampos;
|
|
||||||
using state_type = mbstate_t;
|
|
||||||
#if _LIBCPP_STD_VER >= 20
|
|
||||||
using comparison_category = strong_ordering;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 void
|
|
||||||
assign(char_type& __c1, const char_type& __c2) _NOEXCEPT {
|
|
||||||
__c1 = __c2;
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT {
|
|
||||||
return __c1 == __c2;
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT {
|
|
||||||
return __c1 < __c2;
|
|
||||||
}
|
|
||||||
|
|
||||||
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX17 int
|
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX17 int
|
||||||
compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
|
compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
|
||||||
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX17 size_t length(const char_type* __s) _NOEXCEPT;
|
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX17 size_t length(const char_type* __s) _NOEXCEPT;
|
||||||
@ -435,37 +328,6 @@ struct _LIBCPP_TEMPLATE_VIS char_traits<char32_t> {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
return __match;
|
return __match;
|
||||||
}
|
}
|
||||||
|
|
||||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static char_type*
|
|
||||||
move(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT {
|
|
||||||
return std::__constexpr_memmove(__s1, __s2, __element_count(__n));
|
|
||||||
}
|
|
||||||
|
|
||||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static char_type*
|
|
||||||
copy(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT {
|
|
||||||
std::__constexpr_memmove(__s1, __s2, __element_count(__n));
|
|
||||||
return __s1;
|
|
||||||
}
|
|
||||||
|
|
||||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static char_type*
|
|
||||||
assign(char_type* __s, size_t __n, char_type __a) _NOEXCEPT {
|
|
||||||
std::fill_n(__s, __n, __a);
|
|
||||||
return __s;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT {
|
|
||||||
return eq_int_type(__c, eof()) ? ~eof() : __c;
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT {
|
|
||||||
return char_type(__c);
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT {
|
|
||||||
return int_type(__c);
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT {
|
|
||||||
return __c1 == __c2;
|
|
||||||
}
|
|
||||||
static inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT { return int_type(0xFFFFFFFF); }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline _LIBCPP_CONSTEXPR_SINCE_CXX17 int
|
inline _LIBCPP_CONSTEXPR_SINCE_CXX17 int
|
||||||
|
Loading…
x
Reference in New Issue
Block a user