Leptonica  1.83.1
Image processing and image analysis suite
map.c
Go to the documentation of this file.
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 
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 }
void l_rbtreeDelete(L_RBTREE *t, RB_TYPE key)
l_rbtreeDelete()
Definition: rbtree.c:236
L_RBTREE_NODE * l_rbtreeGetLast(L_RBTREE *t)
l_rbtreeGetLast()
Definition: rbtree.c:382
RB_TYPE * l_rbtreeLookup(L_RBTREE *t, RB_TYPE key)
l_rbtreeLookup()
Definition: rbtree.c:157
L_RBTREE_NODE * l_rbtreeGetPrev(L_RBTREE_NODE *n)
l_rbtreeGetPrev()
Definition: rbtree.c:415
L_RBTREE_NODE * l_rbtreeGetNext(L_RBTREE_NODE *n)
l_rbtreeGetNext()
Definition: rbtree.c:349
void l_rbtreeDestroy(L_RBTREE **pt)
l_rbtreeDestroy()
Definition: rbtree.c:282
L_RBTREE_NODE * l_rbtreeGetFirst(L_RBTREE *t)
l_rbtreeGetFirst()
Definition: rbtree.c:316
l_int32 l_rbtreeGetCount(L_RBTREE *t)
l_rbtreeGetCount()
Definition: rbtree.c:443
void l_rbtreeInsert(L_RBTREE *t, RB_TYPE key, RB_TYPE value)
l_rbtreeInsert()
Definition: rbtree.c:184
Definition: rbtree.h:62