3#include <xrpl/beast/utility/instrumentation.h>
5#include <boost/asio/buffer.hpp>
7#include <google/protobuf/io/zero_copy_stream.h>
16template <
class Buffers>
20 using iterator =
typename Buffers::const_iterator;
32 Next(
void const** data,
int* size)
override;
35 BackUp(
int count)
override;
38 Skip(
int count)
override;
40 google::protobuf::int64
49template <
class Buffers>
51 : last_(buffers.end())
52 , first_(buffers.begin())
53 , pos_((first_ != last_) ? *first_ :
const_buffer(nullptr, 0))
57template <
class Buffers>
62 *size = boost::asio::buffer_size(pos_);
66 pos_ = (++first_ != last_) ? *first_ :
const_buffer(
nullptr, 0);
70template <
class Buffers>
75 pos_ = *first_ + (boost::asio::buffer_size(*first_) - count);
79template <
class Buffers>
87 auto const size = boost::asio::buffer_size(pos_);
95 if (++first_ == last_)
109template <
class Streambuf>
114 using iterator =
typename buffers_type::const_iterator;
130 Next(
void** data,
int* size)
override;
133 BackUp(
int count)
override;
135 google::protobuf::int64
144template <
class Streambuf>
146 : streambuf_(streambuf)
147 , blockSize_(blockSize)
148 , buffers_(streambuf_.prepare(blockSize_))
149 , pos_(buffers_.begin())
153template <
class Streambuf>
157 streambuf_.commit(commit_);
160template <
class Streambuf>
166 streambuf_.commit(commit_);
170 if (pos_ == buffers_.end())
172 buffers_ = streambuf_.prepare(blockSize_);
173 pos_ = buffers_.begin();
176 *data = *pos_.data();
177 *size = boost::asio::buffer_size(*pos_);
183template <
class Streambuf>
187 XRPL_ASSERT(count <= commit_,
"xrpl::ZeroCopyOutputStream::BackUp : valid input");
188 auto const n = commit_ - count;
189 streambuf_.commit(n);
Implements ZeroCopyOutputStream around a Streambuf.
typename Streambuf::mutable_buffers_type buffers_type
void BackUp(int count) override
google::protobuf::int64 count_
boost::asio::mutable_buffer mutable_buffer
ZeroCopyOutputStream(Streambuf &streambuf, std::size_t blockSize)
google::protobuf::int64 ByteCount() const override
typename buffers_type::const_iterator iterator
bool Next(void **data, int *size) override
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.