libfilezilla
|
The buffer class is a simple buffer where data can be appended at the end and consumed at the front. Think of it as a deque with contiguous storage. More...
#include <buffer.hpp>
Public Types | |
typedef unsigned char | value_type |
Public Member Functions | |
buffer (size_t capacity) | |
Initially reserves the passed capacity. | |
buffer (buffer const &buf) | |
buffer (buffer &&buf) noexcept | |
buffer & | operator= (buffer const &buf) |
buffer & | operator= (buffer &&buf) noexcept |
unsigned char const * | get () const |
Undefined if buffer is empty. | |
unsigned char * | get () |
unsigned char * | data () |
Same as get() | |
unsigned char const * | data () const |
unsigned char * | get (size_t write_size) |
Returns a writable buffer guaranteed to be large enough for write_size bytes, call add when done. More... | |
void | add (size_t added) |
Increase size by the passed amount. Call this after having obtained a writable buffer with get(size_t write_size) | |
template<typename T , std::enable_if_t< std::is_signed_v< T >, int > = 0> | |
void | add (T added) |
Overload of add for signed types, only adds if value is positive. More... | |
void | consume (size_t consumed) |
Removes consumed bytes from the beginning of the buffer. More... | |
size_t | size () const |
void | clear () |
void | append (unsigned char const *data, size_t len) |
Appends the passed data to the buffer. More... | |
void | append (std::string_view const &str) |
void | append (std::vector< uint8_t > const &data) |
void | append (fz::buffer const &b) |
void | append (unsigned char v) |
void | append (size_t len, unsigned char c) |
buffer & | operator+= (unsigned char v) |
buffer & | operator+= (std::string_view const &str) |
buffer & | operator+= (std::vector< uint8_t > const &data) |
buffer & | operator+= (fz::buffer const &b) |
bool | empty () const |
operator bool () const | |
size_t | capacity () const |
void | reserve (size_t capacity) |
void | resize (size_t size) |
unsigned char | operator[] (size_t i) const |
Gets element at offset i. Does not do bounds checking. | |
unsigned char & | operator[] (size_t i) |
bool | operator== (buffer const &rhs) const |
bool | operator!= (buffer const &rhs) const |
std::string_view | to_view () const |
The buffer class is a simple buffer where data can be appended at the end and consumed at the front. Think of it as a deque with contiguous storage.
This class is useful when buffering data for sending over the network, or for buffering data for further piecemeal processing after having received it.
In general, copying/moving data around is expensive and allocations are even more expensive. Using this class helps to limit both to the bare minimum.
|
inline |
Overload of add for signed types, only adds if value is positive.
Does nothing on values <= 0, useful for directly passing the ssize_t result of the system's recv() or read() functions.
void append | ( | unsigned char const * | data, |
size_t | len | ||
) |
Appends the passed data to the buffer.
The number of reallocations as result to repeated append are amortized O(1)
void clear | ( | ) |
Does not release the memory.
void consume | ( | size_t | consumed | ) |
Removes consumed bytes from the beginning of the buffer.
Undefined if consumed > size()
unsigned char* get | ( | size_t | write_size | ) |
Returns a writable buffer guaranteed to be large enough for write_size bytes, call add when done.
The returned pointer is pointing just after the data already stored in the buffer.
Calling this function does not does not affect size().