forked from boostorg/conversion
Fixed so it doesn't trim any whitespace when converting, fixed reversed bad_lexical_cast constructor parameters, changed to pass-by-const reference
[SVN r29629]
This commit is contained in:
@@ -12,7 +12,7 @@
|
||||
// with additional fixes and suggestions from Gennaro Prota,
|
||||
// Beman Dawes, Dave Abrahams, Daryle Walker, Peter Dimov,
|
||||
// and other Boosters
|
||||
// when: November 2000, March 2003
|
||||
// when: November 2000, March 2003, June 2005
|
||||
|
||||
#include <string>
|
||||
#include <typeinfo>
|
||||
@@ -45,9 +45,9 @@ namespace boost
|
||||
{
|
||||
}
|
||||
bad_lexical_cast(
|
||||
const std::type_info &s,
|
||||
const std::type_info &t) :
|
||||
source(&s), target(&t)
|
||||
const std::type_info &source_type,
|
||||
const std::type_info &target_type) :
|
||||
source(&source_type), target(&target_type)
|
||||
{
|
||||
}
|
||||
const std::type_info &source_type() const
|
||||
@@ -123,6 +123,11 @@ namespace boost
|
||||
template<typename Target, typename Source>
|
||||
class lexical_stream
|
||||
{
|
||||
private:
|
||||
typedef typename widest_char<
|
||||
typename stream_char<Target>::type,
|
||||
typename stream_char<Source>::type>::type char_type;
|
||||
|
||||
public:
|
||||
lexical_stream()
|
||||
{
|
||||
@@ -148,7 +153,7 @@ namespace boost
|
||||
{
|
||||
return !is_pointer<InputStreamable>::value &&
|
||||
stream >> output &&
|
||||
(stream >> std::ws).eof();
|
||||
stream.get() == std::char_traits<char_type>::eof();
|
||||
}
|
||||
bool operator>>(std::string &output)
|
||||
{
|
||||
@@ -166,10 +171,6 @@ namespace boost
|
||||
}
|
||||
#endif
|
||||
private:
|
||||
typedef typename widest_char<
|
||||
typename stream_char<Target>::type,
|
||||
typename stream_char<Source>::type>::type char_type;
|
||||
|
||||
#if defined(BOOST_NO_STRINGSTREAM)
|
||||
std::strstream stream;
|
||||
#elif defined(BOOST_NO_STD_LOCALE)
|
||||
@@ -180,6 +181,42 @@ namespace boost
|
||||
};
|
||||
}
|
||||
|
||||
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||
|
||||
// call-by-const reference version
|
||||
|
||||
namespace detail
|
||||
{
|
||||
template<class T>
|
||||
struct array_to_pointer_decay
|
||||
{
|
||||
typedef T type;
|
||||
};
|
||||
|
||||
template<class T, size_t N>
|
||||
struct array_to_pointer_decay<T[N]>
|
||||
{
|
||||
typedef const T * type;
|
||||
};
|
||||
}
|
||||
|
||||
template<typename Target, typename Source>
|
||||
Target lexical_cast(const Source &arg)
|
||||
{
|
||||
typedef typename detail::array_to_pointer_decay<Source>::type NewSource;
|
||||
|
||||
detail::lexical_stream<Target, NewSource> interpreter;
|
||||
Target result;
|
||||
|
||||
if(!(interpreter << arg && interpreter >> result))
|
||||
throw_exception(bad_lexical_cast(typeid(NewSource), typeid(Target)));
|
||||
return result;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
// call-by-value fallback version (deprecated)
|
||||
|
||||
template<typename Target, typename Source>
|
||||
Target lexical_cast(Source arg)
|
||||
{
|
||||
@@ -187,12 +224,14 @@ namespace boost
|
||||
Target result;
|
||||
|
||||
if(!(interpreter << arg && interpreter >> result))
|
||||
throw_exception(bad_lexical_cast(typeid(Target), typeid(Source)));
|
||||
throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)));
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
// Copyright Kevlin Henney, 2000-2003. All rights reserved.
|
||||
// Copyright Kevlin Henney, 2000-2005. All rights reserved.
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See
|
||||
// accompanying file LICENSE_1_0.txt or copy at
|
||||
@@ -200,4 +239,3 @@ namespace boost
|
||||
|
||||
#undef DISABLE_WIDE_CHAR_SUPPORT
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user