2002-04-09 Benjamin Kosnik <bkoz@redhat.com>
authorbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Apr 2002 21:19:55 +0000 (21:19 +0000)
committerbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Apr 2002 21:19:55 +0000 (21:19 +0000)
        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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@52095 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/locale_facets.tcc
libstdc++-v3/include/bits/localefwd.h
libstdc++-v3/src/locale.cc
libstdc++-v3/src/localename.cc

index 11445db..841bb47 100644 (file)
@@ -1,4 +1,17 @@
 2002-04-09  Benjamin Kosnik  <bkoz@redhat.com>
+
+       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  <bkoz@redhat.com>
            Richard Henderson  <rth@redhat.com>
 
        * include/bits/sstream.tcc: Clean up bit ops.
index 27fc878..d81406f 100644 (file)
@@ -42,7 +42,6 @@
 #include <cctype>    // For isspace
 #include <limits>    // For numeric_limits
 #include <bits/streambuf_iterator.h>
-#include <vector>      
 #include <typeinfo>  // 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<const _Facet&>(*__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);
     }
 
 
index 172adae..c80da64 100644 (file)
@@ -46,7 +46,8 @@
 #include <bits/c++locale.h>     // Defines __c_locale, config-specific includes
 #include <climits>             // For CHAR_BIT
 #include <cctype>              // For isspace, etc.
-#include <string>              // For string
+#include <string>              // For string.
+#include <vector>              // For vector.
 #include <bits/functexcept.h>
 
 #include <bits/atomicity.h>
@@ -61,8 +62,6 @@ namespace std
 #endif
 
   // 22.1.1 Locale
-  template<typename _Tp, typename _Alloc> 
-    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[];
index 02177ed..0b1056c 100644 (file)
@@ -500,7 +500,7 @@ namespace std
     {
       size_t __i = ctype<char>::id._M_index;
       const locale::_Impl* __tmp = __loc._M_impl;
-      return static_cast<const ctype<char>&>(* (*(__tmp->_M_facets))[__i]);
+      return static_cast<const ctype<char>&>(*(__tmp->_M_facets[__i]));
     }
 
 #ifdef _GLIBCPP_USE_WCHAR_T
@@ -510,7 +510,7 @@ namespace std
     {
       size_t __i = ctype<wchar_t>::id._M_index;
       const locale::_Impl* __tmp = __loc._M_impl;
-      return static_cast<const ctype<wchar_t>&>(* (*(__tmp->_M_facets))[__i]);
+      return static_cast<const ctype<wchar_t>&>(*(__tmp->_M_facets[__i]));
     }
 #endif
 
index ad81648..53c9e8a 100644 (file)
@@ -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;
          }
       }
   }