src/cx/array_list.h

Sun, 13 Nov 2022 13:22:03 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 13 Nov 2022 13:22:03 +0100
changeset 608
2e93521145ac
parent 606
314e9288af2f
child 609
6ae8146d9f62
permissions
-rw-r--r--

proposal for a low level array copy

universe@606 1 /*
universe@606 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
universe@606 3 *
universe@606 4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
universe@606 5 *
universe@606 6 * Redistribution and use in source and binary forms, with or without
universe@606 7 * modification, are permitted provided that the following conditions are met:
universe@606 8 *
universe@606 9 * 1. Redistributions of source code must retain the above copyright
universe@606 10 * notice, this list of conditions and the following disclaimer.
universe@606 11 *
universe@606 12 * 2. Redistributions in binary form must reproduce the above copyright
universe@606 13 * notice, this list of conditions and the following disclaimer in the
universe@606 14 * documentation and/or other materials provided with the distribution.
universe@606 15 *
universe@606 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
universe@606 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
universe@606 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
universe@606 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
universe@606 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
universe@606 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
universe@606 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
universe@606 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
universe@606 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
universe@606 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
universe@606 26 * POSSIBILITY OF SUCH DAMAGE.
universe@606 27 */
universe@606 28 /**
universe@606 29 * \file array_list.h
universe@606 30 * \brief Array list implementation.
universe@606 31 * \details Also provides several low-level functions for custom array list implementations.
universe@606 32 * \author Mike Becker
universe@606 33 * \author Olaf Wintermann
universe@606 34 * \version 3.0
universe@606 35 * \copyright 2-Clause BSD License
universe@606 36 */
universe@606 37
universe@606 38
universe@606 39 #ifndef UCX_ARRAY_LIST_H
universe@606 40 #define UCX_ARRAY_LIST_H
universe@606 41
universe@606 42 #include "cx/list.h"
universe@606 43
universe@606 44 #ifdef __cplusplus
universe@606 45 extern "C" {
universe@606 46 #endif
universe@606 47
universe@606 48 /**
universe@608 49 * Defines a reallocation mechanism for arrays.
universe@608 50 */
universe@608 51 struct cx_array_reallocator_s {
universe@608 52 /**
universe@608 53 * Re-allocates space for the given array.
universe@608 54 *
universe@608 55 * Implementations are not required to free the original array.
universe@608 56 * This allows re-allocation of static memory by allocating heap memory
universe@608 57 * and copying the array contents. The information in \p data can keep
universe@608 58 * track of the state of the memory or other additional allocator info.
universe@608 59 *
universe@608 60 * @param array the array to reallocate
universe@608 61 * @param capacity the new capacity (number of elements)
universe@608 62 * @param elem_size the size of each element
universe@608 63 * @param data additional data
universe@608 64 * @return a pointer to the reallocated memory or \c NULL on failure
universe@608 65 */
universe@608 66 void *(*realloc)(
universe@608 67 void *array,
universe@608 68 size_t capacity,
universe@608 69 size_t elem_size,
universe@608 70 void *data
universe@608 71 );
universe@608 72
universe@608 73 /**
universe@608 74 * Additional data.
universe@608 75 */
universe@608 76 void *data;
universe@608 77 };
universe@608 78
universe@608 79 /**
universe@608 80 * Copies elements from one array to another.
universe@608 81 *
universe@608 82 * The elements are copied to the \p target array at the specified \p index,
universe@608 83 * overwriting possible elements. The index must be in range of the current
universe@608 84 * array \p size. If the number of elements added would extend the array's size,
universe@608 85 * and \p capacity is not \c NULL, the remaining capacity is used.
universe@608 86 *
universe@608 87 * If the capacity is insufficient to hold the new data, a reallocation
universe@608 88 * attempt is made, unless the allocator is set to \c NULL, in which case
universe@608 89 * this function ultimately returns a failure.
universe@608 90 *
universe@608 91 * @param target the target array
universe@608 92 * @param size a pointer to the size of the target array
universe@608 93 * @param capacity a pointer to the target array's capacity -
universe@608 94 * \c NULL if only the size shall be used to bound the array
universe@608 95 * @param index the index where the copied elements shall be placed
universe@608 96 * @param src the source array
universe@608 97 * @param elem_size the size of one element
universe@608 98 * @param elem_count the number of elements to copy
universe@608 99 * @param reallocator the array re-allocator to use, or \c NULL
universe@608 100 * if re-allocation shall not happen
universe@608 101 * @return zero on success, non-zero on failure
universe@608 102 */
universe@608 103 int cx_array_copy(
universe@608 104 void **target,
universe@608 105 size_t *size,
universe@608 106 size_t *capacity,
universe@608 107 size_t index,
universe@608 108 void const *src,
universe@608 109 size_t elem_size,
universe@608 110 size_t elem_count,
universe@608 111 struct cx_array_reallocator_s const *reallocator
universe@608 112 ) __attribute__((__nonnull__(1, 2, 5)));
universe@608 113
universe@608 114 /**
universe@606 115 * Allocates an array list for storing elements with \p item_size bytes each.
universe@606 116 *
universe@606 117 * @param allocator the allocator for allocating the list memory
universe@606 118 * @param comparator the comparator for the elements
universe@606 119 * @param item_size the size of each element in bytes
universe@606 120 * @param initial_capacity the initial number of elements the array can store
universe@606 121 * @return the created list
universe@606 122 */
universe@606 123 CxList *cxArrayListCreate(
universe@606 124 CxAllocator const *allocator,
universe@606 125 CxListComparator comparator,
universe@606 126 size_t item_size,
universe@606 127 size_t initial_capacity
universe@606 128 ) __attribute__((__nonnull__));
universe@606 129
universe@606 130
universe@606 131 #ifdef __cplusplus
universe@606 132 } /* extern "C" */
universe@606 133 #endif
universe@606 134
universe@606 135 #endif /* UCX_ARRAY_LIST_H */

mercurial