libvec

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 858719913eeaac12b49c0d2e95e2233be760410a
parent 21d35d6910f8b3281130fb29a89180620fccca74
Author: ssnf <ssnf@ssnf.xyz>
Date:   Thu, 18 Jul 2024 00:43:19 +0000

modify Vecdel to delete a specific entry

Diffstat:
Mvec.c | 9++++++---
Mvec.h | 4++--
2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/vec.c b/vec.c @@ -64,16 +64,19 @@ Vecclose_(void** p) } void -Vecdel_(void** p) +Vecdel_(void** p, ulong n) { Vector* v; + char* q; v = Vec(*p); if (!v->n) return; + q = (char*)p + n * v->ms; if (v->close != NULL) - v->close((char*)*p + (v->n - 1) * v->ms); - memset((char*)*p + --v->n * v->ms, 0, v->ms); + v->close(q); + memmove(q, q + v->ms, (--v->n - n) * v->ms); + memset(q + v->ms, 0, v->n * v->ms); } void diff --git a/vec.h b/vec.h @@ -1,7 +1,7 @@ #define Vecadd(p) Vecadd_((void**)p) #define Vecaddv(p, a, type) *(type*)Vecadd(p) = a #define Vecclose(p) Vecclose_((void**)p) -#define Vecdel(p) Vecdel_((void**)p) +#define Vecdel(p, n) Vecdel_((void**)p, n) #define Vecinit(p) Vecinit_((void**)p, sizeof(*p[0]), NULL, NULL) #define Vecinitf(p, i, c) Vecinit_((void**)p, sizeof(*p[0]), i, c) #define Vecinsure(p, n) Vecinsure_((void**)p, n); @@ -22,7 +22,7 @@ unsigned long Vecsiz(void* p); /* These take the address of the vector pointer */ void* Vecadd_(void** p); void Vecclose_(void** p); -void Vecdel_(void** p); +void Vecdel_(void** p, unsigned long n); void Vecinit_(void** p, unsigned long ms, void (*init)(), void (*close)()); void Vecinsure_(void** p, unsigned long n); void Veczero_(void** p);