44 #ifdef __cplusplus |
44 #ifdef __cplusplus |
45 extern "C" { |
45 extern "C" { |
46 #endif |
46 #endif |
47 |
47 |
48 /** |
48 /** |
|
49 * Defines a reallocation mechanism for arrays. |
|
50 */ |
|
51 struct cx_array_reallocator_s { |
|
52 /** |
|
53 * Re-allocates space for the given array. |
|
54 * |
|
55 * Implementations are not required to free the original array. |
|
56 * This allows re-allocation of static memory by allocating heap memory |
|
57 * and copying the array contents. The information in \p data can keep |
|
58 * track of the state of the memory or other additional allocator info. |
|
59 * |
|
60 * @param array the array to reallocate |
|
61 * @param capacity the new capacity (number of elements) |
|
62 * @param elem_size the size of each element |
|
63 * @param data additional data |
|
64 * @return a pointer to the reallocated memory or \c NULL on failure |
|
65 */ |
|
66 void *(*realloc)( |
|
67 void *array, |
|
68 size_t capacity, |
|
69 size_t elem_size, |
|
70 void *data |
|
71 ); |
|
72 |
|
73 /** |
|
74 * Additional data. |
|
75 */ |
|
76 void *data; |
|
77 }; |
|
78 |
|
79 /** |
|
80 * Copies elements from one array to another. |
|
81 * |
|
82 * The elements are copied to the \p target array at the specified \p index, |
|
83 * overwriting possible elements. The index must be in range of the current |
|
84 * array \p size. If the number of elements added would extend the array's size, |
|
85 * and \p capacity is not \c NULL, the remaining capacity is used. |
|
86 * |
|
87 * If the capacity is insufficient to hold the new data, a reallocation |
|
88 * attempt is made, unless the allocator is set to \c NULL, in which case |
|
89 * this function ultimately returns a failure. |
|
90 * |
|
91 * @param target the target array |
|
92 * @param size a pointer to the size of the target array |
|
93 * @param capacity a pointer to the target array's capacity - |
|
94 * \c NULL if only the size shall be used to bound the array |
|
95 * @param index the index where the copied elements shall be placed |
|
96 * @param src the source array |
|
97 * @param elem_size the size of one element |
|
98 * @param elem_count the number of elements to copy |
|
99 * @param reallocator the array re-allocator to use, or \c NULL |
|
100 * if re-allocation shall not happen |
|
101 * @return zero on success, non-zero on failure |
|
102 */ |
|
103 int cx_array_copy( |
|
104 void **target, |
|
105 size_t *size, |
|
106 size_t *capacity, |
|
107 size_t index, |
|
108 void const *src, |
|
109 size_t elem_size, |
|
110 size_t elem_count, |
|
111 struct cx_array_reallocator_s const *reallocator |
|
112 ) __attribute__((__nonnull__(1, 2, 5))); |
|
113 |
|
114 /** |
49 * Allocates an array list for storing elements with \p item_size bytes each. |
115 * Allocates an array list for storing elements with \p item_size bytes each. |
50 * |
116 * |
51 * @param allocator the allocator for allocating the list memory |
117 * @param allocator the allocator for allocating the list memory |
52 * @param comparator the comparator for the elements |
118 * @param comparator the comparator for the elements |
53 * @param item_size the size of each element in bytes |
119 * @param item_size the size of each element in bytes |