Thu, 30 Oct 2025 19:26:47 +0100
add tests for cxListDifference() - resolves #751
| 606 | 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 | #include "cx/array_list.h" | |
| 763 
741a2040fa33
make cx_cmp_ptr default comparator for pointer lists - relates to #340
 Mike Becker <universe@uap-core.de> parents: 
735diff
changeset | 30 | #include "cx/compare.h" | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 31 | #include <assert.h> | 
| 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 32 | #include <string.h> | 
| 998 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 33 | #include <errno.h> | 
| 606 | 34 | |
| 817 
949908c97474
add cx_array_default_reallocator
 Mike Becker <universe@uap-core.de> parents: 
807diff
changeset | 35 | // Default array reallocator | 
| 
949908c97474
add cx_array_default_reallocator
 Mike Becker <universe@uap-core.de> parents: 
807diff
changeset | 36 | |
| 
949908c97474
add cx_array_default_reallocator
 Mike Becker <universe@uap-core.de> parents: 
807diff
changeset | 37 | static void *cx_array_default_realloc( | 
| 
949908c97474
add cx_array_default_reallocator
 Mike Becker <universe@uap-core.de> parents: 
807diff
changeset | 38 | void *array, | 
| 1322 
7be10b57f658
fix critical memory overflow in the stack-based array reallocator
 Mike Becker <universe@uap-core.de> parents: 
1319diff
changeset | 39 | cx_attr_unused size_t old_capacity, | 
| 
7be10b57f658
fix critical memory overflow in the stack-based array reallocator
 Mike Becker <universe@uap-core.de> parents: 
1319diff
changeset | 40 | size_t new_capacity, | 
| 817 
949908c97474
add cx_array_default_reallocator
 Mike Becker <universe@uap-core.de> parents: 
807diff
changeset | 41 | size_t elem_size, | 
| 985 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 42 | cx_attr_unused CxArrayReallocator *alloc | 
| 817 
949908c97474
add cx_array_default_reallocator
 Mike Becker <universe@uap-core.de> parents: 
807diff
changeset | 43 | ) { | 
| 1040 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 44 | size_t n; | 
| 1322 
7be10b57f658
fix critical memory overflow in the stack-based array reallocator
 Mike Becker <universe@uap-core.de> parents: 
1319diff
changeset | 45 | if (cx_szmul(new_capacity, elem_size, &n)) { | 
| 1040 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 46 | errno = EOVERFLOW; | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 47 | return NULL; | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 48 | } | 
| 1319 
aa1f580f8f59
add convenience macros for using the default allocator - relates to #669
 Mike Becker <universe@uap-core.de> parents: 
1318diff
changeset | 49 | return cxReallocDefault(array, n); | 
| 817 
949908c97474
add cx_array_default_reallocator
 Mike Becker <universe@uap-core.de> parents: 
807diff
changeset | 50 | } | 
| 
949908c97474
add cx_array_default_reallocator
 Mike Becker <universe@uap-core.de> parents: 
807diff
changeset | 51 | |
| 953 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 52 | CxArrayReallocator cx_array_default_reallocator_impl = { | 
| 1425 
83284b289430
remove unnecessary members from the array reallocator struct - fixes #621
 Mike Becker <universe@uap-core.de> parents: 
1423diff
changeset | 53 | cx_array_default_realloc, NULL, NULL | 
| 817 
949908c97474
add cx_array_default_reallocator
 Mike Becker <universe@uap-core.de> parents: 
807diff
changeset | 54 | }; | 
| 
949908c97474
add cx_array_default_reallocator
 Mike Becker <universe@uap-core.de> parents: 
807diff
changeset | 55 | |
| 953 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 56 | CxArrayReallocator *cx_array_default_reallocator = &cx_array_default_reallocator_impl; | 
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 57 | |
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 58 | // Stack-aware array reallocator | 
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 59 | |
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 60 | static void *cx_array_advanced_realloc( | 
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 61 | void *array, | 
| 1322 
7be10b57f658
fix critical memory overflow in the stack-based array reallocator
 Mike Becker <universe@uap-core.de> parents: 
1319diff
changeset | 62 | size_t old_capacity, | 
| 
7be10b57f658
fix critical memory overflow in the stack-based array reallocator
 Mike Becker <universe@uap-core.de> parents: 
1319diff
changeset | 63 | size_t new_capacity, | 
| 953 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 64 | size_t elem_size, | 
| 985 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 65 | cx_attr_unused CxArrayReallocator *alloc | 
| 953 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 66 | ) { | 
| 1040 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 67 | // check for overflow | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 68 | size_t n; | 
| 1322 
7be10b57f658
fix critical memory overflow in the stack-based array reallocator
 Mike Becker <universe@uap-core.de> parents: 
1319diff
changeset | 69 | if (cx_szmul(new_capacity, elem_size, &n)) { | 
| 1040 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 70 | errno = EOVERFLOW; | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 71 | return NULL; | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 72 | } | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 73 | |
| 953 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 74 | // retrieve the pointer to the actual allocator | 
| 1425 
83284b289430
remove unnecessary members from the array reallocator struct - fixes #621
 Mike Becker <universe@uap-core.de> parents: 
1423diff
changeset | 75 | const CxAllocator *al = alloc->allocator; | 
| 953 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 76 | |
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 77 | // check if the array is still located on the stack | 
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 78 | void *newmem; | 
| 1425 
83284b289430
remove unnecessary members from the array reallocator struct - fixes #621
 Mike Becker <universe@uap-core.de> parents: 
1423diff
changeset | 79 | if (array == alloc->stack_ptr) { | 
| 1040 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 80 | newmem = cxMalloc(al, n); | 
| 995 
d3d4f245b843
fix cx_array_advanced_realloc to handle reallocation of NULL arrays, consistent with standard realloc behavior
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
986diff
changeset | 81 | if (newmem != NULL && array != NULL) { | 
| 1322 
7be10b57f658
fix critical memory overflow in the stack-based array reallocator
 Mike Becker <universe@uap-core.de> parents: 
1319diff
changeset | 82 | memcpy(newmem, array, old_capacity*elem_size); | 
| 953 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 83 | } | 
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 84 | } else { | 
| 1040 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 85 | newmem = cxRealloc(al, array, n); | 
| 953 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 86 | } | 
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 87 | return newmem; | 
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 88 | } | 
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 89 | |
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 90 | struct cx_array_reallocator_s cx_array_reallocator( | 
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 91 | const struct cx_allocator_s *allocator, | 
| 1425 
83284b289430
remove unnecessary members from the array reallocator struct - fixes #621
 Mike Becker <universe@uap-core.de> parents: 
1423diff
changeset | 92 | const void *stack_ptr | 
| 953 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 93 | ) { | 
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 94 | if (allocator == NULL) { | 
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 95 | allocator = cxDefaultAllocator; | 
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 96 | } | 
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 97 | return (struct cx_array_reallocator_s) { | 
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 98 | cx_array_advanced_realloc, | 
| 1425 
83284b289430
remove unnecessary members from the array reallocator struct - fixes #621
 Mike Becker <universe@uap-core.de> parents: 
1423diff
changeset | 99 | allocator, stack_ptr, | 
| 953 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 100 | }; | 
| 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 101 | } | 
| 818 
2be8fe3d5a2d
add cx_array_add() + fix type of cx_array_default_reallocator
 Mike Becker <universe@uap-core.de> parents: 
817diff
changeset | 102 | |
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 103 | // LOW LEVEL ARRAY LIST FUNCTIONS | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 104 | |
| 1040 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 105 | static size_t cx_array_align_capacity( | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 106 | size_t cap, | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 107 | size_t alignment, | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 108 | size_t max | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 109 | ) { | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 110 | if (cap > max - alignment) { | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 111 | return cap; | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 112 | } else { | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 113 | return cap - (cap % alignment) + alignment; | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 114 | } | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 115 | } | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 116 | |
| 999 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 117 | int cx_array_reserve( | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 118 | void **array, | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 119 | void *size, | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 120 | void *capacity, | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 121 | unsigned width, | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 122 | size_t elem_size, | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 123 | size_t elem_count, | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 124 | CxArrayReallocator *reallocator | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 125 | ) { | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 126 | // assert pointers | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 127 | assert(array != NULL); | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 128 | assert(size != NULL); | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 129 | assert(capacity != NULL); | 
| 1089 
865c84fef6b4
refine docs for array_list.h - issue #548
 Mike Becker <universe@uap-core.de> parents: 
1084diff
changeset | 130 | |
| 
865c84fef6b4
refine docs for array_list.h - issue #548
 Mike Becker <universe@uap-core.de> parents: 
1084diff
changeset | 131 | // default reallocator | 
| 
865c84fef6b4
refine docs for array_list.h - issue #548
 Mike Becker <universe@uap-core.de> parents: 
1084diff
changeset | 132 | if (reallocator == NULL) { | 
| 
865c84fef6b4
refine docs for array_list.h - issue #548
 Mike Becker <universe@uap-core.de> parents: 
1084diff
changeset | 133 | reallocator = cx_array_default_reallocator; | 
| 
865c84fef6b4
refine docs for array_list.h - issue #548
 Mike Becker <universe@uap-core.de> parents: 
1084diff
changeset | 134 | } | 
| 999 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 135 | |
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 136 | // determine size and capacity | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 137 | size_t oldcap; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 138 | size_t oldsize; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 139 | size_t max_size; | 
| 1084 
0bcd71d2615a
change cx_array_reserve() and cx_array_copy() to accept width in bytes instead of bits
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 140 | if (width == 0 || width == sizeof(size_t)) { | 
| 999 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 141 | oldcap = *(size_t*) capacity; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 142 | oldsize = *(size_t*) size; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 143 | max_size = SIZE_MAX; | 
| 1084 
0bcd71d2615a
change cx_array_reserve() and cx_array_copy() to accept width in bytes instead of bits
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 144 | } else if (width == sizeof(uint16_t)) { | 
| 999 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 145 | oldcap = *(uint16_t*) capacity; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 146 | oldsize = *(uint16_t*) size; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 147 | max_size = UINT16_MAX; | 
| 1084 
0bcd71d2615a
change cx_array_reserve() and cx_array_copy() to accept width in bytes instead of bits
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 148 | } else if (width == sizeof(uint8_t)) { | 
| 999 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 149 | oldcap = *(uint8_t*) capacity; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 150 | oldsize = *(uint8_t*) size; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 151 | max_size = UINT8_MAX; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 152 | } | 
| 1018 
c773da859bad
fix compilation for compilers which don't set __WORDSIZE
 Mike Becker <universe@uap-core.de> parents: 
999diff
changeset | 153 | #if CX_WORDSIZE == 64 | 
| 1084 
0bcd71d2615a
change cx_array_reserve() and cx_array_copy() to accept width in bytes instead of bits
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 154 | else if (width == sizeof(uint32_t)) { | 
| 999 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 155 | oldcap = *(uint32_t*) capacity; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 156 | oldsize = *(uint32_t*) size; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 157 | max_size = UINT32_MAX; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 158 | } | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 159 | #endif | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 160 | else { | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 161 | errno = EINVAL; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 162 | return 1; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 163 | } | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 164 | |
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 165 | // assert that the array is allocated when it has capacity | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 166 | assert(*array != NULL || oldcap == 0); | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 167 | |
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 168 | // check for overflow | 
| 1040 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 169 | if (elem_count > max_size - oldsize) { | 
| 999 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 170 | errno = EOVERFLOW; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 171 | return 1; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 172 | } | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 173 | |
| 1040 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 174 | // determine new capacity | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 175 | size_t newcap = oldsize + elem_count; | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 176 | |
| 999 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 177 | // reallocate if possible | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 178 | if (newcap > oldcap) { | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 179 | // calculate new capacity (next number divisible by 16) | 
| 1040 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 180 | newcap = cx_array_align_capacity(newcap, 16, max_size); | 
| 999 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 181 | |
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 182 | // perform reallocation | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 183 | void *newmem = reallocator->realloc( | 
| 1322 
7be10b57f658
fix critical memory overflow in the stack-based array reallocator
 Mike Becker <universe@uap-core.de> parents: 
1319diff
changeset | 184 | *array, oldcap, newcap, elem_size, reallocator | 
| 999 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 185 | ); | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 186 | if (newmem == NULL) { | 
| 1065 
6eb7b54975ee
improve coverage metrics
 Mike Becker <universe@uap-core.de> parents: 
1047diff
changeset | 187 | return 1; // LCOV_EXCL_LINE | 
| 999 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 188 | } | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 189 | |
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 190 | // store new pointer | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 191 | *array = newmem; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 192 | |
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 193 | // store new capacity | 
| 1084 
0bcd71d2615a
change cx_array_reserve() and cx_array_copy() to accept width in bytes instead of bits
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 194 | if (width == 0 || width == sizeof(size_t)) { | 
| 999 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 195 | *(size_t*) capacity = newcap; | 
| 1084 
0bcd71d2615a
change cx_array_reserve() and cx_array_copy() to accept width in bytes instead of bits
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 196 | } else if (width == sizeof(uint16_t)) { | 
| 1019 
09c6fe8fe3b9
add explicit casts to silence warnings
 Mike Becker <universe@uap-core.de> parents: 
1018diff
changeset | 197 | *(uint16_t*) capacity = (uint16_t) newcap; | 
| 1084 
0bcd71d2615a
change cx_array_reserve() and cx_array_copy() to accept width in bytes instead of bits
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 198 | } else if (width == sizeof(uint8_t)) { | 
| 1019 
09c6fe8fe3b9
add explicit casts to silence warnings
 Mike Becker <universe@uap-core.de> parents: 
1018diff
changeset | 199 | *(uint8_t*) capacity = (uint8_t) newcap; | 
| 999 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 200 | } | 
| 1018 
c773da859bad
fix compilation for compilers which don't set __WORDSIZE
 Mike Becker <universe@uap-core.de> parents: 
