diff options
| author | Tyge Løvset <[email protected]> | 2022-08-11 11:38:14 +0200 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2022-08-11 11:38:14 +0200 |
| commit | f225ba90a4497d91ed3934574a304aad4158af91 (patch) | |
| tree | 5f2fa91647e29a3dc560bab0ba803ce9593f0d74 /include/stc | |
| parent | f7fbc7727b8ceab54ef1ae1744cc378225a36d02 (diff) | |
| download | STC-modified-f225ba90a4497d91ed3934574a304aad4158af91.tar.gz STC-modified-f225ba90a4497d91ed3934574a304aad4158af91.zip | |
cvec/cdeq insert/erase ranges fixes.
Diffstat (limited to 'include/stc')
| -rw-r--r-- | include/stc/cdeq.h | 27 | ||||
| -rw-r--r-- | include/stc/cvec.h | 22 |
2 files changed, 29 insertions, 20 deletions
diff --git a/include/stc/cdeq.h b/include/stc/cdeq.h index d09c43ae..afe26f4b 100644 --- a/include/stc/cdeq.h +++ b/include/stc/cdeq.h @@ -120,7 +120,7 @@ _cx_memb(_insert_n)(_cx_self* self, const size_t idx, const _cx_value arr[], con } STC_INLINE _cx_iter _cx_memb(_insert_at)(_cx_self* self, _cx_iter it, i_key value) { - return _cx_memb(_insert_range_p)(self, (it.ref ? it.ref : it.end), &value, &value + 1); + return _cx_memb(_insert_range_p)(self, it.ref, &value, &value + 1); } STC_INLINE _cx_iter @@ -347,16 +347,20 @@ _cx_memb(_expand_left_half_)(_cx_self* self, const size_t idx, const size_t n) { } static _cx_iter -_cx_memb(_insert_uninit_p)(_cx_self* self, const _cx_value* pos, const size_t n) { - const size_t idx = pos - self->data; - if (idx*2 < cdeq_rep_(self)->size) - _cx_memb(_expand_left_half_)(self, idx, n); - else - _cx_memb(_expand_right_half_)(self, idx, n); - struct cdeq_rep* rep = cdeq_rep_(self); - if (n) - rep->size += n; /* do only if size > 0 */ - return c_make(_cx_iter){self->data + idx, self->data + rep->size}; +_cx_memb(_insert_uninit_p)(_cx_self* self, _cx_value* pos, const size_t n) { + struct cdeq_rep* r = cdeq_rep_(self); + if (n) { + if (!pos) pos = self->data + r->size; + const size_t idx = pos - self->data; + if (idx*2 < r->size) + _cx_memb(_expand_left_half_)(self, idx, n); + else + _cx_memb(_expand_right_half_)(self, idx, n); + r = cdeq_rep_(self); + r->size += n; + pos = self->data + idx; + } + return c_make(_cx_iter){pos, self->data + r->size}; } STC_DEF _cx_value* @@ -381,6 +385,7 @@ _cx_memb(_insert_range_p)(_cx_self* self, _cx_value* pos, STC_DEF _cx_iter _cx_memb(_erase_range_p)(_cx_self* self, _cx_value* p1, _cx_value* p2) { + assert(p1 && p2); intptr_t len = p2 - p1; struct cdeq_rep* r = cdeq_rep_(self); _cx_value* p = p1, *end = self->data + r->size; diff --git a/include/stc/cvec.h b/include/stc/cvec.h index 86646026..be838360 100644 --- a/include/stc/cvec.h +++ b/include/stc/cvec.h @@ -171,7 +171,7 @@ _cx_memb(_insert_n)(_cx_self* self, const size_t idx, const _cx_value arr[], con } STC_INLINE _cx_iter _cx_memb(_insert_at)(_cx_self* self, _cx_iter it, i_key value) { - return _cx_memb(_insert_range_p)(self, (it.ref ? it.ref : it.end), &value, &value + 1); + return _cx_memb(_insert_range_p)(self, it.ref, &value, &value + 1); } STC_INLINE _cx_iter @@ -332,16 +332,19 @@ _cx_memb(_push)(_cx_self* self, i_key value) { STC_DEF _cx_iter _cx_memb(_insert_uninit_p)(_cx_self* self, _cx_value* pos, const size_t n) { - const size_t idx = pos - self->data; struct cvec_rep* r = cvec_rep_(self); - if (r->size + n > r->cap) { - if (!_cx_memb(_reserve)(self, r->size*3/2 + n)) - return _cx_memb(_end)(self); - r = cvec_rep_(self); - pos = self->data + idx; + if (n) { + if (!pos) pos = self->data + r->size; + const size_t idx = pos - self->data; + if (r->size + n > r->cap) { + if (!_cx_memb(_reserve)(self, r->size*3/2 + n)) + return _cx_memb(_end)(self); + r = cvec_rep_(self); + pos = self->data + idx; + } + memmove(pos + n, pos, (r->size - idx)*sizeof *pos); + r->size += n; } - memmove(pos + n, pos, (r->size - idx)*sizeof *pos); - r->size += n; return c_make(_cx_iter){pos, self->data + r->size}; } @@ -356,6 +359,7 @@ _cx_memb(_insert_range_p)(_cx_self* self, _cx_value* pos, STC_DEF _cx_iter _cx_memb(_erase_range_p)(_cx_self* self, _cx_value* p1, _cx_value* p2) { + assert(p1 && p2); intptr_t len = p2 - p1; struct cvec_rep* r = cvec_rep_(self); _cx_value* p = p1, *end = self->data + r->size; |
