summaryrefslogtreecommitdiff
path: root/boost/lexical_cast/detail/converter_lexical_streams.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/lexical_cast/detail/converter_lexical_streams.hpp')
-rw-r--r--boost/lexical_cast/detail/converter_lexical_streams.hpp64
1 files changed, 31 insertions, 33 deletions
diff --git a/boost/lexical_cast/detail/converter_lexical_streams.hpp b/boost/lexical_cast/detail/converter_lexical_streams.hpp
index 981594995a..86c9c6d2c0 100644
--- a/boost/lexical_cast/detail/converter_lexical_streams.hpp
+++ b/boost/lexical_cast/detail/converter_lexical_streams.hpp
@@ -1,6 +1,6 @@
// Copyright Kevlin Henney, 2000-2005.
// Copyright Alexander Nasonov, 2006-2010.
-// Copyright Antony Polukhin, 2011-2014.
+// Copyright Antony Polukhin, 2011-2016.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
@@ -13,7 +13,7 @@
// Beman Dawes, Dave Abrahams, Daryle Walker, Peter Dimov,
// Alexander Nasonov, Antony Polukhin, Justin Viiret, Michael Hofmann,
// Cheng Yang, Matthew Bradbury, David W. Birdsall, Pavel Korzh and other Boosters
-// when: November 2000, March 2003, June 2005, June 2006, March 2011 - 2014
+// when: November 2000, March 2003, June 2005, June 2006, March 2011 - 2014, Nowember 2016
#ifndef BOOST_LEXICAL_CAST_DETAIL_CONVERTER_LEXICAL_STREAMS_HPP
#define BOOST_LEXICAL_CAST_DETAIL_CONVERTER_LEXICAL_STREAMS_HPP
@@ -107,23 +107,26 @@ namespace boost {
namespace detail
{
- struct do_not_construct_out_stream_t{};
-
+ struct do_not_construct_out_buffer_t{};
+ struct do_not_construct_out_stream_t{
+ do_not_construct_out_stream_t(do_not_construct_out_buffer_t*){}
+ };
+
template <class CharT, class Traits>
struct out_stream_helper_trait {
#if defined(BOOST_NO_STRINGSTREAM)
- typedef std::ostrstream out_stream_t;
- typedef void buffer_t;
+ typedef std::ostream out_stream_t;
+ typedef basic_unlockedbuf<std::strstreambuf, char> stringbuffer_t;
#elif defined(BOOST_NO_STD_LOCALE)
- typedef std::ostringstream out_stream_t;
- typedef basic_unlockedbuf<std::streambuf, char> buffer_t;
+ typedef std::ostream out_stream_t;
+ typedef basic_unlockedbuf<std::stringbuf, char> stringbuffer_t;
+ typedef basic_unlockedbuf<std::streambuf, char> buffer_t;
#else
- typedef std::basic_ostringstream<CharT, Traits>
- out_stream_t;
- typedef basic_unlockedbuf<std::basic_streambuf<CharT, Traits>, CharT>
- buffer_t;
+ typedef std::basic_ostream<CharT, Traits> out_stream_t;
+ typedef basic_unlockedbuf<std::basic_stringbuf<CharT, Traits>, CharT> stringbuffer_t;
+ typedef basic_unlockedbuf<std::basic_streambuf<CharT, Traits>, CharT> buffer_t;
#endif
- };
+ };
}
namespace detail // optimized stream wrappers
@@ -134,19 +137,19 @@ namespace boost {
, std::size_t CharacterBufferSize
>
class lexical_istream_limited_src: boost::noncopyable {
- typedef BOOST_DEDUCED_TYPENAME out_stream_helper_trait<CharT, Traits>::buffer_t
- buffer_t;
-
- typedef BOOST_DEDUCED_TYPENAME out_stream_helper_trait<CharT, Traits>::out_stream_t
- out_stream_t;
-
typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_c<
RequiresStringbuffer,
- out_stream_t,
+ BOOST_DEDUCED_TYPENAME out_stream_helper_trait<CharT, Traits>::out_stream_t,
do_not_construct_out_stream_t
>::type deduced_out_stream_t;
- // A string representation of Source is written to `buffer`.
+ typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_c<
+ RequiresStringbuffer,
+ BOOST_DEDUCED_TYPENAME out_stream_helper_trait<CharT, Traits>::stringbuffer_t,
+ do_not_construct_out_buffer_t
+ >::type deduced_out_buffer_t;
+
+ deduced_out_buffer_t out_buffer;
deduced_out_stream_t out_stream;
CharT buffer[CharacterBufferSize];
@@ -157,7 +160,9 @@ namespace boost {
public:
lexical_istream_limited_src() BOOST_NOEXCEPT
- : start(buffer)
+ : out_buffer()
+ , out_stream(&out_buffer)
+ , start(buffer)
, finish(buffer + CharacterBufferSize)
{}
@@ -170,10 +175,6 @@ namespace boost {
}
private:
- // Undefined:
- lexical_istream_limited_src(lexical_istream_limited_src const&);
- void operator=(lexical_istream_limited_src const&);
-
/************************************ HELPER FUNCTIONS FOR OPERATORS << ( ... ) ********************************/
bool shl_char(CharT ch) BOOST_NOEXCEPT {
Traits::assign(buffer[0], ch);
@@ -212,7 +213,7 @@ namespace boost {
"Use boost::locale instead" );
return shl_input_streamable(str);
}
-
+
bool shl_char_array_limited(CharT const* str, std::size_t max_size) BOOST_NOEXCEPT {
start = str;
finish = std::find(start, start + max_size, Traits::to_char_type(0));
@@ -232,8 +233,8 @@ namespace boost {
try {
#endif
bool const result = !(out_stream << input).fail();
- const buffer_t* const p = static_cast<buffer_t*>(
- static_cast<std::basic_streambuf<CharT, Traits>*>(out_stream.rdbuf())
+ const deduced_out_buffer_t* const p = static_cast<deduced_out_buffer_t*>(
+ out_stream.rdbuf()
);
start = p->pbase();
finish = p->pptr();
@@ -573,14 +574,11 @@ namespace boost {
"support such conversions. Try updating it."
);
#endif
- typedef BOOST_DEDUCED_TYPENAME out_stream_helper_trait<CharT, Traits>::buffer_t
- buffer_t;
#if defined(BOOST_NO_STRINGSTREAM)
std::istrstream stream(start, finish - start);
#else
-
- buffer_t buf;
+ BOOST_DEDUCED_TYPENAME out_stream_helper_trait<CharT, Traits>::buffer_t buf;
// Usually `istream` and `basic_istream` do not modify
// content of buffer; `buffer_t` assures that this is true
buf.setbuf(const_cast<CharT*>(start), finish - start);