999diff
changeset | 201 | #if CX_WORDSIZE == 64 | 
| 1084 
0bcd71d2615a
change cx_array_reserve() and cx_array_copy() to accept width in bytes instead of bits
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 202 | else if (width == sizeof(uint32_t)) { | 
| 1019 
09c6fe8fe3b9
add explicit casts to silence warnings
 Mike Becker <universe@uap-core.de> parents: 
1018diff
changeset | 203 | *(uint32_t*) capacity = (uint32_t) newcap; | 
| 999 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 204 | } | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 205 | #endif | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 206 | } | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 207 | |
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 208 | return 0; | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 209 | } | 
| 
84fc42b04d3b
add cx_array_reserve() and several more array convenience functions
 Mike Becker <universe@uap-core.de> parents: 
998diff
changeset | 210 | |
| 986 
38fa7e41194c
simplify cx_array_copy() - fixes #474
 Mike Becker <universe@uap-core.de> parents: 
985diff
changeset | 211 | int cx_array_copy( | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 212 | void **target, | 
| 998 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 213 | void *size, | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 214 | void *capacity, | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 215 | unsigned width, | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 216 | size_t index, | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 217 | const void *src, | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 218 | size_t elem_size, | 
| 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 219 | size_t elem_count, | 
| 953 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 220 | CxArrayReallocator *reallocator | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 221 | ) { | 
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 222 | // assert pointers | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 223 | assert(target != NULL); | 
| 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 224 | assert(size != NULL); | 
| 986 
38fa7e41194c
simplify cx_array_copy() - fixes #474
 Mike Becker <universe@uap-core.de> parents: 
985diff
changeset | 225 | assert(capacity != NULL); | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 226 | assert(src != NULL); | 
| 1089 
865c84fef6b4
refine docs for array_list.h - issue #548
 Mike Becker <universe@uap-core.de> parents: 
1084diff
changeset | 227 | |
| 
865c84fef6b4
refine docs for array_list.h - issue #548
 Mike Becker <universe@uap-core.de> parents: 
1084diff
changeset | 228 | // default reallocator | 
| 
865c84fef6b4
refine docs for array_list.h - issue #548
 Mike Becker <universe@uap-core.de> parents: 
1084diff
changeset | 229 | if (reallocator == NULL) { | 
| 
865c84fef6b4
refine docs for array_list.h - issue #548
 Mike Becker <universe@uap-core.de> parents: 
1084diff
changeset | 230 | reallocator = cx_array_default_reallocator; | 
| 
865c84fef6b4
refine docs for array_list.h - issue #548
 Mike Becker <universe@uap-core.de> parents: 
1084diff
changeset | 231 | } | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 232 | |
| 998 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 233 | // determine size and capacity | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 234 | size_t oldcap; | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 235 | size_t oldsize; | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 236 | size_t max_size; | 
| 1084 
0bcd71d2615a
change cx_array_reserve() and cx_array_copy() to accept width in bytes instead of bits
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 237 | if (width == 0 || width == sizeof(size_t)) { | 
| 998 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 238 | oldcap = *(size_t*) capacity; | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 239 | oldsize = *(size_t*) size; | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 240 | max_size = SIZE_MAX; | 
| 1084 
0bcd71d2615a
change cx_array_reserve() and cx_array_copy() to accept width in bytes instead of bits
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 241 | } else if (width == sizeof(uint16_t)) { | 
| 998 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 242 | oldcap = *(uint16_t*) capacity; | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 243 | oldsize = *(uint16_t*) size; | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 244 | max_size = UINT16_MAX; | 
| 1084 
0bcd71d2615a
change cx_array_reserve() and cx_array_copy() to accept width in bytes instead of bits
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 245 | } else if (width == sizeof(uint8_t)) { | 
| 998 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 246 | oldcap = *(uint8_t*) capacity; | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 247 | oldsize = *(uint8_t*) size; | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 248 | max_size = UINT8_MAX; | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 249 | } | 
| 1018 
c773da859bad
fix compilation for compilers which don't set __WORDSIZE
 Mike Becker <universe@uap-core.de> parents: 
999diff
changeset | 250 | #if CX_WORDSIZE == 64 | 
| 1084 
0bcd71d2615a
change cx_array_reserve() and cx_array_copy() to accept width in bytes instead of bits
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 251 | else if (width == sizeof(uint32_t)) { | 
| 998 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 252 | oldcap = *(uint32_t*) capacity; | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 253 | oldsize = *(uint32_t*) size; | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 254 | max_size = UINT32_MAX; | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 255 | } | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 256 | #endif | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 257 | else { | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 258 | errno = EINVAL; | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 259 | return 1; | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 260 | } | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 261 | |
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 262 | // assert that the array is allocated when it has capacity | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 263 | assert(*target != NULL || oldcap == 0); | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 264 | |
| 1040 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 265 | // check for overflow | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 266 | if (index > max_size || elem_count > max_size - index) { | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 267 | errno = EOVERFLOW; | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 268 | return 1; | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 269 | } | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 270 | |
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 271 | // check if resize is required | 
| 627 
cc8cbabd27cd
fix cx_array_copy() unintentionally shrinking the array
 Mike Becker <universe@uap-core.de> parents: 
626diff
changeset | 272 | size_t minsize = index + elem_count; | 
| 998 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 273 | size_t newsize = oldsize < minsize ? minsize : oldsize; | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 274 | |
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 275 | // reallocate if possible | 
| 998 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 276 | size_t newcap = oldcap; | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 277 | if (newsize > oldcap) { | 
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 278 | // check, if we need to repair the src pointer | 
| 611 
77efa5163ae5
#219 array list: implement insert
 Mike Becker <universe@uap-core.de> parents: 
610diff
changeset | 279 | uintptr_t targetaddr = (uintptr_t) *target; | 
| 
77efa5163ae5
#219 array list: implement insert
 Mike Becker <universe@uap-core.de> parents: 
610diff
changeset | 280 | uintptr_t srcaddr = (uintptr_t) src; | 
| 
77efa5163ae5
#219 array list: implement insert
 Mike Becker <universe@uap-core.de> parents: 
610diff
changeset | 281 | bool repairsrc = targetaddr <= srcaddr | 
| 998 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 282 | && srcaddr < targetaddr + oldcap * elem_size; | 
| 611 
77efa5163ae5
#219 array list: implement insert
 Mike Becker <universe@uap-core.de> parents: 
610diff
changeset | 283 | |
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 284 | // calculate new capacity (next number divisible by 16) | 
| 1040 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 285 | newcap = cx_array_align_capacity(newsize, 16, max_size); | 
| 998 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 286 | assert(newcap > newsize); | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 287 | |
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 288 | // perform reallocation | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 289 | void *newmem = reallocator->realloc( | 
| 1322 
7be10b57f658
fix critical memory overflow in the stack-based array reallocator
 Mike Becker <universe@uap-core.de> parents: 
1319diff
changeset | 290 | *target, oldcap, newcap, elem_size, reallocator | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 291 | ); | 
| 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 292 | if (newmem == NULL) { | 
| 1423 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 293 | return 1; // LCOV_EXCL_LINE | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 294 | } | 
| 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 295 | |
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 296 | // repair src pointer, if necessary | 
| 611 
77efa5163ae5
#219 array list: implement insert
 Mike Becker <universe@uap-core.de> parents: 
610diff
changeset | 297 | if (repairsrc) { | 
| 
77efa5163ae5
#219 array list: implement insert
 Mike Becker <universe@uap-core.de> parents: 
610diff
changeset | 298 | src = ((char *) newmem) + (srcaddr - targetaddr); | 
| 
77efa5163ae5
#219 array list: implement insert
 Mike Becker <universe@uap-core.de> parents: 
610diff
changeset | 299 | } | 
| 
77efa5163ae5
#219 array list: implement insert
 Mike Becker <universe@uap-core.de> parents: 
610diff
changeset | 300 | |
| 998 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 301 | // store new pointer | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 302 | *target = newmem; | 
| 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 303 | } | 
| 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 304 | |
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 305 | // determine target pointer | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 306 | char *start = *target; | 
| 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 307 | start += index * elem_size; | 
| 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 308 | |
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 309 | // copy elements and set new size | 
| 1040 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 310 | // note: no overflow check here, b/c we cannot get here w/o allocation | 
| 611 
77efa5163ae5
#219 array list: implement insert
 Mike Becker <universe@uap-core.de> parents: 
610diff
changeset | 311 | memmove(start, src, elem_count * elem_size); | 
| 998 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 312 | |
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 313 | // if any of size or capacity changed, store them back | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 314 | if (newsize != oldsize || newcap != oldcap) { | 
| 1084 
0bcd71d2615a
change cx_array_reserve() and cx_array_copy() to accept width in bytes instead of bits
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 315 | if (width == 0 || width == sizeof(size_t)) { | 
| 998 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 316 | *(size_t*) capacity = newcap; | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 317 | *(size_t*) size = newsize; | 
| 1084 
0bcd71d2615a
change cx_array_reserve() and cx_array_copy() to accept width in bytes instead of bits
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 318 | } else if (width == sizeof(uint16_t)) { | 
| 1019 
09c6fe8fe3b9
add explicit casts to silence warnings
 Mike Becker <universe@uap-core.de> parents: 
1018diff
changeset | 319 | *(uint16_t*) capacity = (uint16_t) newcap; | 
| 
09c6fe8fe3b9
add explicit casts to silence warnings
 Mike Becker <universe@uap-core.de> parents: 
1018diff
changeset | 320 | *(uint16_t*) size = (uint16_t) newsize; | 
| 1084 
0bcd71d2615a
change cx_array_reserve() and cx_array_copy() to accept width in bytes instead of bits
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 321 | } else if (width == sizeof(uint8_t)) { | 
| 1019 
09c6fe8fe3b9
add explicit casts to silence warnings
 Mike Becker <universe@uap-core.de> parents: 
1018diff
changeset | 322 | *(uint8_t*) capacity = (uint8_t) newcap; | 
| 
09c6fe8fe3b9
add explicit casts to silence warnings
 Mike Becker <universe@uap-core.de> parents: 
1018diff
changeset | 323 | *(uint8_t*) size = (uint8_t) newsize; | 
| 998 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 324 | } | 
| 1018 
c773da859bad
fix compilation for compilers which don't set __WORDSIZE
 Mike Becker <universe@uap-core.de> parents: 
999diff
changeset | 325 | #if CX_WORDSIZE == 64 | 
| 1084 
0bcd71d2615a
change cx_array_reserve() and cx_array_copy() to accept width in bytes instead of bits
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 326 | else if (width == sizeof(uint32_t)) { | 
| 1019 
09c6fe8fe3b9
add explicit casts to silence warnings
 Mike Becker <universe@uap-core.de> parents: 
1018diff
changeset | 327 | *(uint32_t*) capacity = (uint32_t) newcap; | 
| 
09c6fe8fe3b9
add explicit casts to silence warnings
 Mike Becker <universe@uap-core.de> parents: 
1018diff
changeset | 328 | *(uint32_t*) size = (uint32_t) newsize; | 
| 998 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 329 | } | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 330 | #endif | 
| 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 331 | } | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 332 | |
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 333 | // return successfully | 
| 986 
38fa7e41194c
simplify cx_array_copy() - fixes #474
 Mike Becker <universe@uap-core.de> parents: 
