From 7f5a269d5a13ba39da7c2fa8e9bf45e77c5755c6 Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Tue, 14 Dec 2021 20:44:04 +0100 Subject: Fixed silly bug in cpque_X_pop(). Thanks to matthieugras. Added cpque_X_shrink_to_fit(). Fixed memory leak in example box2.c --- docs/cpque_api.md | 1 + examples/box2.c | 16 +++++++++------- include/stc/cpque.h | 7 +++++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/docs/cpque_api.md b/docs/cpque_api.md index 8f01e4c9..ddc0532c 100644 --- a/docs/cpque_api.md +++ b/docs/cpque_api.md @@ -27,6 +27,7 @@ cpque_X cpque_X_clone(cpque_X pq); void cpque_X_clear(cpque_X* self); bool cpque_X_reserve(cpque_X* self, size_t n); +void cpque_X_shrink_to_fit(cpque_X* self); void cpque_X_copy(cpque_X* self, cpque_X other); void cpque_X_del(cpque_X* self); // destructor diff --git a/examples/box2.c b/examples/box2.c index 79304609..d65ae717 100644 --- a/examples/box2.c +++ b/examples/box2.c @@ -19,16 +19,18 @@ struct { #define i_val Point #define i_opt c_no_compare -#include - -#define i_val cbox_Point -#define i_opt c_no_compare -#define i_tag BoxPoint -#include +#include // cbox_Box #define i_val Rectangle #define i_opt c_no_compare -#include +#include // cbox_Rectangle + +// Box in box: +#define i_val cbox_Point +#define i_del(b) cbox_Point_del(b) +#define i_opt c_no_compare|c_no_clone +#define i_tag BoxPoint +#include // cbox_BoxPoint Point origin(void) { return (Point){ .x=0.0, .y=0.0 }; diff --git a/include/stc/cpque.h b/include/stc/cpque.h index 86bab2ec..6b09e1d5 100644 --- a/include/stc/cpque.h +++ b/include/stc/cpque.h @@ -51,6 +51,9 @@ STC_INLINE bool _cx_memb(_reserve)(_cx_self* self, size_t n) { return t ? (self->data = t, self->capacity = n) : 0; } +STC_INLINE void _cx_memb(_shrink_to_fit)(_cx_self* self) + { _cx_memb(_reserve)(self, self->size); } + STC_INLINE _cx_self _cx_memb(_with_capacity)(size_t cap) { _cx_self out = {0}; _cx_memb(_reserve)(&out, cap); return out; @@ -136,9 +139,9 @@ STC_DEF _cx_self _cx_memb(_clone)(_cx_self q) { STC_DEF void _cx_memb(_erase_at)(_cx_self* self, size_t idx) { - size_t n = _cx_memb(_size)(*self) - 1; + i_valdel(&self->data[idx]); + size_t n = --self->size; self->data[idx] = self->data[n]; - _cx_memb(_pop_back)(self); _cx_memb(_sift_down_)(self->data - 1, idx + 1, n); } -- cgit v1.2.3