JustUI/include/justui/p/vec.h

50 lines
1.3 KiB
C

//---
// JustUI.util.vector: Dynamic arrays
//---
#ifndef _J_UTIL_VECTOR
#define _J_UTIL_VECTOR
#include <justui/defs.h>
/* Vector metadata, on four bytes; the pointer is included, but the user will
have aliased union access from the macro definition */
typedef struct {
/* Pointer to elements of the vector */
void *data;
/* Number of elements used in the vector */
uint16_t size;
/* Number of free elements (never more than 255) */
uint8_t free;
/* Element size, in bytes */
uint8_t elsize;
} vec_t;
/* Macro to declare a vector and have typed access to its data */
#define DECLARE_VEC(type, name) \
union { \
type *name; \
vec_t name ## _vec; \
};
/* Initialize a vector; the element size can be specified with the typed
pointer, like this: vec_init(&name_vector, sizeof *name); */
void vec_init(vec_t *v, size_t elsize);
/* Free a vector's data, can also be used to clear all elements */
void vec_clear(vec_t *v);
//---
// Size management
//---
/* Add elements to the vector. The elements should be assigned by the owner
through the typed pointer, this only allocates and maintains the size. */
bool vec_add(vec_t *v, size_t elements);
/* Remove elements from the vector */
bool vec_remove(vec_t *v, size_t elements);
#endif /* _J_UTIL_VECTOR */