20 #ifndef RIPPLE_OVERLAY_ZEROCOPYSTREAM_H_INCLUDED
21 #define RIPPLE_OVERLAY_ZEROCOPYSTREAM_H_INCLUDED
23 #include <google/protobuf/io/zero_copy_stream.h>
24 #include <boost/asio/buffer.hpp>
33 template <
class Buffers>
35 :
public ::google::protobuf::io::ZeroCopyInputStream
38 using iterator =
typename Buffers::const_iterator;
51 Next (
const void** data,
int* size)
override;
54 BackUp (
int count)
override;
57 Skip (
int count)
override;
59 google::protobuf::int64
68 template <
class Buffers>
70 Buffers
const& buffers)
71 : last_ (buffers.end())
72 , first_ (buffers.begin())
73 , pos_ ((first_ != last_) ?
78 template <
class Buffers>
81 const void** data,
int* size)
83 *data = boost::asio::buffer_cast<void const*>(pos_);
84 *size = boost::asio::buffer_size(pos_);
88 pos_ = (++first_ != last_) ? *first_ :
93 template <
class Buffers>
99 (boost::asio::buffer_size(*first_) - count);
103 template <
class Buffers>
112 boost::asio::buffer_size(pos_);
120 if (++first_ == last_)
134 template <
class Streambuf>
136 :
public ::google::protobuf::io::ZeroCopyOutputStream
140 using iterator =
typename buffers_type::const_iterator;
158 Next (
void** data,
int* size)
override;
161 BackUp (
int count)
override;
163 google::protobuf::int64
172 template <
class Streambuf>
175 : streambuf_ (streambuf)
176 , blockSize_ (blockSize)
177 , buffers_ (streambuf_.prepare(blockSize_))
178 , pos_ (buffers_.begin())
182 template <
class Streambuf>
186 streambuf_.commit(commit_);
189 template <
class Streambuf>
192 void** data,
int* size)
196 streambuf_.commit(commit_);
200 if (pos_ == buffers_.end())
202 buffers_ = streambuf_.prepare (blockSize_);
203 pos_ = buffers_.begin();
206 *data = boost::asio::buffer_cast<void*>(*pos_);
207 *size = boost::asio::buffer_size(*pos_);
213 template <
class Streambuf>
217 assert(count <= commit_);
218 auto const n = commit_ - count;
219 streambuf_.commit(n);