diff options
| author | tylov <[email protected]> | 2023-08-08 00:31:15 +0200 |
|---|---|---|
| committer | tylov <[email protected]> | 2023-08-08 00:31:15 +0200 |
| commit | 9e13d34c82abfeeadcc8697331f9fd3e5e7f2bca (patch) | |
| tree | 57e091a7b49e94448d76ed7eab19aa1bc216c6f8 /include/stc/cdeq.h | |
| parent | 10f27b760903a153fe6ebc84b0123acb7a50a0ee (diff) | |
| download | STC-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.h | 10 |
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; } |
