2021-07-31 19:05:04 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <jemalloc/jemalloc.h>
|
|
|
|
#include <stddef.h>
|
|
|
|
|
|
|
|
/*
|
|
|
|
* KSRARRAY DEFAULT SIZES.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define KSRARRAY_TINY_SIZE 2
|
|
|
|
#define KSRARRAY_SMALL_SIZE 8
|
|
|
|
#define KSRARRAY_BASIC_SIZE 16
|
|
|
|
#define KSRARRAY_BIG_SIZE 64
|
|
|
|
#define KSRARRAY_HUGE_SIZE 128
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ksrarray structure.
|
|
|
|
*/
|
|
|
|
typedef struct {
|
|
|
|
void **data; // array data.
|
|
|
|
size_t length; // currently used size.
|
|
|
|
|
|
|
|
size_t _allocated_size; // currently allocated size.
|
|
|
|
} ksrarray;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a ksrarray with the given start size.
|
|
|
|
* @param start_size - the allocated size at start.
|
|
|
|
*/
|
|
|
|
ksrarray* ksrarray_new(const size_t start_size);
|
|
|
|
/**
|
|
|
|
* Create a tiny sized ksrarray.
|
|
|
|
*/
|
|
|
|
static inline ksrarray* ksrarray_new_tiny()
|
|
|
|
{ return ksrarray_new(KSRARRAY_TINY_SIZE); }
|
|
|
|
/**
|
|
|
|
* Create a small sized ksrarray.
|
|
|
|
*/
|
|
|
|
static inline ksrarray* ksrarray_new_small()
|
|
|
|
{ return ksrarray_new(KSRARRAY_SMALL_SIZE); }
|
|
|
|
/**
|
|
|
|
* Create a normal sized ksrarray.
|
|
|
|
*/
|
|
|
|
static inline ksrarray* ksrarray_new_basic()
|
|
|
|
{ return ksrarray_new(KSRARRAY_BASIC_SIZE); }
|
|
|
|
/**
|
|
|
|
* Create a big sized ksrarray.
|
|
|
|
*/
|
|
|
|
static inline ksrarray* ksrarray_new_big()
|
|
|
|
{ return ksrarray_new(KSRARRAY_BIG_SIZE); }
|
|
|
|
/**
|
|
|
|
* Create a huge sized ksrarray.
|
|
|
|
*/
|
|
|
|
static inline ksrarray* ksrarray_new_huge()
|
|
|
|
{ return ksrarray_new(KSRARRAY_HUGE_SIZE); }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Push a new element at the end of a ksrarray.
|
|
|
|
* @param array - the ksrarray in which to push.
|
|
|
|
* @param element - the element to push.
|
|
|
|
*/
|
|
|
|
void ksrarray_push(ksrarray *array, void *element);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove an element from a ksrarray.
|
|
|
|
* @param array - the ksrarray in which to remove.
|
|
|
|
* @param index - the index of the element to remove.
|
|
|
|
*/
|
|
|
|
bool ksrarray_remove(ksrarray *array, const size_t index);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Free a ksrarray.
|
|
|
|
* /!\ This will NOT free the elements, just the container and its internal data.
|
|
|
|
*/
|
|
|
|
static inline void ksrarray_free(ksrarray *array)
|
|
|
|
{
|
|
|
|
free(array->data);
|
|
|
|
free(array);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the iterator variable name, used in ksrarray_foreach.
|
|
|
|
*/
|
|
|
|
#define _ksrarray_get_iter_name(a, b) b ## _iter
|
|
|
|
/**
|
|
|
|
* For each element of the given ksrarray, do...
|
|
|
|
*/
|
|
|
|
#define ksrarray_foreach(ksrarray, element) \
|
|
|
|
for(size_t _ksrarray_get_iter_name(ksrarray, element) = 0; \
|
2023-02-11 19:23:26 +01:00
|
|
|
(element = (ksrarray).data[_ksrarray_get_iter_name(ksrarray, element)]) || true, \
|
|
|
|
_ksrarray_get_iter_name(ksrarray, element) < (ksrarray).length; \
|
2021-07-31 19:05:04 +02:00
|
|
|
_ksrarray_get_iter_name(ksrarray, element)++)
|