From 0dba73e0ab4dba1f4f4850f326950bc91581329e Mon Sep 17 00:00:00 2001 From: Benjamin Kosnik Date: Tue, 9 Apr 2002 21:19:55 +0000 Subject: [PATCH] localefwd.h (locale::_Impl::_M_facets): Change from pointer to vector. 2002-04-09 Benjamin Kosnik libstdc++/1072 * include/bits/localefwd.h (locale::_Impl::_M_facets): Change from pointer to vector. Remove forward declaration of vector. Include vector. * include/bits/locale_facets.tcc: Remove vector include. (use_locale): Adjust. (has_locale): Adjust. * src/locale.cc: Adjust. * src/localename.cc: Same. From-SVN: r52095 --- libstdc++-v3/ChangeLog | 13 +++++ libstdc++-v3/include/bits/locale_facets.tcc | 11 ++-- libstdc++-v3/include/bits/localefwd.h | 7 ++- libstdc++-v3/src/locale.cc | 4 +- libstdc++-v3/src/localename.cc | 59 ++++++++------------- 5 files changed, 45 insertions(+), 49 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 11445dbd869..841bb477a13 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,16 @@ +2002-04-09 Benjamin Kosnik + + libstdc++/1072 + * include/bits/localefwd.h (locale::_Impl::_M_facets): Change from + pointer to vector. + Remove forward declaration of vector. + Include vector. + * include/bits/locale_facets.tcc: Remove vector include. + (use_locale): Adjust. + (has_locale): Adjust. + * src/locale.cc: Adjust. + * src/localename.cc: Same. + 2002-04-09 Benjamin Kosnik Richard Henderson diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index 27fc8787148..d81406ff4b1 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -42,7 +42,6 @@ #include // For isspace #include // For numeric_limits #include -#include #include // For bad_cast. namespace std @@ -72,9 +71,9 @@ namespace std use_facet(const locale& __loc) { size_t __i = _Facet::id._M_index; - locale::_Impl::__vec_facet* __facet = __loc._M_impl->_M_facets; - const locale::facet* __fp = (*__facet)[__i]; - if (__fp == 0 || __i >= __facet->size()) + locale::_Impl::__vec_facet& __facet = __loc._M_impl->_M_facets; + const locale::facet* __fp = __facet[__i]; + if (__fp == 0 || __i >= __facet.size()) __throw_bad_cast(); return static_cast(*__fp); } @@ -84,8 +83,8 @@ namespace std has_facet(const locale& __loc) throw() { size_t __i = _Facet::id._M_index; - locale::_Impl::__vec_facet* __facet = __loc._M_impl->_M_facets; - return (__i < __facet->size() && (*__facet)[__i] != 0); + locale::_Impl::__vec_facet& __facet = __loc._M_impl->_M_facets; + return (__i < __facet.size() && __facet[__i] != 0); } diff --git a/libstdc++-v3/include/bits/localefwd.h b/libstdc++-v3/include/bits/localefwd.h index 172adae2e04..c80da641490 100644 --- a/libstdc++-v3/include/bits/localefwd.h +++ b/libstdc++-v3/include/bits/localefwd.h @@ -46,7 +46,8 @@ #include // Defines __c_locale, config-specific includes #include // For CHAR_BIT #include // For isspace, etc. -#include // For string +#include // For string. +#include // For vector. #include #include @@ -61,8 +62,6 @@ namespace std #endif // 22.1.1 Locale - template - class vector; class locale; // 22.1.3 Convenience interfaces @@ -320,7 +319,7 @@ namespace std private: // Data Members. _Atomic_word _M_references; - __vec_facet* _M_facets; + __vec_facet _M_facets; string _M_names[_S_num_categories]; static const locale::id* const _S_id_ctype[]; static const locale::id* const _S_id_numeric[]; diff --git a/libstdc++-v3/src/locale.cc b/libstdc++-v3/src/locale.cc index 02177ed73c5..0b1056c045d 100644 --- a/libstdc++-v3/src/locale.cc +++ b/libstdc++-v3/src/locale.cc @@ -500,7 +500,7 @@ namespace std { size_t __i = ctype::id._M_index; const locale::_Impl* __tmp = __loc._M_impl; - return static_cast&>(* (*(__tmp->_M_facets))[__i]); + return static_cast&>(*(__tmp->_M_facets[__i])); } #ifdef _GLIBCPP_USE_WCHAR_T @@ -510,7 +510,7 @@ namespace std { size_t __i = ctype::id._M_index; const locale::_Impl* __tmp = __loc._M_impl; - return static_cast&>(* (*(__tmp->_M_facets))[__i]); + return static_cast&>(*(__tmp->_M_facets[__i])); } #endif diff --git a/libstdc++-v3/src/localename.cc b/libstdc++-v3/src/localename.cc index ad816486705..53c9e8a0347 100644 --- a/libstdc++-v3/src/localename.cc +++ b/libstdc++-v3/src/localename.cc @@ -36,31 +36,25 @@ namespace std locale::_Impl:: ~_Impl() throw() { - __vec_facet::iterator it = _M_facets->begin(); - for (; it != _M_facets->end(); ++it) - if (*it) - (*it)->_M_remove_reference(); - delete _M_facets; + __vec_facet::iterator __it = _M_facets.begin(); + __vec_facet::iterator __end = _M_facets.end(); + for (; __it != __end; ++__it) + if (*__it) + (*__it)->_M_remove_reference(); } // Clone existing _Impl object. locale::_Impl:: _Impl(const _Impl& __imp, size_t __refs) - : _M_references(__refs), _M_facets(0) // XXX + : _M_references(__refs) // XXX { - try - { _M_facets = new __vec_facet(*(__imp._M_facets)); } - catch(...) - { - delete _M_facets; - __throw_exception_again; - } + _M_facets = __imp._M_facets; + for (size_t __i = 0; __i < _S_num_categories; ++__i) + _M_names[__i] = __imp._M_names[__i]; - for (size_t i = 0; i < _S_num_categories; ++i) - _M_names[i] = __imp._M_names[i]; - - __vec_facet::iterator __it = _M_facets->begin(); - for (; __it != _M_facets->end(); ++__it) + __vec_facet::iterator __it = _M_facets.begin(); + __vec_facet::iterator __end = _M_facets.end(); + for (; __it != __end; ++__it) if (*__it) (*__it)->_M_add_reference(); } @@ -68,7 +62,7 @@ namespace std // Construct named _Impl, including the standard "C" locale. locale::_Impl:: _Impl(string __str, size_t __refs) - : _M_references(__refs), _M_facets(0) + : _M_references(__refs) { // Initialize the underlying locale model, which also checks to // see if the given name is valid. @@ -81,14 +75,7 @@ namespace std if (__str != "C" && __str != "POSIX") __cloc_c = __cloc; - // Allocate facet container. - try - { _M_facets = new __vec_facet(_S_num_facets, NULL); } - catch(...) - { - delete _M_facets; - __throw_exception_again; - } + _M_facets = __vec_facet(_S_num_facets, NULL); // Name all the categories. for (size_t i = 0; i < _S_num_categories; ++i) @@ -162,12 +149,11 @@ namespace std _M_replace_facet(const _Impl* __imp, const locale::id* __idp) { size_t __index = __idp->_M_index; - if (__index == 0 - || __imp->_M_facets->size() <= __index - || (*(__imp->_M_facets))[__index] == 0) + if (__index == 0 || __imp->_M_facets.size() <= __index + || __imp->_M_facets[__index] == 0) __throw_runtime_error("no locale facet"); - _M_install_facet(__idp, (*(__imp->_M_facets))[__index]); + _M_install_facet(__idp, __imp->_M_facets[__index]); } void @@ -180,14 +166,13 @@ namespace std if (!__index) __index = 1 + __exchange_and_add(&locale::id::_S_highwater, 1); - if (__index >= _M_facets->size()) - _M_facets->resize(__index + 1, 0); // might throw + if (__index >= _M_facets.size()) + _M_facets.resize(__index + 1, 0); // might throw - facet*& __fpr = (*_M_facets)[__index]; + facet*& __fpr = _M_facets[__index]; if (__fpr) { - // Replacing an existing facet. - // Order matters, here: + // Replacing an existing facet. Order matters. __fp->_M_add_reference(); __fpr->_M_remove_reference(); __fpr = __fp; @@ -197,7 +182,7 @@ namespace std // Installing a newly created facet into an empty // _M_facets container, say a newly-constructed, // swanky-fresh _Impl. - (*_M_facets)[__index] = __fp; + _M_facets[__index] = __fp; } } } -- 2.30.2