pawengine/dynarray.h

71 lines
4 KiB
C
Raw Normal View History

2025-02-09 18:48:25 +01:00
#ifndef INCLUDE_WAYLANDCLIENT_DYNARRAY_H_
#define INCLUDE_WAYLANDCLIENT_DYNARRAY_H_
2025-02-24 20:11:51 +01:00
#include "allocator.h"
2025-02-09 18:48:25 +01:00
#include <stdint.h>
#define dyn_array_append(array, item) \
do { \
if ((array)->count >= (array)->capacity) { \
(array)->capacity += 10; \
2025-02-24 20:11:51 +01:00
if ((array)->mem == NULL) { \
(array)->items = realloc((array)->items, \
(array)->capacity * sizeof(*(array)->items)); \
} else { \
void *temp = (array)->items; \
(array)->items = mem_malloc( \
(array)->mem, (array)->capacity * sizeof(*(array)->items)); \
memcpy((array)->items, temp, \
((array)->count) * sizeof(*(array)->items)); \
mem_free((array)->mem, temp); \
} \
2025-02-09 18:48:25 +01:00
} \
(array)->items[(array)->count++] = (item); \
} while (0)
2025-02-24 20:11:51 +01:00
2025-02-09 18:48:25 +01:00
#define dyn_array_remove(array, index) \
do { \
(array)->items[(index)] = (array)->items[(array)->count - 1]; \
2025-02-24 20:11:51 +01:00
memset(&(array)->items[(array)->count], 0, sizeof((array)->items[0])); \
2025-02-09 18:48:25 +01:00
(array)->count--; \
} while (0)
2025-02-24 20:11:51 +01:00
#define dyn_array_destroy(array) \
if ((array)->mem == NULL) { \
free((array)->items); \
} else { \
mem_free((array)->mem, (array)->items); \
}
2025-02-09 18:48:25 +01:00
#define dyn_array_reset(array) \
do { \
(array)->capacity = 10; \
(array)->count = 0; \
2025-02-24 20:11:51 +01:00
if ((array)->mem == NULL) { \
(array)->items = realloc((array)->items, \
(array)->capacity * sizeof(*(array)->items)); \
} else { \
mem_free((array)->mem, (array)->items); \
(array)->items = mem_malloc((array)->mem, (array)->capacity * \
sizeof(*(array)->items)); \
} \
2025-02-09 18:48:25 +01:00
} while (0)
#define dyn_array_define($name, $type) \
struct $name { \
int count; \
int capacity; \
2025-02-24 20:11:51 +01:00
$type *items; \
struct Mem *mem; \
2025-02-09 18:48:25 +01:00
}
dyn_array_define(da_uint32_t, uint32_t);
void *dyn_array_create();
2025-02-24 20:11:51 +01:00
void *dyn_array_create_mem(struct Mem *mem);
2025-02-09 18:48:25 +01:00
void dyn_array_create_inplace(void *array);
2025-02-24 20:11:51 +01:00
void dyn_array_create_inplace_mem(void *array, struct Mem *mem);
2025-02-09 18:48:25 +01:00
#endif // INCLUDE_WAYLANDCLIENT_DYNARRAY_H_