985diff
changeset | 334 | return 0; | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 335 | } | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 336 | |
| 1419 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 337 | static int cx_array_insert_sorted_impl( | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 338 | void **target, | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 339 | size_t *size, | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 340 | size_t *capacity, | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 341 | cx_compare_func cmp_func, | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 342 | const void *sorted_data, | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 343 | size_t elem_size, | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 344 | size_t elem_count, | 
| 1419 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 345 | CxArrayReallocator *reallocator, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 346 | bool allow_duplicates | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 347 | ) { | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 348 | // assert pointers | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 349 | assert(target != NULL); | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 350 | assert(size != NULL); | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 351 | assert(capacity != NULL); | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 352 | assert(cmp_func != NULL); | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 353 | assert(sorted_data != NULL); | 
| 1089 
865c84fef6b4
refine docs for array_list.h - issue #548
 Mike Becker <universe@uap-core.de> parents: 
1084diff
changeset | 354 | |
| 
865c84fef6b4
refine docs for array_list.h - issue #548
 Mike Becker <universe@uap-core.de> parents: 
1084diff
changeset | 355 | // default reallocator | 
| 
865c84fef6b4
refine docs for array_list.h - issue #548
 Mike Becker <universe@uap-core.de> parents: 
1084diff
changeset | 356 | if (reallocator == NULL) { | 
| 
865c84fef6b4
refine docs for array_list.h - issue #548
 Mike Becker <universe@uap-core.de> parents: 
1084diff
changeset | 357 | reallocator = cx_array_default_reallocator; | 
| 
865c84fef6b4
refine docs for array_list.h - issue #548
 Mike Becker <universe@uap-core.de> parents: 
1084diff
changeset | 358 | } | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 359 | |
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 360 | // corner case | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 361 | if (elem_count == 0) return 0; | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 362 | |
| 1040 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 363 | // overflow check | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 364 | if (elem_count > SIZE_MAX - *size) { | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 365 | errno = EOVERFLOW; | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 366 | return 1; | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 367 | } | 
| 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 368 | |
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 369 | // store some counts | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 370 | size_t old_size = *size; | 
| 1322 
7be10b57f658
fix critical memory overflow in the stack-based array reallocator
 Mike Becker <universe@uap-core.de> parents: 
1319diff
changeset | 371 | size_t old_capacity = *capacity; | 
| 1419 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 372 | // the necessary capacity is the worst case assumption, including duplicates | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 373 | size_t needed_capacity = old_size + elem_count; | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 374 | |
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 375 | // if we need more than we have, try a reallocation | 
| 1322 
7be10b57f658
fix critical memory overflow in the stack-based array reallocator
 Mike Becker <universe@uap-core.de> parents: 
1319diff
changeset | 376 | if (needed_capacity > old_capacity) { | 
| 1040 
1ecf4dbbc60c
add some more overflow treatment and make sure to set errno properly
 Mike Becker <universe@uap-core.de> parents: 
1022diff
changeset | 377 | size_t new_capacity = cx_array_align_capacity(needed_capacity, 16, SIZE_MAX); | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 378 | void *new_mem = reallocator->realloc( | 
| 1322 
7be10b57f658
fix critical memory overflow in the stack-based array reallocator
 Mike Becker <universe@uap-core.de> parents: 
1319diff
changeset | 379 | *target, old_capacity, new_capacity, elem_size, reallocator | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 380 | ); | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 381 | if (new_mem == NULL) { | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 382 | // give it up right away, there is no contract | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 383 | // that requires us to insert as much as we can | 
| 1065 
6eb7b54975ee
improve coverage metrics
 Mike Becker <universe@uap-core.de> parents: 
1047diff
changeset | 384 | return 1; // LCOV_EXCL_LINE | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 385 | } | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 386 | *target = new_mem; | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 387 | *capacity = new_capacity; | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 388 | } | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 389 | |
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 390 | // now we have guaranteed that we can insert everything | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 391 | size_t new_size = old_size + elem_count; | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 392 | *size = new_size; | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 393 | |
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 394 | // declare the source and destination indices/pointers | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 395 | size_t si = 0, di = 0; | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 396 | const char *src = sorted_data; | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 397 | char *dest = *target; | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 398 | |
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 399 | // find the first insertion point | 
| 889 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 400 | di = cx_array_binary_search_sup(dest, old_size, elem_size, src, cmp_func); | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 401 | dest += di * elem_size; | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 402 | |
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 403 | // move the remaining elements in the array completely to the right | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 404 | // we will call it the "buffer" for parked elements | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 405 | size_t buf_size = old_size - di; | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 406 | size_t bi = new_size - buf_size; | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 407 | char *bptr = ((char *) *target) + bi * elem_size; | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 408 | memmove(bptr, dest, buf_size * elem_size); | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 409 | |
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 410 | // while there are both source and buffered elements left, | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 411 | // copy them interleaving | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 412 | while (si < elem_count && bi < new_size) { | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 413 | // determine how many source elements can be inserted | 
| 889 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 414 | size_t copy_len, bytes_copied; | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 415 | copy_len = cx_array_binary_search_sup( | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 416 | src, | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 417 | elem_count - si, | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 418 | elem_size, | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 419 | bptr, | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 420 | cmp_func | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 421 | ); | 
| 1423 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 422 | // binary search gives us the smallest index; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 423 | // we also want to include equal elements here | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 424 | while (si + copy_len < elem_count | 
| 1419 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 425 | && cmp_func(bptr, src+copy_len*elem_size) == 0) { | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 426 | copy_len++; | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 427 | } | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 428 | |
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 429 | // copy the source elements | 
| 1423 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 430 | if (copy_len > 0) { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 431 | if (allow_duplicates) { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 432 | // we can copy the entire chunk | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 433 | bytes_copied = copy_len * elem_size; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 434 | memcpy(dest, src, bytes_copied); | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 435 | dest += bytes_copied; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 436 | src += bytes_copied; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 437 | si += copy_len; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 438 | di += copy_len; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 439 | } else { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 440 | // first, check the end of the source chunk | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 441 | // for being a duplicate of the bptr | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 442 | const char *end_of_src = src + (copy_len - 1) * elem_size; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 443 | size_t skip_len = 0; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 444 | while (copy_len > 0 && cmp_func(bptr, end_of_src) == 0) { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 445 | end_of_src -= elem_size; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 446 | skip_len++; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 447 | copy_len--; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 448 | } | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 449 | char *last = dest == *target ? NULL : dest - elem_size; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 450 | // then iterate through the source chunk | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 451 | // and skip all duplicates with the last element in the array | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 452 | size_t more_skipped = 0; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 453 | for (unsigned j = 0; j < copy_len; j++) { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 454 | if (last != NULL && cmp_func(last, src) == 0) { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 455 | // duplicate - skip | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 456 | src += elem_size; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 457 | si++; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 458 | more_skipped++; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 459 | } else { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 460 | memcpy(dest, src, elem_size); | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 461 | src += elem_size; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 462 | last = dest; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 463 | dest += elem_size; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 464 | si++; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 465 | di++; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 466 | } | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 467 | } | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 468 | // skip the previously identified elements as well | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 469 | src += skip_len * elem_size; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 470 | si += skip_len; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 471 | skip_len += more_skipped; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 472 | // reduce the actual size by the number of skipped elements | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 473 | *size -= skip_len; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 474 | } | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 475 | } | 
| 889 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 476 | |
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 477 | // when all source elements are in place, we are done | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 478 | if (si >= elem_count) break; | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 479 | |
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 480 | // determine how many buffered elements need to be restored | 
| 889 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 481 | copy_len = cx_array_binary_search_sup( | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 482 | bptr, | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 483 | new_size - bi, | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 484 | elem_size, | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 485 | src, | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 486 | cmp_func | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 487 | ); | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 488 | |
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 489 | // restore the buffered elements | 
| 889 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 490 | bytes_copied = copy_len * elem_size; | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 491 | memmove(dest, bptr, bytes_copied); | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 492 | dest += bytes_copied; | 
| 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 493 | bptr += bytes_copied; | 
| 1419 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 494 | di += copy_len; | 
| 889 
f549fd9fbd8f
apply binary search in cx_array_insert_sorted()
 Mike Becker <universe@uap-core.de> parents: 
888diff
changeset | 495 | bi += copy_len; | 
| 1423 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 496 | } | 
| 1419 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 497 | |
| 1423 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 498 | // still source elements left? | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 499 | if (si < elem_count) { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 500 | if (allow_duplicates) { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 501 | // duplicates allowed or nothing inserted yet: simply copy everything | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 502 | memcpy(dest, src, elem_size * (elem_count - si)); | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 503 | } else { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 504 | if (dest != *target) { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 505 | // skip all source elements that equal the last element | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 506 | char *last = dest - elem_size; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 507 | while (si < elem_count) { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 508 | if (last != NULL && cmp_func(last, src) == 0) { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 509 | src += elem_size; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 510 | si++; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 511 | (*size)--; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 512 | } else { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 513 | break; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 514 | } | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 515 | } | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 516 | } | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 517 | // we must check the elements in the chunk one by one | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 518 | while (si < elem_count) { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 519 | // find a chain of elements that can be copied | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 520 | size_t copy_len = 1, skip_len = 0; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 521 | { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 522 | const char *left_src = src; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 523 | while (si + copy_len < elem_count) { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 524 | const char *right_src = left_src + elem_size; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 525 | int d = cmp_func(left_src, right_src); | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 526 | if (d < 0) { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 527 | if (skip_len > 0) { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 528 | // new larger element found; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 529 | // handle it in the next cycle | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 530 | break; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 531 | } | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 532 | left_src += elem_size; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 533 | copy_len++; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 534 | } else if (d == 0) { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 535 | left_src += elem_size; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 536 | skip_len++; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 537 | } else { | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 538 | break; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 539 | } | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 540 | } | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 541 | } | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 542 | size_t bytes_copied = copy_len * elem_size; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 543 | memcpy(dest, src, bytes_copied); | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 544 | dest += bytes_copied; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 545 | src += bytes_copied + skip_len * elem_size; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 546 | si += copy_len + skip_len; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 547 | di += copy_len; | 
| 
9a72258446cd
fixes various bugs related to skipping duplicates in insert_unique - relates to #557
 Mike Becker <universe@uap-core.de> parents: 
1419diff
changeset | 548 | *size -= skip_len; | 
| 1419 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 549 | } | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 550 | } | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 551 | } | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 552 | |
| 1419 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 553 | // buffered elements need to be moved when we skipped duplicates | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 554 | size_t total_skipped = new_size - *size; | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 555 | if (bi < new_size && total_skipped > 0) { | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 556 | // move the remaining buffer to the end of the array | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 557 | memmove(dest, bptr, elem_size * (new_size - bi)); | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 558 | } | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 559 | |
| 986 
38fa7e41194c
simplify cx_array_copy() - fixes #474
 Mike Becker <universe@uap-core.de> parents: 
