mirror of
https://github.com/fmtlib/fmt.git
synced 2025-07-30 02:37:36 +02:00
Add a fixed buffer
This commit is contained in:
@ -629,16 +629,18 @@ template <typename T> class buffer {
|
|||||||
T* ptr_;
|
T* ptr_;
|
||||||
size_t size_;
|
size_t size_;
|
||||||
size_t capacity_;
|
size_t capacity_;
|
||||||
|
bool fixed_;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Don't initialize ptr_ since it is not accessed to save a few cycles.
|
// Don't initialize ptr_ since it is not accessed to save a few cycles.
|
||||||
FMT_SUPPRESS_MSC_WARNING(26495)
|
FMT_SUPPRESS_MSC_WARNING(26495)
|
||||||
buffer(size_t sz) FMT_NOEXCEPT : size_(sz), capacity_(sz) {}
|
buffer(size_t sz) FMT_NOEXCEPT : size_(sz), capacity_(sz), fixed_(false) {}
|
||||||
|
|
||||||
buffer(T* p = nullptr, size_t sz = 0, size_t cap = 0) FMT_NOEXCEPT
|
buffer(T* p = nullptr, size_t sz = 0, size_t cap = 0,
|
||||||
: ptr_(p),
|
bool fixed = false) FMT_NOEXCEPT : ptr_(p),
|
||||||
size_(sz),
|
size_(sz),
|
||||||
capacity_(cap) {}
|
capacity_(cap),
|
||||||
|
fixed_(fixed) {}
|
||||||
|
|
||||||
/** Sets the buffer data and capacity. */
|
/** Sets the buffer data and capacity. */
|
||||||
void set(T* buf_data, size_t buf_capacity) FMT_NOEXCEPT {
|
void set(T* buf_data, size_t buf_capacity) FMT_NOEXCEPT {
|
||||||
@ -705,6 +707,12 @@ template <typename T> class buffer {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// A fixed capacity buffer.
|
||||||
|
template <typename T> class fixed_buffer : buffer<T> {
|
||||||
|
public:
|
||||||
|
fixed_buffer(T* data, size_t capacity) : buffer<T>(data, 0, capacity, true) {}
|
||||||
|
};
|
||||||
|
|
||||||
// A container-backed buffer.
|
// A container-backed buffer.
|
||||||
template <typename Container>
|
template <typename Container>
|
||||||
class container_buffer : public buffer<typename Container::value_type> {
|
class container_buffer : public buffer<typename Container::value_type> {
|
||||||
|
@ -372,8 +372,10 @@ reserve(std::back_insert_iterator<Container> it, size_t n) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline checked_ptr<T> reserve(buffer_appender<T> it, size_t n) {
|
inline buffer_appender<T> reserve(buffer_appender<T> it, size_t n) {
|
||||||
return reserve(std::back_insert_iterator<buffer<T>>(it), n);
|
buffer<T>& buf = get_container(it);
|
||||||
|
buf.reserve(buf.size() + n);
|
||||||
|
return it;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Iterator> inline Iterator& reserve(Iterator& it, size_t) {
|
template <typename Iterator> inline Iterator& reserve(Iterator& it, size_t) {
|
||||||
|
Reference in New Issue
Block a user