From 62320889d9075f97c3038117d05ba4c28504c841 Mon Sep 17 00:00:00 2001 From: Ibrahim Gokhan YANIKLAR Date: Tue, 6 Dec 2016 19:24:50 +0000 Subject: [PATCH 1/2] iostreams::detail::basic_buffer::resize expects std::streamsize --- include/boost/iostreams/detail/streambuf/indirect_streambuf.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/boost/iostreams/detail/streambuf/indirect_streambuf.hpp b/include/boost/iostreams/detail/streambuf/indirect_streambuf.hpp index e0597bc5..fe3cd58c 100644 --- a/include/boost/iostreams/detail/streambuf/indirect_streambuf.hpp +++ b/include/boost/iostreams/detail/streambuf/indirect_streambuf.hpp @@ -170,7 +170,7 @@ void indirect_streambuf::open std::streamsize size = pback_size_ + ( buffer_size ? buffer_size: std::streamsize(1) ); - in().resize(static_cast(size)); + in().resize(size); if (!shared_buffer()) init_get_area(); } @@ -178,7 +178,7 @@ void indirect_streambuf::open // Construct output buffer. if (can_write() && !shared_buffer()) { if (buffer_size != std::streamsize(0)) - out().resize(static_cast(buffer_size)); + out().resize(buffer_size); init_put_area(); } From 9c6d7242c61da833475536c11331bad91f5c7067 Mon Sep 17 00:00:00 2001 From: Ibrahim Gokhan YANIKLAR Date: Tue, 6 Dec 2016 19:26:06 +0000 Subject: [PATCH 2/2] optimized xsgetn and xsputn for data bigger than the buffer --- .../detail/streambuf/indirect_streambuf.hpp | 61 ++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/include/boost/iostreams/detail/streambuf/indirect_streambuf.hpp b/include/boost/iostreams/detail/streambuf/indirect_streambuf.hpp index fe3cd58c..444c5fb1 100644 --- a/include/boost/iostreams/detail/streambuf/indirect_streambuf.hpp +++ b/include/boost/iostreams/detail/streambuf/indirect_streambuf.hpp @@ -90,6 +90,8 @@ class indirect_streambuf pos_type seekoff( off_type off, BOOST_IOS::seekdir way, BOOST_IOS::openmode which ); pos_type seekpos(pos_type sp, BOOST_IOS::openmode which); + std::streamsize xsgetn(char_type* s, std::streamsize n); + std::streamsize xsputn(const char_type* s, std::streamsize n); // Declared in linked_streambuf. void set_next(streambuf_type* next); @@ -421,6 +423,65 @@ void indirect_streambuf::init_put_area() setp(0, 0); } +//----------Optimized xsgetn & xsputn-----------------------------------------// + +template +std::streamsize indirect_streambuf::xsgetn + (char_type* s, std::streamsize n) +{ + if (n < (std::max)(in().size() - pback_size_ - 2, std::streamsize(2))) + return streambuf_type::xsgetn(s, n); + + std::streamsize ret = 0; + if (!gptr()) init_get_area(); + const std::streamsize avail = egptr() - gptr(); + // First, copy the chars already present in the buffer. + + if (avail != 0) { + traits_type::copy(s, gptr(), avail); + s += avail; + setg(eback(), gptr() + avail, egptr()); + ret += avail; + n -= avail; + } + + // Need to loop in case of short reads. + for (std::streamsize len; n != 0; n -= len) { + len = obj().read(s, n, next_); + + if (len <= 0) { + this->set_true_eof(true); + break; + } + + ret += len; + s += len; + } + + if (n == 0) + setg(0, 0, 0); + + return ret; +} + +template +std::streamsize indirect_streambuf::xsputn + (const char_type* s, std::streamsize n) +{ + using namespace std; + + if (n < (std::max)(out().size() - pback_size_ - 2, std::streamsize(2))) + return streambuf_type::xsputn(s, n); + + if (output_buffered()) { + if (!pptr() || (shared_buffer() && gptr())) + init_put_area(); + sync_impl(); + } + + return obj().write(s, n, next_); +} + //----------------------------------------------------------------------------// } } } // End namespaces detail, iostreams, boost.