20 #ifndef RIPPLE_OVERLAY_ZEROCOPYSTREAM_H_INCLUDED
21 #define RIPPLE_OVERLAY_ZEROCOPYSTREAM_H_INCLUDED
23 #include <boost/asio/buffer.hpp>
25 #include <google/protobuf/io/zero_copy_stream.h>
34 template <
class Buffers>
38 using iterator =
typename Buffers::const_iterator;
50 Next(
const void** data,
int* size)
override;
53 BackUp(
int count)
override;
56 Skip(
int count)
override;
58 google::protobuf::int64
67 template <
class Buffers>
69 : last_(buffers.end())
70 , first_(buffers.begin())
71 , pos_((first_ != last_) ? *first_ :
const_buffer(nullptr, 0))
75 template <
class Buffers>
79 *data = boost::asio::buffer_cast<void const*>(pos_);
80 *size = boost::asio::buffer_size(pos_);
84 pos_ = (++first_ != last_) ? *first_ :
const_buffer(
nullptr, 0);
88 template <
class Buffers>
93 pos_ = *first_ + (boost::asio::buffer_size(*first_) - count);
97 template <
class Buffers>
105 auto const size = boost::asio::buffer_size(pos_);
113 if (++first_ == last_)
127 template <
class Streambuf>
132 using iterator =
typename buffers_type::const_iterator;
148 Next(
void** data,
int* size)
override;
151 BackUp(
int count)
override;
153 google::protobuf::int64
162 template <
class Streambuf>
164 Streambuf& streambuf,
166 : streambuf_(streambuf)
167 , blockSize_(blockSize)
168 , buffers_(streambuf_.prepare(blockSize_))
169 , pos_(buffers_.begin())
173 template <
class Streambuf>
177 streambuf_.commit(commit_);
180 template <
class Streambuf>
186 streambuf_.commit(commit_);
190 if (pos_ == buffers_.end())
192 buffers_ = streambuf_.prepare(blockSize_);
193 pos_ = buffers_.begin();
196 *data = boost::asio::buffer_cast<void*>(*pos_);
197 *size = boost::asio::buffer_size(*pos_);
203 template <
class Streambuf>
207 assert(count <= commit_);
208 auto const n = commit_ - count;
209 streambuf_.commit(n);