From 16890bf0412506356841f0f25654b95fb7d1e5f7 Mon Sep 17 00:00:00 2001 From: Antony Polukhin Date: Thu, 27 Dec 2012 18:54:28 +0000 Subject: [PATCH] Merge from trunk * Fixes #7799 (optimizations with std::array were not used) * Fixes #7831 (documentation update) [SVN r82224] --- doc/lexical_cast.qbk | 4 ++ include/boost/lexical_cast.hpp | 30 ++++++----- test/lexical_cast_arrays_test.cpp | 64 ++++++++++++------------ test/lexical_cast_stream_traits_test.cpp | 5 +- 4 files changed, 58 insertions(+), 45 deletions(-) diff --git a/doc/lexical_cast.qbk b/doc/lexical_cast.qbk index 3d0e319..6fba038 100644 --- a/doc/lexical_cast.qbk +++ b/doc/lexical_cast.qbk @@ -94,8 +94,12 @@ Library features defined in [@boost:boost/lexical_cast.hpp boost/lexical_cast.hp namespace boost { class bad_lexical_cast; + template Target lexical_cast(const Source& arg); + + template + Target lexical_cast(const AnyCharacterType* chars, std::size_t count); } `` diff --git a/include/boost/lexical_cast.hpp b/include/boost/lexical_cast.hpp index cfb98cf..62dca33 100644 --- a/include/boost/lexical_cast.hpp +++ b/include/boost/lexical_cast.hpp @@ -151,7 +151,7 @@ namespace boost #include #include -#if !defined(BOOST_NO_CXX11_HDR_ARRAY) && defined(BOOST_HAS_TR1_ARRAY) +#ifndef BOOST_NO_CXX11_HDR_ARRAY #include #endif @@ -294,7 +294,7 @@ namespace boost { boost::detail::deduce_character_type_later< boost::array< const Char, N > > > {}; -#if !defined(BOOST_NO_CXX11_HDR_ARRAY) && defined(BOOST_HAS_TR1_ARRAY) +#ifndef BOOST_NO_CXX11_HDR_ARRAY template < typename Char, std::size_t N > struct stream_char_common< std::array >: public boost::mpl::if_c< boost::detail::is_char_or_wchar< Char >::value, @@ -308,7 +308,7 @@ namespace boost { Char, boost::detail::deduce_character_type_later< std::array< const Char, N > > > {}; -#endif // !defined(BOOST_NO_CXX11_HDR_ARRAY) && defined(BOOST_HAS_TR1_ARRAY) +#endif #if !defined(BOOST_LCAST_NO_WCHAR_T) && defined(BOOST_NO_INTRINSIC_WCHAR_T) template <> @@ -1768,10 +1768,13 @@ namespace boost { bool operator<<(boost::array const& input) BOOST_NOEXCEPT { return ((*this) << reinterpret_cast const& >(input)); } -#if !defined(BOOST_NO_CXX11_HDR_ARRAY) && defined(BOOST_HAS_TR1_ARRAY) +#ifndef BOOST_NO_CXX11_HDR_ARRAY template bool operator<<(std::array const& input) BOOST_NOEXCEPT - { return shl_char_array_limited(input.begin(), N); } + { + if (input.size()) return shl_char_array_limited(&input[0], N); + else return true; + } template bool operator<<(std::array const& input) BOOST_NOEXCEPT @@ -1783,7 +1786,10 @@ namespace boost { template bool operator<<(std::array const& input) BOOST_NOEXCEPT - { return shl_char_array_limited(input.begin(), N); } + { + if (input.size()) return shl_char_array_limited(&input[0], N); + else return true; + } template bool operator<<(std::array const& input) BOOST_NOEXCEPT @@ -1792,7 +1798,7 @@ namespace boost { template bool operator<<(std::array const& input) BOOST_NOEXCEPT { return ((*this) << reinterpret_cast const& >(input)); } -#endif // !defined(BOOST_NO_CXX11_HDR_ARRAY) && defined(BOOST_HAS_TR1_ARRAY) +#endif template bool operator<<(const InStreamable& input) { return shl_input_streamable(input); } @@ -1984,8 +1990,8 @@ namespace boost { return false; } - memcpy(output.begin(), start, size * sizeof(CharT)); - *(output.begin() + size) = Traits::to_char_type(0); + memcpy(&output[0], start, size * sizeof(CharT)); + output[size] = Traits::to_char_type(0); return true; } @@ -2009,7 +2015,7 @@ namespace boost { return ((*this) >> reinterpret_cast& >(output)); } -#if !defined(BOOST_NO_CXX11_HDR_ARRAY) && defined(BOOST_HAS_TR1_ARRAY) +#ifndef BOOST_NO_CXX11_HDR_ARRAY template bool operator>>(std::array& output) BOOST_NOEXCEPT { @@ -2023,11 +2029,11 @@ namespace boost { } template - bool operator>>(std::array& in) + bool operator>>(std::array& output) { return ((*this) >> reinterpret_cast& >(output)); } -#endif // !defined(BOOST_NO_CXX11_HDR_ARRAY) && defined(BOOST_HAS_TR1_ARRAY) +#endif /* diff --git a/test/lexical_cast_arrays_test.cpp b/test/lexical_cast_arrays_test.cpp index 2ed009e..703f75b 100644 --- a/test/lexical_cast_arrays_test.cpp +++ b/test/lexical_cast_arrays_test.cpp @@ -50,25 +50,25 @@ static void testing_template_array_output_on_spec_value(T val) { arr_type res1 = lexical_cast(val); - BOOST_CHECK_EQUAL(res1.begin(), ethalon); + BOOST_CHECK_EQUAL(&res1[0], ethalon); const arr_type res2 = lexical_cast(val); - BOOST_CHECK_EQUAL(res2.begin(), ethalon); + BOOST_CHECK_EQUAL(&res2[0], ethalon); BOOST_CHECK_THROW(lexical_cast(val), boost::bad_lexical_cast); } { uarr_type res1 = lexical_cast(val); - BOOST_CHECK_EQUAL(reinterpret_cast(res1.begin()), ethalon); + BOOST_CHECK_EQUAL(reinterpret_cast(&res1[0]), ethalon); const uarr_type res2 = lexical_cast(val); - BOOST_CHECK_EQUAL(reinterpret_cast(res2.begin()), ethalon); + BOOST_CHECK_EQUAL(reinterpret_cast(&res2[0]), ethalon); BOOST_CHECK_THROW(lexical_cast(val), boost::bad_lexical_cast); } { sarr_type res1 = lexical_cast(val); - BOOST_CHECK_EQUAL(reinterpret_cast(res1.begin()), ethalon); + BOOST_CHECK_EQUAL(reinterpret_cast(&res1[0]), ethalon); const sarr_type res2 = lexical_cast(val); - BOOST_CHECK_EQUAL(reinterpret_cast(res2.begin()), ethalon); + BOOST_CHECK_EQUAL(reinterpret_cast(&res2[0]), ethalon); BOOST_CHECK_THROW(lexical_cast(val), boost::bad_lexical_cast); } @@ -79,12 +79,12 @@ static void testing_template_array_output_on_spec_value(T val) { warr_type res = lexical_cast(val); - BOOST_CHECK(res.begin() == wethalon); + BOOST_CHECK(&res[0] == wethalon); } { const warr_type res = lexical_cast(val); - BOOST_CHECK(res.begin() == wethalon); + BOOST_CHECK(&res[0] == wethalon); } BOOST_CHECK_THROW(lexical_cast(val), boost::bad_lexical_cast); @@ -98,12 +98,12 @@ static void testing_template_array_output_on_spec_value(T val) { u16arr_type res = lexical_cast(val); - BOOST_CHECK(res.begin() == u16ethalon); + BOOST_CHECK(&res[0] == u16ethalon); } { const u16arr_type res = lexical_cast(val); - BOOST_CHECK(res.begin() == u16ethalon); + BOOST_CHECK(&res[0] == u16ethalon); } BOOST_CHECK_THROW(lexical_cast(val), boost::bad_lexical_cast); @@ -116,12 +116,12 @@ static void testing_template_array_output_on_spec_value(T val) { u32arr_type res = lexical_cast(val); - BOOST_CHECK(res.begin() == u32ethalon); + BOOST_CHECK(&res[0] == u32ethalon); } { const u32arr_type res = lexical_cast(val); - BOOST_CHECK(res.begin() == u32ethalon); + BOOST_CHECK(&res[0] == u32ethalon); } BOOST_CHECK_THROW(lexical_cast(val), boost::bad_lexical_cast); @@ -145,25 +145,25 @@ static void testing_template_array_output_on_char_value() { arr_type res1 = lexical_cast(val); - BOOST_CHECK_EQUAL(res1.begin(), ethalon); + BOOST_CHECK_EQUAL(&res1[0], ethalon); const arr_type res2 = lexical_cast(val); - BOOST_CHECK_EQUAL(res2.begin(), ethalon); + BOOST_CHECK_EQUAL(&res2[0], ethalon); BOOST_CHECK_THROW(lexical_cast(val), boost::bad_lexical_cast); } { uarr_type res1 = lexical_cast(val); - BOOST_CHECK_EQUAL(reinterpret_cast(res1.begin()), ethalon); + BOOST_CHECK_EQUAL(reinterpret_cast(&res1[0]), ethalon); const uarr_type res2 = lexical_cast(val); - BOOST_CHECK_EQUAL(reinterpret_cast(res2.begin()), ethalon); + BOOST_CHECK_EQUAL(reinterpret_cast(&res2[0]), ethalon); BOOST_CHECK_THROW(lexical_cast(val), boost::bad_lexical_cast); } { sarr_type res1 = lexical_cast(val); - BOOST_CHECK_EQUAL(reinterpret_cast(res1.begin()), ethalon); + BOOST_CHECK_EQUAL(reinterpret_cast(&res1[0]), ethalon); const sarr_type res2 = lexical_cast(val); - BOOST_CHECK_EQUAL(reinterpret_cast(res2.begin()), ethalon); + BOOST_CHECK_EQUAL(reinterpret_cast(&res2[0]), ethalon); BOOST_CHECK_THROW(lexical_cast(val), boost::bad_lexical_cast); } @@ -174,16 +174,16 @@ static void testing_template_array_output_on_char_value() { warr_type res = lexical_cast(val); - BOOST_CHECK(res.begin() == wethalon); + BOOST_CHECK(&res[0] == wethalon); warr_type res3 = lexical_cast(wethalon); - BOOST_CHECK(res3.begin() == wethalon); + BOOST_CHECK(&res3[0] == wethalon); } { const warr_type res = lexical_cast(val); - BOOST_CHECK(res.begin() == wethalon); + BOOST_CHECK(&res[0] == wethalon); const warr_type res3 = lexical_cast(wethalon); - BOOST_CHECK(res3.begin() == wethalon); + BOOST_CHECK(&res3[0] == wethalon); } BOOST_CHECK_THROW(lexical_cast(val), boost::bad_lexical_cast); @@ -198,20 +198,20 @@ static void testing_template_array_output_on_char_value() { #ifdef BOOST_STL_SUPPORTS_NEW_UNICODE_LOCALES u16arr_type res = lexical_cast(val); - BOOST_CHECK(res.begin() == u16ethalon); + BOOST_CHECK(&res[0] == u16ethalon); #endif u16arr_type res3 = lexical_cast(u16ethalon); - BOOST_CHECK(res3.begin() == u16ethalon); + BOOST_CHECK(&res3[0] == u16ethalon); } { #ifdef BOOST_STL_SUPPORTS_NEW_UNICODE_LOCALES const u16arr_type res = lexical_cast(val); - BOOST_CHECK(res.begin() == u16ethalon); + BOOST_CHECK(&res[0] == u16ethalon); #endif const u16arr_type res3 = lexical_cast(u16ethalon); - BOOST_CHECK(res3.begin() == u16ethalon); + BOOST_CHECK(&res3[0] == u16ethalon); } BOOST_CHECK_THROW(lexical_cast(val), boost::bad_lexical_cast); @@ -225,19 +225,19 @@ static void testing_template_array_output_on_char_value() { #ifdef BOOST_STL_SUPPORTS_NEW_UNICODE_LOCALES u32arr_type res = lexical_cast(val); - BOOST_CHECK(res.begin() == u32ethalon); + BOOST_CHECK(&res[0] == u32ethalon); #endif u32arr_type res3 = lexical_cast(u32ethalon); - BOOST_CHECK(res3.begin() == u32ethalon); + BOOST_CHECK(&res3[0] == u32ethalon); } { #ifdef BOOST_STL_SUPPORTS_NEW_UNICODE_LOCALES const u32arr_type res = lexical_cast(val); - BOOST_CHECK(res.begin() == u32ethalon); + BOOST_CHECK(&res[0] == u32ethalon); #endif const u32arr_type res3 = lexical_cast(u32ethalon); - BOOST_CHECK(res3.begin() == u32ethalon); + BOOST_CHECK(&res3[0] == u32ethalon); } BOOST_CHECK_THROW(lexical_cast(val), boost::bad_lexical_cast); @@ -256,7 +256,7 @@ void testing_boost_array_output_conversion() void testing_std_array_output_conversion() { -#if !defined(BOOST_NO_CXX11_HDR_ARRAY) && defined(BOOST_HAS_TR1_ARRAY) +#ifndef BOOST_NO_CXX11_HDR_ARRAY testing_template_array_output_on_char_value(); testing_template_array_output_on_spec_value(100); testing_template_array_output_on_spec_value(static_cast(100)); @@ -358,7 +358,7 @@ void testing_boost_array_input_conversion() void testing_std_array_input_conversion() { -#if !defined(BOOST_NO_CXX11_HDR_ARRAY) && defined(BOOST_HAS_TR1_ARRAY) +#ifndef BOOST_NO_CXX11_HDR_ARRAY testing_generic_array_input_conversion(); #endif diff --git a/test/lexical_cast_stream_traits_test.cpp b/test/lexical_cast_stream_traits_test.cpp index 8198ae8..ac7acbe 100644 --- a/test/lexical_cast_stream_traits_test.cpp +++ b/test/lexical_cast_stream_traits_test.cpp @@ -97,7 +97,10 @@ void test_metafunctions() test_optimized_types_to_string<__int64>(); #endif +#if !defined(BOOST_NO_SWPRINTF) && !defined(__MINGW32__) test_optimized_types_to_string(); +#endif + test_optimized_types_to_string(); test_optimized_types_to_string(); //test_optimized_types_to_string(); @@ -128,7 +131,7 @@ void test_metafunctions() test_optimized_types_to_string_const >(); test_optimized_types_to_string_const >(); -#if !defined(BOOST_NO_CXX11_HDR_ARRAY) && defined(BOOST_HAS_TR1_ARRAY) +#ifndef BOOST_NO_CXX11_HDR_ARRAY test_optimized_types_to_string >(); test_optimized_types_to_string >(); test_optimized_types_to_string >();