UNIXworkcode

1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 /** 29 * \file array_list.h 30 * \brief Array list implementation. 31 * \details Also provides several low-level functions for custom array list implementations. 32 * \author Mike Becker 33 * \author Olaf Wintermann 34 * \version 3.0 35 * \copyright 2-Clause BSD License 36 */ 37 38 39 #ifndef UCX_ARRAY_LIST_H 40 #define UCX_ARRAY_LIST_H 41 42 #include "list.h" 43 44 #ifdef __cplusplus 45 extern "C" { 46 #endif 47 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 alloc a reference to this allocator 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 struct cx_array_reallocator_s *alloc 71 ); 72 73 /** 74 * Custom data pointer. 75 */ 76 void *ptr1; 77 /** 78 * Custom data pointer. 79 */ 80 void *ptr2; 81 /** 82 * Custom data integer. 83 */ 84 size_t int1; 85 /** 86 * Custom data integer. 87 */ 88 size_t int2; 89 }; 90 91 /** 92 * Return codes for cx_array_copy(). 93 */ 94 enum cx_array_copy_result { 95 CX_ARRAY_COPY_SUCCESS, 96 CX_ARRAY_COPY_REALLOC_NOT_SUPPORTED, 97 CX_ARRAY_COPY_REALLOC_FAILED, 98 }; 99 100 /** 101 * Copies elements from one array to another. 102 * 103 * The elements are copied to the \p target array at the specified \p index, 104 * overwriting possible elements. The \p index does not need to be in range of 105 * the current array \p size. If the new index plus the number of elements added 106 * would extend the array's size, and \p capacity is not \c NULL, the remaining 107 * capacity is used. 108 * 109 * If the capacity is insufficient to hold the new data, a reallocation 110 * attempt is made, unless the allocator is set to \c NULL, in which case 111 * this function ultimately returns a failure. 112 * 113 * @param target the target array 114 * @param size a pointer to the size of the target array 115 * @param capacity a pointer to the target array's capacity - 116 * \c NULL if only the size shall be used to bound the array 117 * @param index the index where the copied elements shall be placed 118 * @param src the source array 119 * @param elem_size the size of one element 120 * @param elem_count the number of elements to copy 121 * @param reallocator the array re-allocator to use, or \c NULL 122 * if re-allocation shall not happen 123 * @return zero on success, non-zero error code on failure 124 */ 125 enum cx_array_copy_result cx_array_copy( 126 void **target, 127 size_t *size, 128 size_t *capacity, 129 size_t index, 130 void const *src, 131 size_t elem_size, 132 size_t elem_count, 133 struct cx_array_reallocator_s *reallocator 134 ) __attribute__((__nonnull__(1, 2, 5))); 135 136 137 /** 138 * Swaps two array elements. 139 * 140 * @param arr the array 141 * @param elem_size the element size 142 * @param idx1 index of first element 143 * @param idx2 index of second element 144 */ 145 void cx_array_swap( 146 void *arr, 147 size_t elem_size, 148 size_t idx1, 149 size_t idx2 150 ) __attribute__((__nonnull__)); 151 152 /** 153 * Allocates an array list for storing elements with \p item_size bytes each. 154 * 155 * If \p item_size is CX_STORE_POINTERS, the created list will be created as if 156 * cxListStorePointers() was called immediately after creation. 157 * 158 * @param allocator the allocator for allocating the list memory 159 * (if \c NULL the cxDefaultAllocator will be used) 160 * @param comparator the comparator for the elements 161 * (if \c NULL sort and find functions will not work) 162 * @param item_size the size of each element in bytes 163 * @param initial_capacity the initial number of elements the array can store 164 * @return the created list 165 */ 166 CxList *cxArrayListCreate( 167 CxAllocator const *allocator, 168 cx_compare_func comparator, 169 size_t item_size, 170 size_t initial_capacity 171 ); 172 173 /** 174 * Allocates an array list for storing elements with \p item_size bytes each. 175 * 176 * The list will use the cxDefaultAllocator and \em NO compare function. 177 * If you want to call functions that need a compare function, you have to 178 * set it immediately after creation or use cxArrayListCreate(). 179 * 180 * If \p item_size is CX_STORE_POINTERS, the created list will be created as if 181 * cxListStorePointers() was called immediately after creation. 182 * 183 * @param item_size the size of each element in bytes 184 * @param initial_capacity the initial number of elements the array can store 185 * @return the created list 186 */ 187 #define cxArrayListCreateSimple(item_size, initial_capacity) \ 188 cxArrayListCreate(NULL, NULL, item_size, initial_capacity) 189 190 #ifdef __cplusplus 191 } // extern "C" 192 #endif 193 194 #endif // UCX_ARRAY_LIST_H 195