Minimal stream for writing to an existing span of bytes. */
| 127 | /** Minimal stream for writing to an existing span of bytes. |
| 128 | */ |
| 129 | class SpanWriter |
| 130 | { |
| 131 | private: |
| 132 | std::span<std::byte> m_dest; |
| 133 | |
| 134 | public: |
| 135 | explicit SpanWriter(std::span<std::byte> dest) : m_dest{dest} {} |
| 136 | template <typename... Args> |
| 137 | SpanWriter(std::span<std::byte> dest, Args&&... args) : SpanWriter{dest} |
| 138 | { |
| 139 | ::SerializeMany(*this, std::forward<Args>(args)...); |
| 140 | } |
| 141 | |
| 142 | void write(std::span<const std::byte> src) |
| 143 | { |
| 144 | if (src.size() > m_dest.size()) { |
| 145 | throw std::ios_base::failure("SpanWriter::write(): exceeded buffer size"); |
| 146 | } |
| 147 | memcpy(m_dest.data(), src.data(), src.size()); |
| 148 | m_dest = m_dest.subspan(src.size()); |
| 149 | } |
| 150 | |
| 151 | template<typename T> |
| 152 | SpanWriter& operator<<(const T& obj) |
| 153 | { |
| 154 | ::Serialize(*this, obj); |
| 155 | return *this; |
| 156 | } |
| 157 | }; |
| 158 | |
| 159 | /** Double ended buffer combining vector and stream-like interfaces. |
| 160 | * |