$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r80787 - in branches/release: boost libs/conversion libs/conversion/doc
From: antoshkka_at_[hidden]
Date: 2012-09-30 12:07:33
Author: apolukhin
Date: 2012-09-30 12:07:32 EDT (Sun, 30 Sep 2012)
New Revision: 80787
URL: http://svn.boost.org/trac/boost/changeset/80787
Log:
Merege  fix for #7421 from trunk
Text files modified: 
   branches/release/boost/lexical_cast.hpp                |    52 ++++++++++++++++++++++++++++++++++++--- 
   branches/release/libs/conversion/doc/lexical_cast.qbk  |     4 +-                                      
   branches/release/libs/conversion/lexical_cast_test.cpp |    15 +++++++++++                             
   3 files changed, 64 insertions(+), 7 deletions(-)
Modified: branches/release/boost/lexical_cast.hpp
==============================================================================
--- branches/release/boost/lexical_cast.hpp	(original)
+++ branches/release/boost/lexical_cast.hpp	2012-09-30 12:07:32 EDT (Sun, 30 Sep 2012)
@@ -2300,17 +2300,59 @@
         return caster_type::lexical_cast_impl(arg);
     }
 
-    template <typename Target, typename CharType>
-    inline Target lexical_cast(const CharType* chars, std::size_t count)
+    template <typename Target>
+    inline Target lexical_cast(const char* chars, std::size_t count)
     {
-        BOOST_STATIC_ASSERT_MSG(::boost::detail::is_char_or_wchar<CharType>::value, 
-            "CharType must be a character or wide character type");
+        return ::boost::lexical_cast<Target>(
+            ::boost::iterator_range<const char*>(chars, chars + count)
+        );
+    }
+
+
+    template <typename Target>
+    inline Target lexical_cast(const unsigned char* chars, std::size_t count)
+    {
+        return ::boost::lexical_cast<Target>(
+            ::boost::iterator_range<const unsigned char*>(chars, chars + count)
+        );
+    }
 
+    template <typename Target>
+    inline Target lexical_cast(const signed char* chars, std::size_t count)
+    {
         return ::boost::lexical_cast<Target>(
-            ::boost::iterator_range<const CharType*>(chars, chars + count)
+            ::boost::iterator_range<const signed char*>(chars, chars + count)
         );
     }
 
+#ifndef BOOST_LCAST_NO_WCHAR_T
+    template <typename Target>
+    inline Target lexical_cast(const wchar_t* chars, std::size_t count)
+    {
+        return ::boost::lexical_cast<Target>(
+            ::boost::iterator_range<const wchar_t*>(chars, chars + count)
+        );
+    }
+#endif
+#ifndef BOOST_NO_CHAR16_T
+    template <typename Target>
+    inline Target lexical_cast(const char16_t* chars, std::size_t count)
+    {
+        return ::boost::lexical_cast<Target>(
+            ::boost::iterator_range<const char16_t*>(chars, chars + count)
+        );
+    }
+#endif
+#ifndef BOOST_NO_CHAR32_T
+    template <typename Target>
+    inline Target lexical_cast(const char32_t* chars, std::size_t count)
+    {
+        return ::boost::lexical_cast<Target>(
+            ::boost::iterator_range<const char32_t*>(chars, chars + count)
+        );
+    }
+#endif
+
 } // namespace boost
 
 #else // #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Modified: branches/release/libs/conversion/doc/lexical_cast.qbk
==============================================================================
--- branches/release/libs/conversion/doc/lexical_cast.qbk	(original)
+++ branches/release/libs/conversion/doc/lexical_cast.qbk	2012-09-30 12:07:32 EDT (Sun, 30 Sep 2012)
@@ -107,8 +107,8 @@
 Returns the result of streaming arg into a standard library string-based stream and then out as a Target object. Where Target is either `std::string` or `std::wstring`, stream extraction takes the whole content of the string, including spaces, rather than relying on the default `operator>>` behavior. If the conversion is unsuccessful, a `bad_lexical_cast` exception is thrown.
 
 ``
-    template <typename Target, typename CharType>
-      Target lexical_cast(const CharType* chars, std::size_t count);
+    template <typename Target>
+      Target lexical_cast(const AnyCharacterType* chars, std::size_t count);
 ``
 Takes an array of `count` characters as input parameter and streams them out as a Target object. If the conversion is unsuccessful, a `bad_lexical_cast` exception is thrown. This call may be useful for processing nonzero terminated array of characters or processing just some part of character array.
 
Modified: branches/release/libs/conversion/lexical_cast_test.cpp
==============================================================================
--- branches/release/libs/conversion/lexical_cast_test.cpp	(original)
+++ branches/release/libs/conversion/lexical_cast_test.cpp	2012-09-30 12:07:32 EDT (Sun, 30 Sep 2012)
@@ -88,6 +88,7 @@
 #if !defined(BOOST_NO_CHAR32_T) && !defined(BOOST_NO_UNICODE_LITERALS)
 void test_char32_conversions();
 #endif
+void test_getting_pointer_to_function();
 
 unit_test::test_suite *init_unit_test_suite(int, char *[])
 {
@@ -125,6 +126,7 @@
 #if !defined(BOOST_NO_CHAR32_T) && !defined(BOOST_NO_UNICODE_LITERALS)
     suite->add(BOOST_TEST_CASE(&test_char32_conversions));
 #endif
+    suite->add(BOOST_TEST_CASE(&test_getting_pointer_to_function));
 
     return suite;
 }
@@ -599,4 +601,17 @@
 }
 #endif
 
+template <class To, class From, class Func>
+To try_cast_by_ptr(const From& from, const Func& f) {
+    return f(from);
+};
+
+void test_getting_pointer_to_function()
+{
+    // Just checking that &lexical_cast<To, From> is not ambiguous
+    BOOST_CHECK_EQUAL(100, try_cast_by_ptr<int>("100", &boost::lexical_cast<int, const char[4]>));
+    BOOST_CHECK_EQUAL(100, try_cast_by_ptr<int>("100", &boost::lexical_cast<int, std::string>));
+    BOOST_CHECK_EQUAL(std::string("100"), try_cast_by_ptr<std::string>(100, &boost::lexical_cast<std::string, int>));
+}
+