| 50 extern const unsigned cx_array_swap_sbo_size; |
50 extern const unsigned cx_array_swap_sbo_size; |
| 51 |
51 |
| 52 /** |
52 /** |
| 53 * Declares variables for an array that can be used with the convenience macros. |
53 * Declares variables for an array that can be used with the convenience macros. |
| 54 * |
54 * |
| |
55 * @param type the type of the data |
| |
56 * @param name the name of the array |
| |
57 * @param size_type the type of the size (should be uint8_t, uint16_t, uint32_t, or size_t) |
| |
58 * |
| 55 * @see cx_array_simple_add() |
59 * @see cx_array_simple_add() |
| 56 * @see cx_array_simple_copy() |
60 * @see cx_array_simple_copy() |
| 57 * @see cx_array_initialize() |
61 * @see cx_array_initialize() |
| 58 * @see cx_array_simple_add_sorted() |
62 * @see cx_array_simple_add_sorted() |
| 59 * @see cx_array_simple_insert_sorted() |
63 * @see cx_array_simple_insert_sorted() |
| 60 */ |
64 */ |
| 61 #define CX_ARRAY_DECLARE(type, name) \ |
65 #define CX_ARRAY_DECLARE_SIZED(type, name, size_type) \ |
| 62 type * name; \ |
66 type * name; \ |
| 63 size_t name##_size; \ |
67 size_type name##_size; \ |
| 64 size_t name##_capacity |
68 size_type name##_capacity |
| |
69 |
| |
70 /** |
| |
71 * Declares variables for an array that can be used with the convenience macros. |
| |
72 * |
| |
73 * The size and capacity variables will have `size_t` type. |
| |
74 * Use #CX_ARRAY_DECLARE_SIZED() to specify a different type. |
| |
75 * |
| |
76 * @param type the type of the data |
| |
77 * @param name the name of the array |
| |
78 * |
| |
79 * @see cx_array_simple_add() |
| |
80 * @see cx_array_simple_copy() |
| |
81 * @see cx_array_initialize() |
| |
82 * @see cx_array_simple_add_sorted() |
| |
83 * @see cx_array_simple_insert_sorted() |
| |
84 */ |
| |
85 #define CX_ARRAY_DECLARE(type, name) CX_ARRAY_DECLARE_SIZED(type, name, size_t) |
| 65 |
86 |
| 66 /** |
87 /** |
| 67 * Initializes an array declared with CX_ARRAY_DECLARE(). |
88 * Initializes an array declared with CX_ARRAY_DECLARE(). |
| 68 * |
89 * |
| 69 * The memory for the array is allocated with stdlib malloc(). |
90 * The memory for the array is allocated with stdlib malloc(). |
| 161 * would extend the array's size, the remaining \p capacity is used. |
182 * would extend the array's size, the remaining \p capacity is used. |
| 162 * |
183 * |
| 163 * If the \p capacity is also insufficient to hold the new data, a reallocation |
184 * If the \p capacity is also insufficient to hold the new data, a reallocation |
| 164 * attempt is made with the specified \p reallocator. |
185 * attempt is made with the specified \p reallocator. |
| 165 * |
186 * |
| |
187 * The \p width refers to the size and capacity. Both must have the same width. |
| |
188 * Supported are 0, 8, 16, and 32, as well as 64 if running on a 64 bit |
| |
189 * architecture. If set to zero, the native word width is used. |
| |
190 * |
| 166 * @param target a pointer to the target array |
191 * @param target a pointer to the target array |
| 167 * @param size a pointer to the size of the target array |
192 * @param size a pointer to the size of the target array |
| 168 * @param capacity a pointer to the capacity of the target array |
193 * @param capacity a pointer to the capacity of the target array |
| |
194 * @param width the width in bytes for the \p size and \p capacity or zero for default |
| 169 * @param index the index where the copied elements shall be placed |
195 * @param index the index where the copied elements shall be placed |
| 170 * @param src the source array |
196 * @param src the source array |
| 171 * @param elem_size the size of one element |
197 * @param elem_size the size of one element |
| 172 * @param elem_count the number of elements to copy |
198 * @param elem_count the number of elements to copy |
| 173 * @param reallocator the array reallocator to use |
199 * @param reallocator the array reallocator to use |
| 174 * @return zero on success, non-zero on failure |
200 * @return zero on success, non-zero on failure |
| 175 */ |
201 */ |
| 176 cx_attr_nonnull |
202 cx_attr_nonnull |
| 177 int cx_array_copy( |
203 int cx_array_copy( |
| 178 void **target, |
204 void **target, |
| 179 size_t *size, |
205 void *size, |
| 180 size_t *capacity, |
206 void *capacity, |
| |
207 unsigned width, |
| 181 size_t index, |
208 size_t index, |
| 182 const void *src, |
209 const void *src, |
| 183 size_t elem_size, |
210 size_t elem_size, |
| 184 size_t elem_count, |
211 size_t elem_count, |
| 185 struct cx_array_reallocator_s *reallocator |
212 struct cx_array_reallocator_s *reallocator |
| 196 * @return zero on success, non-zero on failure |
223 * @return zero on success, non-zero on failure |
| 197 * @see CX_ARRAY_DECLARE() |
224 * @see CX_ARRAY_DECLARE() |
| 198 */ |
225 */ |
| 199 #define cx_array_simple_copy(array, index, src, count) \ |
226 #define cx_array_simple_copy(array, index, src, count) \ |
| 200 cx_array_copy((void**)&(array), &(array##_size), &(array##_capacity), \ |
227 cx_array_copy((void**)&(array), &(array##_size), &(array##_capacity), \ |
| 201 index, src, sizeof((array)[0]), count, cx_array_default_reallocator) |
228 8*sizeof(array##_size), index, src, sizeof((array)[0]), count, \ |
| |
229 cx_array_default_reallocator) |
| 202 |
230 |
| 203 /** |
231 /** |
| 204 * Adds an element to an array with the possibility of allocating more space. |
232 * Adds an element to an array with the possibility of allocating more space. |
| 205 * |
233 * |
| 206 * The element \p elem is added to the end of the \p target array which contains |
234 * The element \p elem is added to the end of the \p target array which contains |
| 217 * @param elem a pointer to the element to add |
245 * @param elem a pointer to the element to add |
| 218 * @param reallocator the array reallocator to use |
246 * @param reallocator the array reallocator to use |
| 219 * @return zero on success, non-zero on failure |
247 * @return zero on success, non-zero on failure |
| 220 */ |
248 */ |
| 221 #define cx_array_add(target, size, capacity, elem_size, elem, reallocator) \ |
249 #define cx_array_add(target, size, capacity, elem_size, elem, reallocator) \ |
| 222 cx_array_copy((void**)(target), size, capacity, *(size), elem, elem_size, 1, reallocator) |
250 cx_array_copy((void**)(target), size, capacity, 8*sizeof(*(size)), \ |
| |
251 *(size), elem, elem_size, 1, reallocator) |
| 223 |
252 |
| 224 /** |
253 /** |
| 225 * Convenience macro that uses cx_array_add() with a default layout and |
254 * Convenience macro that uses cx_array_add() with a default layout and |
| 226 * the default reallocator. |
255 * the default reallocator. |
| 227 * |
256 * |