20#ifndef RIPPLE_OVERLAY_ZEROCOPYSTREAM_H_INCLUDED
21#define RIPPLE_OVERLAY_ZEROCOPYSTREAM_H_INCLUDED
23#include <xrpl/beast/utility/instrumentation.h>
25#include <boost/asio/buffer.hpp>
26#include <google/protobuf/io/zero_copy_stream.h>
35template <
class Buffers>
39 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
68template <
class Buffers>
70 : last_(buffers.end())
71 , first_(buffers.begin())
72 , pos_((first_ != last_) ? *first_ :
const_buffer(nullptr, 0))
76template <
class Buffers>
80 *data = boost::asio::buffer_cast<void const*>(pos_);
81 *size = boost::asio::buffer_size(pos_);
85 pos_ = (++first_ != last_) ? *first_ :
const_buffer(
nullptr, 0);
89template <
class Buffers>
94 pos_ = *first_ + (boost::asio::buffer_size(*first_) - count);
98template <
class Buffers>
106 auto const size = boost::asio::buffer_size(pos_);
114 if (++first_ == last_)
128template <
class Streambuf>
133 using iterator =
typename buffers_type::const_iterator;
149 Next(
void** data,
int* size)
override;
152 BackUp(
int count)
override;
154 google::protobuf::int64
163template <
class Streambuf>
165 Streambuf& streambuf,
167 : streambuf_(streambuf)
168 , blockSize_(blockSize)
169 , buffers_(streambuf_.prepare(blockSize_))
170 , pos_(buffers_.begin())
174template <
class Streambuf>
178 streambuf_.commit(commit_);
181template <
class Streambuf>
187 streambuf_.commit(commit_);
191 if (pos_ == buffers_.end())
193 buffers_ = streambuf_.prepare(blockSize_);
194 pos_ = buffers_.begin();
197 *data = boost::asio::buffer_cast<void*>(*pos_);
198 *size = boost::asio::buffer_size(*pos_);
204template <
class Streambuf>
209 count <= commit_,
"ripple::ZeroCopyOutputStream::BackUp : valid input");
210 auto const n = commit_ - count;
211 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.