summaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorTyge Lovset <[email protected]>2022-04-09 11:22:03 +0200
committerTyge Lovset <[email protected]>2022-04-09 11:22:03 +0200
commit9e1ea5d14fb1835eb1ad1e45c8e8f02c9072ca57 (patch)
tree9409dd4df06f72c8f2c2a079436e9a9793971044 /include
parent1a4223837d4e34a085f00e323759ee5f9cd81bd3 (diff)
downloadSTC-modified-9e1ea5d14fb1835eb1ad1e45c8e8f02c9072ca57.tar.gz
STC-modified-9e1ea5d14fb1835eb1ad1e45c8e8f02c9072ca57.zip
Optimizing push_back() cvec/cdeq and some minor stuff.
Diffstat (limited to 'include')
-rw-r--r--include/stc/cdeq.h10
-rw-r--r--include/stc/cstr.h2
-rw-r--r--include/stc/cvec.h25
3 files changed, 22 insertions, 15 deletions
diff --git a/include/stc/cdeq.h b/include/stc/cdeq.h
index e9df8898..c0b6b05c 100644
--- a/include/stc/cdeq.h
+++ b/include/stc/cdeq.h
@@ -298,10 +298,12 @@ _cx_memb(_reserve)(_cx_self* self, const size_t n) {
STC_DEF _cx_value*
_cx_memb(_push_back)(_cx_self* self, i_val value) {
- struct cdeq_rep* rep = cdeq_rep_(self);
- if (_cdeq_nfront(self) + rep->size == rep->cap)
- _cx_memb(_expand_right_half_)(self, rep->size, 1);
- _cx_value *v = self->data + cdeq_rep_(self)->size++;
+ struct cdeq_rep* r = cdeq_rep_(self);
+ if (_cdeq_nfront(self) + r->size == r->cap) {
+ _cx_memb(_expand_right_half_)(self, r->size, 1);
+ r = cdeq_rep_(self);
+ }
+ _cx_value *v = self->data + r->size++;
*v = value; return v;
}
diff --git a/include/stc/cstr.h b/include/stc/cstr.h
index 189fc467..1e93a0ef 100644
--- a/include/stc/cstr.h
+++ b/include/stc/cstr.h
@@ -185,7 +185,7 @@ cstr_reserve(cstr* self, const size_t cap) {
cstr_priv* p = _cstr_p(self);
const size_t oldcap = p->cap;
if (cap > oldcap) {
- p = (cstr_priv*) c_realloc(oldcap ? p : NULL, _cstr_opt_mem(cap));
+ p = (cstr_priv*) c_realloc((oldcap != 0) & (p != &_cstr_nullrep) ? p : NULL, _cstr_opt_mem(cap));
self->str = p->chr;
if (oldcap == 0) self->str[p->size = 0] = '\0';
p->cap = _cstr_opt_cap(cap);
diff --git a/include/stc/cvec.h b/include/stc/cvec.h
index 34e830ba..e3a08136 100644
--- a/include/stc/cvec.h
+++ b/include/stc/cvec.h
@@ -299,22 +299,27 @@ _cx_memb(_resize)(_cx_self* self, const size_t len, i_val null) {
STC_DEF _cx_value*
_cx_memb(_push_back)(_cx_self* self, i_val value) {
- const size_t len = cvec_rep_(self)->size;
- if (len == _cx_memb(_capacity)(*self))
- _cx_memb(_reserve)(self, (len*3 >> 1) + 4);
- _cx_value *v = self->data + cvec_rep_(self)->size++;
+ struct cvec_rep *r = cvec_rep_(self);
+ if (r->size == r->cap) {
+ _cx_memb(_reserve)(self, (r->size*3 >> 1) + 4);
+ r = cvec_rep_(self);
+ }
+ _cx_value *v = self->data + r->size++;
*v = value; return v;
}
static _cx_value*
_cx_memb(_insert_space_)(_cx_self* self, _cx_value* pos, const size_t len) {
- const size_t idx = pos - self->data, size = cvec_rep_(self)->size;
- if (len == 0) return pos;
- if (size + len > _cx_memb(_capacity)(*self))
- _cx_memb(_reserve)(self, (size*3 >> 1) + len),
+ const size_t idx = pos - self->data;
+ struct cvec_rep* r = cvec_rep_(self);
+ if (!len) return pos;
+ if (r->size + len > r->cap) {
+ _cx_memb(_reserve)(self, (r->size*3 >> 1) + len);
+ r = cvec_rep_(self);
pos = self->data + idx;
- cvec_rep_(self)->size += len;
- memmove(pos + len, pos, (size - idx) * sizeof(i_val));
+ }
+ memmove(pos + len, pos, (r->size - idx) * sizeof *pos);
+ r->size += len;
return pos;
}