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