Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r72315 - in trunk: boost libs/conversion
From: antoshkka_at_[hidden]
Date: 2011-05-31 16:46:38


Author: apolukhin
Date: 2011-05-31 16:46:37 EDT (Tue, 31 May 2011)
New Revision: 72315
URL: http://svn.boost.org/trac/boost/changeset/72315

Log:
Fixes #5585 and adds test on it
Text files modified:
   trunk/boost/lexical_cast.hpp | 28 ++++++++++++++++++++++++----
   trunk/libs/conversion/lexical_cast_test.cpp | 3 +++
   2 files changed, 27 insertions(+), 4 deletions(-)

Modified: trunk/boost/lexical_cast.hpp
==============================================================================
--- trunk/boost/lexical_cast.hpp (original)
+++ trunk/boost/lexical_cast.hpp 2011-05-31 16:46:37 EDT (Tue, 31 May 2011)
@@ -654,6 +654,7 @@
                 unsigned char current_grouping = 0;
                 CharT const thousands_sep = np.thousands_sep();
                 char remained = grouping[current_grouping] - 1;
+ bool shall_we_return = true;
 
                 for(;end>=begin; --end)
                 {
@@ -671,12 +672,31 @@
                         multiplier *= 10;
                         --remained;
                     } else {
- if ( !Traits::eq(*end, thousands_sep) || begin == end ) return false;
- if (current_grouping < grouping_size-1 ) ++current_grouping;
- remained = grouping[current_grouping];
+ if ( !Traits::eq(*end, thousands_sep) ) //|| begin == end ) return false;
+ {
+ /*
+ * According to Programming languages - C++
+ * Digit grouping is checked. That is, the positions of discarded
+ * separators is examined for consistency with
+ * use_facet<numpunct<charT> >(loc ).grouping()
+ *
+ * BUT what if there is no separators at all and grouping()
+ * is not empty? Well, we have no extraced separators, so we
+ * won`t check them for consistency. This will allow us to
+ * work with "C" locale from other locales
+ */
+ shall_we_return = false;
+ break;
+ } else {
+ if ( begin == end ) return false;
+ if (current_grouping < grouping_size-1 ) ++current_grouping;
+ remained = grouping[current_grouping];
+ }
                     }
                 }
- } else
+
+ if (shall_we_return) return true;
+ }
 #endif
             {
                 while ( begin <= end )

Modified: trunk/libs/conversion/lexical_cast_test.cpp
==============================================================================
--- trunk/libs/conversion/lexical_cast_test.cpp (original)
+++ trunk/libs/conversion/lexical_cast_test.cpp 2011-05-31 16:46:37 EDT (Tue, 31 May 2011)
@@ -677,6 +677,9 @@
                 , bad_lexical_cast);
         BOOST_CHECK_THROW(lexical_cast<T>( std::string("100") + np.thousands_sep() ), bad_lexical_cast);
         BOOST_CHECK_THROW(lexical_cast<T>( np.thousands_sep() + std::string("100") ), bad_lexical_cast);
+
+ // Exception must not be thrown, when we are using no separators at all
+ BOOST_CHECK( lexical_cast<T>("10000") == static_cast<T>(10000) );
     }
 
     test_conversion_from_integral_to_integral<T>();


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk