osh.h

My personal stdc++ replacement
git clone git://git.oshgnacknak.de/osh.h.git
Log | Files | Refs | README

commit 971acd2a0814080df22892afa1ca6cbed46e98d1
parent 9b8132b69ca7bf0aa374b95c734b2b3b083b34aa
Author: Oshgnacknak <osh@oshgnacknak.de>
Date:   Mon,  7 Mar 2022 14:16:04 +0100

Add DArray::setSize and DArray::growToCapacity

Diffstat:
Mosh.h | 37+++++++++++++++++++++++++------------
1 file changed, 25 insertions(+), 12 deletions(-)

diff --git a/osh.h b/osh.h @@ -88,6 +88,8 @@ namespace osh { DArray(size_t = 10); void destruct(); size_t size() const; + void setSize(size_t); + void growToCapacity(size_t); void ensureCapacity(size_t); void push(const T&); void clear(); @@ -104,7 +106,7 @@ namespace osh { char* cstr() const; template<typename... Args> void format(const char* fmt, Args&&...); StringBuffer substr(ssize_t begin, ssize_t end) const; - void clear(); + void setSize(size_t); char& operator[](int index); }; @@ -286,14 +288,25 @@ namespace osh { } template<typename T> - void DArray<T>::ensureCapacity(size_t required) { - if (size_ + required >= capacity) { - capacity = max(capacity *= 2, size_ + required); + void DArray<T>::setSize(size_t newSize) { + growToCapacity(newSize); + size_ = newSize; + } + + template<typename T> + void DArray<T>::growToCapacity(size_t newCapacity) { + if (newCapacity > capacity) { + capacity = max(capacity *= 2, newCapacity); elements = (T*) realloc(elements, sizeof(T) * capacity); } } template<typename T> + void DArray<T>::ensureCapacity(size_t required) { + growToCapacity(size_ + required); + } + + template<typename T> void DArray<T>::push(const T& t) { ensureCapacity(1); elements[size_++] = t; @@ -301,7 +314,7 @@ namespace osh { template<typename T> void DArray<T>::clear() { - size_ = 0; + setSize(0); } template<typename T> @@ -338,6 +351,13 @@ namespace osh { return s; } + void StringBuffer::setSize(size_t newSize) { + DArray::setSize(newSize); + if (capacity > 0) { + elements[size_] = '\0'; + } + } + template<typename... Args> void StringBuffer::format(const char* fmt, Args&&... args) { int required = 1 + snprintf(nullptr, 0, fmt, args...); @@ -346,13 +366,6 @@ namespace osh { size_ += required; } - void StringBuffer::clear() { - DArray::clear(); - if (capacity > 0) { - elements[size_] = '\0'; - } - } - void print1(Formatter auto& fmt, const StringBuffer& s) { printp(fmt, s.cstr()); }