1#ifndef XRPL_OVERLAY_ZEROCOPYSTREAM_H_INCLUDED
2#define XRPL_OVERLAY_ZEROCOPYSTREAM_H_INCLUDED
4#include <xrpl/beast/utility/instrumentation.h>
6#include <boost/asio/buffer.hpp>
8#include <google/protobuf/io/zero_copy_stream.h>
17template <
class Buffers>
21 using iterator =
typename Buffers::const_iterator;
33 Next(
void const** data,
int* size)
override;
36 BackUp(
int count)
override;
39 Skip(
int count)
override;
41 google::protobuf::int64
50template <
class Buffers>
52 : last_(buffers.end())
53 , first_(buffers.begin())
54 , pos_((first_ != last_) ? *first_ :
const_buffer(nullptr, 0))
58template <
class Buffers>
63 *size = boost::asio::buffer_size(pos_);
67 pos_ = (++first_ != last_) ? *first_ :
const_buffer(
nullptr, 0);
71template <
class Buffers>
76 pos_ = *first_ + (boost::asio::buffer_size(*first_) - count);
80template <
class Buffers>
88 auto const size = boost::asio::buffer_size(pos_);
96 if (++first_ == last_)
110template <
class Streambuf>
115 using iterator =
typename buffers_type::const_iterator;
131 Next(
void** data,
int* size)
override;
134 BackUp(
int count)
override;
136 google::protobuf::int64
145template <
class Streambuf>
147 Streambuf& streambuf,
149 : streambuf_(streambuf)
150 , blockSize_(blockSize)
151 , buffers_(streambuf_.prepare(blockSize_))
152 , pos_(buffers_.begin())
156template <
class Streambuf>
160 streambuf_.commit(commit_);
163template <
class Streambuf>
169 streambuf_.commit(commit_);
173 if (pos_ == buffers_.end())
175 buffers_ = streambuf_.prepare(blockSize_);
176 pos_ = buffers_.begin();
179 *data = *pos_.data();
180 *size = boost::asio::buffer_size(*pos_);
186template <
class Streambuf>
191 count <= commit_,
"ripple::ZeroCopyOutputStream::BackUp : valid input");
192 auto const n = commit_ - count;
193 streambuf_.commit(n);
Implements ZeroCopyOutputStream around a Streambuf.
google::protobuf::int64 ByteCount() const override
google::protobuf::int64 count_
typename Streambuf::mutable_buffers_type buffers_type
void BackUp(int count) override
ZeroCopyOutputStream(Streambuf &streambuf, std::size_t blockSize)
typename buffers_type::const_iterator iterator
boost::asio::mutable_buffer mutable_buffer
bool Next(void **data, int *size) override
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.