Fix streams and buffers usage (refs #8267 and refs #7704). Now conversions the use STL streams shall work faster

[SVN r83642]
This commit is contained in:
Antony Polukhin
2013-03-30 07:20:22 +00:00
parent 633b852b81
commit ab0727fdac

View File

@@ -1526,13 +1526,12 @@ namespace boost {
#if defined(BOOST_NO_STRINGSTREAM) #if defined(BOOST_NO_STRINGSTREAM)
typedef std::ostrstream out_stream_t; typedef std::ostrstream out_stream_t;
typedef parser_buf<std::strstreambuf, char> unlocked_but_t;
#elif defined(BOOST_NO_STD_LOCALE) #elif defined(BOOST_NO_STD_LOCALE)
typedef std::ostringstream out_stream_t; typedef std::ostringstream out_stream_t;
typedef parser_buf<std::stringbuf, char> unlocked_but_t; typedef parser_buf<std::streambuf, char> buffer_t;
#else #else
typedef std::basic_ostringstream<CharT, Traits> out_stream_t; typedef std::basic_ostringstream<CharT, Traits> out_stream_t;
typedef parser_buf<std::basic_stringbuf<CharT, Traits>, CharT> unlocked_but_t; typedef parser_buf<std::basic_streambuf<CharT, Traits>, CharT> buffer_t;
#endif #endif
typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_c< typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_c<
RequiresStringbuffer, RequiresStringbuffer,
@@ -1615,8 +1614,9 @@ namespace boost {
BOOST_STATIC_ASSERT((boost::is_same<char, CharT>::value)); BOOST_STATIC_ASSERT((boost::is_same<char, CharT>::value));
#endif #endif
bool const result = !(out_stream << input).fail(); bool const result = !(out_stream << input).fail();
const unlocked_but_t* const p const buffer_t* const p = static_cast<buffer_t*>(
= static_cast<unlocked_but_t*>(out_stream.rdbuf()) ; static_cast<std::basic_streambuf<CharT, Traits>*>(out_stream.rdbuf())
);
start = p->pbase(); start = p->pbase();
finish = p->pptr(); finish = p->pptr();
return result; return result;
@@ -1984,15 +1984,13 @@ namespace boost {
std::istrstream stream(start, finish - start); std::istrstream stream(start, finish - start);
#else #else
#if defined(BOOST_NO_STD_LOCALE) buffer_t buf;
std::istringstream stream;
#else
std::basic_istringstream<CharT, Traits> stream;
#endif // BOOST_NO_STD_LOCALE
unlocked_but_t buf;
buf.setbuf(start, finish - start); buf.setbuf(start, finish - start);
dynamic_cast<std::basic_ios<CharT, Traits>&>(stream).rdbuf(&buf); #if defined(BOOST_NO_STD_LOCALE)
std::istream stream(&buf);
#else
std::basic_istream<CharT, Traits> stream(&buf);
#endif // BOOST_NO_STD_LOCALE
#endif // BOOST_NO_STRINGSTREAM #endif // BOOST_NO_STRINGSTREAM
stream.unsetf(std::ios::skipws); stream.unsetf(std::ios::skipws);