libstdc++: Always define typedefs and hash functions for wide strings [PR 98725]
The wstring and wstring_view typedefs should be enabled even if <wchar.h> isn't supported, because char_traits<wchar_t> works unconditionally. Similarly, the std::hash specializations for wide strings do not depend on <wchar.h> support. Although the primary template works OK for std::char_traits<wchar_t> in the absence of <wchar.h> support, this patch still defines it as an explicit specialization for compatibility with declarations that expect it to be specialized. The explicit specialization just uses the same __gnu_cxx::char_traits base class as the primary template. libstdc++-v3/ChangeLog: PR libstdc++/98725 * include/bits/char_traits.h (char_traits<wchar_t>): Define explicit specialization unconditionally. * include/bits/basic_string.h (hash<wstring>): Define unconditionally. Do not check _GLIBCXX_USE_WCHAR_T. * include/bits/stringfwd.h (wstring): Likewise. * include/debug/string (wstring): Likewise. * include/experimental/string_view (experimental::wstring_view) (hash<experimental::wstring_view>): Likewise. * include/std/string (pmr::wstring, hash<pmr::wstring>): Likewise. * include/std/string_view (wstring_view, hash<wstring_view>): Likewise.
This commit is contained in:
parent
cfeff094e6
commit
0afb9ebaab
|
@ -3954,7 +3954,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
struct __is_fast_hash<hash<string>> : std::false_type
|
||||
{ };
|
||||
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
/// std::hash specialization for wstring.
|
||||
template<>
|
||||
struct hash<wstring>
|
||||
|
@ -3969,7 +3968,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
template<>
|
||||
struct __is_fast_hash<hash<wstring>> : std::false_type
|
||||
{ };
|
||||
#endif
|
||||
#endif /* _GLIBCXX_COMPATIBILITY_CXX0X */
|
||||
|
||||
#ifdef _GLIBCXX_USE_CHAR8_T
|
||||
|
@ -4034,12 +4032,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
operator""s(const char* __str, size_t __len)
|
||||
{ return basic_string<char>{__str, __len}; }
|
||||
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
_GLIBCXX_DEFAULT_ABI_TAG
|
||||
inline basic_string<wchar_t>
|
||||
operator""s(const wchar_t* __str, size_t __len)
|
||||
{ return basic_string<wchar_t>{__str, __len}; }
|
||||
#endif
|
||||
|
||||
#ifdef _GLIBCXX_USE_CHAR8_T
|
||||
_GLIBCXX_DEFAULT_ABI_TAG
|
||||
|
|
|
@ -256,7 +256,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
* for advice on how to make use of this class for @a unusual character
|
||||
* types. Also, check out include/ext/pod_char_traits.h.
|
||||
*/
|
||||
template<class _CharT>
|
||||
template<typename _CharT>
|
||||
struct char_traits : public __gnu_cxx::char_traits<_CharT>
|
||||
{ };
|
||||
|
||||
|
@ -507,6 +507,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
not_eof(const int_type& __c) _GLIBCXX_NOEXCEPT
|
||||
{ return eq_int_type(__c, eof()) ? 0 : __c; }
|
||||
};
|
||||
#else // _GLIBCXX_USE_WCHAR_T
|
||||
template<>
|
||||
struct char_traits<wchar_t> : public __gnu_cxx::char_traits<wchar_t>
|
||||
{ };
|
||||
#endif //_GLIBCXX_USE_WCHAR_T
|
||||
|
||||
#ifdef _GLIBCXX_USE_CHAR8_T
|
||||
|
|
|
@ -54,9 +54,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
|
||||
template<> struct char_traits<char>;
|
||||
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
template<> struct char_traits<wchar_t>;
|
||||
#endif
|
||||
|
||||
#ifdef _GLIBCXX_USE_CHAR8_T
|
||||
template<> struct char_traits<char8_t>;
|
||||
|
@ -78,10 +76,8 @@ _GLIBCXX_END_NAMESPACE_CXX11
|
|||
/// A string of @c char
|
||||
typedef basic_string<char> string;
|
||||
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
/// A string of @c wchar_t
|
||||
typedef basic_string<wchar_t> wstring;
|
||||
#endif
|
||||
|
||||
#ifdef _GLIBCXX_USE_CHAR8_T
|
||||
/// A string of @c char8_t
|
||||
|
|
|
@ -1298,9 +1298,7 @@ namespace __gnu_debug
|
|||
|
||||
typedef basic_string<char> string;
|
||||
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
typedef basic_string<wchar_t> wstring;
|
||||
#endif
|
||||
|
||||
#ifdef _GLIBCXX_USE_CHAR8_T
|
||||
/// A string of @c char8_t
|
||||
|
|
|
@ -564,9 +564,7 @@ inline namespace fundamentals_v1
|
|||
// basic_string_view typedef names
|
||||
|
||||
using string_view = basic_string_view<char>;
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
using wstring_view = basic_string_view<wchar_t>;
|
||||
#endif
|
||||
#ifdef _GLIBCXX_USE_CHAR8_T
|
||||
using u8string_view = basic_string_view<char8_t>;
|
||||
#endif
|
||||
|
@ -593,7 +591,6 @@ inline namespace fundamentals_v1
|
|||
struct __is_fast_hash<hash<experimental::string_view>> : std::false_type
|
||||
{ };
|
||||
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
template<>
|
||||
struct hash<experimental::wstring_view>
|
||||
: public __hash_base<size_t, wstring>
|
||||
|
@ -607,7 +604,6 @@ inline namespace fundamentals_v1
|
|||
template<>
|
||||
struct __is_fast_hash<hash<experimental::wstring_view>> : std::false_type
|
||||
{ };
|
||||
#endif
|
||||
|
||||
#ifdef _GLIBCXX_USE_CHAR8_T
|
||||
template<>
|
||||
|
@ -665,11 +661,9 @@ namespace experimental
|
|||
operator""sv(const char* __str, size_t __len) noexcept
|
||||
{ return basic_string_view<char>{__str, __len}; }
|
||||
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
inline constexpr basic_string_view<wchar_t>
|
||||
operator""sv(const wchar_t* __str, size_t __len) noexcept
|
||||
{ return basic_string_view<wchar_t>{__str, __len}; }
|
||||
#endif
|
||||
|
||||
#ifdef _GLIBCXX_USE_CHAR8_T
|
||||
inline constexpr basic_string_view<char8_t>
|
||||
|
|
|
@ -68,9 +68,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
#endif
|
||||
using u16string = basic_string<char16_t>;
|
||||
using u32string = basic_string<char32_t>;
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
using wstring = basic_string<wchar_t>;
|
||||
#endif
|
||||
} // namespace pmr
|
||||
|
||||
template<typename _Str>
|
||||
|
@ -100,12 +98,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
struct hash<pmr::u32string>
|
||||
: public __hash_string_base<pmr::u32string>
|
||||
{ };
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
template<>
|
||||
struct hash<pmr::wstring>
|
||||
: public __hash_string_base<pmr::wstring>
|
||||
{ };
|
||||
#endif
|
||||
|
||||
_GLIBCXX_END_NAMESPACE_VERSION
|
||||
} // namespace std
|
||||
|
|
|
@ -674,9 +674,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
// basic_string_view typedef names
|
||||
|
||||
using string_view = basic_string_view<char>;
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
using wstring_view = basic_string_view<wchar_t>;
|
||||
#endif
|
||||
#ifdef _GLIBCXX_USE_CHAR8_T
|
||||
using u8string_view = basic_string_view<char8_t>;
|
||||
#endif
|
||||
|
@ -701,7 +699,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
struct __is_fast_hash<hash<string_view>> : std::false_type
|
||||
{ };
|
||||
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
template<>
|
||||
struct hash<wstring_view>
|
||||
: public __hash_base<size_t, wstring_view>
|
||||
|
@ -715,7 +712,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
template<>
|
||||
struct __is_fast_hash<hash<wstring_view>> : std::false_type
|
||||
{ };
|
||||
#endif
|
||||
|
||||
#ifdef _GLIBCXX_USE_CHAR8_T
|
||||
template<>
|
||||
|
@ -770,11 +766,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
operator""sv(const char* __str, size_t __len) noexcept
|
||||
{ return basic_string_view<char>{__str, __len}; }
|
||||
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
inline constexpr basic_string_view<wchar_t>
|
||||
operator""sv(const wchar_t* __str, size_t __len) noexcept
|
||||
{ return basic_string_view<wchar_t>{__str, __len}; }
|
||||
#endif
|
||||
|
||||
#ifdef _GLIBCXX_USE_CHAR8_T
|
||||
inline constexpr basic_string_view<char8_t>
|
||||
|
|
Loading…
Reference in New Issue