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:
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);