From b64dee41cb285b7376d61fcfd3564d08fdddc963 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Tue, 17 Feb 2026 14:42:17 -0500 Subject: [PATCH] xo-interpreter2 stack: define-expr's work at top-level --- include/xo/object2/DArray.hpp | 12 +++++++++--- src/object2/DArray.cpp | 13 +++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/include/xo/object2/DArray.hpp b/include/xo/object2/DArray.hpp index 7b75886..8d7248e 100644 --- a/include/xo/object2/DArray.hpp +++ b/include/xo/object2/DArray.hpp @@ -75,9 +75,6 @@ namespace xo { requires (std::same_as> && ...) static DArray * array(obj mm, Args... args); - const obj & operator[](size_type index) const noexcept { return elts_[index]; } - obj & operator[](size_type index) noexcept { return elts_[index]; } - ///@} /** @defgroup darray-access acecss methods **/ ///@{ @@ -91,6 +88,10 @@ namespace xo { size_type size() const noexcept { return size_; } /** return element @p index of this array (0-based) **/ obj at(size_type index) const; + + const obj & operator[](size_type index) const noexcept { return elts_[index]; } + obj & operator[](size_type index) noexcept { return elts_[index]; } + ///@} /** @defgroup darray-iterators iterators **/ ///@{ @@ -106,6 +107,11 @@ namespace xo { /** @defgroup darray-general general methods **/ ///@{ + /** resize to @p new_size. @p new_size may not be larger than capacity + * Return true if resize was accomplished; false otherwise. + **/ + bool resize(size_type new_size) noexcept; + ///@} /** @defgroup darray-conversion-operators conversion operators **/ ///@{ diff --git a/src/object2/DArray.cpp b/src/object2/DArray.cpp index e1414ee..31ced92 100644 --- a/src/object2/DArray.cpp +++ b/src/object2/DArray.cpp @@ -84,6 +84,19 @@ namespace xo { } } + bool + DArray::resize(size_type new_z) noexcept { + if (new_z >= capacity_) { + return false; + } else if (new_z > size_) { + // ensure new size is zeroed (we/re not zeroing if/when we shrink) + ::memset((std::byte *)(&elts_[size_]), 0, (std::byte *)(&elts_[new_z]) - (std::byte *)(&elts_[size_])); + } + + this->size_ = new_z; + return true; + } + // printing support bool