This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[v3] Add _M_true(false)name_len to __numpunct_cache


Hi,

tested x86-linux. Committed to mainline.

Paolo.

//////////
2004-01-12  Paolo Carlini  <pcarlini@suse.de>

	* include/bits/locale_facets.h (struct __numpunct_cache):
	Add members _M_truename_len and _M_falsename_len, caching
	the lengths of _M_truename and _M_falsename.
	(__numpunct_cache<>::_M_cache): Assign the latter.
	* include/bits/locale_facets.tcc (num_get::do_get(bool&),
	num_put::do_put(bool)): Use the new members, thus avoiding
	computing string lengths again and again.
	* config/locale/generic/numeric_members.cc
	(numpunct<>::_M_initialize_numpunct): Assign the new members.
	* config/locale/gnu/numeric_members.cc
	(numpunct<>::_M_initialize_numpunct): Likewise.
diff -urN libstdc++-v3-orig/config/locale/generic/numeric_members.cc libstdc++-v3/config/locale/generic/numeric_members.cc
--- libstdc++-v3-orig/config/locale/generic/numeric_members.cc	2004-01-04 19:34:27.000000000 +0100
+++ libstdc++-v3/config/locale/generic/numeric_members.cc	2004-01-11 20:20:03.000000000 +0100
@@ -58,7 +58,9 @@
 	_M_data->_M_atoms_in[__i] = __num_base::_S_atoms_in[__i];
 
       _M_data->_M_truename = "true";
-      _M_data->_M_falsename = "false";      
+      _M_data->_M_truename_len = strlen(_M_data->_M_truename);
+      _M_data->_M_falsename = "false";
+      _M_data->_M_falsename_len = strlen(_M_data->_M_falsename);
     }
 
   template<> 
@@ -95,7 +97,9 @@
 	}
       
       _M_data->_M_truename = L"true";
+      _M_data->_M_truename_len = wcslen(_M_data->_M_truename);
       _M_data->_M_falsename = L"false";
+      _M_data->_M_falsename_len = wcslen(_M_data->_M_falsename);
     }
 
   template<> 
diff -urN libstdc++-v3-orig/config/locale/gnu/numeric_members.cc libstdc++-v3/config/locale/gnu/numeric_members.cc
--- libstdc++-v3-orig/config/locale/gnu/numeric_members.cc	2004-01-04 19:34:27.000000000 +0100
+++ libstdc++-v3/config/locale/gnu/numeric_members.cc	2004-01-11 20:08:13.000000000 +0100
@@ -75,8 +75,10 @@
       // NB: There is no way to extact this info from posix locales.
       // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
       _M_data->_M_truename = "true";
+      _M_data->_M_truename_len = strlen(_M_data->_M_truename);
       // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
       _M_data->_M_falsename = "false";
+      _M_data->_M_falsename_len = strlen(_M_data->_M_falsename);
     }
  
   template<> 
@@ -138,8 +140,10 @@
       // NB: There is no way to extact this info from posix locales.
       // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
       _M_data->_M_truename = L"true";
+      _M_data->_M_truename_len = wcslen(_M_data->_M_truename);
       // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
       _M_data->_M_falsename = L"false";
+      _M_data->_M_falsename_len = wcslen(_M_data->_M_falsename);
     }
 
   template<> 
diff -urN libstdc++-v3-orig/include/bits/locale_facets.h libstdc++-v3/include/bits/locale_facets.h
--- libstdc++-v3-orig/include/bits/locale_facets.h	2004-01-10 02:10:23.000000000 +0100
+++ libstdc++-v3/include/bits/locale_facets.h	2004-01-11 19:07:55.000000000 +0100
@@ -1605,6 +1605,8 @@
       bool				_M_use_grouping;
       const _CharT* 			_M_truename;
       const _CharT*			_M_falsename;
+      size_t                            _M_truename_len;
+      size_t                            _M_falsename_len;     
       _CharT 				_M_decimal_point;
       _CharT 				_M_thousands_sep;
       
