summaryrefslogtreecommitdiffhomepage
path: root/include/stc/cdeq.h
diff options
context:
space:
mode:
authortylov <[email protected]>2023-08-08 00:31:15 +0200
committertylov <[email protected]>2023-08-08 00:31:15 +0200
commit9e13d34c82abfeeadcc8697331f9fd3e5e7f2bca (patch)
tree57e091a7b49e94448d76ed7eab19aa1bc216c6f8 /include/stc/cdeq.h
parent10f27b760903a153fe6ebc84b0123acb7a50a0ee (diff)
downloadSTC-modified-9e13d34c82abfeeadcc8697331f9fd3e5e7f2bca.tar.gz
STC-modified-9e13d34c82abfeeadcc8697331f9fd3e5e7f2bca.zip
Optimized cdeq insert (in the middle) functions.
Diffstat (limited to 'include/stc/cdeq.h')
-rw-r--r--include/stc/cdeq.h10
1 files changed, 6 insertions, 4 deletions
diff --git a/include/stc/cdeq.h b/include/stc/cdeq.h
index b0575fe0..4730721c 100644
--- a/include/stc/cdeq.h
+++ b/include/stc/cdeq.h
@@ -158,12 +158,14 @@ _cx_MEMB(_insert_uninit)(_cx_Self* self, const intptr_t idx, const intptr_t n) {
if (len + n > self->capmask)
if (!_cx_MEMB(_reserve)(self, len*5/4 + n))
return it;
- for (intptr_t i = len - 1, j = i + n; i >= idx; --i, --j)
- *_cx_MEMB(_at_mut)(self, j) = *_cx_MEMB(_at)(self, i);
-
- self->end = (self->end + n) & self->capmask;
it.pos = _cdeq_topos(self, idx);
it.ref = self->data + it.pos;
+ self->end = (self->end + n) & self->capmask;
+
+ if (it.pos < self->end) // common case because of reserve policy
+ c_memmove(it.ref + n, it.ref, (len - idx)*c_sizeof *it.ref);
+ else for (intptr_t i = len - 1, j = i + n; i >= idx; --i, --j)
+ *_cx_MEMB(_at_mut)(self, j) = *_cx_MEMB(_at)(self, i);
return it;
}