xo-object2: DArray: + DArray.pop_back + no ub on oom
This commit is contained in:
parent
aea622a1c2
commit
7f3c7671b4
2 changed files with 40 additions and 10 deletions
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue