26class FZ_PUBLIC_SYMBOL buffer_access_interface
29 virtual ~buffer_access_interface();
35 virtual unsigned char const* get()
const = 0;
36 virtual unsigned char* get() = 0;
37 virtual unsigned char* get(
size_t write_size) = 0;
38 virtual void add(
size_t added) = 0;
46 virtual void consume(
size_t consumed) = 0;
47 virtual size_t size()
const = 0;
48 virtual void clear() = 0;
49 virtual void append(
unsigned char const* data,
size_t len) = 0;
50 virtual size_t capacity()
const = 0;
51 virtual void resize(
size_t size) = 0;
55 buffer_access_interface() =
default;
57 buffer_access_interface(buffer_access_interface
const&) =
default;
58 buffer_access_interface& operator=(buffer_access_interface
const&) =
default;
96 using value_type =
unsigned char;
98 basic_buffer()
noexcept =
default;
103 explicit basic_buffer(std::string_view
const&
data);
105 basic_buffer(basic_buffer
const& buf);
106 basic_buffer(basic_buffer && buf)
noexcept;
108 basic_buffer& operator=(basic_buffer
const& buf);
109 basic_buffer& operator=(basic_buffer && buf)
noexcept;
111 basic_buffer& operator=(std::string_view
const& v);
116 unsigned char const*
get()
const {
return pos_; }
117 unsigned char*
get() {
return pos_; }
120 unsigned char*
data() {
return pos_; }
121 unsigned char const*
data()
const {
return pos_; }
141 unsigned char*
get(
size_t write_size);
152 template<
typename T, std::enable_if_t<std::is_
signed_v<T>,
int> = 0>
155 add(
static_cast<size_t>(added));
165 size_t size()
const {
return size_; }
172 void clear_and_free();
179 void append(std::string_view
const& str);
180 void append(std::basic_string_view<uint8_t>
const&
data);
181 void append(std::vector<uint8_t>
const&
data);
182 void append(basic_buffer
const& b);
183 void append(
unsigned char v);
184 void append(
size_t len,
unsigned char c);
186 void push_back(
unsigned char v) {
194 basic_buffer& operator+=(std::string_view
const& str) {
198 basic_buffer& operator+=(std::vector<uint8_t>
const&
data) {
202 basic_buffer& operator+=(basic_buffer
const& b) {
207 bool empty()
const {
return size_ == 0; }
208 explicit operator bool()
const {
212 size_t capacity()
const {
return capacity_; }
213 void reserve(
size_t capacity);
215 void resize(
size_t size);
219 unsigned char &
operator[](
size_t i) {
return pos_[i]; }
221 bool operator==(basic_buffer
const& rhs)
const {
222 return *
this == rhs.to_view();
225 bool operator==(std::string_view
const& rhs)
const;
227 bool operator!=(basic_buffer
const& rhs)
const {
228 return !(*
this == rhs);
230 bool operator!=(std::string_view
const& rhs)
const {
231 return !(*
this == rhs);
234 std::string_view to_view()
const;
246 unsigned char* data_{};
247 unsigned char* pos_{};
266class owning_buffer :
public buffer_interface
269 using value_type =
unsigned char;
271 owning_buffer()
noexcept =
default;
272 explicit owning_buffer(
size_t capacity) : storage_(capacity) {}
273 explicit owning_buffer(std::string_view
const& data) : storage_(data) {}
274 owning_buffer(owning_buffer
const&) =
default;
275 owning_buffer(owning_buffer&&)
noexcept =
default;
276 owning_buffer& operator=(owning_buffer
const&) =
default;
277 owning_buffer& operator=(owning_buffer&&)
noexcept =
default;
279 owning_buffer& operator=(std::string_view
const& data) {
284 unsigned char const* get()
const override {
return storage_.
get(); }
285 unsigned char* get()
override {
return storage_.get(); }
286 unsigned char* get(
size_t size)
override {
return storage_.get(size); }
287 unsigned char* data() {
return storage_.data(); }
288 unsigned char const* data()
const {
return storage_.data(); }
289 void add(
size_t size)
override { storage_.add(size); }
291 template<
typename T, std::enable_if_t<std::is_
signed_v<T>,
int> = 0>
292 void add(T size) { storage_.add(size); }
294 void consume(
size_t size)
override { storage_.consume(size); }
295 size_t size()
const override {
return storage_.size(); }
296 bool empty()
const {
return storage_.empty(); }
297 explicit operator bool()
const {
return bool(storage_); }
298 size_t capacity()
const override {
return storage_.capacity(); }
299 void reserve(
size_t capacity)
override { storage_.reserve(capacity); }
300 void resize(
size_t size)
override { storage_.resize(size); }
301 void clear()
override { storage_.clear(); }
302 void clear_and_free()
override { storage_.clear_and_free(); }
303 void append(
unsigned char const* data,
size_t size)
override { storage_.append(data, size); }
304 void append(std::string_view
const& data) { storage_.append(data); }
305 void append(std::basic_string_view<uint8_t>
const& data) { storage_.append(data); }
306 void append(std::vector<uint8_t>
const& data) { storage_.append(data); }
307 void append(owning_buffer
const& data) { storage_.append(data.storage_); }
308 void append(
unsigned char value) { storage_.append(value); }
309 void append(
size_t size,
unsigned char value) { storage_.append(size, value); }
310 void push_back(
unsigned char value) { storage_.push_back(value); }
312 owning_buffer& operator+=(
unsigned char value) {
317 owning_buffer& operator+=(std::string_view
const& data) {
322 owning_buffer& operator+=(std::vector<uint8_t>
const& data) {
327 owning_buffer& operator+=(owning_buffer
const& data) {
328 storage_ += data.storage_;
332 unsigned char operator[](
size_t i)
const {
return storage_[i]; }
333 unsigned char& operator[](
size_t i) {
return storage_[i]; }
334 bool operator==(owning_buffer
const& rhs)
const {
return storage_ == rhs.storage_; }
335 bool operator==(std::string_view
const& rhs)
const {
return storage_ == rhs; }
336 bool operator!=(owning_buffer
const& rhs)
const {
return storage_ != rhs.storage_; }
337 bool operator!=(std::string_view
const& rhs)
const {
return storage_ != rhs; }
338 std::string_view to_view()
const {
return storage_.to_view(); }
339 void wipe() { storage_.wipe(); }
340 void wipe_unused() { storage_.wipe_unused(); }
343 ~owning_buffer()
override;
377 using owning_buffer::owning_buffer;
378 using owning_buffer::operator=;
379 secure_buffer()
noexcept =
default;
380 secure_buffer(secure_buffer
const&) =
default;
381 secure_buffer(secure_buffer&&)
noexcept =
default;
382 secure_buffer& operator=(secure_buffer
const&) =
default;
383 secure_buffer& operator=(secure_buffer&&)
noexcept =
default;
384 ~secure_buffer()
override;