From 701963d3c4bfbe32fd8bbaa593ecff31efc06105 Mon Sep 17 00:00:00 2001 From: Antony Polukhin Date: Mon, 23 Sep 2013 11:59:06 +0000 Subject: [PATCH] lexical_cast.hpp improvements: fix bug with floats conversions and improve docs (refs #9046) [SVN r85852] --- example/generic_stringize.cpp | 11 +++++--- include/boost/lexical_cast.hpp | 48 ++++++++++++++++------------------ 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/example/generic_stringize.cpp b/example/generic_stringize.cpp index 4944532..aef4ef5 100644 --- a/example/generic_stringize.cpp +++ b/example/generic_stringize.cpp @@ -44,16 +44,19 @@ std::string stringize(const Sequence& seq) { } //` Step 3: Using the `stringize` with different types: -#include +#include #include #include int main() { boost::tuple decim('-', 10, 'e', 5); - std::pair value_and_type(270, "Kelvin"); + assert(stringize(decim) == "-10e5"); - std::cout << stringize(decim) << '\n' // outputs '-10e5' - << stringize(value_and_type); // outputs '270Kelvin' + std::pair value_and_type(270, "Kelvin"); + assert(stringize(value_and_type) == "270Kelvin"); } //] [/lexical_cast_stringize] + + + diff --git a/include/boost/lexical_cast.hpp b/include/boost/lexical_cast.hpp index 14d4754..c3cf818 100644 --- a/include/boost/lexical_cast.hpp +++ b/include/boost/lexical_cast.hpp @@ -1446,74 +1446,74 @@ namespace boost { } template - bool shl_real_type(const T& val, SomeCharT* /*begin*/, SomeCharT*& /*end*/) { + bool shl_real_type(const T& val, SomeCharT* /*begin*/) { lcast_set_precision(out_stream, &val); return shl_input_streamable(val); } - static bool shl_real_type(float val, char* begin, char*& end) { + bool shl_real_type(float val, char* begin) { using namespace std; const double val_as_double = val; - end = begin + + finish = start + #if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) - sprintf_s(begin, end-begin, + sprintf_s(begin, CharacterBufferSize, #else sprintf(begin, #endif "%.*g", static_cast(boost::detail::lcast_get_precision()), val_as_double); - return end > begin; + return finish > start; } - static bool shl_real_type(double val, char* begin, char*& end) { + bool shl_real_type(double val, char* begin) { using namespace std; - end = begin + + finish = start + #if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) - sprintf_s(begin, end-begin, + sprintf_s(begin, CharacterBufferSize, #else sprintf(begin, #endif "%.*g", static_cast(boost::detail::lcast_get_precision()), val); - return end > begin; + return finish > start; } #ifndef __MINGW32__ - static bool shl_real_type(long double val, char* begin, char*& end) { + bool shl_real_type(long double val, char* begin) { using namespace std; - end = begin + + finish = start + #if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) - sprintf_s(begin, end-begin, + sprintf_s(begin, CharacterBufferSize, #else sprintf(begin, #endif "%.*Lg", static_cast(boost::detail::lcast_get_precision()), val ); - return end > begin; + return finish > start; } #endif #if !defined(BOOST_LCAST_NO_WCHAR_T) && !defined(BOOST_NO_SWPRINTF) && !defined(__MINGW32__) - static bool shl_real_type(float val, wchar_t* begin, wchar_t*& end) { + bool shl_real_type(float val, wchar_t* begin) { using namespace std; const double val_as_double = val; - end = begin + swprintf(begin, end-begin, + finish = start + swprintf(begin, CharacterBufferSize, L"%.*g", static_cast(boost::detail::lcast_get_precision()), val_as_double ); - return end > begin; + return finish > start; } - static bool shl_real_type(double val, wchar_t* begin, wchar_t*& end) { + bool shl_real_type(double val, wchar_t* begin) { using namespace std; - end = begin + swprintf(begin, end-begin, + finish = start + swprintf(begin, CharacterBufferSize, L"%.*g", static_cast(boost::detail::lcast_get_precision()), val ); - return end > begin; + return finish > start; } - static bool shl_real_type(long double val, wchar_t* begin, wchar_t*& end) { + bool shl_real_type(long double val, wchar_t* begin) { using namespace std; - end = begin + swprintf(begin, end-begin, + finish = start + swprintf(begin, CharacterBufferSize, L"%.*Lg", static_cast(boost::detail::lcast_get_precision()), val ); - return end > begin; + return finish > start; } #endif template @@ -1524,9 +1524,7 @@ namespace boost { return true; } - bool const result = shl_real_type(val, static_cast(buffer), tmp_finish); - finish = tmp_finish; - return result; + return shl_real_type(val, static_cast(buffer)); } /************************************ OPERATORS << ( ... ) ********************************/