985diff
changeset | 560 | return 0; | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 561 | } | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 562 | |
| 1419 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 563 | int cx_array_insert_sorted( | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 564 | void **target, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 565 | size_t *size, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 566 | size_t *capacity, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 567 | cx_compare_func cmp_func, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 568 | const void *sorted_data, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 569 | size_t elem_size, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 570 | size_t elem_count, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 571 | CxArrayReallocator *reallocator | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 572 | ) { | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 573 | return cx_array_insert_sorted_impl(target, size, capacity, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 574 | cmp_func, sorted_data, elem_size, elem_count, reallocator, true); | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 575 | } | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 576 | |
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 577 | int cx_array_insert_unique( | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 578 | void **target, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 579 | size_t *size, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 580 | size_t *capacity, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 581 | cx_compare_func cmp_func, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 582 | const void *sorted_data, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 583 | size_t elem_size, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 584 | size_t elem_count, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 585 | CxArrayReallocator *reallocator | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 586 | ) { | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 587 | return cx_array_insert_sorted_impl(target, size, capacity, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 588 | cmp_func, sorted_data, elem_size, elem_count, reallocator, false); | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 589 | } | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 590 | |
| 884 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 591 | size_t cx_array_binary_search_inf( | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 592 | const void *arr, | 
| 884 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 593 | size_t size, | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 594 | size_t elem_size, | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 595 | const void *elem, | 
| 884 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 596 | cx_compare_func cmp_func | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 597 | ) { | 
| 888 | 598 | // special case: empty array | 
| 599 | if (size == 0) return 0; | |
| 600 | ||
| 884 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 601 | // declare a variable that will contain the compare results | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 602 | int result; | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 603 | |
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 604 | // cast the array pointer to something we can use offsets with | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 605 | const char *array = arr; | 
| 884 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 606 | |
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 607 | // check the first array element | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 608 | result = cmp_func(elem, array); | 
| 885 
878a450e79bd
fixes incorrect result from cx_array_binary_search() when searched element is smaller than the entire array
 Mike Becker <universe@uap-core.de> parents: 
884diff
changeset | 609 | if (result < 0) { | 
| 
878a450e79bd
fixes incorrect result from cx_array_binary_search() when searched element is smaller than the entire array
 Mike Becker <universe@uap-core.de> parents: 
884diff
changeset | 610 | return size; | 
| 
878a450e79bd
fixes incorrect result from cx_array_binary_search() when searched element is smaller than the entire array
 Mike Becker <universe@uap-core.de> parents: 
884diff
changeset | 611 | } else if (result == 0) { | 
| 884 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 612 | return 0; | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 613 | } | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 614 | |
| 1022 
2911c1f4a570
add shortcut to binary search when array size is one
 Mike Becker <universe@uap-core.de> parents: 
1019diff
changeset | 615 | // special case: there is only one element and that is smaller | 
| 
2911c1f4a570
add shortcut to binary search when array size is one
 Mike Becker <universe@uap-core.de> parents: 
1019diff
changeset | 616 | if (size == 1) return 0; | 
| 
2911c1f4a570
add shortcut to binary search when array size is one
 Mike Becker <universe@uap-core.de> parents: 
1019diff
changeset | 617 | |
| 884 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 618 | // check the last array element | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 619 | result = cmp_func(elem, array + elem_size * (size - 1)); | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 620 | if (result >= 0) { | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 621 | return size - 1; | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 622 | } | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 623 | |
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 624 | // the element is now guaranteed to be somewhere in the list | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 625 | // so start the binary search | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 626 | size_t left_index = 1; | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 627 | size_t right_index = size - 1; | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 628 | size_t pivot_index; | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 629 | |
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 630 | while (left_index <= right_index) { | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 631 | pivot_index = left_index + (right_index - left_index) / 2; | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 632 | const char *arr_elem = array + pivot_index * elem_size; | 
| 884 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 633 | result = cmp_func(elem, arr_elem); | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 634 | if (result == 0) { | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 635 | // found it! | 
| 1419 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 636 | // check previous elements; | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 637 | // when they are equal, report the smallest index | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 638 | arr_elem -= elem_size; | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 639 | while (pivot_index > 0 && cmp_func(elem, arr_elem) == 0) { | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 640 | pivot_index--; | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 641 | arr_elem -= elem_size; | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 642 | } | 
| 884 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 643 | return pivot_index; | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 644 | } else if (result < 0) { | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 645 | // element is smaller than pivot, continue search left | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 646 | right_index = pivot_index - 1; | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 647 | } else { | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 648 | // element is larger than pivot, continue search right | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 649 | left_index = pivot_index + 1; | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 650 | } | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 651 | } | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 652 | |
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 653 | // report the largest upper bound | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 654 | return result < 0 ? (pivot_index - 1) : pivot_index; | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 655 | } | 
| 
d375d8056262
add cx_array_binary_search() - fixes #424
 Mike Becker <universe@uap-core.de> parents: 
883diff
changeset | 656 | |
| 985 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 657 | size_t cx_array_binary_search( | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 658 | const void *arr, | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 659 | size_t size, | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 660 | size_t elem_size, | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 661 | const void *elem, | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 662 | cx_compare_func cmp_func | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 663 | ) { | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 664 | size_t index = cx_array_binary_search_inf( | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 665 | arr, size, elem_size, elem, cmp_func | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 666 | ); | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 667 | if (index < size && | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 668 | cmp_func(((const char *) arr) + index * elem_size, elem) == 0) { | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 669 | return index; | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 670 | } else { | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 671 | return size; | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 672 | } | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 673 | } | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 674 | |
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 675 | size_t cx_array_binary_search_sup( | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 676 | const void *arr, | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 677 | size_t size, | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 678 | size_t elem_size, | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 679 | const void *elem, | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 680 | cx_compare_func cmp_func | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 681 | ) { | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 682 | size_t inf = cx_array_binary_search_inf( | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 683 | arr, size, elem_size, elem, cmp_func | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 684 | ); | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 685 | if (inf == size) { | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 686 | // no infimum means, first element is supremum | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 687 | return 0; | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 688 | } else if (cmp_func(((const char *) arr) + inf * elem_size, elem) == 0) { | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 689 | return inf; | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 690 | } else { | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 691 | return inf + 1; | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 692 | } | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 693 | } | 
| 
68754c7de906
major refactoring of attributes
 Mike Becker <universe@uap-core.de> parents: 
968diff
changeset | 694 | |
| 643 
5700ba9154ab
#228 make buffer sizes adjustable at compile time
 Mike Becker <universe@uap-core.de> parents: 
641diff
changeset | 695 | #ifndef CX_ARRAY_SWAP_SBO_SIZE | 
| 735 
b686d0c98c62
unify the list swap SBO sizes
 Mike Becker <universe@uap-core.de> parents: 
708diff
changeset | 696 | #define CX_ARRAY_SWAP_SBO_SIZE 128 | 
| 643 
5700ba9154ab
#228 make buffer sizes adjustable at compile time
 Mike Becker <universe@uap-core.de> parents: 
641diff
changeset | 697 | #endif | 
| 926 
8fdd8d78c14b
fix several survivors of east-const and some missing consts
 Mike Becker <universe@uap-core.de> parents: 
919diff
changeset | 698 | const unsigned cx_array_swap_sbo_size = CX_ARRAY_SWAP_SBO_SIZE; | 
| 804 
5136f2fc32ec
add CX_DISABLE_ARRAY_LIST_SWAP_SBO flag
 Mike Becker <universe@uap-core.de> parents: 
764diff
changeset | 699 | |
| 623 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 700 | void cx_array_swap( | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 701 | void *arr, | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 702 | size_t elem_size, | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 703 | size_t idx1, | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 704 | size_t idx2 | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 705 | ) { | 
| 660 | 706 | assert(arr != NULL); | 
| 707 | ||
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 708 | // short circuit | 
| 623 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 709 | if (idx1 == idx2) return; | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 710 | |
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 711 | char sbo_mem[CX_ARRAY_SWAP_SBO_SIZE]; | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 712 | void *tmp; | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 713 | |
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 714 | // decide if we can use the local buffer | 
| 807 
c8d692131b1e
remove flags to disable SBO in tests - fix #343 fix #358
 Mike Becker <universe@uap-core.de> parents: 
804diff
changeset | 715 | if (elem_size > CX_ARRAY_SWAP_SBO_SIZE) { | 
| 1319 
aa1f580f8f59
add convenience macros for using the default allocator - relates to #669
 Mike Becker <universe@uap-core.de> parents: 
1318diff
changeset | 716 | tmp = cxMallocDefault(elem_size); | 
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 717 | // we don't want to enforce error handling | 
| 623 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 718 | if (tmp == NULL) abort(); | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 719 | } else { | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 720 | tmp = sbo_mem; | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 721 | } | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 722 | |
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 723 | // calculate memory locations | 
| 623 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 724 | char *left = arr, *right = arr; | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 725 | left += idx1 * elem_size; | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 726 | right += idx2 * elem_size; | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 727 | |
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 728 | // three-way swap | 
| 623 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 729 | memcpy(tmp, left, elem_size); | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 730 | memcpy(left, right, elem_size); | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 731 | memcpy(right, tmp, elem_size); | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 732 | |
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 733 | // free dynamic memory, if it was needed | 
| 623 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 734 | if (tmp != sbo_mem) { | 
| 1319 
aa1f580f8f59
add convenience macros for using the default allocator - relates to #669
 Mike Becker <universe@uap-core.de> parents: 
1318diff
changeset | 735 | cxFreeDefault(tmp); | 
| 623 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 736 | } | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 737 | } | 
| 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 738 | |
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 739 | // HIGH LEVEL ARRAY LIST FUNCTIONS | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 740 | |
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 741 | typedef struct { | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 742 | struct cx_list_s base; | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 743 | void *data; | 
| 677 
b09aae58bba4
refactoring of collections to make use of destructors in map implementations
 Mike Becker <universe@uap-core.de> parents: 
676diff
changeset | 744 | size_t capacity; | 
| 953 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 745 | CxArrayReallocator reallocator; | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 746 | } cx_array_list; | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 747 | |
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 748 | static void cx_arl_destructor(struct cx_list_s *list) { | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 749 | cx_array_list *arl = (cx_array_list *) list; | 
| 708 
1caed6c9ba68
fix inconsistent destructor requirements for list and map classes
 Mike Becker <universe@uap-core.de> parents: 
699diff
changeset | 750 | |
| 
1caed6c9ba68
fix inconsistent destructor requirements for list and map classes
 Mike Becker <universe@uap-core.de> parents: 
699diff
changeset | 751 | char *ptr = arl->data; | 
| 
1caed6c9ba68
fix inconsistent destructor requirements for list and map classes
 Mike Becker <universe@uap-core.de> parents: 
699diff
changeset | 752 | |
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 753 | if (list->collection.simple_destructor) { | 
| 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 754 | for (size_t i = 0; i < list->collection.size; i++) { | 
| 708 
1caed6c9ba68
fix inconsistent destructor requirements for list and map classes
 Mike Becker <universe@uap-core.de> parents: 
699diff
changeset | 755 | cx_invoke_simple_destructor(list, ptr); | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 756 | ptr += list->collection.elem_size; | 
| 708 
1caed6c9ba68
fix inconsistent destructor requirements for list and map classes
 Mike Becker <universe@uap-core.de> parents: 
699diff
changeset | 757 | } | 
| 
1caed6c9ba68
fix inconsistent destructor requirements for list and map classes
 Mike Becker <universe@uap-core.de> parents: 
699diff
changeset | 758 | } | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 759 | if (list->collection.advanced_destructor) { | 
| 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 760 | for (size_t i = 0; i < list->collection.size; i++) { | 
| 708 
1caed6c9ba68
fix inconsistent destructor requirements for list and map classes
 Mike Becker <universe@uap-core.de> parents: 
699diff
changeset | 761 | cx_invoke_advanced_destructor(list, ptr); | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 762 | ptr += list->collection.elem_size; | 
| 708 
1caed6c9ba68
fix inconsistent destructor requirements for list and map classes
 Mike Becker <universe@uap-core.de> parents: 
699diff
changeset | 763 | } | 
| 
1caed6c9ba68
fix inconsistent destructor requirements for list and map classes
 Mike Becker <universe@uap-core.de> parents: 
699diff
changeset | 764 | } | 
| 
1caed6c9ba68
fix inconsistent destructor requirements for list and map classes
 Mike Becker <universe@uap-core.de> parents: 
699diff
changeset | 765 | |
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 766 | cxFree(list->collection.allocator, arl->data); | 
| 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 767 | cxFree(list->collection.allocator, list); | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 768 | } | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 769 | |
| 638 
eafb45eefc51
add cxListInsertArray() - fixes #224
 Mike Becker <universe@uap-core.de> parents: 
630diff
changeset | 770 | static size_t cx_arl_insert_array( | 
| 629 
6c81ee4f11ad
#224 add cxListAddArray()
 Mike Becker <universe@uap-core.de> parents: 
628diff
changeset | 771 | struct cx_list_s *list, | 
| 638 
eafb45eefc51
add cxListInsertArray() - fixes #224
 Mike Becker <universe@uap-core.de> parents: 
630diff
changeset | 772 | size_t index, | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 773 | const void *array, | 
| 629 
6c81ee4f11ad
#224 add cxListAddArray()
 Mike Becker <universe@uap-core.de> parents: 
628diff
changeset | 774 | size_t n | 
| 
6c81ee4f11ad
#224 add cxListAddArray()
 Mike Becker <universe@uap-core.de> parents: 
628diff
changeset | 775 | ) { | 
| 638 
eafb45eefc51
add cxListInsertArray() - fixes #224
 Mike Becker <universe@uap-core.de> parents: 
630diff
changeset | 776 | // out of bounds and special case check | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 777 | if (index > list->collection.size || n == 0) return 0; | 
| 638 
eafb45eefc51
add cxListInsertArray() - fixes #224
 Mike Becker <universe@uap-core.de> parents: 
630diff
changeset | 778 | |
| 
eafb45eefc51
add cxListInsertArray() - fixes #224
 Mike Becker <universe@uap-core.de> parents: 
630diff
changeset | 779 | // get a correctly typed pointer to the list | 
| 629 
6c81ee4f11ad
#224 add cxListAddArray()
 Mike Becker <universe@uap-core.de> parents: 
628diff
changeset | 780 | cx_array_list *arl = (cx_array_list *) list; | 
| 638 
eafb45eefc51
add cxListInsertArray() - fixes #224
 Mike Becker <universe@uap-core.de> parents: 
630diff
changeset | 781 | |
| 1316 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 782 | // guarantee enough capacity | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 783 | if (arl->capacity < list->collection.size + n) { | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 784 | size_t new_capacity = list->collection.size + n; | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 785 | new_capacity = new_capacity - (new_capacity % 16) + 16; | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 786 | if (cxReallocateArray( | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 787 | list->collection.allocator, | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 788 | &arl->data, new_capacity, | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 789 | list->collection.elem_size) | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 790 | ) { | 
| 638 
eafb45eefc51
add cxListInsertArray() - fixes #224
 Mike Becker <universe@uap-core.de> parents: 
630diff
changeset | 791 | return 0; | 
| 
eafb45eefc51
add cxListInsertArray() - fixes #224
 Mike Becker <universe@uap-core.de> parents: 
630diff
changeset | 792 | } | 
| 1316 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 793 | arl->capacity = new_capacity; | 
| 638 
eafb45eefc51
add cxListInsertArray() - fixes #224
 Mike Becker <universe@uap-core.de> parents: 
630diff
changeset | 794 | } | 
| 
eafb45eefc51
add cxListInsertArray() - fixes #224
 Mike Becker <universe@uap-core.de> parents: 
630diff
changeset | 795 | |
| 1316 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 796 | // determine insert position | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 797 | char *arl_data = arl->data; | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 798 | char *insert_pos = arl_data + index * list->collection.elem_size; | 
| 638 
eafb45eefc51
add cxListInsertArray() - fixes #224
 Mike Becker <universe@uap-core.de> parents: 
630diff
changeset | 799 | |
| 1316 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 800 | // do we need to move some elements? | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 801 | if (index < list->collection.size) { | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 802 | size_t elems_to_move = list->collection.size - index; | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 803 | char *target = insert_pos + n * list->collection.elem_size; | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 804 | memmove(target, insert_pos, elems_to_move * list->collection.elem_size); | 
| 629 
6c81ee4f11ad
#224 add cxListAddArray()
 Mike Becker <universe@uap-core.de> parents: 
628diff
changeset | 805 | } | 
| 1316 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 806 | |
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 807 | // place the new elements, if any | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 808 | if (array != NULL) { | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 809 | memcpy(insert_pos, array, n * list->collection.elem_size); | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 810 | } | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 811 | list->collection.size += n; | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 812 | |
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 813 | return n; | 
| 629 
6c81ee4f11ad
#224 add cxListAddArray()
 Mike Becker <universe@uap-core.de> parents: 
628diff
changeset | 814 | } | 
| 
6c81ee4f11ad
#224 add cxListAddArray()
 Mike Becker <universe@uap-core.de> parents: 
628diff
changeset | 815 | |
| 881 
1dbbf8c1c42f
add optimized implementation of insert_sorted for array lists
 Mike Becker <universe@uap-core.de> parents: 
876diff
changeset | 816 | static size_t cx_arl_insert_sorted( | 
| 
1dbbf8c1c42f
add optimized implementation of insert_sorted for array lists
 Mike Becker <universe@uap-core.de> parents: 
876diff
changeset | 817 | struct cx_list_s *list, | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 818 | const void *sorted_data, | 
| 881 
1dbbf8c1c42f
add optimized implementation of insert_sorted for array lists
 Mike Becker <universe@uap-core.de> parents: 
876diff
changeset | 819 | size_t n | 
| 
1dbbf8c1c42f
add optimized implementation of insert_sorted for array lists
 Mike Becker <universe@uap-core.de> parents: 
876diff
changeset | 820 | ) { | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 821 | // get a correctly typed pointer to the list | 
| 881 
1dbbf8c1c42f
add optimized implementation of insert_sorted for array lists
 Mike Becker <universe@uap-core.de> parents: 
876diff
changeset | 822 | cx_array_list *arl = (cx_array_list *) list; | 
| 
1dbbf8c1c42f
add optimized implementation of insert_sorted for array lists
 Mike Becker <universe@uap-core.de> parents: 
876diff
changeset | 823 | |
| 986 
38fa7e41194c
simplify cx_array_copy() - fixes #474
 Mike Becker <universe@uap-core.de> parents: 
985diff
changeset | 824 | if (cx_array_insert_sorted( | 
| 883 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 825 | &arl->data, | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 826 | &list->collection.size, | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 827 | &arl->capacity, | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 828 | list->collection.cmpfunc, | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 829 | sorted_data, | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 830 | list->collection.elem_size, | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 831 | n, | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 832 | &arl->reallocator | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 833 | )) { | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 834 | // array list implementation is "all or nothing" | 
| 
3012e9b4214e
add low level cx_array_insert_sorted() and convenience macros
 Mike Becker <universe@uap-core.de> parents: 
881diff
changeset | 835 | return 0; | 
| 986 
38fa7e41194c
simplify cx_array_copy() - fixes #474
 Mike Becker <universe@uap-core.de> parents: 
985diff
changeset | 836 | } else { | 
| 
38fa7e41194c
simplify cx_array_copy() - fixes #474
 Mike Becker <universe@uap-core.de> parents: 
985diff
changeset | 837 | return n; | 
| 881 
1dbbf8c1c42f
add optimized implementation of insert_sorted for array lists
 Mike Becker <universe@uap-core.de> parents: 
876diff
changeset | 838 | } | 
| 
1dbbf8c1c42f
add optimized implementation of insert_sorted for array lists
 Mike Becker <universe@uap-core.de> parents: 
876diff
changeset | 839 | } | 
| 
1dbbf8c1c42f
add optimized implementation of insert_sorted for array lists
 Mike Becker <universe@uap-core.de> parents: 
876diff
changeset | 840 | |
| 1419 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 841 | static size_t cx_arl_insert_unique( | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 842 | struct cx_list_s *list, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 843 | const void *sorted_data, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 844 | size_t n | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 845 | ) { | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 846 | // get a correctly typed pointer to the list | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 847 | cx_array_list *arl = (cx_array_list *) list; | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 848 | |
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 849 | if (cx_array_insert_unique( | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 850 | &arl->data, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 851 | &list->collection.size, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 852 | &arl->capacity, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 853 | list->collection.cmpfunc, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 854 | sorted_data, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 855 | list->collection.elem_size, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 856 | n, | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 857 | &arl->reallocator | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 858 | )) { | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 859 | // array list implementation is "all or nothing" | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 860 | return 0; | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 861 | } else { | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 862 | return n; | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 863 | } | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 864 | } | 
| 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 865 | |
| 1316 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 866 | static void *cx_arl_insert_element( | 
| 641 
d402fead3386
add new pointer list wrapper - resolves #234
 Mike Becker <universe@uap-core.de> parents: 
640diff
changeset | 867 | struct cx_list_s *list, | 
| 
d402fead3386
add new pointer list wrapper - resolves #234
 Mike Becker <universe@uap-core.de> parents: 
640diff
changeset | 868 | size_t index, | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 869 | const void *element | 
| 641 
d402fead3386
add new pointer list wrapper - resolves #234
 Mike Becker <universe@uap-core.de> parents: 
640diff
changeset | 870 | ) { | 
| 1316 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 871 | if (cx_arl_insert_array(list, index, element, 1) == 1) { | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 872 | return ((char*)((cx_array_list *) list)->data) + index * list->collection.elem_size; | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 873 | } else { | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 874 | return NULL; | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 875 | } | 
| 641 
d402fead3386
add new pointer list wrapper - resolves #234
 Mike Becker <universe@uap-core.de> parents: 
640diff
changeset | 876 | } | 
| 
d402fead3386
add new pointer list wrapper - resolves #234
 Mike Becker <universe@uap-core.de> parents: 
640diff
changeset | 877 | |
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 878 | static int cx_arl_insert_iter( | 
| 853 
d4baf4dd55c3
simplify iterator structures
 Mike Becker <universe@uap-core.de> parents: 
850diff
changeset | 879 | struct cx_iterator_s *iter, | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 880 | const void *elem, | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 881 | int prepend | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 882 | ) { | 
| 1429 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 Mike Becker <universe@uap-core.de> parents: 
1425diff
changeset | 883 | struct cx_list_s *list = iter->src_handle; | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 884 | if (iter->index < list->collection.size) { | 
| 1316 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 885 | if (cx_arl_insert_element(list, | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 886 | iter->index + 1 - prepend, elem) == NULL) { | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 887 | return 1; | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 888 | } | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 889 | iter->elem_count++; | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 890 | if (prepend != 0) { | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 891 | iter->index++; | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 892 | iter->elem_handle = ((char *) iter->elem_handle) + list->collection.elem_size; | 
| 619 
5e58187ac707
#219 array list: implement insert via iterator
 Mike Becker <universe@uap-core.de> parents: 
616diff
changeset | 893 | } | 
| 1316 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 894 | return 0; | 
| 619 
5e58187ac707
#219 array list: implement insert via iterator
 Mike Becker <universe@uap-core.de> parents: 
616diff
changeset | 895 | } else { | 
| 1316 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 896 | if (cx_arl_insert_element(list, list->collection.size, elem) == NULL) { | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 897 | return 1; | 
| 874 
cdce47f34d48
fix inserting via iterator correctly increases element count
 Mike Becker <universe@uap-core.de> parents: 
856diff
changeset | 898 | } | 
| 1316 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 899 | iter->elem_count++; | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 900 | iter->index = list->collection.size; | 
| 
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
 Mike Becker <universe@uap-core.de> parents: 
1163diff
changeset | 901 | return 0; | 
| 619 
5e58187ac707
#219 array list: implement insert via iterator
 Mike Becker <universe@uap-core.de> parents: 
616diff
changeset | 902 | } | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 903 | } | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 904 | |
| 919 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 905 | static size_t cx_arl_remove( | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 906 | struct cx_list_s *list, | 
| 919 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 907 | size_t index, | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 908 | size_t num, | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 909 | void *targetbuf | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 910 | ) { | 
| 664 
af5bf4603a5d
add cxListClear and fix missing destructor invocations - #241 #246
 Mike Becker <universe@uap-core.de> parents: 
662diff
changeset | 911 | cx_array_list *arl = (cx_array_list *) list; | 
| 
af5bf4603a5d
add cxListClear and fix missing destructor invocations - #241 #246
 Mike Becker <universe@uap-core.de> parents: 
662diff
changeset | 912 | |
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 913 | // out-of-bounds check | 
| 919 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 914 | size_t remove; | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 915 | if (index >= list->collection.size) { | 
| 919 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 916 | remove = 0; | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 917 | } else if (index + num > list->collection.size) { | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 918 | remove = list->collection.size - index; | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 919 | } else { | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 920 | remove = num; | 
| 613 
85c08391a090
#219 array list: implement remove
 Mike Becker <universe@uap-core.de> parents: 
612diff
changeset | 921 | } | 
| 
85c08391a090
#219 array list: implement remove
 Mike Becker <universe@uap-core.de> parents: 
612diff
changeset | 922 | |
| 919 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 923 | // easy exit | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 924 | if (remove == 0) return 0; | 
| 664 
af5bf4603a5d
add cxListClear and fix missing destructor invocations - #241 #246
 Mike Becker <universe@uap-core.de> parents: 
662diff
changeset | 925 | |
| 919 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 926 | // destroy or copy contents | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 927 | if (targetbuf == NULL) { | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 928 | for (size_t idx = index; idx < index + remove; idx++) { | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 929 | cx_invoke_destructor( | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 930 | list, | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 931 | ((char *) arl->data) + idx * list->collection.elem_size | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 932 | ); | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 933 | } | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 934 | } else { | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 935 | memcpy( | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 936 | targetbuf, | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 937 | ((char *) arl->data) + index * list->collection.elem_size, | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 938 | remove * list->collection.elem_size | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 939 | ); | 
| 624 
b0bdff7d8203
#219: cx_arl_remove short-circuit for last element
 Mike Becker <universe@uap-core.de> parents: 
623diff
changeset | 940 | } | 
| 613 
85c08391a090
#219 array list: implement remove
 Mike Becker <universe@uap-core.de> parents: 
612diff
changeset | 941 | |
| 919 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 942 | // short-circuit removal of last elements | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 943 | if (index + remove == list->collection.size) { | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 944 | list->collection.size -= remove; | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 945 | return remove; | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 946 | } | 
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 947 | |
| 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 948 | // just move the elements to the left | 
| 1065 
6eb7b54975ee
improve coverage metrics
 Mike Becker <universe@uap-core.de> parents: 
1047diff
changeset | 949 | cx_array_copy( | 
| 613 
85c08391a090
#219 array list: implement remove
 Mike Becker <universe@uap-core.de> parents: 
612diff
changeset | 950 | &arl->data, | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 951 | &list->collection.size, | 
| 677 
b09aae58bba4
refactoring of collections to make use of destructors in map implementations
 Mike Becker <universe@uap-core.de> parents: 
676diff
changeset | 952 | &arl->capacity, | 
| 998 
bb196054f3fd
make cx_array_copy() support different types for size/capacity - fixes #492
 Mike Becker <universe@uap-core.de> parents: 
995diff
changeset | 953 | 0, | 
| 613 
85c08391a090
#219 array list: implement remove
 Mike Becker <universe@uap-core.de> parents: 
612diff
changeset | 954 | index, | 
| 919 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 955 | ((char *) arl->data) + (index + remove) * list->collection.elem_size, | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 956 | list->collection.elem_size, | 
| 919 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 957 | list->collection.size - index - remove, | 
| 613 
85c08391a090
#219 array list: implement remove
 Mike Becker <universe@uap-core.de> parents: 
612diff
changeset | 958 | &arl->reallocator | 
| 
85c08391a090
#219 array list: implement remove
 Mike Becker <universe@uap-core.de> parents: 
612diff
changeset | 959 | ); | 
| 820 
8b86ee2e09bb
remove check that is always true in cx_arl_remove()
 Mike Becker <universe@uap-core.de> parents: 
819diff
changeset | 960 | |
| 
8b86ee2e09bb
remove check that is always true in cx_arl_remove()
 Mike Becker <universe@uap-core.de> parents: 
819diff
changeset | 961 | // decrease the size | 
| 919 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 962 | list->collection.size -= remove; | 
| 820 
8b86ee2e09bb
remove check that is always true in cx_arl_remove()
 Mike Becker <universe@uap-core.de> parents: 
819diff
changeset | 963 | |
| 919 
75da57d4634e
add possibility to remove arrays of data and retrieve removed data
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 964 | return remove; | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 965 | } | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 966 | |
| 664 
af5bf4603a5d
add cxListClear and fix missing destructor invocations - #241 #246
 Mike Becker <universe@uap-core.de> parents: 
662diff
changeset | 967 | static void cx_arl_clear(struct cx_list_s *list) { | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 968 | if (list->collection.size == 0) return; | 
| 664 
af5bf4603a5d
add cxListClear and fix missing destructor invocations - #241 #246
 Mike Becker <universe@uap-core.de> parents: 
662diff
changeset | 969 | |
| 
af5bf4603a5d
add cxListClear and fix missing destructor invocations - #241 #246
 Mike Becker <universe@uap-core.de> parents: 
662diff
changeset | 970 | cx_array_list *arl = (cx_array_list *) list; | 
| 
af5bf4603a5d
add cxListClear and fix missing destructor invocations - #241 #246
 Mike Becker <universe@uap-core.de> parents: 
662diff
changeset | 971 | char *ptr = arl->data; | 
| 
af5bf4603a5d
add cxListClear and fix missing destructor invocations - #241 #246
 Mike Becker <universe@uap-core.de> parents: 
662diff
changeset | 972 | |
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 973 | if (list->collection.simple_destructor) { | 
| 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 974 | for (size_t i = 0; i < list->collection.size; i++) { | 
| 677 
b09aae58bba4
refactoring of collections to make use of destructors in map implementations
 Mike Becker <universe@uap-core.de> parents: 
676diff
changeset | 975 | cx_invoke_simple_destructor(list, ptr); | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 976 | ptr += list->collection.elem_size; | 
| 664 
af5bf4603a5d
add cxListClear and fix missing destructor invocations - #241 #246
 Mike Becker <universe@uap-core.de> parents: 
662diff
changeset | 977 | } | 
| 677 
b09aae58bba4
refactoring of collections to make use of destructors in map implementations
 Mike Becker <universe@uap-core.de> parents: 
676diff
changeset | 978 | } | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 979 | if (list->collection.advanced_destructor) { | 
| 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 980 | for (size_t i = 0; i < list->collection.size; i++) { | 
| 677 
b09aae58bba4
refactoring of collections to make use of destructors in map implementations
 Mike Becker <universe@uap-core.de> parents: 
676diff
changeset | 981 | cx_invoke_advanced_destructor(list, ptr); | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 982 | ptr += list->collection.elem_size; | 
| 664 
af5bf4603a5d
add cxListClear and fix missing destructor invocations - #241 #246
 Mike Becker <universe@uap-core.de> parents: 
662diff
changeset | 983 | } | 
| 
af5bf4603a5d
add cxListClear and fix missing destructor invocations - #241 #246
 Mike Becker <universe@uap-core.de> parents: 
662diff
changeset | 984 | } | 
| 666 
b5dd654deb3b
add unit test for cxListClear + fix destructor functions not always invoked with the correct pointer
 Mike Becker <universe@uap-core.de> parents: 
664diff
changeset | 985 | |
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 986 | memset(arl->data, 0, list->collection.size * list->collection.elem_size); | 
| 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 987 | list->collection.size = 0; | 
| 664 
af5bf4603a5d
add cxListClear and fix missing destructor invocations - #241 #246
 Mike Becker <universe@uap-core.de> parents: 
662diff
changeset | 988 | } | 
| 
af5bf4603a5d
add cxListClear and fix missing destructor invocations - #241 #246
 Mike Becker <universe@uap-core.de> parents: 
662diff
changeset | 989 | |
| 647 
2e6e9d9f2159
implement swap function for list elements - fixes #218
 Mike Becker <universe@uap-core.de> parents: 
643diff
changeset | 990 | static int cx_arl_swap( | 
| 
2e6e9d9f2159
implement swap function for list elements - fixes #218
 Mike Becker <universe@uap-core.de> parents: 
643diff
changeset | 991 | struct cx_list_s *list, | 
| 
2e6e9d9f2159
implement swap function for list elements - fixes #218
 Mike Becker <universe@uap-core.de> parents: 
643diff
changeset | 992 | size_t i, | 
| 
2e6e9d9f2159
implement swap function for list elements - fixes #218
 Mike Becker <universe@uap-core.de> parents: 
643diff
changeset | 993 | size_t j | 
| 
2e6e9d9f2159
implement swap function for list elements - fixes #218
 Mike Becker <universe@uap-core.de> parents: 
643diff
changeset | 994 | ) { | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 995 | if (i >= list->collection.size || j >= list->collection.size) return 1; | 
| 647 
2e6e9d9f2159
implement swap function for list elements - fixes #218
 Mike Becker <universe@uap-core.de> parents: 
643diff
changeset | 996 | cx_array_list *arl = (cx_array_list *) list; | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 997 | cx_array_swap(arl->data, list->collection.elem_size, i, j); | 
| 647 
2e6e9d9f2159
implement swap function for list elements - fixes #218
 Mike Becker <universe@uap-core.de> parents: 
643diff
changeset | 998 | return 0; | 
| 
2e6e9d9f2159
implement swap function for list elements - fixes #218
 Mike Becker <universe@uap-core.de> parents: 
643diff
changeset | 999 | } | 
| 
2e6e9d9f2159
implement swap function for list elements - fixes #218
 Mike Becker <universe@uap-core.de> parents: 
643diff
changeset | 1000 | |
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 1001 | static void *cx_arl_at( | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 1002 | const struct cx_list_s *list, | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1003 | size_t index | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1004 | ) { | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1005 | if (index < list->collection.size) { | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 1006 | const cx_array_list *arl = (const cx_array_list *) list; | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 1007 | char *space = arl->data; | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1008 | return space + index * list->collection.elem_size; | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 1009 | } else { | 
| 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 1010 | return NULL; | 
| 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 1011 | } | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1012 | } | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1013 | |
| 1162 
e3bb67b72d33
remove dependency to ssize_t - fixes #552
 Mike Becker <universe@uap-core.de> parents: 
1111diff
changeset | 1014 | static size_t cx_arl_find_remove( | 
| 764 
ccbdbd088455
add cxListFindRemove and cx_linked_list_find_node
 Mike Becker <universe@uap-core.de> parents: 
763diff
changeset | 1015 | struct cx_list_s *list, | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 1016 | const void *elem, | 
| 764 
ccbdbd088455
add cxListFindRemove and cx_linked_list_find_node
 Mike Becker <universe@uap-core.de> parents: 
763diff
changeset | 1017 | bool remove | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1018 | ) { | 
| 1163 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1019 | assert(list != NULL); | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1020 | assert(list->collection.cmpfunc != NULL); | 
| 1163 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1021 | if (list->collection.size == 0) return 0; | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 1022 | char *cur = ((const cx_array_list *) list)->data; | 
| 614 
7aaec630cf15
#219 array list: implement find
 Mike Becker <universe@uap-core.de> parents: 
613diff
changeset | 1023 | |
| 1163 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1024 | // optimize with binary search, when sorted | 
| 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1025 | if (list->collection.sorted) { | 
| 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1026 | size_t i = cx_array_binary_search( | 
| 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1027 | cur, | 
| 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1028 | list->collection.size, | 
| 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1029 | list->collection.elem_size, | 
| 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1030 | elem, | 
| 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1031 | list->collection.cmpfunc | 
| 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1032 | ); | 
| 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1033 | if (remove && i < list->collection.size) { | 
| 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1034 | cx_arl_remove(list, i, 1, NULL); | 
| 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1035 | } | 
| 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1036 | return i; | 
| 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1037 | } | 
| 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1038 | |
| 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1039 | // fallback: linear search | 
| 1162 
e3bb67b72d33
remove dependency to ssize_t - fixes #552
 Mike Becker <universe@uap-core.de> parents: 
1111diff
changeset | 1040 | for (size_t i = 0; i < list->collection.size; i++) { | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1041 | if (0 == list->collection.cmpfunc(elem, cur)) { | 
| 764 
ccbdbd088455
add cxListFindRemove and cx_linked_list_find_node
 Mike Becker <universe@uap-core.de> parents: 
763diff
changeset | 1042 | if (remove) { | 
| 1163 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1043 | cx_arl_remove(list, i, 1, NULL); | 
| 764 
ccbdbd088455
add cxListFindRemove and cx_linked_list_find_node
 Mike Becker <universe@uap-core.de> parents: 
763diff
changeset | 1044 | } | 
| 1163 
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
 Mike Becker <universe@uap-core.de> parents: 
1162diff
changeset | 1045 | return i; | 
| 614 
7aaec630cf15
#219 array list: implement find
 Mike Becker <universe@uap-core.de> parents: 
613diff
changeset | 1046 | } | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1047 | cur += list->collection.elem_size; | 
| 614 
7aaec630cf15
#219 array list: implement find
 Mike Becker <universe@uap-core.de> parents: 
613diff
changeset | 1048 | } | 
| 1162 
e3bb67b72d33
remove dependency to ssize_t - fixes #552
 Mike Becker <universe@uap-core.de> parents: 
1111diff
changeset | 1049 | return list->collection.size; | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1050 | } | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1051 | |
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1052 | static void cx_arl_sort(struct cx_list_s *list) { | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1053 | assert(list->collection.cmpfunc != NULL); | 
| 615 
b52b66dcd44b
#219 array list: implement sort
 Mike Becker <universe@uap-core.de> parents: 
614diff
changeset | 1054 | qsort(((cx_array_list *) list)->data, | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1055 | list->collection.size, | 
| 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1056 | list->collection.elem_size, | 
| 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1057 | list->collection.cmpfunc | 
| 615 
b52b66dcd44b
#219 array list: implement sort
 Mike Becker <universe@uap-core.de> parents: 
614diff
changeset | 1058 | ); | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1059 | } | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1060 | |
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1061 | static int cx_arl_compare( | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 1062 | const struct cx_list_s *list, | 
| 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 1063 | const struct cx_list_s *other | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1064 | ) { | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1065 | assert(list->collection.cmpfunc != NULL); | 
| 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1066 | if (list->collection.size == other->collection.size) { | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 1067 | const char *left = ((const cx_array_list *) list)->data; | 
| 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 1068 | const char *right = ((const cx_array_list *) other)->data; | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1069 | for (size_t i = 0; i < list->collection.size; i++) { | 
| 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1070 | int d = list->collection.cmpfunc(left, right); | 
| 622 
3d93cd78aa20
#219 array list: implement compare member func
 Mike Becker <universe@uap-core.de> parents: 
620diff
changeset | 1071 | if (d != 0) { | 
| 
3d93cd78aa20
#219 array list: implement compare member func
 Mike Becker <universe@uap-core.de> parents: 
620diff
changeset | 1072 | return d; | 
| 
3d93cd78aa20
#219 array list: implement compare member func
 Mike Becker <universe@uap-core.de> parents: 
620diff
changeset | 1073 | } | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1074 | left += list->collection.elem_size; | 
| 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1075 | right += other->collection.elem_size; | 
| 622 
3d93cd78aa20
#219 array list: implement compare member func
 Mike Becker <universe@uap-core.de> parents: 
620diff
changeset | 1076 | } | 
| 
3d93cd78aa20
#219 array list: implement compare member func
 Mike Becker <universe@uap-core.de> parents: 
620diff
changeset | 1077 | return 0; | 
| 
3d93cd78aa20
#219 array list: implement compare member func
 Mike Becker <universe@uap-core.de> parents: 
620diff
changeset | 1078 | } else { | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1079 | return list->collection.size < other->collection.size ? -1 : 1; | 
| 622 
3d93cd78aa20
#219 array list: implement compare member func
 Mike Becker <universe@uap-core.de> parents: 
620diff
changeset | 1080 | } | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1081 | } | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1082 | |
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1083 | static void cx_arl_reverse(struct cx_list_s *list) { | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1084 | if (list->collection.size < 2) return; | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 1085 | void *data = ((const cx_array_list *) list)->data; | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1086 | size_t half = list->collection.size / 2; | 
| 623 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 1087 | for (size_t i = 0; i < half; i++) { | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1088 | cx_array_swap(data, list->collection.elem_size, i, list->collection.size - 1 - i); | 
| 623 
21082350a590
#219 array list: implement reverse
 Mike Becker <universe@uap-core.de> parents: 
622diff
changeset | 1089 | } | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1090 | } | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1091 | |
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 1092 | static bool cx_arl_iter_valid(const void *it) { | 
| 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 1093 | const struct cx_iterator_s *iter = it; | 
| 1429 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 Mike Becker <universe@uap-core.de> parents: 
1425diff
changeset | 1094 | const struct cx_list_s *list = iter->src_handle; | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1095 | return iter->index < list->collection.size; | 
| 616 
af7d8a29fbc5
#219 array list: add iterator
 Mike Becker <universe@uap-core.de> parents: 
615diff
changeset | 1096 | } | 
| 
af7d8a29fbc5
#219 array list: add iterator
 Mike Becker <universe@uap-core.de> parents: 
615diff
changeset | 1097 | |
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 1098 | static void *cx_arl_iter_current(const void *it) { | 
| 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 1099 | const struct cx_iterator_s *iter = it; | 
| 616 
af7d8a29fbc5
#219 array list: add iterator
 Mike Becker <universe@uap-core.de> parents: 
615diff
changeset | 1100 | return iter->elem_handle; | 
| 
af7d8a29fbc5
#219 array list: add iterator
 Mike Becker <universe@uap-core.de> parents: 
615diff
changeset | 1101 | } | 
| 
af7d8a29fbc5
#219 array list: add iterator
 Mike Becker <universe@uap-core.de> parents: 
615diff
changeset | 1102 | |
| 630 
ac5e7f789048
separate iterators and mutating iterators
 Mike Becker <universe@uap-core.de> parents: 
629diff
changeset | 1103 | static void cx_arl_iter_next(void *it) { | 
| 853 
d4baf4dd55c3
simplify iterator structures
 Mike Becker <universe@uap-core.de> parents: 
850diff
changeset | 1104 | struct cx_iterator_s *iter = it; | 
| 854 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 Mike Becker <universe@uap-core.de> parents: 
853diff
changeset | 1105 | if (iter->base.remove) { | 
| 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 Mike Becker <universe@uap-core.de> parents: 
853diff
changeset | 1106 | iter->base.remove = false; | 
| 1429 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 Mike Becker <universe@uap-core.de> parents: 
1425diff
changeset | 1107 | cx_arl_remove(iter->src_handle, iter->index, 1, NULL); | 
| 1387 
9bdd053820b7
the elem_count member of an iterator was not updated after removing an element flagged by cxIteratorFlagRemoval() - fixes #728
 Mike Becker <universe@uap-core.de> parents: 
1322diff
changeset | 1108 | iter->elem_count--; | 
| 616 
af7d8a29fbc5
#219 array list: add iterator
 Mike Becker <universe@uap-core.de> parents: 
615diff
changeset | 1109 | } else { | 
| 
af7d8a29fbc5
#219 array list: add iterator
 Mike Becker <universe@uap-core.de> parents: 
615diff
changeset | 1110 | iter->index++; | 
| 620 
f220695aded6
#219 improve cx_arl_iter_next
 Mike Becker <universe@uap-core.de> parents: 
619diff
changeset | 1111 | iter->elem_handle = | 
| 
f220695aded6
#219 improve cx_arl_iter_next
 Mike Becker <universe@uap-core.de> parents: 
619diff
changeset | 1112 | ((char *) iter->elem_handle) | 
| 1429 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 Mike Becker <universe@uap-core.de> parents: 
1425diff
changeset | 1113 | + ((const struct cx_list_s *) iter->src_handle)->collection.elem_size; | 
| 616 
af7d8a29fbc5
#219 array list: add iterator
 Mike Becker <universe@uap-core.de> parents: 
615diff
changeset | 1114 | } | 
| 
af7d8a29fbc5
#219 array list: add iterator
 Mike Becker <universe@uap-core.de> parents: 
615diff
changeset | 1115 | } | 
| 
af7d8a29fbc5
#219 array list: add iterator
 Mike Becker <universe@uap-core.de> parents: 
615diff
changeset | 1116 | |
| 655 
7340c4255f1f
implement backwards iterator - fixes #238
 Mike Becker <universe@uap-core.de> parents: 
654diff
changeset | 1117 | static void cx_arl_iter_prev(void *it) { | 
| 853 
d4baf4dd55c3
simplify iterator structures
 Mike Becker <universe@uap-core.de> parents: 
850diff
changeset | 1118 | struct cx_iterator_s *iter = it; | 
| 854 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 Mike Becker <universe@uap-core.de> parents: 
853diff
changeset | 1119 | if (iter->base.remove) { | 
| 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 Mike Becker <universe@uap-core.de> parents: 
853diff
changeset | 1120 | iter->base.remove = false; | 
| 1429 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 Mike Becker <universe@uap-core.de> parents: 
1425diff
changeset | 1121 | cx_arl_remove(iter->src_handle, iter->index, 1, NULL); | 
| 1387 
9bdd053820b7
the elem_count member of an iterator was not updated after removing an element flagged by cxIteratorFlagRemoval() - fixes #728
 Mike Becker <universe@uap-core.de> parents: 
1322diff
changeset | 1122 | iter->elem_count--; | 
| 655 
7340c4255f1f
implement backwards iterator - fixes #238
 Mike Becker <universe@uap-core.de> parents: 
654diff
changeset | 1123 | } | 
| 
7340c4255f1f
implement backwards iterator - fixes #238
 Mike Becker <universe@uap-core.de> parents: 
654diff
changeset | 1124 | iter->index--; | 
| 1429 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 Mike Becker <universe@uap-core.de> parents: 
1425diff
changeset | 1125 | cx_array_list *list = iter->src_handle; | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1126 | if (iter->index < list->base.collection.size) { | 
| 655 
7340c4255f1f
implement backwards iterator - fixes #238
 Mike Becker <universe@uap-core.de> parents: 
654diff
changeset | 1127 | iter->elem_handle = ((char *) list->data) | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1128 | + iter->index * list->base.collection.elem_size; | 
| 655 
7340c4255f1f
implement backwards iterator - fixes #238
 Mike Becker <universe@uap-core.de> parents: 
654diff
changeset | 1129 | } | 
| 
7340c4255f1f
implement backwards iterator - fixes #238
 Mike Becker <universe@uap-core.de> parents: 
654diff
changeset | 1130 | } | 
| 
7340c4255f1f
implement backwards iterator - fixes #238
 Mike Becker <universe@uap-core.de> parents: 
654diff
changeset | 1131 | |
| 630 
ac5e7f789048
separate iterators and mutating iterators
 Mike Becker <universe@uap-core.de> parents: 
629diff
changeset | 1132 | |
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1133 | static struct cx_iterator_s cx_arl_iterator( | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 1134 | const struct cx_list_s *list, | 
| 655 
7340c4255f1f
implement backwards iterator - fixes #238
 Mike Becker <universe@uap-core.de> parents: 
654diff
changeset | 1135 | size_t index, | 
| 
7340c4255f1f
implement backwards iterator - fixes #238
 Mike Becker <universe@uap-core.de> parents: 
654diff
changeset | 1136 | bool backwards | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1137 | ) { | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1138 | struct cx_iterator_s iter; | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1139 | |
| 616 
af7d8a29fbc5
#219 array list: add iterator
 Mike Becker <universe@uap-core.de> parents: 
615diff
changeset | 1140 | iter.index = index; | 
| 1429 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 Mike Becker <universe@uap-core.de> parents: 
1425diff
changeset | 1141 | iter.src_handle = (void*)list; | 
| 616 
af7d8a29fbc5
#219 array list: add iterator
 Mike Becker <universe@uap-core.de> parents: 
615diff
changeset | 1142 | iter.elem_handle = cx_arl_at(list, index); | 
| 856 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1143 | iter.elem_size = list->collection.elem_size; | 
| 
6bbbf219251d
fix name of collection base member (to avoid base.base)
 Mike Becker <universe@uap-core.de> parents: 
855diff
changeset | 1144 | iter.elem_count = list->collection.size; | 
| 854 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 Mike Becker <universe@uap-core.de> parents: 
853diff
changeset | 1145 | iter.base.valid = cx_arl_iter_valid; | 
| 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 Mike Becker <universe@uap-core.de> parents: 
853diff
changeset | 1146 | iter.base.current = cx_arl_iter_current; | 
| 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 Mike Becker <universe@uap-core.de> parents: 
853diff
changeset | 1147 | iter.base.next = backwards ? cx_arl_iter_prev : cx_arl_iter_next; | 
| 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 Mike Becker <universe@uap-core.de> parents: 
853diff
changeset | 1148 | iter.base.remove = false; | 
| 1429 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 Mike Becker <universe@uap-core.de> parents: 
1425diff
changeset | 1149 | iter.base.allow_remove = true; | 
| 630 
ac5e7f789048
separate iterators and mutating iterators
 Mike Becker <universe@uap-core.de> parents: 
629diff
changeset | 1150 | |
| 
ac5e7f789048
separate iterators and mutating iterators
 Mike Becker <universe@uap-core.de> parents: 
629diff
changeset | 1151 | return iter; | 
| 
ac5e7f789048
separate iterators and mutating iterators
 Mike Becker <universe@uap-core.de> parents: 
629diff
changeset | 1152 | } | 
| 616 
af7d8a29fbc5
#219 array list: add iterator
 Mike Becker <universe@uap-core.de> parents: 
615diff
changeset | 1153 | |
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1154 | static cx_list_class cx_array_list_class = { | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1155 | cx_arl_destructor, | 
| 641 
d402fead3386
add new pointer list wrapper - resolves #234
 Mike Becker <universe@uap-core.de> parents: 
640diff
changeset | 1156 | cx_arl_insert_element, | 
| 638 
eafb45eefc51
add cxListInsertArray() - fixes #224
 Mike Becker <universe@uap-core.de> parents: 
630diff
changeset | 1157 | cx_arl_insert_array, | 
| 881 
1dbbf8c1c42f
add optimized implementation of insert_sorted for array lists
 Mike Becker <universe@uap-core.de> parents: 
876diff
changeset | 1158 | cx_arl_insert_sorted, | 
| 1419 
e46406fd1b3c
add functions to insert elements into lists/arrays without duplicates - resolves #557
 Mike Becker <universe@uap-core.de> parents: 
1387diff
changeset | 1159 | cx_arl_insert_unique, | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1160 | cx_arl_insert_iter, | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1161 | cx_arl_remove, | 
| 664 
af5bf4603a5d
add cxListClear and fix missing destructor invocations - #241 #246
 Mike Becker <universe@uap-core.de> parents: 
662diff
changeset | 1162 | cx_arl_clear, | 
| 647 
2e6e9d9f2159
implement swap function for list elements - fixes #218
 Mike Becker <universe@uap-core.de> parents: 
643diff
changeset | 1163 | cx_arl_swap, | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1164 | cx_arl_at, | 
| 764 
ccbdbd088455
add cxListFindRemove and cx_linked_list_find_node
 Mike Becker <universe@uap-core.de> parents: 
763diff
changeset | 1165 | cx_arl_find_remove, | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1166 | cx_arl_sort, | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1167 | cx_arl_compare, | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1168 | cx_arl_reverse, | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1169 | cx_arl_iterator, | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1170 | }; | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1171 | |
| 670 
4ad8ea3aee49
allow NULL for allocator and comparator
 Mike Becker <universe@uap-core.de> parents: 
667diff
changeset | 1172 | CxList *cxArrayListCreate( | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
889diff
changeset | 1173 | const CxAllocator *allocator, | 
| 677 
b09aae58bba4
refactoring of collections to make use of destructors in map implementations
 Mike Becker <universe@uap-core.de> parents: 
676diff
changeset | 1174 | cx_compare_func comparator, | 
| 855 
35bcb3216c0d
fix inconsistent use of item_size and elem_size
 Mike Becker <universe@uap-core.de> parents: 
854diff
changeset | 1175 | size_t elem_size, | 
| 606 | 1176 | size_t initial_capacity | 
| 1177 | ) { | |
| 670 
4ad8ea3aee49
allow NULL for allocator and comparator
 Mike Becker <universe@uap-core.de> parents: 
667diff
changeset | 1178 | if (allocator == NULL) { | 
| 
4ad8ea3aee49
allow NULL for allocator and comparator
 Mike Becker <universe@uap-core.de> parents: 
667diff
changeset | 1179 | allocator = cxDefaultAllocator; | 
| 
4ad8ea3aee49
allow NULL for allocator and comparator
 Mike Becker <universe@uap-core.de> parents: 
667diff
changeset | 1180 | } | 
| 
4ad8ea3aee49
allow NULL for allocator and comparator
 Mike Becker <universe@uap-core.de> parents: 
667diff
changeset | 1181 | |
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1182 | cx_array_list *list = cxCalloc(allocator, 1, sizeof(cx_array_list)); | 
| 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1183 | if (list == NULL) return NULL; | 
| 1111 
78eeeb950883
remove API for changing the store_pointer property after list creation
 Mike Becker <universe@uap-core.de> parents: 
1089diff
changeset | 1184 | cx_list_init((CxList*)list, &cx_array_list_class, | 
| 
78eeeb950883
remove API for changing the store_pointer property after list creation
 Mike Becker <universe@uap-core.de> parents: 
1089diff
changeset | 1185 | allocator, comparator, elem_size); | 
| 677 
b09aae58bba4
refactoring of collections to make use of destructors in map implementations
 Mike Becker <universe@uap-core.de> parents: 
676diff
changeset | 1186 | list->capacity = initial_capacity; | 
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1187 | |
| 855 
35bcb3216c0d
fix inconsistent use of item_size and elem_size
 Mike Becker <universe@uap-core.de> parents: 
854diff
changeset | 1188 | // allocate the array after the real elem_size is known | 
| 1111 
78eeeb950883
remove API for changing the store_pointer property after list creation
 Mike Becker <universe@uap-core.de> parents: 
1089diff
changeset | 1189 | list->data = cxCalloc(allocator, initial_capacity, | 
| 
78eeeb950883
remove API for changing the store_pointer property after list creation
 Mike Becker <universe@uap-core.de> parents: 
1089diff
changeset | 1190 | list->base.collection.elem_size); | 
| 1065 
6eb7b54975ee
improve coverage metrics
 Mike Becker <universe@uap-core.de> parents: 
1047diff
changeset | 1191 | if (list->data == NULL) { // LCOV_EXCL_START | 
| 676 
d0680a23d850
fix initial storage allocation for array lists created with CX_STORE_POINTERS
 Mike Becker <universe@uap-core.de> parents: 
670diff
changeset | 1192 | cxFree(allocator, list); | 
| 
d0680a23d850
fix initial storage allocation for array lists created with CX_STORE_POINTERS
 Mike Becker <universe@uap-core.de> parents: 
670diff
changeset | 1193 | return NULL; | 
| 1065 
6eb7b54975ee
improve coverage metrics
 Mike Becker <universe@uap-core.de> parents: 
1047diff
changeset | 1194 | } // LCOV_EXCL_STOP | 
| 676 
d0680a23d850
fix initial storage allocation for array lists created with CX_STORE_POINTERS
 Mike Becker <universe@uap-core.de> parents: 
670diff
changeset | 1195 | |
| 628 
1e2be40f0cb5
use //-style single line comments everywhere
 Mike Becker <universe@uap-core.de> parents: 
627diff
changeset | 1196 | // configure the reallocator | 
| 953 
581ad4fd01e9
add function to create array reallocator that can move arrays from stack to heap
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 1197 | list->reallocator = cx_array_reallocator(allocator, NULL); | 
| 610 
de5d3ee6435f
#219 array list: implement add and at
 Mike Becker <universe@uap-core.de> parents: 
607diff
changeset | 1198 | |
| 607 
2d99e978dc34
implement array list ctor and dtor
 Mike Becker <universe@uap-core.de> parents: 
606diff
changeset | 1199 | return (CxList *) list; | 
| 606 | 1200 | } |