34#ifndef _LOCALE_CLASSES_TCC
35#define _LOCALE_CLASSES_TCC 1
38#pragma GCC system_header
40#pragma GCC diagnostic push
41#pragma GCC diagnostic ignored "-Wc++11-extensions"
42#pragma GCC diagnostic ignored "-Wvariadic-macros"
44namespace std _GLIBCXX_VISIBILITY(default)
46_GLIBCXX_BEGIN_NAMESPACE_VERSION
48 template<
typename _Facet>
54 if (__builtin_expect(!__f, 0))
56 _M_impl = __other._M_impl;
57 _M_impl->_M_add_reference();
61 _M_impl =
new _Impl(*__other._M_impl, 1);
64 { _M_impl->_M_install_facet(&_Facet::id, __f); }
67 _M_impl->_M_remove_reference();
68 __throw_exception_again;
70 delete [] _M_impl->_M_names[0];
71 _M_impl->_M_names[0] = 0;
74 template<
typename _Facet>
79#if __cpp_lib_type_trait_variable_templates
80 static_assert(__is_facet<_Facet>,
"Template argument must be a facet");
83 _Impl* __tmp =
new _Impl(*_M_impl, 1);
86 __tmp->_M_replace_facet(__other._M_impl, &_Facet::id);
90 __tmp->_M_remove_reference();
91 __throw_exception_again;
93 delete[] __tmp->_M_names[0];
94 __tmp->_M_names[0] = 0;
98 template<
typename _CharT,
typename _Traits,
typename _Alloc>
105 const __collate_type& __collate = use_facet<__collate_type>(*
this);
106 return (__collate.compare(__s1.
data(), __s1.
data() + __s1.
length(),
110#pragma GCC diagnostic push
111#pragma GCC diagnostic ignored "-Wc++17-extensions"
112 template<
typename _Facet>
114 __try_use_facet(
const locale& __loc) _GLIBCXX_NOTHROW
116 const size_t __i = _Facet::id._M_id();
117 const locale::facet** __facets = __loc._M_impl->_M_facets;
121#define _GLIBCXX_STD_FACET(...) \
122 if _GLIBCXX_CONSTEXPR (__is_same(const _Facet, const __VA_ARGS__)) \
123 return static_cast<const _Facet*>(__facets[__i])
125 _GLIBCXX_STD_FACET(ctype<char>);
126 _GLIBCXX_STD_FACET(num_get<char>);
127 _GLIBCXX_STD_FACET(num_put<char>);
128 _GLIBCXX_STD_FACET(codecvt<char, char, mbstate_t>);
129 _GLIBCXX_STD_FACET(collate<char>);
130 _GLIBCXX_STD_FACET(moneypunct<char>);
131 _GLIBCXX_STD_FACET(moneypunct<char, true>);
132 _GLIBCXX_STD_FACET(money_get<char>);
133 _GLIBCXX_STD_FACET(money_put<char>);
134 _GLIBCXX_STD_FACET(numpunct<char>);
135 _GLIBCXX_STD_FACET(time_get<char>);
136 _GLIBCXX_STD_FACET(time_put<char>);
137 _GLIBCXX_STD_FACET(messages<char>);
139#ifdef _GLIBCXX_USE_WCHAR_T
140 _GLIBCXX_STD_FACET(ctype<wchar_t>);
141 _GLIBCXX_STD_FACET(num_get<wchar_t>);
142 _GLIBCXX_STD_FACET(num_put<wchar_t>);
143 _GLIBCXX_STD_FACET(codecvt<wchar_t, char, mbstate_t>);
144 _GLIBCXX_STD_FACET(collate<wchar_t>);
145 _GLIBCXX_STD_FACET(moneypunct<wchar_t>);
146 _GLIBCXX_STD_FACET(moneypunct<wchar_t, true>);
147 _GLIBCXX_STD_FACET(money_get<wchar_t>);
148 _GLIBCXX_STD_FACET(money_put<wchar_t>);
149 _GLIBCXX_STD_FACET(numpunct<wchar_t>);
150 _GLIBCXX_STD_FACET(time_get<wchar_t>);
151 _GLIBCXX_STD_FACET(time_put<wchar_t>);
152 _GLIBCXX_STD_FACET(messages<wchar_t>);
154#if __cplusplus >= 201103L
155 _GLIBCXX_STD_FACET(codecvt<char16_t, char, mbstate_t>);
156 _GLIBCXX_STD_FACET(codecvt<char32_t, char, mbstate_t>);
159#undef _GLIBCXX_STD_FACET
161 if (__i >= __loc._M_impl->_M_facets_size || !__facets[__i])
165 return dynamic_cast<const _Facet*
>(__facets[__i]);
167 return static_cast<const _Facet*
>(__facets[__i]);
170#pragma GCC diagnostic pop
184 template<
typename _Facet>
189#if __cplusplus >= 201103L
191 "template argument must be derived from locale::facet");
193 (void)
static_cast<const _Facet*
>(
static_cast<const locale::facet*
>(0));
195 return std::__try_use_facet<_Facet>(__loc) != 0;
212#pragma GCC diagnostic push
213#pragma GCC diagnostic ignored "-Wdangling-reference"
214 template<
typename _Facet>
219#if __cplusplus >= 201103L
221 "template argument must be derived from locale::facet");
223 (void)
static_cast<const _Facet*
>(
static_cast<const locale::facet*
>(0));
225 if (
const _Facet* __f = std::__try_use_facet<_Facet>(__loc))
229#pragma GCC diagnostic pop
233 template<
typename _CharT>
239 template<
typename _CharT>
241 collate<_CharT>::_M_transform(_CharT*,
const _CharT*,
size_t)
const throw ()
244 template<
typename _CharT>
247 do_compare(
const _CharT* __lo1,
const _CharT* __hi1,
248 const _CharT* __lo2,
const _CharT* __hi2)
const
255 const _CharT* __p = __one.
c_str();
256 const _CharT* __pend = __one.
data() + __one.
length();
257 const _CharT* __q = __two.
c_str();
258 const _CharT* __qend = __two.
data() + __two.
length();
265 const int __res = _M_compare(__p, __q);
271 if (__p == __pend && __q == __qend)
273 else if (__p == __pend)
275 else if (__q == __qend)
283 template<
typename _CharT>
286 do_transform(
const _CharT* __lo,
const _CharT* __hi)
const
293 const _CharT* __p = __str.
c_str();
294 const _CharT* __pend = __str.
data() + __str.
length();
296 size_t __len = (__hi - __lo) * 2;
298 _CharT* __c =
new _CharT[__len];
308 size_t __res = _M_transform(__c, __p, __len);
314 delete [] __c, __c = 0;
315 __c =
new _CharT[__len];
316 __res = _M_transform(__c, __p, __len);
331 __throw_exception_again;
339 template<
typename _CharT>
342 do_hash(
const _CharT* __lo,
const _CharT* __hi)
const
344 unsigned long __val = 0;
345 for (; __lo < __hi; ++__lo)
347 *__lo + ((__val << 7)
348 | (__val >> (__gnu_cxx::__numeric_traits<unsigned long>::
350 return static_cast<long>(__val);
355#if _GLIBCXX_EXTERN_TEMPLATE
361 __try_use_facet<collate<char> >(
const locale&) _GLIBCXX_NOTHROW;
365 use_facet<collate<char> >(
const locale&);
369 has_facet<collate<char> >(
const locale&);
371#ifdef _GLIBCXX_USE_WCHAR_T
377 __try_use_facet<collate<wchar_t> >(
const locale&) _GLIBCXX_NOTHROW;
381 use_facet<collate<wchar_t> >(
const locale&);
385 has_facet<collate<wchar_t> >(
const locale&);
389_GLIBCXX_END_NAMESPACE_VERSION
392#pragma GCC diagnostic pop
const _Facet & use_facet(const locale &__loc)
Return a facet.
bool has_facet(const locale &__loc) noexcept
Test for the presence of a facet.
ISO C++ entities toplevel namespace is std.
Basis for explicit traits specializations.
Managing sequences of characters and character-like objects.
void push_back(_CharT __c)
Append a single character.
const _CharT * data() const noexcept
Return const pointer to contents.
size_type length() const noexcept
Returns the number of characters in the string, not including any null-termination.
basic_string & append(const basic_string &__str)
Append a string to this string.
const _CharT * c_str() const noexcept
Return const pointer to null-terminated contents.
Container class for localization functionality.
locale combine(const locale &__other) const
Construct locale with another facet.
bool operator()(const basic_string< _Char, _Traits, _Alloc > &__s1, const basic_string< _Char, _Traits, _Alloc > &__s2) const
Compare two strings according to collate.
locale()
Default constructor.
Localization functionality base class.
Facet for localized string comparison.
virtual long do_hash(const _CharT *__lo, const _CharT *__hi) const
Return hash of a string.
virtual string_type do_transform(const _CharT *__lo, const _CharT *__hi) const
Transform string to comparable form.
virtual int do_compare(const _CharT *__lo1, const _CharT *__hi1, const _CharT *__lo2, const _CharT *__hi2) const
Compare two strings.
class collate_byname [22.2.4.2].