use golang's vector realloc

This commit is contained in:
blueloveTH 2025-06-26 17:01:58 +08:00
parent 13e82c1913
commit e0efcae53a
2 changed files with 22 additions and 6 deletions

View File

@ -23,6 +23,7 @@ void* c11_vector__emplace(c11_vector* self);
bool c11_vector__contains(const c11_vector* self, void* elem); bool c11_vector__contains(const c11_vector* self, void* elem);
void* c11_vector__submit(c11_vector* self, int* length); void* c11_vector__submit(c11_vector* self, int* length);
void c11_vector__swap(c11_vector* self, c11_vector* other); void c11_vector__swap(c11_vector* self, c11_vector* other);
int c11_vector__nextcap(c11_vector* self);
#define c11__getitem(T, self, index) (((T*)(self)->data)[index]) #define c11__getitem(T, self, index) (((T*)(self)->data)[index])
#define c11__setitem(T, self, index, value) ((T*)(self)->data)[index] = value; #define c11__setitem(T, self, index, value) ((T*)(self)->data)[index] = value;
@ -30,7 +31,9 @@ void c11_vector__swap(c11_vector* self, c11_vector* other);
#define c11_vector__push(T, self, elem) \ #define c11_vector__push(T, self, elem) \
do { \ do { \
if((self)->length == (self)->capacity) c11_vector__reserve((self), (self)->capacity * 2); \ if((self)->length == (self)->capacity) { \
c11_vector__reserve((self), c11_vector__nextcap((self))); \
} \
((T*)(self)->data)[(self)->length] = (elem); \ ((T*)(self)->data)[(self)->length] = (elem); \
(self)->length++; \ (self)->length++; \
} while(0) } while(0)
@ -42,15 +45,19 @@ void c11_vector__swap(c11_vector* self, c11_vector* other);
#define c11_vector__extend(T, self, p, size) \ #define c11_vector__extend(T, self, p, size) \
do { \ do { \
int min_capacity = (self)->length + (size); \ int min_capacity = (self)->length + (size); \
if((self)->capacity < min_capacity) \ if((self)->capacity < min_capacity) { \
c11_vector__reserve((self), c11__max((self)->capacity * 2, min_capacity)); \ int nextcap = c11_vector__nextcap(self); \
c11_vector__reserve((self), c11__max(nextcap, min_capacity)); \
} \
memcpy((T*)(self)->data + (self)->length, (p), (size) * sizeof(T)); \ memcpy((T*)(self)->data + (self)->length, (p), (size) * sizeof(T)); \
(self)->length += (size); \ (self)->length += (size); \
} while(0) } while(0)
#define c11_vector__insert(T, self, index, elem) \ #define c11_vector__insert(T, self, index, elem) \
do { \ do { \
if((self)->length == (self)->capacity) c11_vector__reserve((self), (self)->capacity * 2); \ if((self)->length == (self)->capacity) { \
c11_vector__reserve((self), c11_vector__nextcap(self)); \
} \
T* p = (T*)(self)->data + (index); \ T* p = (T*)(self)->data + (index); \
memmove(p + 1, p, ((self)->length - (index)) * sizeof(T)); \ memmove(p + 1, p, ((self)->length - (index)) * sizeof(T)); \
*p = (elem); \ *p = (elem); \

View File

@ -40,7 +40,7 @@ void c11_vector__reserve(c11_vector* self, int capacity) {
void c11_vector__clear(c11_vector* self) { self->length = 0; } void c11_vector__clear(c11_vector* self) { self->length = 0; }
void* c11_vector__emplace(c11_vector* self) { void* c11_vector__emplace(c11_vector* self) {
if(self->length == self->capacity) c11_vector__reserve(self, self->capacity * 2); if(self->length == self->capacity) { c11_vector__reserve(self, c11_vector__nextcap(self)); }
void* p = (char*)self->data + (size_t)self->elem_size * (size_t)self->length; void* p = (char*)self->data + (size_t)self->elem_size * (size_t)self->length;
self->length++; self->length++;
return p; return p;
@ -68,3 +68,12 @@ void c11_vector__swap(c11_vector *self, c11_vector *other){
*self = *other; *self = *other;
*other = tmp; *other = tmp;
} }
int c11_vector__nextcap(c11_vector* self) {
if(self->capacity < 1024) {
return self->capacity * 2;
} else {
// increase by 25%
return self->capacity + (self->capacity >> 2);
}
}