xo-object2: DArray: + DArray.pop_back + no ub on oom

This commit is contained in:
Roland Conybeare 2026-04-10 20:31:26 -04:00
commit 7f3c7671b4
2 changed files with 40 additions and 10 deletions

View file

@ -18,6 +18,7 @@ namespace xo {
using xo::facet::typeseq;
namespace scm {
// TODO: error reporting?
DArray *
DArray::empty(obj<AAllocator> mm,
size_type cap)
@ -27,12 +28,14 @@ namespace xo {
void * mem = mm.alloc(typeseq::id<DArray>(),
sizeof(DArray) + cap * sizeof(obj<AGCObject>));
result = new (mem) DArray();
if (mem) [[likely]] {
result = new (mem) DArray();
assert(result);
assert(result);
result->capacity_ = cap;
result->size_ = 0;
result->capacity_ = cap;
result->size_ = 0;
}
return result;
}
@ -44,12 +47,14 @@ namespace xo {
{
DArray * dest = empty(mm, new_cap);
/** could just memcpy here **/
for (size_type i = 0, n = src->size(); i < n; ++i) {
dest->elts_[i] = src->elts_[i];
}
if (dest) [[likely]] {
/** could just memcpy here **/
for (size_type i = 0, n = src->size(); i < n; ++i) {
dest->elts_[i] = src->elts_[i];
}
dest->size_ = src->size();
dest->size_ = src->size();
}
return dest;
}
@ -98,6 +103,25 @@ namespace xo {
}
}
bool
DArray::pop_back(obj<AGCObject> * p_elt) noexcept
{
if (size_ > 0) {
--size_;
obj<AGCObject> & last = elts_[size_];
if (p_elt)
*p_elt = last;
last.reset(); // hygiene
return true;
}
return false;
}
bool
DArray::resize(size_type new_z) noexcept
{