From c8e5441c7f9d7ee01eaed393bf7b126504bd43bd Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Sun, 26 Nov 2023 13:39:18 -0800 Subject: [PATCH] [Glacier] Add the ability to remove a character from a StringBuilder. --- lib/glacier/container/vector.h | 8 ++++++++ lib/glacier/string/string_builder.cpp | 16 ++++++++++++++++ lib/glacier/string/string_builder.h | 9 +++++++++ 3 files changed, 33 insertions(+) diff --git a/lib/glacier/container/vector.h b/lib/glacier/container/vector.h index 08a5653..afe6229 100644 --- a/lib/glacier/container/vector.h +++ b/lib/glacier/container/vector.h @@ -45,6 +45,8 @@ class Vector { template void EmplaceBack(Args&&... args); + T&& PopBack(); + private: T* data_; uint64_t size_; @@ -119,6 +121,12 @@ void Vector::EmplaceBack(Args&&... args) { data_[size_++] = T(args...); } +template +T&& Vector::PopBack() { + size_--; + return glcr::Move(data_[size_]); +} + template void Vector::Expand() { uint64_t new_capacity = capacity_ == 0 ? 1 : capacity_ * 2; diff --git a/lib/glacier/string/string_builder.cpp b/lib/glacier/string/string_builder.cpp index 2fbd176..8bb2879 100644 --- a/lib/glacier/string/string_builder.cpp +++ b/lib/glacier/string/string_builder.cpp @@ -19,6 +19,14 @@ void VariableStringBuilder::PushBack(const StringView& str) { void VariableStringBuilder::PushBack(const char str) { data_.PushBack(str); } +void VariableStringBuilder::DeleteLast() { + if (data_.size() > 0) { + data_.PopBack(); + } +} + +void VariableStringBuilder::Reset() { data_ = glcr::Vector(); } + String VariableStringBuilder::ToString() const { return String(data_.RawPtr(), size()); } @@ -50,4 +58,12 @@ FixedStringBuilder::operator StringView() const { return StringView(buffer_, size_); } +void FixedStringBuilder::DeleteLast() { + if (size_ > 0) { + size_--; + } +} + +void FixedStringBuilder::Reset() { size_ = 0; } + } // namespace glcr diff --git a/lib/glacier/string/string_builder.h b/lib/glacier/string/string_builder.h index 444fbc1..7eb3d2d 100644 --- a/lib/glacier/string/string_builder.h +++ b/lib/glacier/string/string_builder.h @@ -12,6 +12,9 @@ class StringBuilder { virtual void PushBack(const StringView& str) = 0; virtual void PushBack(const char str) = 0; + virtual void DeleteLast() = 0; + virtual void Reset() = 0; + virtual String ToString() const = 0; virtual operator StringView() const = 0; @@ -30,6 +33,9 @@ class VariableStringBuilder : public StringBuilder { virtual void PushBack(const StringView& str) override; virtual void PushBack(const char str) override; + virtual void DeleteLast() override; + virtual void Reset() override; + virtual String ToString() const override; // Note that this could become invalidated @@ -56,6 +62,9 @@ class FixedStringBuilder : public StringBuilder { virtual void PushBack(const StringView& str) override; virtual void PushBack(const char str) override; + virtual void DeleteLast() override; + virtual void Reset() override; + virtual String ToString() const override; virtual operator StringView() const override;