src/list.c

Sun, 14 Dec 2025 17:30:17 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 14 Dec 2025 17:30:17 +0100
changeset 1605
55b13f583356
parent 1604
68b75c091028
permissions
-rw-r--r--

refactor the list and map construction functions and remove the simple macros

relates to #780
relates to #622

503
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 *
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 *
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 *
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 */
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29 #include "cx/list.h"
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30
640
55cc3b373c5e simplify list class - fixes #236
Mike Becker <universe@uap-core.de>
parents: 630
diff changeset
31 #include <string.h>
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
32 #include <assert.h>
640
55cc3b373c5e simplify list class - fixes #236
Mike Becker <universe@uap-core.de>
parents: 630
diff changeset
33
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
34 // <editor-fold desc="Store Pointers Functionality">
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
35
677
b09aae58bba4 refactoring of collections to make use of destructors in map implementations
Mike Becker <universe@uap-core.de>
parents: 666
diff changeset
36 static _Thread_local cx_compare_func cx_pl_cmpfunc_impl;
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
37
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
38 static int cx_pl_cmpfunc(
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
39 const void *l,
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
40 const void *r
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
41 ) {
1422
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
42 // l and r are guaranteed to be non-NULL pointing to the list's memory
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
43 void *const *lptr = l;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
44 void *const *rptr = r;
1422
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
45 const void *left = *lptr;
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
46 const void *right = *rptr;
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
47 if (left == NULL) {
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
48 // NULL is smaller than any value except NULL
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
49 return right == NULL ? 0 : -1;
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
50 } else if (right == NULL) {
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
51 // any value is larger than NULL
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
52 return 1;
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
53 }
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
54 return cx_pl_cmpfunc_impl(left, right);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
55 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
56
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
57 static void cx_pl_hack_cmpfunc(const struct cx_list_s *list) {
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
58 // cast away const - this is the hacky thing
856
6bbbf219251d fix name of collection base member (to avoid base.base)
Mike Becker <universe@uap-core.de>
parents: 855
diff changeset
59 struct cx_collection_s *l = (struct cx_collection_s*) &list->collection;
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
60 cx_pl_cmpfunc_impl = l->cmpfunc;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
61 l->cmpfunc = cx_pl_cmpfunc;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
62 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
63
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
64 static void cx_pl_unhack_cmpfunc(const struct cx_list_s *list) {
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
65 // cast away const - this is the hacky thing
856
6bbbf219251d fix name of collection base member (to avoid base.base)
Mike Becker <universe@uap-core.de>
parents: 855
diff changeset
66 struct cx_collection_s *l = (struct cx_collection_s*) &list->collection;
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
67 l->cmpfunc = cx_pl_cmpfunc_impl;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
68 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
69
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
70 static void cx_pl_destructor(struct cx_list_s *list) {
993
b642eca4b956 make names of destroy and free functions consistent - fixes #484
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
71 list->climpl->deallocate(list);
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
72 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
73
1316
c41538edfcef add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
Mike Becker <universe@uap-core.de>
parents: 1287
diff changeset
74 static void *cx_pl_insert_element(
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
75 struct cx_list_s *list,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
76 size_t index,
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
77 const void *element
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
78 ) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
79 return list->climpl->insert_element(list, index, &element);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
80 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
81
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
82 static size_t cx_pl_insert_array(
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
83 struct cx_list_s *list,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
84 size_t index,
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
85 const void *array,
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
86 size_t n
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
87 ) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
88 return list->climpl->insert_array(list, index, array, n);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
89 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
90
876
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
91 static size_t cx_pl_insert_sorted(
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
92 struct cx_list_s *list,
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
93 const void *array,
876
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
94 size_t n
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
95 ) {
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
96 cx_pl_hack_cmpfunc(list);
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
97 size_t result = list->climpl->insert_sorted(list, array, n);
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
98 cx_pl_unhack_cmpfunc(list);
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
99 return result;
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
100 }
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
101
1419
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
102 static size_t cx_pl_insert_unique(
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
103 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: 1345
diff changeset
104 const void *array,
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
105 size_t n
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
106 ) {
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
107 cx_pl_hack_cmpfunc(list);
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
108 size_t result = list->climpl->insert_unique(list, array, n);
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
109 cx_pl_unhack_cmpfunc(list);
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
110 return result;
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
111 }
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
112
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
113 static int cx_pl_insert_iter(
853
d4baf4dd55c3 simplify iterator structures
Mike Becker <universe@uap-core.de>
parents: 802
diff changeset
114 struct cx_iterator_s *iter,
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
115 const void *elem,
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
116 int prepend
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
117 ) {
1429
6e0c3a8a914a remove the concept of "mutating iterators" - resolves #579
Mike Becker <universe@uap-core.de>
parents: 1428
diff changeset
118 struct cx_list_s *list = iter->src_handle;
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
119 return list->climpl->insert_iter(iter, &elem, prepend);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
120 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
121
919
75da57d4634e add possibility to remove arrays of data and retrieve removed data
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
122 static size_t cx_pl_remove(
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
123 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: 890
diff changeset
124 size_t index,
75da57d4634e add possibility to remove arrays of data and retrieve removed data
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
125 size_t num,
75da57d4634e add possibility to remove arrays of data and retrieve removed data
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
126 void *targetbuf
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
127 ) {
919
75da57d4634e add possibility to remove arrays of data and retrieve removed data
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
128 return list->climpl->remove(list, index, num, targetbuf);
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
129 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
130
664
af5bf4603a5d add cxListClear and fix missing destructor invocations - #241 #246
Mike Becker <universe@uap-core.de>
parents: 655
diff changeset
131 static void cx_pl_clear(struct cx_list_s *list) {
af5bf4603a5d add cxListClear and fix missing destructor invocations - #241 #246
Mike Becker <universe@uap-core.de>
parents: 655
diff changeset
132 list->climpl->clear(list);
af5bf4603a5d add cxListClear and fix missing destructor invocations - #241 #246
Mike Becker <universe@uap-core.de>
parents: 655
diff changeset
133 }
af5bf4603a5d add cxListClear and fix missing destructor invocations - #241 #246
Mike Becker <universe@uap-core.de>
parents: 655
diff changeset
134
653
2e6e9d9f2159 implement swap function for list elements - fixes #218
Mike Becker <universe@uap-core.de>
parents: 641
diff changeset
135 static int cx_pl_swap(
2e6e9d9f2159 implement swap function for list elements - fixes #218
Mike Becker <universe@uap-core.de>
parents: 641
diff changeset
136 struct cx_list_s *list,
2e6e9d9f2159 implement swap function for list elements - fixes #218
Mike Becker <universe@uap-core.de>
parents: 641
diff changeset
137 size_t i,
2e6e9d9f2159 implement swap function for list elements - fixes #218
Mike Becker <universe@uap-core.de>
parents: 641
diff changeset
138 size_t j
2e6e9d9f2159 implement swap function for list elements - fixes #218
Mike Becker <universe@uap-core.de>
parents: 641
diff changeset
139 ) {
2e6e9d9f2159 implement swap function for list elements - fixes #218
Mike Becker <universe@uap-core.de>
parents: 641
diff changeset
140 return list->climpl->swap(list, i, j);
2e6e9d9f2159 implement swap function for list elements - fixes #218
Mike Becker <universe@uap-core.de>
parents: 641
diff changeset
141 }
2e6e9d9f2159 implement swap function for list elements - fixes #218
Mike Becker <universe@uap-core.de>
parents: 641
diff changeset
142
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
143 static void *cx_pl_at(
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
144 const struct cx_list_s *list,
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
145 size_t index
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
146 ) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
147 void **ptr = list->climpl->at(list, index);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
148 return ptr == NULL ? NULL : *ptr;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
149 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
150
1162
e3bb67b72d33 remove dependency to ssize_t - fixes #552
Mike Becker <universe@uap-core.de>
parents: 1111
diff changeset
151 static size_t cx_pl_find_remove(
764
ccbdbd088455 add cxListFindRemove and cx_linked_list_find_node
Mike Becker <universe@uap-core.de>
parents: 708
diff changeset
152 struct cx_list_s *list,
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
153 const void *elem,
764
ccbdbd088455 add cxListFindRemove and cx_linked_list_find_node
Mike Becker <universe@uap-core.de>
parents: 708
diff changeset
154 bool remove
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
155 ) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
156 cx_pl_hack_cmpfunc(list);
1162
e3bb67b72d33 remove dependency to ssize_t - fixes #552
Mike Becker <universe@uap-core.de>
parents: 1111
diff changeset
157 size_t ret = list->climpl->find_remove(list, &elem, remove);
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
158 cx_pl_unhack_cmpfunc(list);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
159 return ret;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
160 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
161
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
162 static void cx_pl_sort(struct cx_list_s *list) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
163 cx_pl_hack_cmpfunc(list);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
164 list->climpl->sort(list);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
165 cx_pl_unhack_cmpfunc(list);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
166 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
167
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
168 static int cx_pl_compare(
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
169 const struct cx_list_s *list,
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
170 const struct cx_list_s *other
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
171 ) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
172 cx_pl_hack_cmpfunc(list);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
173 int ret = list->climpl->compare(list, other);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
174 cx_pl_unhack_cmpfunc(list);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
175 return ret;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
176 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
177
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
178 static void cx_pl_reverse(struct cx_list_s *list) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
179 list->climpl->reverse(list);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
180 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
181
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
182 static void *cx_pl_iter_current(const void *it) {
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
183 const 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: 853
diff changeset
184 void **ptr = iter->base.current_impl(it);
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
185 return ptr == NULL ? NULL : *ptr;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
186 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
187
1482
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
188 static int cx_pl_change_capacity(struct cx_list_s *list, size_t cap) {
1485
814c1c61488d add tests for cxListShrink() and cxListReserve() + fixes a bug
Mike Becker <universe@uap-core.de>
parents: 1482
diff changeset
189 if (list->climpl->change_capacity == NULL) {
814c1c61488d add tests for cxListShrink() and cxListReserve() + fixes a bug
Mike Becker <universe@uap-core.de>
parents: 1482
diff changeset
190 return 0;
814c1c61488d add tests for cxListShrink() and cxListReserve() + fixes a bug
Mike Becker <universe@uap-core.de>
parents: 1482
diff changeset
191 } else {
814c1c61488d add tests for cxListShrink() and cxListReserve() + fixes a bug
Mike Becker <universe@uap-core.de>
parents: 1482
diff changeset
192 return list->climpl->change_capacity(list, cap);
814c1c61488d add tests for cxListShrink() and cxListReserve() + fixes a bug
Mike Becker <universe@uap-core.de>
parents: 1482
diff changeset
193 }
1482
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
194 }
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
195
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
196 static struct cx_iterator_s cx_pl_iterator(
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
197 const struct cx_list_s *list,
655
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 653
diff changeset
198 size_t index,
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 653
diff changeset
199 bool backwards
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
200 ) {
655
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 653
diff changeset
201 struct cx_iterator_s iter = list->climpl->iterator(list, index, backwards);
854
fe0d69d72bcd fix members inherited by macro or include are not documented
Mike Becker <universe@uap-core.de>
parents: 853
diff changeset
202 iter.base.current_impl = iter.base.current;
fe0d69d72bcd fix members inherited by macro or include are not documented
Mike Becker <universe@uap-core.de>
parents: 853
diff changeset
203 iter.base.current = cx_pl_iter_current;
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
204 return iter;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
205 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
206
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
207 static cx_list_class cx_pointer_list_class = {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
208 cx_pl_destructor,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
209 cx_pl_insert_element,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
210 cx_pl_insert_array,
876
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
211 cx_pl_insert_sorted,
1419
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
212 cx_pl_insert_unique,
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
213 cx_pl_insert_iter,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
214 cx_pl_remove,
664
af5bf4603a5d add cxListClear and fix missing destructor invocations - #241 #246
Mike Becker <universe@uap-core.de>
parents: 655
diff changeset
215 cx_pl_clear,
653
2e6e9d9f2159 implement swap function for list elements - fixes #218
Mike Becker <universe@uap-core.de>
parents: 641
diff changeset
216 cx_pl_swap,
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
217 cx_pl_at,
764
ccbdbd088455 add cxListFindRemove and cx_linked_list_find_node
Mike Becker <universe@uap-core.de>
parents: 708
diff changeset
218 cx_pl_find_remove,
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
219 cx_pl_sort,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
220 cx_pl_compare,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
221 cx_pl_reverse,
1482
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
222 cx_pl_change_capacity,
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
223 cx_pl_iterator,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
224 };
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
225 // </editor-fold>
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
226
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
227 // <editor-fold desc="empty list implementation">
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
228
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 919
diff changeset
229 static void cx_emptyl_noop(cx_attr_unused CxList *list) {
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
230 // this is a noop, but MUST be implemented
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
231 }
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
232
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
233 static void *cx_emptyl_at(
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 919
diff changeset
234 cx_attr_unused const struct cx_list_s *list,
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 919
diff changeset
235 cx_attr_unused size_t index
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
236 ) {
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
237 return NULL;
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
238 }
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
239
1162
e3bb67b72d33 remove dependency to ssize_t - fixes #552
Mike Becker <universe@uap-core.de>
parents: 1111
diff changeset
240 static size_t cx_emptyl_find_remove(
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 919
diff changeset
241 cx_attr_unused struct cx_list_s *list,
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 919
diff changeset
242 cx_attr_unused const void *elem,
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 919
diff changeset
243 cx_attr_unused bool remove
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
244 ) {
1162
e3bb67b72d33 remove dependency to ssize_t - fixes #552
Mike Becker <universe@uap-core.de>
parents: 1111
diff changeset
245 return 0;
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
246 }
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
247
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 919
diff changeset
248 static bool cx_emptyl_iter_valid(cx_attr_unused const void *iter) {
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
249 return false;
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
250 }
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
251
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
252 static CxIterator cx_emptyl_iterator(
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
253 const struct cx_list_s *list,
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
254 size_t index,
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 919
diff changeset
255 cx_attr_unused bool backwards
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
256 ) {
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
257 CxIterator iter = {0};
1429
6e0c3a8a914a remove the concept of "mutating iterators" - resolves #579
Mike Becker <universe@uap-core.de>
parents: 1428
diff changeset
258 iter.src_handle = (void*) list;
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
259 iter.index = index;
854
fe0d69d72bcd fix members inherited by macro or include are not documented
Mike Becker <universe@uap-core.de>
parents: 853
diff changeset
260 iter.base.valid = cx_emptyl_iter_valid;
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
261 return iter;
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
262 }
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
263
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
264 static cx_list_class cx_empty_list_class = {
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
265 cx_emptyl_noop,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
266 NULL,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
267 NULL,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
268 NULL,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
269 NULL,
876
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
270 NULL,
1419
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
271 NULL,
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
272 cx_emptyl_noop,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
273 NULL,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
274 cx_emptyl_at,
764
ccbdbd088455 add cxListFindRemove and cx_linked_list_find_node
Mike Becker <universe@uap-core.de>
parents: 708
diff changeset
275 cx_emptyl_find_remove,
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
276 cx_emptyl_noop,
875
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
277 NULL,
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
278 cx_emptyl_noop,
1482
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
279 NULL,
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
280 cx_emptyl_iterator,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
281 };
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
282
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
283 CxList cx_empty_list = {
1163
68ff0839bc6a optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents: 1162
diff changeset
284 {
68ff0839bc6a optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents: 1162
diff changeset
285 NULL,
68ff0839bc6a optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents: 1162
diff changeset
286 NULL,
68ff0839bc6a optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents: 1162
diff changeset
287 0,
68ff0839bc6a optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents: 1162
diff changeset
288 0,
68ff0839bc6a optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents: 1162
diff changeset
289 NULL,
68ff0839bc6a optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents: 1162
diff changeset
290 NULL,
68ff0839bc6a optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents: 1162
diff changeset
291 NULL,
68ff0839bc6a optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents: 1162
diff changeset
292 false,
68ff0839bc6a optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents: 1162
diff changeset
293 true,
68ff0839bc6a optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents: 1162
diff changeset
294 },
68ff0839bc6a optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents: 1162
diff changeset
295 &cx_empty_list_class,
68ff0839bc6a optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents: 1162
diff changeset
296 NULL
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
297 };
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
298
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
299 CxList *const cxEmptyList = &cx_empty_list;
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
300
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
301 // </editor-fold>
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
302
875
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
303 #define invoke_list_func(name, list, ...) \
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
304 ((list)->climpl == NULL ? (list)->cl->name : (list)->climpl->name) \
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
305 (list, __VA_ARGS__)
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
306
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
307 size_t cx_list_default_insert_array(
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
308 struct cx_list_s *list,
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
309 size_t index,
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
310 const void *data,
875
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
311 size_t n
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
312 ) {
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
313 const char *src = data;
875
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
314 size_t i = 0;
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
315 for (; i < n; i++) {
1316
c41538edfcef add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
Mike Becker <universe@uap-core.de>
parents: 1287
diff changeset
316 if (NULL == invoke_list_func(
1433
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
317 insert_element, list, index + i, src)
1422
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
318 ) {
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
319 return i; // LCOV_EXCL_LINE
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
320 }
1433
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
321 if (src != NULL) {
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
322 src += list->collection.elem_size;
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
323 }
875
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
324 }
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
325 return i;
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
326 }
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
327
1419
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
328 static size_t cx_list_default_insert_sorted_impl(
876
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
329 struct cx_list_s *list,
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
330 const void *sorted_data,
1419
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
331 size_t n,
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
332 bool allow_duplicates
876
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
333 ) {
877
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
334 // corner case
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
335 if (n == 0) return 0;
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
336
876
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
337 size_t elem_size = list->collection.elem_size;
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
338 cx_compare_func cmp = list->collection.cmpfunc;
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
339 const char *src = sorted_data;
876
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
340
877
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
341 // track indices and number of inserted items
1423
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
342 size_t di = 0, si = 0, processed = 0;
877
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
343
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
344 // search the list for insertion points
1423
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
345 while (di < list->collection.size) {
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
346 const void *list_elm = invoke_list_func(at, list, di);
877
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
347
1423
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
348 // compare the current list element with the first source element
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
349 // if less, skip the list elements
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
350 // if equal, skip the list elements and optionally the source elements
1419
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
351 {
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
352 int d = cmp(list_elm, src);
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
353 if (d <= 0) {
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
354 if (!allow_duplicates && d == 0) {
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
355 src += elem_size;
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
356 si++;
1423
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
357 processed++; // we also count duplicates for the return value
1419
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
358 while (si < n && cmp(list_elm, src) == 0) {
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
359 src += elem_size;
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
360 si++;
1423
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
361 processed++;
1419
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
362 }
1423
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
363 if (processed == n) {
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
364 return processed;
1422
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
365 }
1419
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
366 }
1423
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
367 di++;
1419
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
368 continue;
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
369 }
877
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
370 }
876
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
371
1423
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
372 // determine the number of consecutive elements that can be inserted
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
373 size_t ins = 1, skip = 0;
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
374 const char *next = src;
877
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
375 while (++si < n) {
1423
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
376 if (!allow_duplicates) {
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
377 // skip duplicates within the source
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
378 if (cmp(next, next + elem_size) == 0) {
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
379 next += elem_size;
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
380 skip++;
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
381 continue;
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
382 } else {
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
383 if (skip > 0) {
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
384 // if we had to skip something, we must wait for the next run
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
385 next += elem_size;
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
386 break;
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
387 }
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
388 }
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
389 }
877
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
390 next += elem_size;
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
391 // once we become larger than the list elem, break
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
392 if (cmp(list_elm, next) <= 0) {
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
393 break;
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
394 }
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
395 // otherwise, we can insert one more
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
396 ins++;
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
397 }
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
398
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
399 // insert the elements at location si
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
400 if (ins == 1) {
1422
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
401 if (NULL == invoke_list_func(insert_element, list, di, src)) {
1423
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
402 return processed; // LCOV_EXCL_LINE
1422
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
403 }
877
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
404 } else {
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
405 size_t r = invoke_list_func(insert_array, list, di, src, ins);
1422
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
406 if (r < ins) {
1423
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
407 return processed + r; // LCOV_EXCL_LINE
1422
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
408 }
877
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
409 }
1423
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
410 processed += ins + skip;
877
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
411 di += ins;
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
412
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
413 // everything inserted?
1423
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
414 if (processed == n) {
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
415 return processed;
1422
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
416 }
877
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
417 src = next;
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
418 }
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
419
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
420 // insert remaining items
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
421 if (si < n) {
1423
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
422 if (allow_duplicates) {
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
423 processed += invoke_list_func(insert_array, list, di, src, n - si);
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
424 } else {
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
425 const void *last = di == 0 ? NULL : invoke_list_func(at, list, di - 1);
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
426 for (; si < n; si++) {
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
427 // skip duplicates within the source
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
428 if (last == NULL || cmp(last, src) != 0) {
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
429 if (NULL == invoke_list_func(insert_element, list, di, src)) {
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
430 return processed; // LCOV_EXCL_LINE
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
431 }
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
432 last = src;
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
433 di++;
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
434 }
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
435 processed++;
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
436 src += elem_size;
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
437 }
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
438 }
877
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
439 }
608b14deea18 optimize default insert_sorted implementation
Mike Becker <universe@uap-core.de>
parents: 876
diff changeset
440
1423
9a72258446cd fixes various bugs related to skipping duplicates in insert_unique - relates to #557
Mike Becker <universe@uap-core.de>
parents: 1422
diff changeset
441 return processed;
876
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
442 }
f4ce7df9cff0 add stupid default implementation for high level insertion sort
Mike Becker <universe@uap-core.de>
parents: 875
diff changeset
443
1419
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
444 size_t cx_list_default_insert_sorted(
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
445 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: 1345
diff changeset
446 const void *sorted_data,
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
447 size_t n
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
448 ) {
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
449 return cx_list_default_insert_sorted_impl(list, sorted_data, n, true);
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
450 }
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
451
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
452 size_t cx_list_default_insert_unique(
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
453 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: 1345
diff changeset
454 const void *sorted_data,
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
455 size_t n
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
456 ) {
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
457 return cx_list_default_insert_sorted_impl(list, sorted_data, n, false);
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
458 }
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1345
diff changeset
459
875
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
460 void cx_list_default_sort(struct cx_list_s *list) {
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
461 size_t elem_size = list->collection.elem_size;
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
462 size_t list_size = list->collection.size;
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
463 void *tmp = cxMallocDefault(elem_size * list_size);
1422
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
464 if (tmp == NULL) abort(); // LCOV_EXCL_LINE
875
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
465
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
466 // copy elements from source array
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
467 char *loc = tmp;
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
468 for (size_t i = 0; i < list_size; i++) {
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
469 void *src = invoke_list_func(at, list, i);
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
470 memcpy(loc, src, elem_size);
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
471 loc += elem_size;
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
472 }
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
473
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
474 // qsort
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
475 qsort(tmp, list_size, elem_size,
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
476 list->collection.cmpfunc);
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
477
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
478 // copy elements back
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
479 loc = tmp;
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
480 for (size_t i = 0; i < list_size; i++) {
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
481 void *dest = invoke_list_func(at, list, i);
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
482 memcpy(dest, loc, elem_size);
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
483 loc += elem_size;
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
484 }
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
485
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
486 cxFreeDefault(tmp);
875
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
487 }
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
488
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
489 int cx_list_default_swap(struct cx_list_s *list, size_t i, size_t j) {
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
490 if (i == j) return 0;
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
491 if (i >= list->collection.size) return 1;
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
492 if (j >= list->collection.size) return 1;
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
493
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
494 size_t elem_size = list->collection.elem_size;
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
495
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
496 void *tmp = cxMallocDefault(elem_size);
1422
8bfccb342895 changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
497 if (tmp == NULL) return 1; // LCOV_EXCL_LINE
875
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
498
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
499 void *ip = invoke_list_func(at, list, i);
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
500 void *jp = invoke_list_func(at, list, j);
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
501
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
502 memcpy(tmp, ip, elem_size);
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
503 memcpy(ip, jp, elem_size);
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
504 memcpy(jp, tmp, elem_size);
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
505
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
506 cxFreeDefault(tmp);
875
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
507
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
508 return 0;
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
509 }
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
510
1111
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
511 void cx_list_init(
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
512 struct cx_list_s *list,
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
513 struct cx_list_class_s *cl,
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
514 const struct cx_allocator_s *allocator,
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
515 size_t elem_size
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
516 ) {
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
517 list->cl = cl;
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
518 list->collection.allocator = allocator;
1605
55b13f583356 refactor the list and map construction functions and remove the simple macros
Mike Becker <universe@uap-core.de>
parents: 1604
diff changeset
519 list->collection.cmpfunc = NULL;
1111
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
520 if (elem_size > 0) {
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
521 list->collection.elem_size = elem_size;
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
522 } else {
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
523 list->collection.elem_size = sizeof(void *);
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
524 if (list->collection.cmpfunc == NULL) {
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
525 list->collection.cmpfunc = cx_cmp_ptr;
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
526 }
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
527 list->collection.store_pointer = true;
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
528 list->climpl = list->cl;
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
529 list->cl = &cx_pointer_list_class;
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
530 }
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
531 }
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
532
618
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
533 int cxListCompare(
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
534 const CxList *list,
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 877
diff changeset
535 const CxList *other
618
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
536 ) {
875
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
537 bool cannot_optimize = false;
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
538
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
539 // if one is storing pointers but the other is not
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
540 cannot_optimize |= list->collection.store_pointer ^ other->collection.store_pointer;
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
541
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
542 // if one class is wrapped but the other is not
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
543 cannot_optimize |= (list->climpl == NULL) ^ (other->climpl == NULL);
705
0d5447230044 fix cxListCompare if-condition
Mike Becker <universe@uap-core.de>
parents: 704
diff changeset
544
875
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
545 // if the compare functions do not match or both are NULL
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
546 if (!cannot_optimize) {
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
547 cx_compare_func list_cmp = (cx_compare_func) (list->climpl != NULL ?
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
548 list->climpl->compare : list->cl->compare);
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
549 cx_compare_func other_cmp = (cx_compare_func) (other->climpl != NULL ?
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
550 other->climpl->compare : other->cl->compare);
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
551 cannot_optimize |= list_cmp != other_cmp;
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
552 cannot_optimize |= list_cmp == NULL;
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
553 }
705
0d5447230044 fix cxListCompare if-condition
Mike Becker <universe@uap-core.de>
parents: 704
diff changeset
554
875
ee84ac776cbc add default impl for some list member functions
Mike Becker <universe@uap-core.de>
parents: 856
diff changeset
555 if (cannot_optimize) {
680
19379743e5a0 fix wrong operator precedence in destructor macros
Mike Becker <universe@uap-core.de>
parents: 677
diff changeset
556 // lists are definitely different - cannot use internal compare function
856
6bbbf219251d fix name of collection base member (to avoid base.base)
Mike Becker <universe@uap-core.de>
parents: 855
diff changeset
557 if (list->collection.size == other->collection.size) {
776
874cc78cdffd fix accidental generation of cxListIterator() symbol
Mike Becker <universe@uap-core.de>
parents: 764
diff changeset
558 CxIterator left = list->cl->iterator(list, 0, false);
802
30473af255b4 fix #356 : broken cxListCompare
Mike Becker <universe@uap-core.de>
parents: 776
diff changeset
559 CxIterator right = other->cl->iterator(other, 0, false);
856
6bbbf219251d fix name of collection base member (to avoid base.base)
Mike Becker <universe@uap-core.de>
parents: 855
diff changeset
560 for (size_t i = 0; i < list->collection.size; i++) {
630
ac5e7f789048 separate iterators and mutating iterators
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
561 void *leftValue = cxIteratorCurrent(left);
ac5e7f789048 separate iterators and mutating iterators
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
562 void *rightValue = cxIteratorCurrent(right);
856
6bbbf219251d fix name of collection base member (to avoid base.base)
Mike Becker <universe@uap-core.de>
parents: 855
diff changeset
563 int d = list->collection.cmpfunc(leftValue, rightValue);
618
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
564 if (d != 0) {
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
565 return d;
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
566 }
630
ac5e7f789048 separate iterators and mutating iterators
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
567 cxIteratorNext(left);
ac5e7f789048 separate iterators and mutating iterators
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
568 cxIteratorNext(right);
618
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
569 }
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
570 return 0;
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
571 } else {
856
6bbbf219251d fix name of collection base member (to avoid base.base)
Mike Becker <universe@uap-core.de>
parents: 855
diff changeset
572 return list->collection.size < other->collection.size ? -1 : 1;
618
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
573 }
680
19379743e5a0 fix wrong operator precedence in destructor macros
Mike Becker <universe@uap-core.de>
parents: 677
diff changeset
574 } else {
19379743e5a0 fix wrong operator precedence in destructor macros
Mike Becker <universe@uap-core.de>
parents: 677
diff changeset
575 // lists are compatible
19379743e5a0 fix wrong operator precedence in destructor macros
Mike Becker <universe@uap-core.de>
parents: 677
diff changeset
576 return list->cl->compare(list, other);
618
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
577 }
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
578 }
640
55cc3b373c5e simplify list class - fixes #236
Mike Becker <universe@uap-core.de>
parents: 630
diff changeset
579
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
580 size_t cxListSize(const CxList *list) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
581 return list->collection.size;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
582 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
583
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
584 int cxListAdd(CxList *list, const void *elem) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
585 list->collection.sorted = false;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
586 return list->cl->insert_element(list, list->collection.size, elem) == NULL;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
587 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
588
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
589 size_t cxListAddArray(CxList *list, const void *array, size_t n) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
590 list->collection.sorted = false;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
591 return list->cl->insert_array(list, list->collection.size, array, n);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
592 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
593
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
594 int cxListInsert(CxList *list, size_t index, const void *elem) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
595 list->collection.sorted = false;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
596 return list->cl->insert_element(list, index, elem) == NULL;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
597 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
598
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
599 void *cxListEmplaceAt(CxList *list, size_t index) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
600 list->collection.sorted = false;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
601 return list->cl->insert_element(list, index, NULL);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
602 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
603
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
604 void *cxListEmplace(CxList *list) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
605 list->collection.sorted = false;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
606 return list->cl->insert_element(list, list->collection.size, NULL);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
607 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
608
1433
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
609 static bool cx_list_emplace_iterator_valid(const void *it) {
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
610 const CxIterator *iter = it;
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
611 return iter->index < iter->elem_count;
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
612 }
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
613
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
614 CxIterator cxListEmplaceArrayAt(CxList *list, size_t index, size_t n) {
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
615 list->collection.sorted = false;
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
616 size_t c = list->cl->insert_array(list, index, NULL, n);
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
617 CxIterator iter = list->cl->iterator(list, index, false);
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
618 // tweak the fields of this iterator
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
619 iter.elem_count = c;
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
620 iter.index = 0;
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
621 // replace the valid function to abort iteration when c is reached
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
622 iter.base.valid = cx_list_emplace_iterator_valid;
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
623 // if we are storing pointers, we want to return the pure pointers.
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
624 // therefore, we must unwrap the "current" method
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
625 if (list->collection.store_pointer) {
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
626 iter.base.current = iter.base.current_impl;
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
627 }
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
628 return iter;
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
629 }
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
630
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
631 CxIterator cxListEmplaceArray(CxList *list, size_t n) {
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
632 return cxListEmplaceArrayAt(list, list->collection.size, n);
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
633 }
81c301a59b7c add cxListEmplaceArray() and cxListEmplaceArrayAt() as preparation for the clone implementation
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
634
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
635 int cxListInsertSorted(CxList *list, const void *elem) {
1428
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
636 assert(cxCollectionSorted(list));
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
637 list->collection.sorted = true;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
638 const void *data = list->collection.store_pointer ? &elem : elem;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
639 return list->cl->insert_sorted(list, data, 1) == 0;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
640 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
641
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
642 int cxListInsertUnique(CxList *list, const void *elem) {
1428
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
643 if (cxCollectionSorted(list)) {
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
644 list->collection.sorted = true;
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
645 const void *data = list->collection.store_pointer ? &elem : elem;
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
646 return list->cl->insert_unique(list, data, 1) == 0;
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
647 } else {
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
648 if (cxListContains(list, elem)) {
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
649 return 0;
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
650 } else {
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
651 return cxListAdd(list, elem);
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
652 }
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
653 }
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
654 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
655
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
656 size_t cxListInsertArray(CxList *list, size_t index, const void *array, size_t n) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
657 list->collection.sorted = false;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
658 return list->cl->insert_array(list, index, array, n);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
659 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
660
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
661 size_t cxListInsertSortedArray(CxList *list, const void *array, size_t n) {
1428
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
662 assert(cxCollectionSorted(list));
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
663 list->collection.sorted = true;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
664 return list->cl->insert_sorted(list, array, n);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
665 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
666
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
667 size_t cxListInsertUniqueArray(CxList *list, const void *array, size_t n) {
1428
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
668 if (cxCollectionSorted(list)) {
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
669 list->collection.sorted = true;
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
670 return list->cl->insert_unique(list, array, n);
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
671 } else {
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
672 const char *source = array;
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
673 for (size_t i = 0 ; i < n; i++) {
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
674 // note: this also checks elements added in a previous iteration
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
675 const void *data = list->collection.store_pointer ?
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
676 *((const void**)source) : source;
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
677 if (!cxListContains(list, data)) {
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
678 if (cxListAdd(list, data)) {
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
679 return i; // LCOV_EXCL_LINE
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
680 }
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
681 }
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
682 source += list->collection.elem_size;
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
683 }
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
684 return n;
0ac4aa1737fd add support for non-sorted lists in cxListInsertUnique() and cxListInsertUniqueArray()
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
685 }
640
55cc3b373c5e simplify list class - fixes #236
Mike Becker <universe@uap-core.de>
parents: 630
diff changeset
686 }
655
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 653
diff changeset
687
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
688 int cxListInsertAfter(CxIterator *iter, const void *elem) {
1429
6e0c3a8a914a remove the concept of "mutating iterators" - resolves #579
Mike Becker <universe@uap-core.de>
parents: 1428
diff changeset
689 CxList* list = (CxList*)iter->src_handle;
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
690 list->collection.sorted = false;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
691 return list->cl->insert_iter(iter, elem, 0);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
692 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
693
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
694 int cxListInsertBefore(CxIterator *iter, const void *elem) {
1429
6e0c3a8a914a remove the concept of "mutating iterators" - resolves #579
Mike Becker <universe@uap-core.de>
parents: 1428
diff changeset
695 CxList* list = (CxList*)iter->src_handle;
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
696 list->collection.sorted = false;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
697 return list->cl->insert_iter(iter, elem, 1);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
698 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
699
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
700 int cxListRemove(CxList *list, size_t index) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
701 return list->cl->remove(list, index, 1, NULL) == 0;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
702 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
703
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
704 int cxListRemoveAndGet(CxList *list, size_t index, void *targetbuf) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
705 return list->cl->remove(list, index, 1, targetbuf) == 0;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
706 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
707
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
708 int cxListRemoveAndGetFirst(CxList *list, void *targetbuf) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
709 return list->cl->remove(list, 0, 1, targetbuf) == 0;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
710 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
711
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
712 int cxListRemoveAndGetLast(CxList *list, void *targetbuf) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
713 // note: index may wrap - member function will catch that
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
714 return list->cl->remove(list, list->collection.size - 1, 1, targetbuf) == 0;
655
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 653
diff changeset
715 }
1109
89ec23988b88 free functions should not be inline in release mode - relates to #541
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
716
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
717 size_t cxListRemoveArray(CxList *list, size_t index, size_t num) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
718 return list->cl->remove(list, index, num, NULL);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
719 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
720
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
721 size_t cxListRemoveArrayAndGet(CxList *list, size_t index, size_t num, void *targetbuf) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
722 return list->cl->remove(list, index, num, targetbuf);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
723 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
724
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
725 void cxListClear(CxList *list) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
726 list->cl->clear(list);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
727 list->collection.sorted = true; // empty lists are always sorted
1109
89ec23988b88 free functions should not be inline in release mode - relates to #541
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
728 }
1287
3a3ffc27813f adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents: 1163
diff changeset
729
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
730 int cxListSwap(CxList *list, size_t i, size_t j) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
731 list->collection.sorted = false;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
732 return list->cl->swap(list, i, j);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
733 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
734
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
735 void *cxListAt(const CxList *list, size_t index) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
736 return list->cl->at(list, index);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
737 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
738
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
739 void *cxListFirst(const CxList *list) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
740 return list->cl->at(list, 0);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
741 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
742
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
743 void *cxListLast(const CxList *list) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
744 return list->cl->at(list, list->collection.size - 1);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
745 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
746
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
747 int cxListSet(CxList *list, size_t index, const void *elem) {
1287
3a3ffc27813f adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents: 1163
diff changeset
748 if (index >= list->collection.size) {
3a3ffc27813f adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents: 1163
diff changeset
749 return 1;
3a3ffc27813f adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents: 1163
diff changeset
750 }
3a3ffc27813f adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents: 1163
diff changeset
751
3a3ffc27813f adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents: 1163
diff changeset
752 if (list->collection.store_pointer) {
3a3ffc27813f adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents: 1163
diff changeset
753 // For pointer collections, always use climpl
3a3ffc27813f adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents: 1163
diff changeset
754 void **target = list->climpl->at(list, index);
3a3ffc27813f adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents: 1163
diff changeset
755 *target = (void *)elem;
3a3ffc27813f adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents: 1163
diff changeset
756 } else {
3a3ffc27813f adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents: 1163
diff changeset
757 void *target = list->cl->at(list, index);
3a3ffc27813f adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents: 1163
diff changeset
758 memcpy(target, elem, list->collection.elem_size);
3a3ffc27813f adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents: 1163
diff changeset
759 }
3a3ffc27813f adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents: 1163
diff changeset
760
3a3ffc27813f adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents: 1163
diff changeset
761 return 0;
3a3ffc27813f adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents: 1163
diff changeset
762 }
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
763
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
764 CxIterator cxListIteratorAt(const CxList *list, size_t index) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
765 if (list == NULL) list = cxEmptyList;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
766 return list->cl->iterator(list, index, false);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
767 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
768
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
769 CxIterator cxListBackwardsIteratorAt(const CxList *list, size_t index) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
770 if (list == NULL) list = cxEmptyList;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
771 return list->cl->iterator(list, index, true);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
772 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
773
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
774 CxIterator cxListIterator(const CxList *list) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
775 if (list == NULL) list = cxEmptyList;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
776 return list->cl->iterator(list, 0, false);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
777 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
778
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
779 CxIterator cxListBackwardsIterator(const CxList *list) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
780 if (list == NULL) list = cxEmptyList;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
781 return list->cl->iterator(list, list->collection.size - 1, true);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
782 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
783
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
784 size_t cxListFind(const CxList *list, const void *elem) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
785 return list->cl->find_remove((CxList*)list, elem, false);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
786 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
787
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
788 bool cxListContains(const CxList* list, const void* elem) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
789 return list->cl->find_remove((CxList*)list, elem, false) < list->collection.size;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
790 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
791
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
792 bool cxListIndexValid(const CxList *list, size_t index) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
793 return index < list->collection.size;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
794 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
795
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
796 size_t cxListFindRemove(CxList *list, const void *elem) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
797 return list->cl->find_remove(list, elem, true);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
798 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
799
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
800 void cxListSort(CxList *list) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
801 if (list->collection.sorted) return;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
802 list->cl->sort(list);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
803 list->collection.sorted = true;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
804 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
805
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
806 void cxListReverse(CxList *list) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
807 // still sorted, but not according to the cmp_func
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
808 list->collection.sorted = false;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
809 list->cl->reverse(list);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
810 }
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
811
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
812 void cxListFree(CxList *list) {
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
813 if (list == NULL) return;
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
814 list->cl->deallocate(list);
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1423
diff changeset
815 }
1436
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
816
1453
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
817 static void cx_list_pop_uninitialized_elements(CxList *list, size_t n) {
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
818 cx_destructor_func destr_bak = list->collection.simple_destructor;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
819 cx_destructor_func2 destr2_bak = list->collection.advanced_destructor;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
820 list->collection.simple_destructor = NULL;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
821 list->collection.advanced_destructor = NULL;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
822 if (n == 1) {
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
823 cxListRemove(list, list->collection.size - 1);
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
824 } else {
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
825 cxListRemoveArray(list,list->collection.size - n, n);
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
826 }
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
827 list->collection.simple_destructor = destr_bak;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
828 list->collection.advanced_destructor = destr2_bak;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
829 }
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
830
1479
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
831 static void* cx_list_simple_clone_func(void *dst, const void *src, const CxAllocator *al, void *data) {
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
832 size_t elem_size = *(size_t*)data;
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
833 if (dst == NULL) dst = cxMalloc(al, elem_size);
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
834 if (dst != NULL) memcpy(dst, src, elem_size);
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
835 return dst;
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
836 }
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
837
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
838 #define use_simple_clone_func(list) cx_list_simple_clone_func, NULL, (void*)&((list)->collection.elem_size)
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
839
1444
dd9dcbb39c2f make clone functions return int instead of size_t
Mike Becker <universe@uap-core.de>
parents: 1436
diff changeset
840 int cxListClone(CxList *dst, const CxList *src, cx_clone_func clone_func,
1446
5732947cbcc2 default NULL allocator to cxDefaultAllocator
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
841 const CxAllocator *clone_allocator, void *data) {
5732947cbcc2 default NULL allocator to cxDefaultAllocator
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
842 if (clone_allocator == NULL) clone_allocator = cxDefaultAllocator;
1436
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
843
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
844 // remember the original size
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
845 size_t orig_size = dst->collection.size;
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
846
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
847 // first, try to allocate the memory in the new list
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
848 CxIterator empl_iter = cxListEmplaceArray(dst, src->collection.size);
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
849
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
850 // get an iterator over the source elements
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
851 CxIterator src_iter = cxListIterator(src);
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
852
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
853 // now clone the elements
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
854 size_t cloned = empl_iter.elem_count;
1449
bbca398783ed simplify clone implementations
Mike Becker <universe@uap-core.de>
parents: 1446
diff changeset
855 for (size_t i = 0 ; i < empl_iter.elem_count; i++) {
bbca398783ed simplify clone implementations
Mike Becker <universe@uap-core.de>
parents: 1446
diff changeset
856 void *src_elem = cxIteratorCurrent(src_iter);
bbca398783ed simplify clone implementations
Mike Becker <universe@uap-core.de>
parents: 1446
diff changeset
857 void **dest_memory = cxIteratorCurrent(empl_iter);
bbca398783ed simplify clone implementations
Mike Becker <universe@uap-core.de>
parents: 1446
diff changeset
858 void *target = cxCollectionStoresPointers(dst) ? NULL : dest_memory;
bbca398783ed simplify clone implementations
Mike Becker <universe@uap-core.de>
parents: 1446
diff changeset
859 void *dest_ptr = clone_func(target, src_elem, clone_allocator, data);
bbca398783ed simplify clone implementations
Mike Becker <universe@uap-core.de>
parents: 1446
diff changeset
860 if (dest_ptr == NULL) {
bbca398783ed simplify clone implementations
Mike Becker <universe@uap-core.de>
parents: 1446
diff changeset
861 cloned = i;
bbca398783ed simplify clone implementations
Mike Becker <universe@uap-core.de>
parents: 1446
diff changeset
862 break;
bbca398783ed simplify clone implementations
Mike Becker <universe@uap-core.de>
parents: 1446
diff changeset
863 }
bbca398783ed simplify clone implementations
Mike Becker <universe@uap-core.de>
parents: 1446
diff changeset
864 if (cxCollectionStoresPointers(dst)) {
1436
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
865 *dest_memory = dest_ptr;
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
866 }
1449
bbca398783ed simplify clone implementations
Mike Becker <universe@uap-core.de>
parents: 1446
diff changeset
867 cxIteratorNext(src_iter);
bbca398783ed simplify clone implementations
Mike Becker <universe@uap-core.de>
parents: 1446
diff changeset
868 cxIteratorNext(empl_iter);
1436
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
869 }
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
870
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
871 // if we could not clone everything, free the allocated memory
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
872 // (disable the destructors!)
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
873 if (cloned < src->collection.size) {
1453
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
874 cx_list_pop_uninitialized_elements(dst,
1436
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
875 dst->collection.size - cloned - orig_size);
1444
dd9dcbb39c2f make clone functions return int instead of size_t
Mike Becker <universe@uap-core.de>
parents: 1436
diff changeset
876 return 1;
1436
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
877 }
c331add0d9f8 add cxListClone() - resolves #744 except for test coverage
Mike Becker <universe@uap-core.de>
parents: 1433
diff changeset
878
1480
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
879 // set the sorted flag when we know it's sorted
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
880 if (orig_size == 0 && src->collection.sorted) {
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
881 dst->collection.sorted = true;
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
882 }
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
883
1444
dd9dcbb39c2f make clone functions return int instead of size_t
Mike Becker <universe@uap-core.de>
parents: 1436
diff changeset
884 return 0;
1446
5732947cbcc2 default NULL allocator to cxDefaultAllocator
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
885 }
1453
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
886
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
887 int cxListDifference(CxList *dst,
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
888 const CxList *minuend, const CxList *subtrahend,
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
889 cx_clone_func clone_func, const CxAllocator *clone_allocator, void *data) {
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
890 if (clone_allocator == NULL) clone_allocator = cxDefaultAllocator;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
891
1466
a58c65d31342 difference shall not check already present items in the destination - fixes #753
Mike Becker <universe@uap-core.de>
parents: 1463
diff changeset
892 // optimize for sorted collections
1453
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
893 if (cxCollectionSorted(minuend) && cxCollectionSorted(subtrahend)) {
1454
808688e304d5 cxListDifference() sets the sorted flag if it can guarantee that
Mike Becker <universe@uap-core.de>
parents: 1453
diff changeset
894 bool dst_was_empty = cxCollectionSize(dst) == 0;
808688e304d5 cxListDifference() sets the sorted flag if it can guarantee that
Mike Becker <universe@uap-core.de>
parents: 1453
diff changeset
895
1453
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
896 CxIterator min_iter = cxListIterator(minuend);
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
897 CxIterator sub_iter = cxListIterator(subtrahend);
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
898 while (cxIteratorValid(min_iter)) {
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
899 void *min_elem = cxIteratorCurrent(min_iter);
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
900 void *sub_elem;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
901 int d;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
902 if (cxIteratorValid(sub_iter)) {
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
903 sub_elem = cxIteratorCurrent(sub_iter);
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
904 cx_compare_func cmp = subtrahend->collection.cmpfunc;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
905 d = cmp(sub_elem, min_elem);
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
906 } else {
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
907 // no more elements in the subtrahend,
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
908 // i.e., the min_elem is larger than any elem of the subtrahend
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
909 d = 1;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
910 }
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
911 if (d == 0) {
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
912 // is contained, so skip it
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
913 cxIteratorNext(min_iter);
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
914 } else if (d < 0) {
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
915 // subtrahend is smaller than minuend,
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
916 // check the next element
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
917 cxIteratorNext(sub_iter);
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
918 } else {
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
919 // subtrahend is larger than the dst element,
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
920 // clone the minuend and advance
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
921 void **dst_mem = cxListEmplace(dst);
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
922 void *target = cxCollectionStoresPointers(dst) ? NULL : dst_mem;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
923 void* dst_ptr = clone_func(target, min_elem, clone_allocator, data);
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
924 if (dst_ptr == NULL) {
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
925 cx_list_pop_uninitialized_elements(dst, 1);
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
926 return 1;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
927 }
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
928 if (cxCollectionStoresPointers(dst)) {
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
929 *dst_mem = dst_ptr;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
930 }
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
931 cxIteratorNext(min_iter);
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
932 }
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
933 }
1454
808688e304d5 cxListDifference() sets the sorted flag if it can guarantee that
Mike Becker <universe@uap-core.de>
parents: 1453
diff changeset
934
808688e304d5 cxListDifference() sets the sorted flag if it can guarantee that
Mike Becker <universe@uap-core.de>
parents: 1453
diff changeset
935 // if dst was empty, it is now guaranteed to be sorted
808688e304d5 cxListDifference() sets the sorted flag if it can guarantee that
Mike Becker <universe@uap-core.de>
parents: 1453
diff changeset
936 dst->collection.sorted = dst_was_empty;
1453
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
937 } else {
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
938 CxIterator min_iter = cxListIterator(minuend);
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
939 cx_foreach(void *, elem, min_iter) {
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
940 if (cxListContains(subtrahend, elem)) {
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
941 continue;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
942 }
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
943 void **dst_mem = cxListEmplace(dst);
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
944 void *target = cxCollectionStoresPointers(dst) ? NULL : dst_mem;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
945 void* dst_ptr = clone_func(target, elem, clone_allocator, data);
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
946 if (dst_ptr == NULL) {
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
947 cx_list_pop_uninitialized_elements(dst, 1);
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
948 return 1;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
949 }
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
950 if (cxCollectionStoresPointers(dst)) {
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
951 *dst_mem = dst_ptr;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
952 }
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
953 }
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
954 }
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
955
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
956 return 0;
b6fc5b1d5c5d add implementation for cxListDifference() - issue #745
Mike Becker <universe@uap-core.de>
parents: 1449
diff changeset
957 }
1469
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
958
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
959 int cxListIntersection(CxList *dst,
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
960 const CxList *src, const CxList *other,
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
961 cx_clone_func clone_func, const CxAllocator *clone_allocator, void *data) {
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
962 if (clone_allocator == NULL) clone_allocator = cxDefaultAllocator;
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
963
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
964 // optimize for sorted collections
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
965 if (cxCollectionSorted(src) && cxCollectionSorted(other)) {
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
966 bool dst_was_empty = cxCollectionSize(dst) == 0;
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
967
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
968 CxIterator src_iter = cxListIterator(src);
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
969 CxIterator other_iter = cxListIterator(other);
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
970 while (cxIteratorValid(src_iter) && cxIteratorValid(other_iter)) {
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
971 void *src_elem = cxIteratorCurrent(src_iter);
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
972 void *other_elem = cxIteratorCurrent(other_iter);
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
973 int d = src->collection.cmpfunc(src_elem, other_elem);
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
974 if (d == 0) {
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
975 // is contained, clone it
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
976 void **dst_mem = cxListEmplace(dst);
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
977 void *target = cxCollectionStoresPointers(dst) ? NULL : dst_mem;
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
978 void* dst_ptr = clone_func(target, src_elem, clone_allocator, data);
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
979 if (dst_ptr == NULL) {
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
980 cx_list_pop_uninitialized_elements(dst, 1);
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
981 return 1;
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
982 }
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
983 if (cxCollectionStoresPointers(dst)) {
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
984 *dst_mem = dst_ptr;
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
985 }
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
986 cxIteratorNext(src_iter);
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
987 } else if (d < 0) {
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
988 // the other element is larger, skip the source element
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
989 cxIteratorNext(src_iter);
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
990 } else {
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
991 // the source element is larger, try to find it in the other list
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
992 cxIteratorNext(other_iter);
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
993 }
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
994 }
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
995
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
996 // if dst was empty, it is now guaranteed to be sorted
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
997 dst->collection.sorted = dst_was_empty;
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
998 } else {
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
999 CxIterator src_iter = cxListIterator(src);
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1000 cx_foreach(void *, elem, src_iter) {
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1001 if (!cxListContains(other, elem)) {
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1002 continue;
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1003 }
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1004 void **dst_mem = cxListEmplace(dst);
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1005 void *target = cxCollectionStoresPointers(dst) ? NULL : dst_mem;
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1006 void* dst_ptr = clone_func(target, elem, clone_allocator, data);
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1007 if (dst_ptr == NULL) {
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1008 cx_list_pop_uninitialized_elements(dst, 1);
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1009 return 1;
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1010 }
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1011 if (cxCollectionStoresPointers(dst)) {
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1012 *dst_mem = dst_ptr;
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1013 }
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1014 }
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1015 }
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1016
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1017 return 0;
9b2b40a3c9f0 implement cxListIntersection() - resolves #554
Mike Becker <universe@uap-core.de>
parents: 1466
diff changeset
1018 }
1477
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1019
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1020 int cxListUnion(CxList *dst,
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1021 const CxList *src, const CxList *other,
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1022 cx_clone_func clone_func, const CxAllocator *clone_allocator, void *data) {
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1023 if (clone_allocator == NULL) clone_allocator = cxDefaultAllocator;
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1024
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1025 // optimize for sorted collections
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1026 if (cxCollectionSorted(src) && cxCollectionSorted(other)) {
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1027 bool dst_was_empty = cxCollectionSize(dst) == 0;
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1028
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1029 CxIterator src_iter = cxListIterator(src);
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1030 CxIterator other_iter = cxListIterator(other);
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1031 while (cxIteratorValid(src_iter) || cxIteratorValid(other_iter)) {
1497
cd53fb8703c1 fix MSVC compilation error
Mike Becker <universe@uap-core.de>
parents: 1487
diff changeset
1032 void *src_elem = NULL, *other_elem = NULL;
1477
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1033 int d;
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1034 if (!cxIteratorValid(src_iter)) {
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1035 other_elem = cxIteratorCurrent(other_iter);
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1036 d = 1;
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1037 } else if (!cxIteratorValid(other_iter)) {
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1038 src_elem = cxIteratorCurrent(src_iter);
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1039 d = -1;
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1040 } else {
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1041 src_elem = cxIteratorCurrent(src_iter);
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1042 other_elem = cxIteratorCurrent(other_iter);
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1043 d = src->collection.cmpfunc(src_elem, other_elem);
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1044 }
1480
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1045 void *clone_from;
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1046 if (d < 0) {
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1047 // source element is smaller clone it
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1048 clone_from = src_elem;
1477
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1049 cxIteratorNext(src_iter);
1480
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1050 } else if (d == 0) {
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1051 // both elements are equal, clone from the source, skip other
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1052 clone_from = src_elem;
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1053 cxIteratorNext(src_iter);
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1054 cxIteratorNext(other_iter);
1477
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1055 } else {
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1056 // the other element is smaller, clone it
1480
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1057 clone_from = other_elem;
1477
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1058 cxIteratorNext(other_iter);
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1059 }
1480
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1060 void **dst_mem = cxListEmplace(dst);
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1061 void *target = cxCollectionStoresPointers(dst) ? NULL : dst_mem;
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1062 void* dst_ptr = clone_func(target, clone_from, clone_allocator, data);
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1063 if (dst_ptr == NULL) {
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1064 cx_list_pop_uninitialized_elements(dst, 1);
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1065 return 1;
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1066 }
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1067 if (cxCollectionStoresPointers(dst)) {
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1068 *dst_mem = dst_ptr;
83146195a1db add tests for simple clone functions
Mike Becker <universe@uap-core.de>
parents: 1479
diff changeset
1069 }
1477
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1070 }
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1071
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1072 // if dst was empty, it is now guaranteed to be sorted
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1073 dst->collection.sorted = dst_was_empty;
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1074 } else {
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1075 if (cxListClone(dst, src, clone_func, clone_allocator, data)) {
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1076 return 1;
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1077 }
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1078 CxIterator other_iter = cxListIterator(other);
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1079 cx_foreach(void *, elem, other_iter) {
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1080 if (cxListContains(src, elem)) {
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1081 continue;
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1082 }
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1083 void **dst_mem = cxListEmplace(dst);
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1084 void *target = cxCollectionStoresPointers(dst) ? NULL : dst_mem;
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1085 void* dst_ptr = clone_func(target, elem, clone_allocator, data);
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1086 if (dst_ptr == NULL) {
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1087 cx_list_pop_uninitialized_elements(dst, 1);
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1088 return 1;
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1089 }
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1090 if (cxCollectionStoresPointers(dst)) {
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1091 *dst_mem = dst_ptr;
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1092 }
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1093 }
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1094 }
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1095
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1096 return 0;
9170a7dff573 implement cxListUnion() - resolves #755
Mike Becker <universe@uap-core.de>
parents: 1469
diff changeset
1097 }
1479
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
1098
1604
68b75c091028 rename the "simple" cloning functions from Simple to Shallow
Mike Becker <universe@uap-core.de>
parents: 1497
diff changeset
1099 int cxListCloneShallow(CxList *dst, const CxList *src) {
1479
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
1100 return cxListClone(dst, src, use_simple_clone_func(src));
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
1101 }
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
1102
1604
68b75c091028 rename the "simple" cloning functions from Simple to Shallow
Mike Becker <universe@uap-core.de>
parents: 1497
diff changeset
1103 int cxListDifferenceShallow(CxList *dst, const CxList *minuend, const CxList *subtrahend) {
1479
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
1104 return cxListDifference(dst, minuend, subtrahend, use_simple_clone_func(minuend));
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
1105 }
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
1106
1604
68b75c091028 rename the "simple" cloning functions from Simple to Shallow
Mike Becker <universe@uap-core.de>
parents: 1497
diff changeset
1107 int cxListIntersectionShallow(CxList *dst, const CxList *src, const CxList *other) {
1479
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
1108 return cxListIntersection(dst, src, other, use_simple_clone_func(src));
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
1109 }
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
1110
1604
68b75c091028 rename the "simple" cloning functions from Simple to Shallow
Mike Becker <universe@uap-core.de>
parents: 1497
diff changeset
1111 int cxListUnionShallow(CxList *dst, const CxList *src, const CxList *other) {
1479
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
1112 return cxListUnion(dst, src, other, use_simple_clone_func(src));
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1477
diff changeset
1113 }
1482
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
1114
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
1115 int cxListReserve(CxList *list, size_t capacity) {
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
1116 if (list->cl->change_capacity == NULL) {
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
1117 return 0;
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
1118 }
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
1119 if (capacity <= cxCollectionSize(list)) {
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
1120 return 0;
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
1121 }
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
1122 return list->cl->change_capacity(list, capacity);
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
1123 }
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
1124
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
1125 int cxListShrink(CxList *list) {
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
1126 if (list->cl->change_capacity == NULL) {
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
1127 return 0;
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
1128 }
6769cb72521b implement a new allocation strategy for array lists and add cxListReserve() and cxListShrink()
Mike Becker <universe@uap-core.de>
parents: 1480
diff changeset
1129 return list->cl->change_capacity(list, cxCollectionSize(list));
1487
0ff535033b78 fix missing newline at end of list.c (-Wnewline-eof complains about that)
Mike Becker <universe@uap-core.de>
parents: 1485
diff changeset
1130 }

mercurial