src/list.c

Sun, 14 Jan 2024 13:50:17 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 14 Jan 2024 13:50:17 +0100
changeset 806
e06249e09f99
parent 802
30473af255b4
child 853
d4baf4dd55c3
permissions
-rw-r--r--

add constant for reading out strstr sbo size - relates to #343

also fixes the related test which was working with the old SBO size of 256 and was broken after increasing it to 512

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>
55cc3b373c5e simplify list class - fixes #236
Mike Becker <universe@uap-core.de>
parents: 630
diff changeset
32
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
33 // <editor-fold desc="Store Pointers Functionality">
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
34
677
b09aae58bba4 refactoring of collections to make use of destructors in map implementations
Mike Becker <universe@uap-core.de>
parents: 666
diff changeset
35 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
36
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
37 static int cx_pl_cmpfunc(
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
38 void const *l,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
39 void const *r
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
40 ) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
41 void *const *lptr = l;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
42 void *const *rptr = r;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
43 void const *left = lptr == NULL ? NULL : *lptr;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
44 void const *right = rptr == NULL ? NULL : *rptr;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
45 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
46 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
47
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
48 static void cx_pl_hack_cmpfunc(struct cx_list_s const *list) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
49 // cast away const - this is the hacky thing
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
50 struct cx_list_s *l = (struct cx_list_s *) list;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
51 cx_pl_cmpfunc_impl = l->cmpfunc;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
52 l->cmpfunc = cx_pl_cmpfunc;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
53 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
54
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
55 static void cx_pl_unhack_cmpfunc(struct cx_list_s const *list) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
56 // cast away const - this is the hacky thing
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
57 struct cx_list_s *l = (struct cx_list_s *) list;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
58 l->cmpfunc = cx_pl_cmpfunc_impl;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
59 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
60
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
61 static void cx_pl_destructor(struct cx_list_s *list) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
62 list->climpl->destructor(list);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
63 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
64
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
65 static int cx_pl_insert_element(
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
66 struct cx_list_s *list,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
67 size_t index,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
68 void const *element
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 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
71 }
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 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
74 struct cx_list_s *list,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
75 size_t index,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
76 void const *array,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
77 size_t n
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_array(list, index, array, n);
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 int cx_pl_insert_iter(
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
83 struct cx_mut_iterator_s *iter,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
84 void const *elem,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
85 int prepend
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
86 ) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
87 struct cx_list_s *list = iter->src_handle;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
88 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
89 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
90
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
91 static int cx_pl_remove(
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
92 struct cx_list_s *list,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
93 size_t index
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
94 ) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
95 return list->climpl->remove(list, index);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
96 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
97
664
af5bf4603a5d add cxListClear and fix missing destructor invocations - #241 #246
Mike Becker <universe@uap-core.de>
parents: 655
diff changeset
98 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
99 list->climpl->clear(list);
af5bf4603a5d add cxListClear and fix missing destructor invocations - #241 #246
Mike Becker <universe@uap-core.de>
parents: 655
diff changeset
100 }
af5bf4603a5d add cxListClear and fix missing destructor invocations - #241 #246
Mike Becker <universe@uap-core.de>
parents: 655
diff changeset
101
647
2e6e9d9f2159 implement swap function for list elements - fixes #218
Mike Becker <universe@uap-core.de>
parents: 641
diff changeset
102 static int cx_pl_swap(
2e6e9d9f2159 implement swap function for list elements - fixes #218
Mike Becker <universe@uap-core.de>
parents: 641
diff changeset
103 struct cx_list_s *list,
2e6e9d9f2159 implement swap function for list elements - fixes #218
Mike Becker <universe@uap-core.de>
parents: 641
diff changeset
104 size_t i,
2e6e9d9f2159 implement swap function for list elements - fixes #218
Mike Becker <universe@uap-core.de>
parents: 641
diff changeset
105 size_t j
2e6e9d9f2159 implement swap function for list elements - fixes #218
Mike Becker <universe@uap-core.de>
parents: 641
diff changeset
106 ) {
2e6e9d9f2159 implement swap function for list elements - fixes #218
Mike Becker <universe@uap-core.de>
parents: 641
diff changeset
107 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
108 }
2e6e9d9f2159 implement swap function for list elements - fixes #218
Mike Becker <universe@uap-core.de>
parents: 641
diff changeset
109
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
110 static void *cx_pl_at(
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
111 struct cx_list_s const *list,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
112 size_t index
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
113 ) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
114 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
115 return ptr == NULL ? NULL : *ptr;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
116 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
117
764
ccbdbd088455 add cxListFindRemove and cx_linked_list_find_node
Mike Becker <universe@uap-core.de>
parents: 708
diff changeset
118 static ssize_t cx_pl_find_remove(
ccbdbd088455 add cxListFindRemove and cx_linked_list_find_node
Mike Becker <universe@uap-core.de>
parents: 708
diff changeset
119 struct cx_list_s *list,
ccbdbd088455 add cxListFindRemove and cx_linked_list_find_node
Mike Becker <universe@uap-core.de>
parents: 708
diff changeset
120 void const *elem,
ccbdbd088455 add cxListFindRemove and cx_linked_list_find_node
Mike Becker <universe@uap-core.de>
parents: 708
diff changeset
121 bool remove
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
122 ) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
123 cx_pl_hack_cmpfunc(list);
764
ccbdbd088455 add cxListFindRemove and cx_linked_list_find_node
Mike Becker <universe@uap-core.de>
parents: 708
diff changeset
124 ssize_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
125 cx_pl_unhack_cmpfunc(list);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
126 return ret;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
127 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
128
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
129 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
130 cx_pl_hack_cmpfunc(list);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
131 list->climpl->sort(list);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
132 cx_pl_unhack_cmpfunc(list);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
133 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
134
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
135 static int cx_pl_compare(
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
136 struct cx_list_s const *list,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
137 struct cx_list_s const *other
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
138 ) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
139 cx_pl_hack_cmpfunc(list);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
140 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
141 cx_pl_unhack_cmpfunc(list);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
142 return ret;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
143 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
144
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
145 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
146 list->climpl->reverse(list);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
147 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
148
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
149 static void *cx_pl_iter_current(void const *it) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
150 struct cx_iterator_s const *iter = it;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
151 void **ptr = iter->base.current_impl(it);
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
152 return ptr == NULL ? NULL : *ptr;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
153 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
154
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
155 static struct cx_iterator_s cx_pl_iterator(
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
156 struct cx_list_s const *list,
655
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
157 size_t index,
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
158 bool backwards
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
159 ) {
655
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
160 struct cx_iterator_s iter = list->climpl->iterator(list, index, backwards);
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
161 iter.base.current_impl = iter.base.current;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
162 iter.base.current = cx_pl_iter_current;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
163 return iter;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
164 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
165
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
166 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
167 cx_pl_destructor,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
168 cx_pl_insert_element,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
169 cx_pl_insert_array,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
170 cx_pl_insert_iter,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
171 cx_pl_remove,
664
af5bf4603a5d add cxListClear and fix missing destructor invocations - #241 #246
Mike Becker <universe@uap-core.de>
parents: 655
diff changeset
172 cx_pl_clear,
647
2e6e9d9f2159 implement swap function for list elements - fixes #218
Mike Becker <universe@uap-core.de>
parents: 641
diff changeset
173 cx_pl_swap,
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
174 cx_pl_at,
764
ccbdbd088455 add cxListFindRemove and cx_linked_list_find_node
Mike Becker <universe@uap-core.de>
parents: 708
diff changeset
175 cx_pl_find_remove,
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
176 cx_pl_sort,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
177 cx_pl_compare,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
178 cx_pl_reverse,
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
179 cx_pl_iterator,
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
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
182 void cxListStoreObjects(CxList *list) {
677
b09aae58bba4 refactoring of collections to make use of destructors in map implementations
Mike Becker <universe@uap-core.de>
parents: 666
diff changeset
183 list->store_pointer = false;
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
184 if (list->climpl != NULL) {
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
185 list->cl = list->climpl;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
186 list->climpl = NULL;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
187 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
188 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
189
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
190 void cxListStorePointers(CxList *list) {
677
b09aae58bba4 refactoring of collections to make use of destructors in map implementations
Mike Becker <universe@uap-core.de>
parents: 666
diff changeset
191 list->item_size = sizeof(void *);
b09aae58bba4 refactoring of collections to make use of destructors in map implementations
Mike Becker <universe@uap-core.de>
parents: 666
diff changeset
192 list->store_pointer = true;
641
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
193 list->climpl = list->cl;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
194 list->cl = &cx_pointer_list_class;
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
195 }
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
196
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
197 // </editor-fold>
d402fead3386 add new pointer list wrapper - resolves #234
Mike Becker <universe@uap-core.de>
parents: 640
diff changeset
198
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
199 // <editor-fold desc="empty list implementation">
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
200
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
201 static void cx_emptyl_noop(__attribute__((__unused__)) CxList *list) {
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
202 // 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
203 }
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
204
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
205 static void *cx_emptyl_at(
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
206 __attribute__((__unused__)) struct cx_list_s const *list,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
207 __attribute__((__unused__)) size_t index
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
208 ) {
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
209 return NULL;
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
210 }
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
211
764
ccbdbd088455 add cxListFindRemove and cx_linked_list_find_node
Mike Becker <universe@uap-core.de>
parents: 708
diff changeset
212 static ssize_t cx_emptyl_find_remove(
ccbdbd088455 add cxListFindRemove and cx_linked_list_find_node
Mike Becker <universe@uap-core.de>
parents: 708
diff changeset
213 __attribute__((__unused__)) struct cx_list_s *list,
ccbdbd088455 add cxListFindRemove and cx_linked_list_find_node
Mike Becker <universe@uap-core.de>
parents: 708
diff changeset
214 __attribute__((__unused__)) void const *elem,
ccbdbd088455 add cxListFindRemove and cx_linked_list_find_node
Mike Becker <universe@uap-core.de>
parents: 708
diff changeset
215 __attribute__((__unused__)) bool remove
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
216 ) {
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
217 return -1;
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
218 }
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
219
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
220 static int cx_emptyl_compare(
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
221 __attribute__((__unused__)) struct cx_list_s const *list,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
222 struct cx_list_s const *other
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
223 ) {
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
224 if (other->size == 0) return 0;
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
225 return -1;
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
226 }
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
227
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
228 static bool cx_emptyl_iter_valid(__attribute__((__unused__)) void const *iter) {
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
229 return false;
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
230 }
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 static CxIterator cx_emptyl_iterator(
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
233 struct cx_list_s const *list,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
234 size_t index,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
235 __attribute__((__unused__)) bool backwards
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 CxIterator iter = {0};
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
238 iter.src_handle = list;
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
239 iter.index = index;
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
240 iter.base.valid = cx_emptyl_iter_valid;
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
241 return iter;
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
242 }
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
243
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
244 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
245 cx_emptyl_noop,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
246 NULL,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
247 NULL,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
248 NULL,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
249 NULL,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
250 cx_emptyl_noop,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
251 NULL,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
252 cx_emptyl_at,
764
ccbdbd088455 add cxListFindRemove and cx_linked_list_find_node
Mike Becker <universe@uap-core.de>
parents: 708
diff changeset
253 cx_emptyl_find_remove,
704
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
254 cx_emptyl_noop,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
255 cx_emptyl_compare,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
256 cx_emptyl_noop,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
257 cx_emptyl_iterator,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
258 };
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
259
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
260 CxList cx_empty_list = {
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
261 NULL,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
262 NULL,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
263 0,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
264 0,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
265 NULL,
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 false,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
269 &cx_empty_list_class,
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
270 NULL
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
271 };
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
272
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
273 CxList *const cxEmptyList = &cx_empty_list;
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
274
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
275 // </editor-fold>
35f06c5eeb0e add empty list implementation - fixes #258
Mike Becker <universe@uap-core.de>
parents: 699
diff changeset
276
677
b09aae58bba4 refactoring of collections to make use of destructors in map implementations
Mike Becker <universe@uap-core.de>
parents: 666
diff changeset
277 void cxListDestroy(CxList *list) {
524
e98b09018d32 remove list destructor
Mike Becker <universe@uap-core.de>
parents: 519
diff changeset
278 list->cl->destructor(list);
503
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents:
diff changeset
279 }
618
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
280
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
281 int cxListCompare(
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
282 CxList const *list,
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
283 CxList const *other
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
284 ) {
705
0d5447230044 fix cxListCompare if-condition
Mike Becker <universe@uap-core.de>
parents: 704
diff changeset
285 if (
0d5447230044 fix cxListCompare if-condition
Mike Becker <universe@uap-core.de>
parents: 704
diff changeset
286 // if one is storing pointers but the other is not
0d5447230044 fix cxListCompare if-condition
Mike Becker <universe@uap-core.de>
parents: 704
diff changeset
287 (list->store_pointer ^ other->store_pointer) ||
0d5447230044 fix cxListCompare if-condition
Mike Becker <universe@uap-core.de>
parents: 704
diff changeset
288
0d5447230044 fix cxListCompare if-condition
Mike Becker <universe@uap-core.de>
parents: 704
diff changeset
289 // if one class is wrapped but the other is not
0d5447230044 fix cxListCompare if-condition
Mike Becker <universe@uap-core.de>
parents: 704
diff changeset
290 ((list->climpl == NULL) ^ (other->climpl == NULL)) ||
0d5447230044 fix cxListCompare if-condition
Mike Becker <universe@uap-core.de>
parents: 704
diff changeset
291
0d5447230044 fix cxListCompare if-condition
Mike Becker <universe@uap-core.de>
parents: 704
diff changeset
292 // if the resolved compare functions are not the same
680
19379743e5a0 fix wrong operator precedence in destructor macros
Mike Becker <universe@uap-core.de>
parents: 677
diff changeset
293 ((list->climpl != NULL ? list->climpl->compare : list->cl->compare) !=
705
0d5447230044 fix cxListCompare if-condition
Mike Becker <universe@uap-core.de>
parents: 704
diff changeset
294 (other->climpl != NULL ? other->climpl->compare : other->cl->compare))
0d5447230044 fix cxListCompare if-condition
Mike Becker <universe@uap-core.de>
parents: 704
diff changeset
295 ) {
680
19379743e5a0 fix wrong operator precedence in destructor macros
Mike Becker <universe@uap-core.de>
parents: 677
diff changeset
296 // lists are definitely different - cannot use internal compare function
618
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
297 if (list->size == other->size) {
776
874cc78cdffd fix accidental generation of cxListIterator() symbol
Mike Becker <universe@uap-core.de>
parents: 764
diff changeset
298 CxIterator left = list->cl->iterator(list, 0, false);
802
30473af255b4 fix #356 : broken cxListCompare
Mike Becker <universe@uap-core.de>
parents: 776
diff changeset
299 CxIterator right = other->cl->iterator(other, 0, false);
618
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
300 for (size_t i = 0; i < list->size; i++) {
630
ac5e7f789048 separate iterators and mutating iterators
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
301 void *leftValue = cxIteratorCurrent(left);
ac5e7f789048 separate iterators and mutating iterators
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
302 void *rightValue = cxIteratorCurrent(right);
618
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
303 int d = list->cmpfunc(leftValue, rightValue);
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
304 if (d != 0) {
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
305 return d;
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
306 }
630
ac5e7f789048 separate iterators and mutating iterators
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
307 cxIteratorNext(left);
ac5e7f789048 separate iterators and mutating iterators
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
308 cxIteratorNext(right);
618
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
309 }
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
310 return 0;
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
311 } else {
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
312 return list->size < other->size ? -1 : 1;
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
313 }
680
19379743e5a0 fix wrong operator precedence in destructor macros
Mike Becker <universe@uap-core.de>
parents: 677
diff changeset
314 } else {
19379743e5a0 fix wrong operator precedence in destructor macros
Mike Becker <universe@uap-core.de>
parents: 677
diff changeset
315 // lists are compatible
19379743e5a0 fix wrong operator precedence in destructor macros
Mike Becker <universe@uap-core.de>
parents: 677
diff changeset
316 return list->cl->compare(list, other);
618
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
317 }
1f5a8f6f3015 #219 array list: implement compare
Mike Becker <universe@uap-core.de>
parents: 528
diff changeset
318 }
640
55cc3b373c5e simplify list class - fixes #236
Mike Becker <universe@uap-core.de>
parents: 630
diff changeset
319
655
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
320 CxMutIterator cxListMutIteratorAt(
640
55cc3b373c5e simplify list class - fixes #236
Mike Becker <universe@uap-core.de>
parents: 630
diff changeset
321 CxList *list,
55cc3b373c5e simplify list class - fixes #236
Mike Becker <universe@uap-core.de>
parents: 630
diff changeset
322 size_t index
55cc3b373c5e simplify list class - fixes #236
Mike Becker <universe@uap-core.de>
parents: 630
diff changeset
323 ) {
655
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
324 CxIterator it = list->cl->iterator(list, index, false);
640
55cc3b373c5e simplify list class - fixes #236
Mike Becker <universe@uap-core.de>
parents: 630
diff changeset
325 it.base.mutating = true;
55cc3b373c5e simplify list class - fixes #236
Mike Becker <universe@uap-core.de>
parents: 630
diff changeset
326
55cc3b373c5e simplify list class - fixes #236
Mike Becker <universe@uap-core.de>
parents: 630
diff changeset
327 // we know the iterators share the same memory layout
55cc3b373c5e simplify list class - fixes #236
Mike Becker <universe@uap-core.de>
parents: 630
diff changeset
328 CxMutIterator iter;
55cc3b373c5e simplify list class - fixes #236
Mike Becker <universe@uap-core.de>
parents: 630
diff changeset
329 memcpy(&iter, &it, sizeof(CxMutIterator));
55cc3b373c5e simplify list class - fixes #236
Mike Becker <universe@uap-core.de>
parents: 630
diff changeset
330 return iter;
55cc3b373c5e simplify list class - fixes #236
Mike Becker <universe@uap-core.de>
parents: 630
diff changeset
331 }
655
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
332
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
333 CxMutIterator cxListMutBackwardsIteratorAt(
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
334 CxList *list,
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
335 size_t index
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
336 ) {
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
337 CxIterator it = list->cl->iterator(list, index, true);
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
338 it.base.mutating = true;
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
339
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
340 // we know the iterators share the same memory layout
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
341 CxMutIterator iter;
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
342 memcpy(&iter, &it, sizeof(CxMutIterator));
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
343 return iter;
7340c4255f1f implement backwards iterator - fixes #238
Mike Becker <universe@uap-core.de>
parents: 647
diff changeset
344 }

mercurial