Sun, 23 Nov 2025 13:15:19 +0100
optimize sorted insertion by using the infimum instead of the supremum
The reason is that the supremum returns the equal element with the smallest index, and we want the largest.
Therefore, we use the infimum, which already gives us the largest index when there are equal elements, and increase the index by one. The infimum is also guaranteed to exist in that case.
|
706
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1 | /* |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
3 | * |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
4 | * Copyright 2023 Mike Becker, Olaf Wintermann All rights reserved. |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
5 | * |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
8 | * |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
11 | * |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
15 | * |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
8c6edaccaef1
add empty map implementation - fixes #259
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 |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
27 | */ |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
28 | |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
29 | #include "cx/map.h" |
|
709
1e8ba59e7911
simplify map class structure
Mike Becker <universe@uap-core.de>
parents:
706
diff
changeset
|
30 | #include <string.h> |
|
706
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
31 | |
|
1445
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
32 | #include "cx/list.h" |
|
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
33 | |
|
706
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
34 | // <editor-fold desc="empty map implementation"> |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
35 | |
|
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
890
diff
changeset
|
36 | static void cx_empty_map_noop(cx_attr_unused CxMap *map) { |
|
706
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
37 | // this is a noop, but MUST be implemented |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
38 | } |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
39 | |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
40 | static void *cx_empty_map_get( |
|
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
890
diff
changeset
|
41 | cx_attr_unused const CxMap *map, |
|
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
890
diff
changeset
|
42 | cx_attr_unused CxHashKey key |
|
706
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
43 | ) { |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
44 | return NULL; |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
45 | } |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
46 | |
|
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
890
diff
changeset
|
47 | static bool cx_empty_map_iter_valid(cx_attr_unused const void *iter) { |
|
706
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
48 | return false; |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
49 | } |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
50 | |
|
1115
6db21dee4929
create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents:
1109
diff
changeset
|
51 | static CxMapIterator cx_empty_map_iterator( |
|
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
854
diff
changeset
|
52 | const struct cx_map_s *map, |
|
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
890
diff
changeset
|
53 | cx_attr_unused enum cx_map_iterator_type type |
|
709
1e8ba59e7911
simplify map class structure
Mike Becker <universe@uap-core.de>
parents:
706
diff
changeset
|
54 | ) { |
|
1115
6db21dee4929
create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents:
1109
diff
changeset
|
55 | CxMapIterator iter = {0}; |
|
1429
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
Mike Becker <universe@uap-core.de>
parents:
1426
diff
changeset
|
56 | iter.map = (CxMap*) map; |
|
854
fe0d69d72bcd
fix members inherited by macro or include are not documented
Mike Becker <universe@uap-core.de>
parents:
853
diff
changeset
|
57 | iter.base.valid = cx_empty_map_iter_valid; |
|
706
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
58 | return iter; |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
59 | } |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
60 | |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
61 | static struct cx_map_class_s cx_empty_map_class = { |
|
709
1e8ba59e7911
simplify map class structure
Mike Becker <universe@uap-core.de>
parents:
706
diff
changeset
|
62 | cx_empty_map_noop, |
|
1e8ba59e7911
simplify map class structure
Mike Becker <universe@uap-core.de>
parents:
706
diff
changeset
|
63 | cx_empty_map_noop, |
|
1e8ba59e7911
simplify map class structure
Mike Becker <universe@uap-core.de>
parents:
706
diff
changeset
|
64 | NULL, |
|
1e8ba59e7911
simplify map class structure
Mike Becker <universe@uap-core.de>
parents:
706
diff
changeset
|
65 | cx_empty_map_get, |
|
1e8ba59e7911
simplify map class structure
Mike Becker <universe@uap-core.de>
parents:
706
diff
changeset
|
66 | NULL, |
|
1e8ba59e7911
simplify map class structure
Mike Becker <universe@uap-core.de>
parents:
706
diff
changeset
|
67 | cx_empty_map_iterator |
|
706
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
68 | }; |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
69 | |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
70 | CxMap cx_empty_map = { |
|
1163
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents:
1115
diff
changeset
|
71 | { |
|
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents:
1115
diff
changeset
|
72 | NULL, |
|
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents:
1115
diff
changeset
|
73 | NULL, |
|
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents:
1115
diff
changeset
|
74 | 0, |
|
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents:
1115
diff
changeset
|
75 | 0, |
|
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents:
1115
diff
changeset
|
76 | NULL, |
|
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents:
1115
diff
changeset
|
77 | NULL, |
|
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents:
1115
diff
changeset
|
78 | NULL, |
|
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents:
1115
diff
changeset
|
79 | false, |
|
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents:
1115
diff
changeset
|
80 | true |
|
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents:
1115
diff
changeset
|
81 | }, |
|
68ff0839bc6a
optimize cx_arl_find_remove for sorted arrays - fixes #547
Mike Becker <universe@uap-core.de>
parents:
1115
diff
changeset
|
82 | &cx_empty_map_class |
|
706
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
83 | }; |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
84 | |
|
709
1e8ba59e7911
simplify map class structure
Mike Becker <universe@uap-core.de>
parents:
706
diff
changeset
|
85 | CxMap *const cxEmptyMap = &cx_empty_map; |
|
706
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
86 | |
|
8c6edaccaef1
add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
87 | // </editor-fold> |
|
709
1e8ba59e7911
simplify map class structure
Mike Becker <universe@uap-core.de>
parents:
706
diff
changeset
|
88 | |
|
1426
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
89 | void cxMapClear(CxMap *map) { |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
90 | map->cl->clear(map); |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
91 | } |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
92 | |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
93 | size_t cxMapSize(const CxMap *map) { |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
94 | return map->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:
1345
diff
changeset
|
95 | } |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
96 | |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
97 | CxMapIterator cxMapIteratorValues(const CxMap *map) { |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
98 | if (map == NULL) map = cxEmptyMap; |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
99 | return map->cl->iterator(map, CX_MAP_ITERATOR_VALUES); |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
100 | } |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
101 | |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
102 | CxMapIterator cxMapIteratorKeys(const CxMap *map) { |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
103 | if (map == NULL) map = cxEmptyMap; |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
104 | return map->cl->iterator(map, CX_MAP_ITERATOR_KEYS); |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
105 | } |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
106 | |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
107 | CxMapIterator cxMapIterator(const CxMap *map) { |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
108 | if (map == NULL) map = cxEmptyMap; |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
109 | return map->cl->iterator(map, CX_MAP_ITERATOR_PAIRS); |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
110 | } |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
111 | |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
112 | int cx_map_put(CxMap *map, CxHashKey key, void *value) { |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
113 | return map->cl->put(map, key, value) == NULL; |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
114 | } |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
115 | |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
116 | void *cx_map_emplace(CxMap *map, CxHashKey key) { |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
117 | return map->cl->put(map, key, NULL); |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
118 | } |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
119 | |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
120 | void *cx_map_get(const CxMap *map, CxHashKey key) { |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
121 | return map->cl->get(map, key); |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
122 | } |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
123 | |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
124 | int cx_map_remove(CxMap *map, CxHashKey key, 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:
1345
diff
changeset
|
125 | return map->cl->remove(map, key, targetbuf); |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
126 | } |
|
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents:
1345
diff
changeset
|
127 | |
|
1109
89ec23988b88
free functions should not be inline in release mode - relates to #541
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
128 | void cxMapFree(CxMap *map) { |
|
89ec23988b88
free functions should not be inline in release mode - relates to #541
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
129 | if (map == NULL) return; |
|
89ec23988b88
free functions should not be inline in release mode - relates to #541
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
130 | map->cl->deallocate(map); |
|
89ec23988b88
free functions should not be inline in release mode - relates to #541
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
131 | } |
|
1437
dde4903c0fd7
untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents:
1429
diff
changeset
|
132 | |
|
1438
2ca9e03ceeec
add destruction of uninitialized entries on allocation failure to cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents:
1437
diff
changeset
|
133 | static void cx_map_remove_uninitialized_entry(CxMap *map, CxHashKey key) { |
|
2ca9e03ceeec
add destruction of uninitialized entries on allocation failure to cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents:
1437
diff
changeset
|
134 | cx_destructor_func destr_bak = map->collection.simple_destructor; |
|
2ca9e03ceeec
add destruction of uninitialized entries on allocation failure to cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents:
1437
diff
changeset
|
135 | cx_destructor_func2 destr2_bak = map->collection.advanced_destructor; |
|
2ca9e03ceeec
add destruction of uninitialized entries on allocation failure to cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents:
1437
diff
changeset
|
136 | map->collection.simple_destructor = NULL; |
|
2ca9e03ceeec
add destruction of uninitialized entries on allocation failure to cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents:
1437
diff
changeset
|
137 | map->collection.advanced_destructor = NULL; |
|
2ca9e03ceeec
add destruction of uninitialized entries on allocation failure to cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents:
1437
diff
changeset
|
138 | cxMapRemove(map, key); |
|
2ca9e03ceeec
add destruction of uninitialized entries on allocation failure to cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents:
1437
diff
changeset
|
139 | map->collection.simple_destructor = destr_bak; |
|
2ca9e03ceeec
add destruction of uninitialized entries on allocation failure to cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents:
1437
diff
changeset
|
140 | map->collection.advanced_destructor = destr2_bak; |
|
2ca9e03ceeec
add destruction of uninitialized entries on allocation failure to cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents:
1437
diff
changeset
|
141 | } |
|
2ca9e03ceeec
add destruction of uninitialized entries on allocation failure to cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents:
1437
diff
changeset
|
142 | |
|
1479
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
143 | static void* cx_map_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:
1474
diff
changeset
|
144 | size_t elem_size = *(size_t*)data; |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
145 | if (dst == NULL) dst = cxMalloc(al, elem_size); |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
146 | if (dst != NULL) memcpy(dst, src, elem_size); |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
147 | return dst; |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
148 | } |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
149 | |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
150 | #define use_simple_clone_func(map) cx_map_simple_clone_func, NULL, (void*)&((map)->collection.elem_size) |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
151 | |
|
1444
dd9dcbb39c2f
make clone functions return int instead of size_t
Mike Becker <universe@uap-core.de>
parents:
1438
diff
changeset
|
152 | int cxMapClone(CxMap *dst, const CxMap *src, cx_clone_func clone_func, |
|
1437
dde4903c0fd7
untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents:
1429
diff
changeset
|
153 | const CxAllocator *clone_allocator, void *data) { |
|
1446
5732947cbcc2
default NULL allocator to cxDefaultAllocator
Mike Becker <universe@uap-core.de>
parents:
1445
diff
changeset
|
154 | if (clone_allocator == NULL) clone_allocator = cxDefaultAllocator; |
|
1437
dde4903c0fd7
untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents:
1429
diff
changeset
|
155 | CxMapIterator src_iter = cxMapIterator(src); |
|
1449
bbca398783ed
simplify clone implementations
Mike Becker <universe@uap-core.de>
parents:
1446
diff
changeset
|
156 | for (size_t i = 0; i < cxMapSize(src); i++) { |
|
bbca398783ed
simplify clone implementations
Mike Becker <universe@uap-core.de>
parents:
1446
diff
changeset
|
157 | const CxMapEntry *entry = cxIteratorCurrent(src_iter); |
|
bbca398783ed
simplify clone implementations
Mike Becker <universe@uap-core.de>
parents:
1446
diff
changeset
|
158 | void **dst_mem = cxMapEmplace(dst, *(entry->key)); |
|
bbca398783ed
simplify clone implementations
Mike Becker <universe@uap-core.de>
parents:
1446
diff
changeset
|
159 | if (dst_mem == NULL) { |
|
1450
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
160 | return 1; // LCOV_EXCL_LINE |
|
1449
bbca398783ed
simplify clone implementations
Mike Becker <universe@uap-core.de>
parents:
1446
diff
changeset
|
161 | } |
|
bbca398783ed
simplify clone implementations
Mike Becker <universe@uap-core.de>
parents:
1446
diff
changeset
|
162 | void *target = cxCollectionStoresPointers(dst) ? NULL : dst_mem; |
|
bbca398783ed
simplify clone implementations
Mike Becker <universe@uap-core.de>
parents:
1446
diff
changeset
|
163 | void *dst_ptr = clone_func(target, entry->value, clone_allocator, data); |
|
bbca398783ed
simplify clone implementations
Mike Becker <universe@uap-core.de>
parents:
1446
diff
changeset
|
164 | if (dst_ptr == NULL) { |
|
bbca398783ed
simplify clone implementations
Mike Becker <universe@uap-core.de>
parents:
1446
diff
changeset
|
165 | cx_map_remove_uninitialized_entry(dst, *(entry->key)); |
|
bbca398783ed
simplify clone implementations
Mike Becker <universe@uap-core.de>
parents:
1446
diff
changeset
|
166 | return 1; |
|
bbca398783ed
simplify clone implementations
Mike Becker <universe@uap-core.de>
parents:
1446
diff
changeset
|
167 | } |
|
bbca398783ed
simplify clone implementations
Mike Becker <universe@uap-core.de>
parents:
1446
diff
changeset
|
168 | if (cxCollectionStoresPointers(dst)) { |
|
1437
dde4903c0fd7
untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents:
1429
diff
changeset
|
169 | *dst_mem = dst_ptr; |
|
dde4903c0fd7
untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents:
1429
diff
changeset
|
170 | } |
|
1449
bbca398783ed
simplify clone implementations
Mike Becker <universe@uap-core.de>
parents:
1446
diff
changeset
|
171 | cxIteratorNext(src_iter); |
|
1437
dde4903c0fd7
untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents:
1429
diff
changeset
|
172 | } |
|
1444
dd9dcbb39c2f
make clone functions return int instead of size_t
Mike Becker <universe@uap-core.de>
parents:
1438
diff
changeset
|
173 | return 0; |
|
dd9dcbb39c2f
make clone functions return int instead of size_t
Mike Becker <universe@uap-core.de>
parents:
1438
diff
changeset
|
174 | } |
|
1445
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
175 | |
|
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
176 | int cxMapDifference(CxMap *dst, const CxMap *minuend, const CxMap *subtrahend, |
|
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
177 | cx_clone_func clone_func, const CxAllocator *clone_allocator, void *data) { |
|
1446
5732947cbcc2
default NULL allocator to cxDefaultAllocator
Mike Becker <universe@uap-core.de>
parents:
1445
diff
changeset
|
178 | if (clone_allocator == NULL) clone_allocator = cxDefaultAllocator; |
|
5732947cbcc2
default NULL allocator to cxDefaultAllocator
Mike Becker <universe@uap-core.de>
parents:
1445
diff
changeset
|
179 | |
|
1445
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
180 | CxMapIterator src_iter = cxMapIterator(minuend); |
|
1449
bbca398783ed
simplify clone implementations
Mike Becker <universe@uap-core.de>
parents:
1446
diff
changeset
|
181 | cx_foreach(const CxMapEntry *, entry, src_iter) { |
|
bbca398783ed
simplify clone implementations
Mike Becker <universe@uap-core.de>
parents:
1446
diff
changeset
|
182 | if (cxMapContains(subtrahend, *entry->key)) { |
|
1450
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
183 | continue; |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
184 | } |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
185 | void** dst_mem = cxMapEmplace(dst, *entry->key); |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
186 | if (dst_mem == NULL) { |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
187 | return 1; // LCOV_EXCL_LINE |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
188 | } |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
189 | void *target = cxCollectionStoresPointers(dst) ? NULL : dst_mem; |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
190 | void* dst_ptr = clone_func(target, entry->value, clone_allocator, data); |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
191 | if (dst_ptr == NULL) { |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
192 | cx_map_remove_uninitialized_entry(dst, *(entry->key)); |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
193 | return 1; |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
194 | } |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
195 | if (cxCollectionStoresPointers(dst)) { |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
196 | *dst_mem = dst_ptr; |
|
1445
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
197 | } |
|
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
198 | } |
|
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
199 | return 0; |
|
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
200 | } |
|
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
201 | |
|
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
202 | int cxMapListDifference(CxMap *dst, const CxMap *src, const CxList *keys, |
|
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
203 | cx_clone_func clone_func, const CxAllocator *clone_allocator, void *data) { |
|
1450
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
204 | if (clone_allocator == NULL) clone_allocator = cxDefaultAllocator; |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
205 | |
|
1445
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
206 | CxMapIterator src_iter = cxMapIterator(src); |
|
1449
bbca398783ed
simplify clone implementations
Mike Becker <universe@uap-core.de>
parents:
1446
diff
changeset
|
207 | cx_foreach(const CxMapEntry *, entry, src_iter) { |
|
bbca398783ed
simplify clone implementations
Mike Becker <universe@uap-core.de>
parents:
1446
diff
changeset
|
208 | if (cxListContains(keys, entry->key)) { |
|
1450
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
209 | continue; |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
210 | } |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
211 | void** dst_mem = cxMapEmplace(dst, *entry->key); |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
212 | if (dst_mem == NULL) { |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
213 | return 1; // LCOV_EXCL_LINE |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
214 | } |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
215 | void *target = cxCollectionStoresPointers(dst) ? NULL : dst_mem; |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
216 | void* dst_ptr = clone_func(target, entry->value, clone_allocator, data); |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
217 | if (dst_ptr == NULL) { |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
218 | cx_map_remove_uninitialized_entry(dst, *(entry->key)); |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
219 | return 1; |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
220 | } |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
221 | if (cxCollectionStoresPointers(dst)) { |
|
09a73312d5ec
add more test coverage for new map functions and fixes some issues
Mike Becker <universe@uap-core.de>
parents:
1449
diff
changeset
|
222 | *dst_mem = dst_ptr; |
|
1445
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
223 | } |
|
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
224 | } |
|
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
225 | return 0; |
|
e8089a590b71
add implementations for map difference
Mike Becker <universe@uap-core.de>
parents:
1444
diff
changeset
|
226 | } |
|
1467
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
227 | |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
228 | int cxMapIntersection(CxMap *dst, const CxMap *src, const CxMap *other, |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
229 | cx_clone_func clone_func, const CxAllocator *clone_allocator, void *data) { |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
230 | if (clone_allocator == NULL) clone_allocator = cxDefaultAllocator; |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
231 | |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
232 | CxMapIterator src_iter = cxMapIterator(src); |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
233 | cx_foreach(const CxMapEntry *, entry, src_iter) { |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
234 | if (!cxMapContains(other, *entry->key)) { |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
235 | continue; |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
236 | } |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
237 | void** dst_mem = cxMapEmplace(dst, *entry->key); |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
238 | if (dst_mem == NULL) { |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
239 | return 1; // LCOV_EXCL_LINE |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
240 | } |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
241 | void *target = cxCollectionStoresPointers(dst) ? NULL : dst_mem; |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
242 | void* dst_ptr = clone_func(target, entry->value, clone_allocator, data); |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
243 | if (dst_ptr == NULL) { |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
244 | cx_map_remove_uninitialized_entry(dst, *(entry->key)); |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
245 | return 1; |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
246 | } |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
247 | if (cxCollectionStoresPointers(dst)) { |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
248 | *dst_mem = dst_ptr; |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
249 | } |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
250 | } |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
251 | return 0; |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
252 | } |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
253 | |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
254 | int cxMapListIntersection(CxMap *dst, const CxMap *src, const CxList *keys, |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
255 | cx_clone_func clone_func, const CxAllocator *clone_allocator, void *data) { |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
256 | if (clone_allocator == NULL) clone_allocator = cxDefaultAllocator; |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
257 | |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
258 | CxMapIterator src_iter = cxMapIterator(src); |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
259 | cx_foreach(const CxMapEntry *, entry, src_iter) { |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
260 | if (!cxListContains(keys, entry->key)) { |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
261 | continue; |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
262 | } |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
263 | void** dst_mem = cxMapEmplace(dst, *entry->key); |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
264 | if (dst_mem == NULL) { |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
265 | return 1; // LCOV_EXCL_LINE |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
266 | } |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
267 | void *target = cxCollectionStoresPointers(dst) ? NULL : dst_mem; |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
268 | void* dst_ptr = clone_func(target, entry->value, clone_allocator, data); |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
269 | if (dst_ptr == NULL) { |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
270 | cx_map_remove_uninitialized_entry(dst, *(entry->key)); |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
271 | return 1; |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
272 | } |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
273 | if (cxCollectionStoresPointers(dst)) { |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
274 | *dst_mem = dst_ptr; |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
275 | } |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
276 | } |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
277 | return 0; |
|
bb6f04c35310
implements cxMapIntersection() and cxMapListIntersection() - resolves #555
Mike Becker <universe@uap-core.de>
parents:
1466
diff
changeset
|
278 | } |
|
1474
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
279 | |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
280 | int cxMapUnion(CxMap *dst, const CxMap *src, |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
281 | cx_clone_func clone_func, const CxAllocator *clone_allocator, void *data) { |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
282 | if (clone_allocator == NULL) clone_allocator = cxDefaultAllocator; |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
283 | |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
284 | CxMapIterator src_iter = cxMapIterator(src); |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
285 | cx_foreach(const CxMapEntry *, entry, src_iter) { |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
286 | if (cxMapContains(dst, *entry->key)) { |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
287 | continue; |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
288 | } |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
289 | void** dst_mem = cxMapEmplace(dst, *entry->key); |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
290 | if (dst_mem == NULL) { |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
291 | return 1; // LCOV_EXCL_LINE |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
292 | } |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
293 | void *target = cxCollectionStoresPointers(dst) ? NULL : dst_mem; |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
294 | void* dst_ptr = clone_func(target, entry->value, clone_allocator, data); |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
295 | if (dst_ptr == NULL) { |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
296 | cx_map_remove_uninitialized_entry(dst, *(entry->key)); |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
297 | return 1; |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
298 | } |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
299 | if (cxCollectionStoresPointers(dst)) { |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
300 | *dst_mem = dst_ptr; |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
301 | } |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
302 | } |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
303 | return 0; |
|
84de0ba791af
implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents:
1467
diff
changeset
|
304 | } |
|
1479
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
305 | |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
306 | int cxMapCloneSimple(CxMap *dst, const CxMap *src) { |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
307 | return cxMapClone(dst, src, use_simple_clone_func(src)); |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
308 | } |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
309 | |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
310 | int cxMapDifferenceSimple(CxMap *dst, const CxMap *minuend, const CxMap *subtrahend) { |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
311 | return cxMapDifference(dst, minuend, subtrahend, use_simple_clone_func(minuend)); |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
312 | } |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
313 | |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
314 | int cxMapListDifferenceSimple(CxMap *dst, const CxMap *src, const CxList *keys) { |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
315 | return cxMapListDifference(dst, src, keys, use_simple_clone_func(src)); |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
316 | } |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
317 | |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
318 | int cxMapIntersectionSimple(CxMap *dst, const CxMap *src, const CxMap *other) { |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
319 | return cxMapIntersection(dst, src, other, use_simple_clone_func(src)); |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
320 | } |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
321 | |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
322 | int cxMapListIntersectionSimple(CxMap *dst, const CxMap *src, const CxList *keys) { |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
323 | return cxMapListIntersection(dst, src, keys, use_simple_clone_func(src)); |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
324 | } |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
325 | |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
326 | int cxMapUnionSimple(CxMap *dst, const CxMap *src) { |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
327 | return cxMapUnion(dst, src, use_simple_clone_func(src)); |
|
ac1baaed2fd7
implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents:
1474
diff
changeset
|
328 | } |