34 #ifndef _LOCALE_CLASSES_H 35 #define _LOCALE_CLASSES_H 1 37 #pragma GCC system_header 43 namespace std _GLIBCXX_VISIBILITY(default)
45 _GLIBCXX_BEGIN_NAMESPACE_VERSION
77 template<
typename _Facet>
81 template<
typename _Facet>
85 template<
typename _Facet>
87 __try_use_facet(
const locale&) _GLIBCXX_NOTHROW;
89 template<
typename _Cache>
90 friend struct __use_cache;
157 #if __cplusplus >= 201103L 209 template<
typename _Facet>
224 operator=(const
locale& __other) throw();
238 template<typename _Facet>
247 _GLIBCXX_DEFAULT_ABI_TAG
259 operator==(const
locale& __other) const throw();
261 #if __cpp_impl_three_way_comparison < 201907L 269 operator!=(
const locale& __other)
const throw()
288 template<
typename _Char,
typename _Traits,
typename _Alloc>
290 operator()(
const basic_string<_Char, _Traits, _Alloc>& __s1,
291 const basic_string<_Char, _Traits, _Alloc>& __s2)
const;
318 static _Impl* _S_classic;
321 static _Impl* _S_global;
327 static const char*
const*
const _S_categories;
339 enum { _S_categories_size = 6 + _GLIBCXX_NUM_CATEGORIES };
342 static __gthread_once_t _S_once;
352 _S_initialize_once() throw();
360 #if _GLIBCXX_USE_CXX11_ABI 361 static const id*
const _S_twinned_facets[];
381 friend class locale::_Impl;
383 mutable _Atomic_word _M_refcount;
386 static __c_locale _S_c_locale;
389 static const char _S_c_name[2];
392 static __gthread_once_t _S_once;
396 _S_initialize_once();
409 facet(
size_t __refs = 0) throw() : _M_refcount(__refs ? 1 : 0)
417 _S_create_c_locale(__c_locale& __cloc,
const char* __s,
418 __c_locale __old = 0);
421 _S_clone_c_locale(__c_locale& __cloc)
throw();
424 _S_destroy_c_locale(__c_locale& __cloc);
427 _S_lc_ctype_c_locale(__c_locale __cloc,
const char* __s);
434 _GLIBCXX_CONST
static const char*
435 _S_get_c_name() throw();
437 #if __cplusplus < 201103L 442 operator=(
const facet&);
447 operator=(
const facet&) =
delete;
452 _M_add_reference()
const throw()
453 { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); }
456 _M_remove_reference()
const throw()
459 _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_refcount);
460 if (__gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1) == 1)
462 _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_refcount);
470 const facet* _M_sso_shim(
const id*)
const;
471 const facet* _M_cow_shim(
const id*)
const;
493 friend class locale::_Impl;
495 template<
typename _Facet>
499 template<
typename _Facet>
503 template<
typename _Facet>
505 __try_use_facet(
const locale&) _GLIBCXX_NOTHROW;
510 mutable size_t _M_index;
513 static _Atomic_word _S_refcount;
516 operator=(
const id&);
527 _M_id()
const throw();
539 template<
typename _Facet>
543 template<
typename _Facet>
547 template<
typename _Facet>
549 __try_use_facet(
const locale&) _GLIBCXX_NOTHROW;
551 template<
typename _Cache>
552 friend struct __use_cache;
556 _Atomic_word _M_refcount;
557 const facet** _M_facets;
558 size_t _M_facets_size;
559 const facet** _M_caches;
562 static const locale::id*
const _S_id_numeric[];
563 static const locale::id*
const _S_id_collate[];
565 static const locale::id*
const _S_id_monetary[];
566 static const locale::id*
const _S_id_messages[];
567 static const locale::id*
const*
const _S_facet_categories[];
570 _M_add_reference() throw()
571 { __gnu_cxx::__atomic_add_dispatch(&_M_refcount, 1); }
574 _M_remove_reference() throw()
577 _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_refcount);
578 if (__gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1) == 1)
580 _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_refcount);
588 _Impl(
const _Impl&,
size_t);
589 _Impl(
const char*,
size_t);
590 _Impl(
size_t)
throw();
597 operator=(const _Impl&);
605 for (
size_t __i = 0; __ret && __i < _S_categories_size - 1; ++__i)
606 __ret = __builtin_strcmp(_M_names[__i], _M_names[__i + 1]) == 0;
611 _M_replace_categories(
const _Impl*,
category);
614 _M_replace_category(
const _Impl*,
const locale::id*
const*);
617 _M_replace_facet(
const _Impl*,
const locale::id*);
620 _M_install_facet(
const locale::id*,
const facet*);
622 template<
typename _Facet>
624 _M_init_facet(_Facet* __facet)
625 { _M_install_facet(&_Facet::id, __facet); }
627 template<
typename _Facet>
629 _M_init_facet_unchecked(_Facet* __facet)
631 __facet->_M_add_reference();
632 _M_facets[_Facet::id._M_id()] = __facet;
636 _M_install_cache(
const facet*,
size_t);
638 void _M_init_extra(facet**);
639 void _M_init_extra(
void*,
void*,
const char*,
const char*);
641 #ifdef _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT 642 void _M_init_extra_ldbl128(
bool);
659 template<
typename _CharT>
673 __c_locale _M_c_locale_collate;
688 : facet(__refs), _M_c_locale_collate(_S_get_c_locale())
702 : facet(__refs), _M_c_locale_collate(_S_clone_c_locale(__cloc))
718 compare(
const _CharT* __lo1,
const _CharT* __hi1,
719 const _CharT* __lo2,
const _CharT* __hi2)
const 720 {
return this->do_compare(__lo1, __hi1, __lo2, __hi2); }
738 {
return this->do_transform(__lo, __hi); }
751 hash(
const _CharT* __lo,
const _CharT* __hi)
const 752 {
return this->do_hash(__lo, __hi); }
756 _M_compare(
const _CharT*,
const _CharT*)
const throw();
759 _M_transform(_CharT*,
const _CharT*,
size_t)
const throw();
765 { _S_destroy_c_locale(_M_c_locale_collate); }
780 do_compare(
const _CharT* __lo1,
const _CharT* __hi1,
781 const _CharT* __lo2,
const _CharT* __hi2)
const;
794 do_transform(
const _CharT* __lo,
const _CharT* __hi)
const;
807 do_hash(
const _CharT* __lo,
const _CharT* __hi)
const;
810 template<
typename _CharT>
816 collate<char>::_M_compare(
const char*,
const char*)
const throw();
820 collate<char>::_M_transform(
char*,
const char*,
size_t)
const throw();
822 #ifdef _GLIBCXX_USE_WCHAR_T 825 collate<wchar_t>::_M_compare(
const wchar_t*,
const wchar_t*)
const throw();
829 collate<wchar_t>::_M_transform(
wchar_t*,
const wchar_t*,
size_t)
const throw();
833 template<
typename _CharT>
847 if (__builtin_strcmp(__s,
"C") != 0
848 && __builtin_strcmp(__s,
"POSIX") != 0)
850 this->_S_destroy_c_locale(this->_M_c_locale_collate);
851 this->_S_create_c_locale(this->_M_c_locale_collate, __s);
855 #if __cplusplus >= 201103L 863 ~collate_byname() { }
866 _GLIBCXX_END_NAMESPACE_VERSION
static const locale & classic()
Return reference to the C locale.
static locale::id id
Numpunct facet id.
static const category time
Category values.
constexpr _Iterator __base(_Iterator __it)
virtual ~facet()
Facet destructor.
static locale global(const locale &__loc)
Set global locale.
bool operator()(const basic_string< _Char, _Traits, _Alloc > &__s1, const basic_string< _Char, _Traits, _Alloc > &__s2) const
Compare two strings according to collate.
locale(const std::string &__s)
Named locale constructor.
Localization functionality base class.The facet class is the base class for a localization feature...
static const category messages
Category values.
basic_string< _CharT > string_type
Public typedefs.
_CharT char_type
Public typedefs.
basic_string< _CharT > string_type
Public typedefs.
friend bool has_facet(const locale &)
Test for the presence of a facet.has_facet tests the locale argument for the presence of the facet ty...
facet(size_t __refs=0)
Facet constructor.
friend const _Facet & use_facet(const locale &)
Return a facet.use_facet looks for and returns a reference to a facet of type Facet where Facet is th...
Primary class template ctype facet.This template class defines classification and conversion function...
bool operator==(const locale &__other) const
Locale equality.
long hash(const _CharT *__lo, const _CharT *__hi) const
Return hash of a string.
friend const _Facet & use_facet(const locale &)
Return a facet.use_facet looks for and returns a reference to a facet of type Facet where Facet is th...
string name() const
Return locale name.
Primary class template messages.This facet encapsulates the code to retrieve messages from message ca...
Container class for localization functionality.The locale class is first a class wrapper for C librar...
static const category none
Category values.
~locale()
Locale destructor.
_CharT char_type
Public typedefs.
virtual ~collate()
Destructor.
class collate_byname [22.2.4.2].
Facet ID class.The ID class provides facets with an index used to identify them. Every facet class mu...
ISO C++ entities toplevel namespace is std.
static const category numeric
Category values.
locale(const locale &__base, const std::string &__s, category __cat)
Construct locale with facets from another locale.
Facet for localized string comparison.
static const category all
Category values.
friend bool has_facet(const locale &)
Test for the presence of a facet.has_facet tests the locale argument for the presence of the facet ty...
string_type transform(const _CharT *__lo, const _CharT *__hi) const
Transform string to comparable form.
locale()
Default constructor.
int category
Definition of locale::category.
locale combine(const locale &__other) const
Construct locale with another facet.
static const category monetary
Category values.
collate(size_t __refs=0)
Constructor performs initialization.
collate(__c_locale __cloc, size_t __refs=0)
Internal constructor. Not for general use.
int compare(const _CharT *__lo1, const _CharT *__hi1, const _CharT *__lo2, const _CharT *__hi2) const
Compare two strings.