mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 19:40:18 +00:00
use golang's vector realloc
This commit is contained in:
parent
13e82c1913
commit
e0efcae53a
@ -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); \
|
||||||
|
@ -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;
|
||||||
@ -63,8 +63,17 @@ void* c11_vector__submit(c11_vector* self, int* length) {
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
void c11_vector__swap(c11_vector *self, c11_vector *other){
|
void c11_vector__swap(c11_vector* self, c11_vector* other) {
|
||||||
c11_vector tmp = *self;
|
c11_vector tmp = *self;
|
||||||
*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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user