Zrythm
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
arrays.h
1/*
2 * SPDX-FileCopyrightText: © 2018-2022 Alexandros Theodotou <alex@zrythm.org>
3 *
4 * SPDX-License-Identifier: LicenseRef-ZrythmLicense
5 */
6
7#ifndef __UTILS_ARRAYS_H__
8#define __UTILS_ARRAYS_H__
9
10#define array_index_of(array, size, element) \
11 _array_index_of ((void **) array, size, (void *) element)
12
16#define array_append(array, size, element) (array)[(size)++] = element;
17
18#define array_double_append(arr1, arr2, size, el1, el2) \
19 arr1[size] = el1; \
20 arr2[size] = el2; \
21 size++;
22
27#define array_insert(array, size, pos, element) \
28 for (int ii = size; ii > pos; ii--) \
29 { \
30 array[ii] = array[ii - 1]; \
31 } \
32 array[pos] = element; \
33 size++;
34
40#define array_double_insert(arr1, arr2, size, pos, el1, el2) \
41 for (int ii = size; ii > pos; ii--) \
42 { \
43 arr1[ii] = arr1[ii - 1]; \
44 arr2[ii] = arr2[ii - 1]; \
45 } \
46 arr1[pos] = el1; \
47 arr2[pos] = el2; \
48 size++;
49
69NONNULL void
70_array_double_size_if_full (
71 void ** arr_ptr,
72 size_t count,
73 size_t * max_sz,
74 size_t el_size);
75
85#define array_double_size_if_full(array, count, size, type) \
86 ((size_t) (count) < (size_t) (size) \
87 ? ({}) \
88 : _array_double_size_if_full ( \
89 (void **) &array, (size_t) (count), &size, sizeof (type)))
90
95#define array_delete(array, size, element) \
96 for (size_t ii = 0; ii < (size_t) size; ii++) \
97 { \
98 if ((void *) array[ii] == (void *) element) \
99 { \
100 --size; \
101 for (size_t jj = ii; jj < (size_t) size; jj++) \
102 { \
103 array[jj] = array[jj + 1]; \
104 } \
105 break; \
106 } \
107 }
108
113#define array_delete_confirm(array, size, element, confirm) \
114 confirm = false; \
115 for (size_t ii = 0; ii < (size_t) size; ii++) \
116 { \
117 if ((void *) array[ii] == (void *) element) \
118 { \
119 confirm = true; \
120 --size; \
121 for (size_t jj = ii; jj < (size_t) size; jj++) \
122 { \
123 array[jj] = array[jj + 1]; \
124 } \
125 break; \
126 } \
127 }
128
133#define array_delete_primitive(array, size, element) \
134 for (int ii = 0; ii < size; ii++) \
135 { \
136 if (array[ii] == element) \
137 { \
138 --size; \
139 for (int jj = ii; jj < size; jj++) \
140 { \
141 array[jj] = array[jj + 1]; \
142 } \
143 break; \
144 } \
145 }
146
151#define array_delete_return_pos(array, size, element, pos) \
152 for (int ii = 0; ii < size; ii++) \
153 { \
154 if (array[ii] == element) \
155 { \
156 pos = ii; \
157 --size; \
158 for (int jj = ii; jj < size; jj++) \
159 { \
160 array[jj] = array[jj + 1]; \
161 } \
162 break; \
163 } \
164 }
165
172#define array_double_delete(array1, array2, size, element1, element2) \
173 for (int ii = 0; ii < size; ii++) \
174 { \
175 if (array1[ii] == element1) \
176 { \
177 --size; \
178 for (int jj = ii; jj < size; jj++) \
179 { \
180 array1[jj] = array1[jj + 1]; \
181 array2[jj] = array2[jj + 1]; \
182 } \
183 break; \
184 } \
185 }
186
187#define array_contains_cmp(array, size, element, cmp, equal_val, pointers) \
188 _array_contains_cmp ( \
189 (void **) array, size, (void *) element, (int (*) (void *, void *)) cmp, \
190 equal_val, pointers)
191
196#define array_contains(array, size, element) \
197 _array_contains ((void **) array, size, (void *) element)
198
199#define array_dynamic_swap(arr1, sz1, arr2, sz2) \
200 _array_dynamic_swap ( \
201 (void ***) arr1, (size_t *) sz1, (void ***) arr2, (size_t *) sz2)
202
211void
212_array_dynamic_swap (void *** arr1, size_t * sz1, void *** arr2, size_t * sz2);
213
214static inline int
215array_contains_int (int * array, int size, int element)
216{
217 for (int i = 0; i < size; i++)
218 {
219 if (array[i] == element)
220 return 1;
221 }
222 return 0;
223}
224
232void
233array_shuffle (void * array, size_t n, size_t size);
234
240NONNULL PURE WARN_UNUSED_RESULT int
241_array_contains (void ** array, int size, void * element);
242
254int
255_array_contains_cmp (
256 void ** array,
257 int size,
258 void * element,
259 int (*cmp) (void *, void *),
260 int equal_val,
261 int pointers);
262
267int
268_array_index_of (void ** array, int size, void * element);
269
270void
271array_sort_alphabetically (char ** array, int size, int case_sensitive);
272
273void
274array_sort_float (float * array, int size);
275
276void
277array_sort_long (long * array, int size);
278
279#define array_get_count(_arr, _sz) _array_get_count ((void **) _arr, _sz)
280
284size_t
285_array_get_count (void ** array, size_t element_size);
286
287#endif /* __UTILS_ARRAYS_H__ */