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:
M | osh.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());
}