Binpack from arena/pool, add container resize/grow

This commit is contained in:
2025-07-24 22:19:48 +10:00
parent dbc3fe63f8
commit 172362cdb8
9 changed files with 279 additions and 209 deletions
+23 -4
View File
@@ -96,19 +96,19 @@ DN_API void *DN_CArray2_AddArray(void *data, DN_USize *size, DN_USize max, DN_US
return result;
}
DN_API bool DN_CArray2_GrowIfNeededFromPool(void **data, DN_USize size, DN_USize *max, DN_USize data_size, DN_Pool *pool)
DN_API bool DN_CArray2_ResizeFromPool(void **data, DN_USize *size, DN_USize *max, DN_USize data_size, DN_Pool *pool, DN_USize new_max)
{
bool result = true;
if (size >= *max) {
DN_USize new_max = DN_Max(*max * 2, 8);
if (new_max != *max) {
DN_USize bytes_to_alloc = data_size * new_max;
void *buffer = DN_Pool_NewArray(pool, DN_U8, bytes_to_alloc);
if (buffer) {
DN_USize bytes_to_copy = data_size * size;
DN_USize bytes_to_copy = data_size * DN_Min(*size, new_max);
DN_Memcpy(buffer, *data, bytes_to_copy);
DN_Pool_Dealloc(pool, *data);
*data = buffer;
*max = new_max;
*size = DN_Min(*size, new_max);
} else {
result = false;
}
@@ -117,6 +117,25 @@ DN_API bool DN_CArray2_GrowIfNeededFromPool(void **data, DN_USize size, DN_USize
return result;
}
DN_API bool DN_CArray2_GrowFromPool(void **data, DN_USize size, DN_USize *max, DN_USize data_size, DN_Pool *pool, DN_USize new_max)
{
bool result = true;
if (new_max > *max)
result = DN_CArray2_ResizeFromPool(data, &size, max, data_size, pool, new_max);
return result;
}
DN_API bool DN_CArray2_GrowIfNeededFromPool(void **data, DN_USize size, DN_USize *max, DN_USize data_size, DN_Pool *pool, DN_USize add_count)
{
bool result = true;
DN_USize new_size = size + add_count;
if (new_size > *max) {
DN_USize new_max = DN_Max(DN_Max(*max * 2, new_size), 8);
result = DN_CArray2_ResizeFromPool(data, &size, max, data_size, pool, new_max);
}
return result;
}
DN_API void *DN_CSLList_Detach(void **link, void **next)
{
void *result = *link;