Graphviz 13.1.3~dev.20250831.0023
Loading...
Searching...
No Matches
list-private.h
Go to the documentation of this file.
1
7
8#pragma once
9
10#include <stdbool.h>
11#include <stddef.h>
12#include <stdio.h>
13#include <stdlib.h>
14#include <string.h>
15#include <util/api.h>
16
17#ifdef __cplusplus
18extern "C" {
19#endif
20
25typedef struct {
26 void *base;
28 size_t head;
30 size_t size;
32 size_t capacity;
33} list_t_;
34
39static inline size_t gv_list_size_(const list_t_ list) { return list.size; }
40
47UTIL_API bool gv_list_try_reserve_(list_t_ *list, size_t capacity,
48 size_t item_size);
49
57UTIL_API size_t gv_list_append_slot_(list_t_ *list, size_t item_size);
58
66UTIL_API size_t gv_list_prepend_slot_(list_t_ *list, size_t item_size);
67
73UTIL_API size_t gv_list_get_(const list_t_ list, size_t index);
74
87#define LIST_DTOR_(list, slot) \
88 do { \
89 if ((list)->dtor == LIST_DTOR_FREE) { \
90 /* we need to juggle the element into a pointer to avoid compilation */ \
91 /* errors from this (untaken) branch when the element type is not a */ \
92 /* pointer */ \
93 void *ptr_; \
94 sizeof((list)->base[0]) == sizeof(ptr_) \
95 ? (void)0 \
96 : (void)(fprintf(stderr, "list element type is not a pointer, but " \
97 "`free` used as destructor\n"), \
98 abort()); \
99 memcpy(&ptr_, &(list)->base[slot], sizeof(ptr_)); \
100 free(ptr_); \
101 } else if ((list)->dtor != NULL) { \
102 (list)->dtor((list)->base[slot]); \
103 } \
104 } while (0)
105
112UTIL_API size_t gv_list_find_(const list_t_ list, const void *needle,
113 size_t item_size);
114
120UTIL_API void gv_list_remove_(list_t_ *list, size_t index, size_t item_size);
121
126UTIL_API void gv_list_clear_(list_t_ *list, size_t item_size);
127
135UTIL_API void gv_list_reserve_(list_t_ *list, size_t capacity,
136 size_t item_size);
137
144UTIL_API bool gv_list_contains_(const list_t_ list, const void *needle,
145 size_t item_size);
146
154UTIL_API list_t_ gv_list_copy_(const list_t_ list, size_t item_size);
155
174
182UTIL_API void gv_list_sync_(list_t_ *list, size_t item_size);
183
190 int (*cmp)(const void *, const void *),
191 size_t item_size);
192
197UTIL_API void gv_list_reverse_(list_t_ *list, size_t item_size);
198
203UTIL_API void gv_list_shrink_to_fit_(list_t_ *list, size_t item_size);
204
208UTIL_API void gv_list_free_(list_t_ *list);
209
215UTIL_API void gv_list_pop_front_(list_t_ *list, void *into, size_t item_size);
216
222UTIL_API void gv_list_pop_back_(list_t_ *list, void *into, size_t item_size);
223
224#ifdef __cplusplus
225}
226#endif
macro for API hiding/exposing
#define UTIL_API
Definition api.h:18
static int cmp(const void *key, const void *candidate)
UTIL_API void gv_list_sort_(list_t_ *list, int(*cmp)(const void *, const void *), size_t item_size)
Definition list.c:285
UTIL_API list_t_ gv_list_copy_(const list_t_ list, size_t item_size)
Definition list.c:228
UTIL_API void gv_list_sync_(list_t_ *list, size_t item_size)
Definition list.c:254
UTIL_API void gv_list_reserve_(list_t_ *list, size_t capacity, size_t item_size)
Definition list.c:212
UTIL_API void gv_list_pop_back_(list_t_ *list, void *into, size_t item_size)
Definition list.c:353
UTIL_API size_t gv_list_append_slot_(list_t_ *list, size_t item_size)
Definition list.c:54
UTIL_API size_t gv_list_get_(const list_t_ list, size_t index)
Definition list.c:161
UTIL_API size_t gv_list_find_(const list_t_ list, const void *needle, size_t item_size)
Definition list.c:166
UTIL_API void gv_list_reverse_(list_t_ *list, size_t item_size)
Definition list.c:309
UTIL_API void gv_list_free_(list_t_ *list)
Definition list.c:333
UTIL_API bool gv_list_contains_(const list_t_ list, const void *needle, size_t item_size)
Definition list.c:223
UTIL_API void gv_list_shrink_to_fit_(list_t_ *list, size_t item_size)
Definition list.c:322
UTIL_API void gv_list_remove_(list_t_ *list, size_t index, size_t item_size)
Definition list.c:179
UTIL_API size_t gv_list_prepend_slot_(list_t_ *list, size_t item_size)
Definition list.c:75
UTIL_API void gv_list_clear_(list_t_ *list, size_t item_size)
Definition list.c:197
UTIL_API bool gv_list_is_contiguous_(const list_t_ list)
Definition list.c:250
static size_t gv_list_size_(const list_t_ list)
UTIL_API void gv_list_pop_front_(list_t_ *list, void *into, size_t item_size)
Definition list.c:339
UTIL_API bool gv_list_try_reserve_(list_t_ *list, size_t capacity, size_t item_size)
Definition list.c:156
size_t size
size <= capacity
size_t capacity
available storage slots
void * base
(base == NULL && capacity == 0) || (base != NULL && capacity > 0)
size_t head
(capacity == 0 && head == 0) || (capacity > 0 && head < capacity)