From def9790d51a51a78a700567bb677225a90bc854e Mon Sep 17 00:00:00 2001 From: Benjamin Kosnik Date: Sat, 15 Dec 2001 07:05:04 +0000 Subject: Clean up initialization and simplfy caching of underlying "C" locale objects. 2001-12-14 Benjamin Kosnik Clean up initialization and simplfy caching of underlying "C" locale objects. * src/localename.cc (locale::_Impl::_Impl(string, size_t): Unconditionally create __clocale object for all named locales, including "C" and "POSIX". * config/locale/c_locale_generic.cc (locale::facet::_S_create_c_locale): Always set __cloc to zero. * config/locale/c_locale_gnu.cc: Always delete. * include/bits/localefwd.h (locale::facet::_S_c_locale): New. * src/locale.cc (locale::classic()): Initialize locale::facet::_S_c_locale. (locale::facet::_S_c_locale): Define. * include/bits/locale_facets.h: Add ctype_byname ctor specialization. * src/locale.cc: Add definition here. * config/os/gnu-linux/bits/ctype_inline.h: Tweak. * config/os/gnu-linux/bits/ctype_noninline.h: Adjust initializations. * include/bits/locale_facets.h (ctype::_M_c_locale_ctype): Add. Adjust ctors, dtors. (ctype::_M_toupper): Remove const&. (ctype::_M_tolower): Remove const&. (ctype::_M_ctable): Remove const&. * include/bits/locale_facets.h (collate): Clean up initialization of _M_c_locale_collate in ctors and dtors. * config/locale/collate_members_gnu.cc: Always use extended functions. * include/bits/locale_facets.h (messages): Clean up inits in ctor/dtor. (messages_byname): Same. * config/locale/messages_members_generic.h (messages::~messages): Remove. * config/locale/messages_members_gnu.h: Same. * include/bits/localefwd.h: Clean. Move dtor definitions to * src/locale.cc: Here. * testsuite/22_locale/facet.cc: Fix spelling. Named locale support for ctype. * acinclude.m4 (GLIBCPP_ENABLE_CLOCALE): Add variable ctype_members_* bits. * aclocal.m4: Regenerate. * configure: Regenerate. * src/Makefile.am (sources): Add ctype.cc. * src/Makefile.in: Regenerate. * config/locale/ctype_members_generic.cc: New file. * config/locale/ctype_members_gnu.cc: New file. * src/locale.cc: Remove ctype definitions. From-SVN: r48034 --- libstdc++-v3/include/bits/locale_facets.h | 81 ++++++++++++++++--------------- libstdc++-v3/include/bits/localefwd.h | 17 +++++-- 2 files changed, 55 insertions(+), 43 deletions(-) (limited to 'libstdc++-v3/include') diff --git a/libstdc++-v3/include/bits/locale_facets.h b/libstdc++-v3/include/bits/locale_facets.h index 967f399..8550709 100644 --- a/libstdc++-v3/include/bits/locale_facets.h +++ b/libstdc++-v3/include/bits/locale_facets.h @@ -171,7 +171,7 @@ namespace std explicit ctype(size_t __refs = 0) : __ctype_abstract_base<_CharT>(__refs) { } - static locale::id id; + static locale::id id; protected: virtual @@ -225,15 +225,16 @@ namespace std { public: // Types: - typedef char char_type; + typedef char char_type; - private: + protected: // Data Members: - bool _M_del; - __to_type const& _M_toupper; - __to_type const& _M_tolower; - const mask* const& _M_ctable; - const mask* _M_table; + __c_locale _M_c_locale_ctype; + bool _M_del; + __to_type _M_toupper; + __to_type _M_tolower; + const mask* _M_ctable; + const mask* _M_table; public: static locale::id id; @@ -259,9 +260,6 @@ namespace std scan_not(mask __m, const char* __lo, const char* __hi) const; protected: - virtual - ~ctype(); - const mask* table() const throw() { return _M_table; } @@ -270,6 +268,9 @@ namespace std classic_table() throw() { return _M_ctable; } + virtual + ~ctype(); + virtual bool do_is(mask __m, char_type __c) const; @@ -306,7 +307,7 @@ namespace std virtual const char_type* do_narrow(const char_type* __lo, const char_type* __hi, - char __dfault, char* __dest) const; + char __dfault, char* __dest) const; }; template<> @@ -320,11 +321,15 @@ namespace std { public: // Types: - typedef wchar_t char_type; - typedef wctype_t __wmask_type; + typedef wchar_t char_type; + typedef wctype_t __wmask_type; + protected: + __c_locale _M_c_locale_ctype; + + public: // Data Members: - static locale::id id; + static locale::id id; explicit ctype(size_t __refs = 0); @@ -375,7 +380,7 @@ namespace std virtual const char_type* do_narrow(const char_type* __lo, const char_type* __hi, - char __dfault, char* __dest) const; + char __dfault, char* __dest) const; }; @@ -395,22 +400,25 @@ namespace std typedef _CharT char_type; explicit - ctype_byname(const char*, size_t __refs = 0); + ctype_byname(const char* __s, size_t __refs = 0); protected: virtual - ~ctype_byname() { } + ~ctype_byname() { }; }; - // 22.2.1.4 Class ctype_byname specialization + // 22.2.1.4 Class ctype_byname specializations. template<> ctype_byname::ctype_byname(const char*, size_t refs); + template<> + ctype_byname::ctype_byname(const char*, size_t refs); // 22.2.1.5 Template class codecvt #include + // 22.2.2 The numeric category. class __num_base { public: @@ -815,17 +823,14 @@ namespace std explicit collate(size_t __refs = 0) - : locale::facet(__refs), _M_c_locale_collate(NULL) - { } + : locale::facet(__refs) + { _M_c_locale_collate = _S_clone_c_locale(_S_c_locale); } // Non-standard. explicit collate(__c_locale __cloc, size_t __refs = 0) : locale::facet(__refs) - { - if (__cloc) - _M_c_locale_collate = _S_clone_c_locale(__cloc); - } + { _M_c_locale_collate = _S_clone_c_locale(__cloc); } int compare(const _CharT* __lo1, const _CharT* __hi1, @@ -850,10 +855,7 @@ namespace std protected: virtual ~collate() - { - if (_M_c_locale_collate) - _S_destroy_c_locale(_M_c_locale_collate); - } + { _S_destroy_c_locale(_M_c_locale_collate); } virtual int do_compare(const _CharT* __lo1, const _CharT* __hi1, @@ -899,10 +901,13 @@ namespace std explicit collate_byname(const char* __s, size_t __refs = 0) : collate<_CharT>(__refs) - { _S_create_c_locale(_M_c_locale_collate, __s); } + { + _S_destroy_c_locale(_M_c_locale_collate); + _S_create_c_locale(_M_c_locale_collate, __s); + } protected: - virtual + virtual ~collate_byname() { } }; @@ -1609,9 +1614,8 @@ namespace std explicit messages(size_t __refs = 0) - : locale::facet(__refs), _M_c_locale_messages(NULL), - _M_name_messages("C") - { } + : locale::facet(__refs), _M_name_messages("C") + { _M_c_locale_messages = _S_clone_c_locale(_S_c_locale); } // Non-standard. explicit @@ -1619,8 +1623,7 @@ namespace std : locale::facet(__refs) { _M_name_messages = __name; - if (__cloc) - _M_c_locale_messages = _S_clone_c_locale(__cloc); + _M_c_locale_messages = _S_clone_c_locale(__cloc); } catalog @@ -1641,7 +1644,8 @@ namespace std protected: virtual - ~messages(); + ~messages() + { _S_destroy_c_locale(_M_c_locale_messages); } virtual catalog do_open(const basic_string&, const locale&) const; @@ -1723,8 +1727,9 @@ namespace std messages_byname(const char* __s, size_t __refs = 0) : messages<_CharT>(__refs) { - _S_create_c_locale(_M_c_locale_messages, __s); _M_name_messages = __s; + _S_destroy_c_locale(_M_c_locale_messages); + _S_create_c_locale(_M_c_locale_messages, __s); } protected: diff --git a/libstdc++-v3/include/bits/localefwd.h b/libstdc++-v3/include/bits/localefwd.h index af48b60..a0fe324 100644 --- a/libstdc++-v3/include/bits/localefwd.h +++ b/libstdc++-v3/include/bits/localefwd.h @@ -282,7 +282,10 @@ namespace std static inline void _S_initialize() - { if (!_S_classic) classic(); } + { + if (!_S_classic) + classic(); + } static category _S_normalize_category(category); @@ -344,7 +347,7 @@ namespace std _Impl(string __name, size_t); ~_Impl() throw(); - bool + inline bool _M_check_same_name() { bool __ret = true; @@ -352,6 +355,7 @@ namespace std __ret &= _M_names[i] == _M_names[i + 1]; return __ret; } + void _M_replace_categories(const _Impl*, category); @@ -387,11 +391,15 @@ namespace std friend class __enc_traits; protected: + // Contains data from the underlying "C" library for default "C" + // and "POSIX" locales. + static __c_locale _S_c_locale; + explicit facet(size_t __refs = 0) throw(); virtual - ~facet() { }; + ~facet(); static void _S_create_c_locale(__c_locale& __cloc, const char* __s); @@ -447,8 +455,7 @@ namespace std public: // NB: This class is always a static data member, and thus can be // counted on to be zero-initialized. - // XXX id() : _M_index(0) { } - id() { } + id(); }; template -- cgit v1.1