6#ifndef TTG_SERIALIZATION_STREAM_H
7#define TTG_SERIALIZATION_STREAM_H
17 using std::streambuf::streambuf;
20 size_t size()
const {
return size_; }
23 std::streamsize
xsputn(
const char_type* s, std::streamsize n)
override {
35 using std::streambuf::streambuf;
37 const auto&
iovec()
const {
return iovec_; };
40 std::streamsize
xsputn(
const char_type* s, std::streamsize n)
override {
41 iovec_.emplace_back(s, n);
46 std::vector<std::pair<const void*, std::size_t>> iovec_ = {};
52 using std::streambuf::streambuf;
57 std::streamsize
xsgetn(char_type* s, std::streamsize max_n)
override {
58 const auto n = iovec_[current_item_].second;
60 throw std::out_of_range(
"iovec_istreambuf::xsgetn(dest, max_n): actual size of data exceeds max_n");
61 const char*
ptr =
static_cast<const char*
>(iovec_[current_item_].first);
62 std::copy(
ptr,
ptr + n, s);
67 std::size_t current_item_ = 0;
68 const std::vector<std::pair<const void*, std::size_t>>& iovec_;
74 using std::streambuf::streambuf;
76 byte_ostreambuf(char_type* buffer, std::streamsize buffer_size = std::numeric_limits<std::streamsize>::max()) : buffer_(buffer), cursor_(buffer_), buffer_size_(buffer_size) {}
79 std::streamsize
sputn(
const char_type* s, std::streamsize n)
noexcept {
83 std::streamsize
xsputn(
const char_type* s, std::streamsize n)
noexcept override final {
84 assert((cursor_ - buffer_) + n <= buffer_size_);
85 std::memcpy(cursor_, s, n *
sizeof(char_type));
91 std::streamsize
size() const noexcept {
92 return cursor_ - buffer_;
98 std::streamsize buffer_size_;
104 using std::streambuf::streambuf;
106 byte_istreambuf(
const char_type* buffer, std::size_t buffer_size = std::numeric_limits<std::size_t>::max()) : buffer_(buffer), cursor_(buffer_), buffer_size_(buffer_size) {}
109 std::streamsize
sgetn(char_type* s, std::streamsize n)
noexcept {
110 return this->
xsgetn(s, n);
113 std::streamsize
xsgetn(char_type* s, std::streamsize max_n)
noexcept override final {
114 const auto n_to_read = std::min(buffer_size_ - (cursor_ - buffer_), max_n);
115 std::memcpy(s, cursor_, n_to_read *
sizeof(char_type));
116 cursor_ += n_to_read;
121 std::streamsize
size() const noexcept {
122 return cursor_ - buffer_;
126 const char_type* buffer_;
127 const char_type* cursor_;
128 std::streamsize buffer_size_;
streambuf that writes bytes to a buffer in memory
byte_istreambuf(const char_type *buffer, std::size_t buffer_size=std::numeric_limits< std::size_t >::max())
std::streamsize xsgetn(char_type *s, std::streamsize max_n) noexcept override final
std::streamsize sgetn(char_type *s, std::streamsize n) noexcept
std::streamsize size() const noexcept
number of characters read from the buffer
streambuf that writes bytes to a buffer in memory
std::streamsize xsputn(const char_type *s, std::streamsize n) noexcept override final
std::streamsize sputn(const char_type *s, std::streamsize n) noexcept
byte_ostreambuf(char_type *buffer, std::streamsize buffer_size=std::numeric_limits< std::streamsize >::max())
std::streamsize size() const noexcept
number of characters written to the buffer
streambuf that counts bytes
std::streamsize xsputn(const char_type *s, std::streamsize n) override
streambuf that reads vector of address-size pairs
std::streamsize xsgetn(char_type *s, std::streamsize max_n) override
iovec_istreambuf(const std::vector< std::pair< const void *, std::size_t > > &iovec)
streambuf that records vector of address-size pairs
const auto & iovec() const
std::streamsize xsputn(const char_type *s, std::streamsize n) override