[lexical_cast] Merge from trunk: r56158 (fix warning on MSVC warning level 4) and r53668 (avoid C style casts).

[SVN r56159]
This commit is contained in:
Alexander Nasonov
2009-09-12 22:11:01 +00:00
parent a3e690da32
commit 9e764f3e49

View File

@@ -47,6 +47,13 @@
#define BOOST_LCAST_NO_WCHAR_T #define BOOST_LCAST_NO_WCHAR_T
#endif #endif
#ifdef BOOST_NO_TYPEID
#define BOOST_LCAST_THROW_BAD_CAST(S, T) throw_exception(bad_lexical_cast())
#else
#define BOOST_LCAST_THROW_BAD_CAST(Source, Target) \
throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)))
#endif
namespace boost namespace boost
{ {
// exception used to indicate runtime lexical_cast failure // exception used to indicate runtime lexical_cast failure
@@ -577,7 +584,7 @@ namespace boost
lexical_stream(char_type* = 0, char_type* = 0) lexical_stream(char_type* = 0, char_type* = 0)
{ {
stream.unsetf(std::ios::skipws); stream.unsetf(std::ios::skipws);
lcast_set_precision(stream, (Source*)0, (Target*)0); lcast_set_precision(stream, static_cast<Source*>(0), static_cast<Target*>(0) );
} }
~lexical_stream() ~lexical_stream()
{ {
@@ -694,7 +701,7 @@ namespace boost
{ {
this->setp(start, finish); this->setp(start, finish);
std::basic_ostream<CharT> stream(static_cast<Base*>(this)); std::basic_ostream<CharT> stream(static_cast<Base*>(this));
lcast_set_precision(stream, (OutputStreamable*)0); lcast_set_precision(stream, static_cast<OutputStreamable*>(0));
bool const result = !(stream << input).fail(); bool const result = !(stream << input).fail();
finish = this->pptr(); finish = this->pptr();
return result; return result;
@@ -764,7 +771,7 @@ namespace boost
this->setg(start, start, finish); this->setg(start, start, finish);
std::basic_istream<CharT> stream(static_cast<Base*>(this)); std::basic_istream<CharT> stream(static_cast<Base*>(this));
stream.unsetf(std::ios::skipws); stream.unsetf(std::ios::skipws);
lcast_set_precision(stream, (InputStreamable*)0); lcast_set_precision(stream, static_cast<InputStreamable*>(0));
#if (defined _MSC_VER) #if (defined _MSC_VER)
# pragma warning( pop ) # pragma warning( pop )
#endif #endif
@@ -1111,6 +1118,12 @@ namespace boost
typedef const T * type; typedef const T * type;
}; };
#if (defined _MSC_VER)
# pragma warning( push )
# pragma warning( disable : 4701 ) // possible use of ... before initialization
# pragma warning( disable : 4702 ) // unreachable code
#endif
template< typename Target template< typename Target
, typename Source , typename Source
, bool Unlimited // string representation of Source is unlimited , bool Unlimited // string representation of Source is unlimited
@@ -1136,28 +1149,14 @@ namespace boost
, detail::lexical_stream_limited_src<CharT,base,traits> , detail::lexical_stream_limited_src<CharT,base,traits>
>::type interpreter(buf, buf + src_len); >::type interpreter(buf, buf + src_len);
// The original form, reproduced below, is more elegant Target result;
// but yields a spurious C4701 warning ("possible use of if(!(interpreter << arg && interpreter >> result))
// "result" before initialization") with VC7.1 (/W4). BOOST_LCAST_THROW_BAD_CAST(Source, Target);
// return result;
// Target result;
//
// if(!(interpreter << arg && interpreter >> result))
// throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)));
// return result;
if(interpreter << arg) {
Target result;
if (interpreter >> result)
return result;
}
#ifndef BOOST_NO_TYPEID
throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)));
#else
throw_exception(bad_lexical_cast());
#endif
return Target(); // normally never reached (throw_exception)
} }
#if (defined _MSC_VER)
# pragma warning( pop )
#endif
} }
template<typename Target, typename Source> template<typename Target, typename Source>