From c584a509c1f5ad91ecf96673c28da307eaa2408f Mon Sep 17 00:00:00 2001 From: Tyge Lovset Date: Tue, 26 Apr 2022 09:29:34 +0200 Subject: Added cvec_X_expand_uninitialized(). Renamed cvec_X_bsearch() to cvec_X_binary_search(). --- docs/cvec_api.md | 6 ++++-- include/stc/cvec.h | 18 +++++++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/docs/cvec_api.md b/docs/cvec_api.md index f5dd11ae..1b06275e 100644 --- a/docs/cvec_api.md +++ b/docs/cvec_api.md @@ -37,6 +37,7 @@ void cvec_X_clear(cvec_X* self); void cvec_X_copy(cvec_X* self, cvec_X other); bool cvec_X_reserve(cvec_X* self, size_t cap); bool cvec_X_resize(cvec_X* self, size_t size, i_val null); +cvec_X_value* cvec_X_expand_uninitialized(cvec_X* self, size_t n); // return uninited data ptr void cvec_X_shrink_to_fit(cvec_X* self); void cvec_X_swap(cvec_X* a, cvec_X* b); void cvec_X_drop(cvec_X* self); // destructor @@ -51,9 +52,10 @@ cvec_X_value* cvec_X_get_mut(cvec_X* self, i_valraw raw); cvec_X_iter cvec_X_find(const cvec_X* self, i_valraw raw); cvec_X_iter cvec_X_find_in(cvec_X_iter i1, cvec_X_iter i2, i_valraw raw); // On sorted vectors: -cvec_X_iter cvec_X_bsearch(const cvec_X* self, i_valraw raw); // at elem == raw, else end +cvec_X_iter cvec_X_binary_search(const cvec_X* self, i_valraw raw); // at elem == raw, else end cvec_X_iter cvec_X_lower_bound(const cvec_X* self, i_valraw raw); // at first elem >= raw, else end -cvec_X_iter cvec_X_bsearch_in(cvec_X_iter i1, cvec_X_iter i2, i_valraw raw, cvec_X_iter* lower_bound); +cvec_X_iter cvec_X_binary_search_in(cvec_X_iter i1, cvec_X_iter i2, + i_valraw raw, cvec_X_iter* lower_bound); cvec_X_value* cvec_X_front(const cvec_X* self); cvec_X_value* cvec_X_back(const cvec_X* self); diff --git a/include/stc/cvec.h b/include/stc/cvec.h index b98ecbd9..54b38222 100644 --- a/include/stc/cvec.h +++ b/include/stc/cvec.h @@ -89,7 +89,7 @@ STC_API _cx_iter _cx_memb(_insert_range_p)(_cx_self* self, _cx_value* pos #if !c_option(c_no_cmp) STC_API int _cx_memb(_value_cmp)(const _cx_value* x, const _cx_value* y); STC_API _cx_iter _cx_memb(_find_in)(_cx_iter it1, _cx_iter it2, i_keyraw raw); -STC_API _cx_iter _cx_memb(_bsearch_in)(_cx_iter it1, _cx_iter it2, i_keyraw raw, _cx_iter* lower_bound); +STC_API _cx_iter _cx_memb(_binary_search_in)(_cx_iter it1, _cx_iter it2, i_keyraw raw, _cx_iter* lower_bound); #endif #if !defined _i_no_clone @@ -167,6 +167,14 @@ _cx_memb(_shrink_to_fit)(_cx_self *self) { _cx_memb(_reserve)(self, _cx_memb(_size)(*self)); } +STC_INLINE _cx_value* +_cx_memb(_expand_uninitialized)(_cx_self *self, size_t n) { + size_t len = _cx_memb(_size)(*self); + if (!_cx_memb(_reserve)(self, len + n)) return NULL; + cvec_rep_(self)->size += n; + return self->data + len; +} + STC_INLINE _cx_iter _cx_memb(_insert)(_cx_self* self, const size_t idx, i_key value) { return _cx_memb(_insert_range_p)(self, self->data + idx, &value, &value + 1); @@ -221,15 +229,15 @@ _cx_memb(_get_mut)(const _cx_self* self, i_keyraw raw) { return (_cx_value*) _cx_memb(_get)(self, raw); } STC_INLINE _cx_iter -_cx_memb(_bsearch)(const _cx_self* self, i_keyraw raw) { +_cx_memb(_binary_search)(const _cx_self* self, i_keyraw raw) { _cx_iter lower; - return _cx_memb(_bsearch_in)(_cx_memb(_begin)(self), _cx_memb(_end)(self), raw, &lower); + return _cx_memb(_binary_search_in)(_cx_memb(_begin)(self), _cx_memb(_end)(self), raw, &lower); } STC_INLINE _cx_iter _cx_memb(_lower_bound)(const _cx_self* self, i_keyraw raw) { _cx_iter lower; - _cx_memb(_bsearch_in)(_cx_memb(_begin)(self), _cx_memb(_end)(self), raw, &lower); + _cx_memb(_binary_search_in)(_cx_memb(_begin)(self), _cx_memb(_end)(self), raw, &lower); return lower; } @@ -391,7 +399,7 @@ _cx_memb(_find_in)(_cx_iter i1, _cx_iter i2, i_keyraw raw) { } STC_DEF _cx_iter -_cx_memb(_bsearch_in)(_cx_iter i1, _cx_iter i2, i_keyraw raw, _cx_iter* lower_bound) { +_cx_memb(_binary_search_in)(_cx_iter i1, _cx_iter i2, i_keyraw raw, _cx_iter* lower_bound) { _cx_iter mid, last = i2; while (i1.ref != i2.ref) { mid.ref = i1.ref + ((i2.ref - i1.ref) >> 1); -- cgit v1.2.3