@@ -1624,8 +1626,9 @@
 
       __numpunct_cache(size_t __refs = 0) : facet(__refs), 
       _M_grouping(NULL), _M_use_grouping(false), _M_truename(NULL), 
-      _M_falsename(NULL), _M_decimal_point(_CharT()), 
-      _M_thousands_sep(_CharT()), _M_allocated(false)
+      _M_falsename(NULL),  _M_truename_len(0), _M_falsename_len(0),
+      _M_decimal_point(_CharT()), _M_thousands_sep(_CharT()),
+      _M_allocated(false)
       { } 
 
       ~__numpunct_cache();
@@ -1649,17 +1652,14 @@
       _M_grouping = __grouping;
       _M_use_grouping = __len && __np.grouping()[0] != 0;
 
-      typedef basic_string<_CharT> __string_type;
-      typename __string_type::size_type __lentf = __np.truename().size();
-      _CharT* __truename = new _CharT[__lentf + 1];
-      __np.truename().copy(__truename, __lentf);
-      __truename[__lentf] = _CharT();
+      _M_truename_len = __np.truename().size();
+      _CharT* __truename = new _CharT[_M_truename_len];
+      __np.truename().copy(__truename, _M_truename_len);
       _M_truename = __truename;
-      
-      __lentf = __np.falsename().size();
-      _CharT* __falsename = new _CharT[__lentf + 1];
-      __np.falsename().copy(__falsename, __lentf);
-      __falsename[__lentf] = _CharT();
+
+      _M_falsename_len = __np.falsename().size();
+      _CharT* __falsename = new _CharT[_M_falsename_len];
+      __np.falsename().copy(__falsename, _M_falsename_len);
       _M_falsename = __falsename;
           
       _M_decimal_point = __np.decimal_point();
diff -urN libstdc++-v3-orig/include/bits/locale_facets.tcc libstdc++-v3/include/bits/locale_facets.tcc
--- libstdc++-v3-orig/include/bits/locale_facets.tcc	2004-01-07 06:22:37.000000000 +0100
+++ libstdc++-v3/include/bits/locale_facets.tcc	2004-01-11 19:21:30.000000000 +0100
@@ -529,8 +529,6 @@
 	  __use_cache<__cache_type> __uc;
 	  const locale& __loc = __io._M_getloc();
 	  const __cache_type* __lc = __uc(__loc);
-	  const size_t __tn = __traits_type::length(__lc->_M_truename);
-	  const size_t __fn = __traits_type::length(__lc->_M_falsename);
 
 	  bool __testf = true;
 	  bool __testt = true;
@@ -538,13 +536,13 @@
           for (__n = 0; __beg != __end; ++__n, ++__beg)
             {
 	      if (__testf)
-		if (__n < __fn)
+		if (__n < __lc->_M_falsename_len)
 		  __testf = __traits_type::eq(*__beg, __lc->_M_falsename[__n]);
 		else
 		  break;
 
 	      if (__testt)
-		if (__n < __tn)
+		if (__n < __lc->_M_truename_len)
 		  __testt = __traits_type::eq(*__beg, __lc->_M_truename[__n]);
 		else
 		  break;
@@ -552,9 +550,9 @@
 	      if (!__testf && !__testt)
 		break;      
             }
-	  if (__testf && __n == __fn)
+	  if (__testf && __n == __lc->_M_falsename_len)
 	    __v = 0;
-	  else if (__testt && __n == __tn)
+	  else if (__testt && __n == __lc->_M_truename_len)
 	    __v = 1;
 	  else
 	    __err |= ios_base::failbit;
@@ -1048,7 +1046,8 @@
 
 	  const _CharT* __name = __v ? __lc->_M_truename 
 	                             : __lc->_M_falsename;
-	  int __len = char_traits<_CharT>::length(__name);
+	  int __len = __v ? __lc->_M_truename_len
+	                  : __lc->_M_falsename_len;
 
 	  const streamsize __w = __io.width();
 	  if (__w > static_cast<streamsize>(__len))

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]