comparison mupdf-source/thirdparty/leptonica/src/map.c @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
comparison
equal deleted inserted replaced
1:1d09e1dec1d9 2:b50eed0cc0ef
1 /*====================================================================*
2 - Copyright (C) 2001 Leptonica. All rights reserved.
3 -
4 - Redistribution and use in source and binary forms, with or without
5 - modification, are permitted provided that the following conditions
6 - are met:
7 - 1. Redistributions of source code must retain the above copyright
8 - notice, this list of conditions and the following disclaimer.
9 - 2. Redistributions in binary form must reproduce the above
10 - copyright notice, this list of conditions and the following
11 - disclaimer in the documentation and/or other materials
12 - provided with the distribution.
13 -
14 - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15 - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16 - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17 - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY
18 - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
23 - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 *====================================================================*/
26
27 /*!
28 * \file map.c
29 * <pre>
30 *
31 * This is an interface for map and set functions, based on using
32 * red-black binary search trees. Because these trees are sorted,
33 * they are O(nlogn) to build. They allow logn insertion, find
34 * and deletion of elements.
35 *
36 * Both the map and set are ordered by key value, with unique keys.
37 * For the map, the elements are key/value pairs.
38 * For the set we only store unique, ordered keys, and the value
39 * (set to 0 in the implementation) is ignored.
40 *
41 * The keys for the map and set can be any of the three types in the
42 * l_rbtree_keytype enum. The values stored can be any of the four
43 * types in the rb_type union.
44 *
45 * In-order forward and reverse iterators are provided for maps and sets.
46 * To forward iterate over the map for any type of key (in this example,
47 * uint32), extracting integer values:
48 *
49 * L_AMAP *m = l_amapCreate(L_UINT_TYPE);
50 * [add elements to the map ...]
51 * L_AMAP_NODE *n = l_amapGetFirst(m);
52 * while (n) {
53 * l_int32 val = n->value.itype;
54 * // do something ...
55 * n = l_amapGetNext(n);
56 * }
57 *
58 * If the nodes are deleted during the iteration:
59 *
60 * L_AMAP *m = l_amapCreate(L_UINT_TYPE);
61 * [add elements to the map ...]
62 * L_AMAP_NODE *n = l_amapGetFirst(m);
63 * L_AMAP_NODE *nn;
64 * while (n) {
65 * nn = l_amapGetNext(n);
66 * l_int32 val = n->value.itype;
67 * l_uint32 key = n->key.utype;
68 * // do something ...
69 * l_amapDelete(m, n->key);
70 * n = nn;
71 * }
72 *
73 * See prog/maptest.c and prog/settest.c for more examples of usage.
74 *
75 * Interface to (a) map using a general key and storing general values
76 * L_AMAP *l_amapCreate()
77 * RB_TYPE *l_amapFind()
78 * void l_amapInsert()
79 * void l_amapDelete()
80 * void l_amapDestroy()
81 * L_AMAP_NODE *l_amapGetFirst()
82 * L_AMAP_NODE *l_amapGetNext()
83 * L_AMAP_NODE *l_amapGetLast()
84 * L_AMAP_NODE *l_amapGetPrev()
85 * l_int32 l_amapSize()
86 *
87 * Interface to (a) set using a general key
88 * L_ASET *l_asetCreate()
89 * RB_TYPE *l_asetFind()
90 * void l_asetInsert()
91 * void l_asetDelete()
92 * void l_asetDestroy()
93 * L_ASET_NODE *l_asetGetFirst()
94 * L_ASET_NODE *l_asetGetNext()
95 * L_ASET_NODE *l_asetGetLast()
96 * L_ASET_NODE *l_asetGetPrev()
97 * l_int32 l_asetSize()
98 * </pre>
99 */
100
101 #ifdef HAVE_CONFIG_H
102 #include <config_auto.h>
103 #endif /* HAVE_CONFIG_H */
104
105 #include "allheaders.h"
106
107 /* ------------------------------------------------------------- *
108 * Interface to Map *
109 * ------------------------------------------------------------- */
110 L_AMAP *
111 l_amapCreate(l_int32 keytype)
112 {
113 L_AMAP *m;
114
115 if (keytype != L_INT_TYPE && keytype != L_UINT_TYPE &&
116 keytype != L_FLOAT_TYPE)
117 return (L_AMAP *)ERROR_PTR("invalid keytype", __func__, NULL);
118
119 m = (L_AMAP *)LEPT_CALLOC(1, sizeof(L_AMAP));
120 m->keytype = keytype;
121 return m;
122 }
123
124 RB_TYPE *
125 l_amapFind(L_AMAP *m,
126 RB_TYPE key)
127 {
128 return l_rbtreeLookup(m, key);
129 }
130
131 void
132 l_amapInsert(L_AMAP *m,
133 RB_TYPE key,
134 RB_TYPE value)
135 {
136 l_rbtreeInsert(m, key, value);
137 }
138
139 void
140 l_amapDelete(L_AMAP *m,
141 RB_TYPE key)
142 {
143 l_rbtreeDelete(m, key);
144 }
145
146 void
147 l_amapDestroy(L_AMAP **pm)
148 {
149 l_rbtreeDestroy(pm);
150 }
151
152 L_AMAP_NODE *
153 l_amapGetFirst(L_AMAP *m)
154 {
155 return l_rbtreeGetFirst(m);
156 }
157
158 L_AMAP_NODE *
159 l_amapGetNext(L_AMAP_NODE *n)
160 {
161 return l_rbtreeGetNext(n);
162 }
163
164 L_AMAP_NODE *
165 l_amapGetLast(L_AMAP *m)
166 {
167 return l_rbtreeGetLast(m);
168 }
169
170 L_AMAP_NODE *
171 l_amapGetPrev(L_AMAP_NODE *n)
172 {
173 return l_rbtreeGetPrev(n);
174 }
175
176 l_int32
177 l_amapSize(L_AMAP *m)
178 {
179 return l_rbtreeGetCount(m);
180 }
181
182
183 /* ------------------------------------------------------------- *
184 * Interface to Set *
185 * ------------------------------------------------------------- */
186 L_ASET *
187 l_asetCreate(l_int32 keytype)
188 {
189 L_ASET *s;
190
191 if (keytype != L_INT_TYPE && keytype != L_UINT_TYPE &&
192 keytype != L_FLOAT_TYPE)
193 return (L_ASET *)ERROR_PTR("invalid keytype", __func__, NULL);
194
195 s = (L_ASET *)LEPT_CALLOC(1, sizeof(L_ASET));
196 s->keytype = keytype;
197 return s;
198 }
199
200 /*
201 * l_asetFind()
202 *
203 * This returns NULL if not found, non-null if it is. In the latter
204 * case, the value stored in the returned pointer has no significance.
205 */
206 RB_TYPE *
207 l_asetFind(L_ASET *s,
208 RB_TYPE key)
209 {
210 return l_rbtreeLookup(s, key);
211 }
212
213 void
214 l_asetInsert(L_ASET *s,
215 RB_TYPE key)
216 {
217 RB_TYPE value;
218
219 value.itype = 0; /* meaningless */
220 l_rbtreeInsert(s, key, value);
221 }
222
223 void
224 l_asetDelete(L_ASET *s,
225 RB_TYPE key)
226 {
227 l_rbtreeDelete(s, key);
228 }
229
230 void
231 l_asetDestroy(L_ASET **ps)
232 {
233 l_rbtreeDestroy(ps);
234 }
235
236 L_ASET_NODE *
237 l_asetGetFirst(L_ASET *s)
238 {
239 return l_rbtreeGetFirst(s);
240 }
241
242 L_ASET_NODE *
243 l_asetGetNext(L_ASET_NODE *n)
244 {
245 return l_rbtreeGetNext(n);
246 }
247
248 L_ASET_NODE *
249 l_asetGetLast(L_ASET *s)
250 {
251 return l_rbtreeGetLast(s);
252 }
253
254 L_ASET_NODE *
255 l_asetGetPrev(L_ASET_NODE *n)
256 {
257 return l_rbtreeGetPrev(n);
258 }
259
260 l_int32
261 l_asetSize(L_ASET *s)
262 {
263 return l_rbtreeGetCount(s);
264 }