From 10a3c0885b827da4b4e070753c45b6f55f399860 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Thu, 19 Jun 2025 11:57:32 +0800 Subject: [PATCH] add `c11_chunkedvector` --- include/pocketpy/common/chunkedvector.h | 32 ++++++++++++++++++++++ src/common/chunkedvector.c | 35 +++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 include/pocketpy/common/chunkedvector.h create mode 100644 src/common/chunkedvector.c diff --git a/include/pocketpy/common/chunkedvector.h b/include/pocketpy/common/chunkedvector.h new file mode 100644 index 00000000..0bf9499a --- /dev/null +++ b/include/pocketpy/common/chunkedvector.h @@ -0,0 +1,32 @@ +#pragma once + +#include "vector.h" + +typedef struct c11_chunkedvector_chunk { + int length; + int capacity; + int elem_size; + void* data; +} c11_chunkedvector_chunk; + +typedef struct c11_chunkedvector { + c11_vector /*T=c11_chunkedvector_chunk*/ chunks; + int length; + int capacity; + int elem_size; + int initial_chunks; +} c11_chunkedvector; + +// chunks[0]: size=1, total_capacity=1 +// chunks[1]: size=2, total_capacity=3 +// chunks[2]: size=4, total_capacity=7 +// chunks[3]: size=8, total_capacity=15 +// chunks[4]: size=16, total_capacity=31 +// chunks[5]: size=32, total_capacity=63 +// ... +// chunks[n]: size=2^n, total_capacity=2^(n+1)-1 + +void c11_chunkedvector__ctor(c11_chunkedvector* self, int elem_size, int initial_chunks); +void c11_chunkedvector__dtor(c11_chunkedvector* self); +void* c11_chunkedvector__emplace(c11_chunkedvector* self); +void* c11_chunkedvector__at(c11_chunkedvector* self, int index); diff --git a/src/common/chunkedvector.c b/src/common/chunkedvector.c new file mode 100644 index 00000000..fce05150 --- /dev/null +++ b/src/common/chunkedvector.c @@ -0,0 +1,35 @@ +#include "pocketpy/common/chunkedvector.h" + +#include +#include +#include "pocketpy/common/utils.h" +#include "pocketpy/config.h" + +void c11_chunkedvector__ctor(c11_chunkedvector* self, int elem_size, int initial_chunks) { + c11_vector__ctor(&self->chunks, sizeof(c11_chunkedvector_chunk)); + self->length = 0; + self->capacity = 0; + self->elem_size = elem_size; + self->initial_chunks = initial_chunks; + + for(int i = 0; i < initial_chunks; i++) { + // TODO: optimize? + c11_chunkedvector_chunk chunk; + chunk.length = 0; + chunk.capacity = (1 << i); + chunk.elem_size = elem_size; + chunk.data = PK_MALLOC(chunk.capacity * elem_size); + c11_vector__push(c11_chunkedvector_chunk, &self->chunks, chunk); + initial_capacity += chunk.capacity; + } +} + +void c11_chunkedvector__dtor(c11_chunkedvector* self) {} + +void* c11_chunkedvector__emplace(c11_chunkedvector* self) {} + +static int c11__bit_length(unsigned int n) { return n == 0 ? 0 : 32 - __builtin_clz(n); } + +void* c11_chunkedvector__at(c11_chunkedvector* self, int index) { + int chunk_index = c11__bit_length(index) - 1; +}