xref: /aosp_15_r20/bionic/libc/include/search.h (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*-
2*8d67ca89SAndroid Build Coastguard Worker  * Written by J.T. Conklin <[email protected]>
3*8d67ca89SAndroid Build Coastguard Worker  * Public domain.
4*8d67ca89SAndroid Build Coastguard Worker  *
5*8d67ca89SAndroid Build Coastguard Worker  *	$NetBSD: search.h,v 1.12 1999/02/22 10:34:28 christos Exp $
6*8d67ca89SAndroid Build Coastguard Worker  * $FreeBSD: release/9.0.0/include/search.h 105250 2002-10-16 14:29:23Z robert $
7*8d67ca89SAndroid Build Coastguard Worker  */
8*8d67ca89SAndroid Build Coastguard Worker 
9*8d67ca89SAndroid Build Coastguard Worker #pragma once
10*8d67ca89SAndroid Build Coastguard Worker 
11*8d67ca89SAndroid Build Coastguard Worker /**
12*8d67ca89SAndroid Build Coastguard Worker  * @file search.h
13*8d67ca89SAndroid Build Coastguard Worker  * @brief Queues, hash tables, trees, and linear array searches.
14*8d67ca89SAndroid Build Coastguard Worker  */
15*8d67ca89SAndroid Build Coastguard Worker 
16*8d67ca89SAndroid Build Coastguard Worker #include <sys/cdefs.h>
17*8d67ca89SAndroid Build Coastguard Worker #include <sys/types.h>
18*8d67ca89SAndroid Build Coastguard Worker 
19*8d67ca89SAndroid Build Coastguard Worker /** See hsearch()/hsearch_r(). */
20*8d67ca89SAndroid Build Coastguard Worker typedef enum {
21*8d67ca89SAndroid Build Coastguard Worker   FIND,
22*8d67ca89SAndroid Build Coastguard Worker   ENTER
23*8d67ca89SAndroid Build Coastguard Worker } ACTION;
24*8d67ca89SAndroid Build Coastguard Worker 
25*8d67ca89SAndroid Build Coastguard Worker /** See hsearch()/hsearch_r(). */
26*8d67ca89SAndroid Build Coastguard Worker typedef struct entry {
27*8d67ca89SAndroid Build Coastguard Worker   /** The string key. */
28*8d67ca89SAndroid Build Coastguard Worker   char* _Nullable key;
29*8d67ca89SAndroid Build Coastguard Worker   /** The associated data. */
30*8d67ca89SAndroid Build Coastguard Worker   void* _Nullable data;
31*8d67ca89SAndroid Build Coastguard Worker } ENTRY;
32*8d67ca89SAndroid Build Coastguard Worker 
33*8d67ca89SAndroid Build Coastguard Worker /**
34*8d67ca89SAndroid Build Coastguard Worker  * Constants given to the twalk() visitor.
35*8d67ca89SAndroid Build Coastguard Worker  * Note that the constant names are misleading.
36*8d67ca89SAndroid Build Coastguard Worker  */
37*8d67ca89SAndroid Build Coastguard Worker typedef enum {
38*8d67ca89SAndroid Build Coastguard Worker   /**
39*8d67ca89SAndroid Build Coastguard Worker    * If this is the first visit to a non-leaf node.
40*8d67ca89SAndroid Build Coastguard Worker    * Use this for *preorder* traversal.
41*8d67ca89SAndroid Build Coastguard Worker    */
42*8d67ca89SAndroid Build Coastguard Worker   preorder,
43*8d67ca89SAndroid Build Coastguard Worker   /**
44*8d67ca89SAndroid Build Coastguard Worker    * If this is the second visit to a non-leaf node.
45*8d67ca89SAndroid Build Coastguard Worker    * Use this for *inorder* traversal.
46*8d67ca89SAndroid Build Coastguard Worker    */
47*8d67ca89SAndroid Build Coastguard Worker   postorder,
48*8d67ca89SAndroid Build Coastguard Worker   /**
49*8d67ca89SAndroid Build Coastguard Worker    * If this is the third visit to a non-leaf node.
50*8d67ca89SAndroid Build Coastguard Worker    * Use this for *postorder* traversal.
51*8d67ca89SAndroid Build Coastguard Worker    */
52*8d67ca89SAndroid Build Coastguard Worker   endorder,
53*8d67ca89SAndroid Build Coastguard Worker   /** If this is the first and only visit to a leaf node. */
54*8d67ca89SAndroid Build Coastguard Worker   leaf
55*8d67ca89SAndroid Build Coastguard Worker } VISIT;
56*8d67ca89SAndroid Build Coastguard Worker 
57*8d67ca89SAndroid Build Coastguard Worker #if defined(__USE_BSD) || defined(__USE_GNU)
58*8d67ca89SAndroid Build Coastguard Worker /** The hash table type for hcreate_r()/hdestroy_r()/hsearch_r(). */
59*8d67ca89SAndroid Build Coastguard Worker struct hsearch_data {
60*8d67ca89SAndroid Build Coastguard Worker   struct __hsearch* _Nullable __hsearch;
61*8d67ca89SAndroid Build Coastguard Worker };
62*8d67ca89SAndroid Build Coastguard Worker #endif
63*8d67ca89SAndroid Build Coastguard Worker 
64*8d67ca89SAndroid Build Coastguard Worker __BEGIN_DECLS
65*8d67ca89SAndroid Build Coastguard Worker 
66*8d67ca89SAndroid Build Coastguard Worker /**
67*8d67ca89SAndroid Build Coastguard Worker  * [insque(3)](https://man7.org/linux/man-pages/man3/insque.3.html) inserts
68*8d67ca89SAndroid Build Coastguard Worker  * an item in a queue (an intrusive doubly-linked list).
69*8d67ca89SAndroid Build Coastguard Worker  */
70*8d67ca89SAndroid Build Coastguard Worker void insque(void* _Nonnull __element, void* _Nullable __previous);
71*8d67ca89SAndroid Build Coastguard Worker 
72*8d67ca89SAndroid Build Coastguard Worker /**
73*8d67ca89SAndroid Build Coastguard Worker  * [remque(3)](https://man7.org/linux/man-pages/man3/remque.3.html) removes
74*8d67ca89SAndroid Build Coastguard Worker  * an item from a queue (an intrusive doubly-linked list).
75*8d67ca89SAndroid Build Coastguard Worker  */
76*8d67ca89SAndroid Build Coastguard Worker void remque(void* _Nonnull __element);
77*8d67ca89SAndroid Build Coastguard Worker 
78*8d67ca89SAndroid Build Coastguard Worker /**
79*8d67ca89SAndroid Build Coastguard Worker  * [hcreate(3)](https://man7.org/linux/man-pages/man3/hcreate.3.html)
80*8d67ca89SAndroid Build Coastguard Worker  * initializes the global hash table, with space for at least `__n` elements.
81*8d67ca89SAndroid Build Coastguard Worker  *
82*8d67ca89SAndroid Build Coastguard Worker  * See hcreate_r() if you need more than one hash table.
83*8d67ca89SAndroid Build Coastguard Worker  *
84*8d67ca89SAndroid Build Coastguard Worker  * Returns *non-zero* on success and returns 0 and sets `errno` on failure.
85*8d67ca89SAndroid Build Coastguard Worker  *
86*8d67ca89SAndroid Build Coastguard Worker  * Available since API level 28.
87*8d67ca89SAndroid Build Coastguard Worker  */
88*8d67ca89SAndroid Build Coastguard Worker 
89*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(28)
90*8d67ca89SAndroid Build Coastguard Worker int hcreate(size_t __n) __INTRODUCED_IN(28);
91*8d67ca89SAndroid Build Coastguard Worker 
92*8d67ca89SAndroid Build Coastguard Worker /**
93*8d67ca89SAndroid Build Coastguard Worker  * [hdestroy(3)](https://man7.org/linux/man-pages/man3/hdestroy.3.html) destroys
94*8d67ca89SAndroid Build Coastguard Worker  * the global hash table.
95*8d67ca89SAndroid Build Coastguard Worker  *
96*8d67ca89SAndroid Build Coastguard Worker  * See hdestroy_r() if you need more than one hash table.
97*8d67ca89SAndroid Build Coastguard Worker  *
98*8d67ca89SAndroid Build Coastguard Worker  * Available since API level 28.
99*8d67ca89SAndroid Build Coastguard Worker  */
100*8d67ca89SAndroid Build Coastguard Worker void hdestroy(void) __INTRODUCED_IN(28);
101*8d67ca89SAndroid Build Coastguard Worker 
102*8d67ca89SAndroid Build Coastguard Worker /**
103*8d67ca89SAndroid Build Coastguard Worker  * [hsearch(3)](https://man7.org/linux/man-pages/man3/hsearch.3.html) finds or
104*8d67ca89SAndroid Build Coastguard Worker  * inserts `__entry` in the global hash table, based on `__action`.
105*8d67ca89SAndroid Build Coastguard Worker  *
106*8d67ca89SAndroid Build Coastguard Worker  * See hsearch_r() if you need more than one hash table.
107*8d67ca89SAndroid Build Coastguard Worker  *
108*8d67ca89SAndroid Build Coastguard Worker  * Returns a pointer to the entry on success, and returns NULL and sets
109*8d67ca89SAndroid Build Coastguard Worker  * `errno` on failure.
110*8d67ca89SAndroid Build Coastguard Worker  *
111*8d67ca89SAndroid Build Coastguard Worker  * Available since API level 28.
112*8d67ca89SAndroid Build Coastguard Worker  */
113*8d67ca89SAndroid Build Coastguard Worker ENTRY* _Nullable hsearch(ENTRY __entry, ACTION __action) __INTRODUCED_IN(28);
114*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(28) */
115*8d67ca89SAndroid Build Coastguard Worker 
116*8d67ca89SAndroid Build Coastguard Worker 
117*8d67ca89SAndroid Build Coastguard Worker #if defined(__USE_BSD) || defined(__USE_GNU)
118*8d67ca89SAndroid Build Coastguard Worker 
119*8d67ca89SAndroid Build Coastguard Worker /**
120*8d67ca89SAndroid Build Coastguard Worker  * [hcreate_r(3)](https://man7.org/linux/man-pages/man3/hcreate_r.3.html)
121*8d67ca89SAndroid Build Coastguard Worker  * initializes a hash table `__table` with space for at least `__n` elements.
122*8d67ca89SAndroid Build Coastguard Worker  *
123*8d67ca89SAndroid Build Coastguard Worker  * Returns *non-zero* on success and returns 0 and sets `errno` on failure.
124*8d67ca89SAndroid Build Coastguard Worker  *
125*8d67ca89SAndroid Build Coastguard Worker  * Available since API level 28.
126*8d67ca89SAndroid Build Coastguard Worker  */
127*8d67ca89SAndroid Build Coastguard Worker 
128*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(28)
129*8d67ca89SAndroid Build Coastguard Worker int hcreate_r(size_t __n, struct hsearch_data* _Nonnull __table) __INTRODUCED_IN(28);
130*8d67ca89SAndroid Build Coastguard Worker 
131*8d67ca89SAndroid Build Coastguard Worker /**
132*8d67ca89SAndroid Build Coastguard Worker  * [hdestroy_r(3)](https://man7.org/linux/man-pages/man3/hdestroy_r.3.html) destroys
133*8d67ca89SAndroid Build Coastguard Worker  * the hash table `__table`.
134*8d67ca89SAndroid Build Coastguard Worker  *
135*8d67ca89SAndroid Build Coastguard Worker  * Available since API level 28.
136*8d67ca89SAndroid Build Coastguard Worker  */
137*8d67ca89SAndroid Build Coastguard Worker void hdestroy_r(struct hsearch_data* _Nonnull __table) __INTRODUCED_IN(28);
138*8d67ca89SAndroid Build Coastguard Worker 
139*8d67ca89SAndroid Build Coastguard Worker /**
140*8d67ca89SAndroid Build Coastguard Worker  * [hsearch_r(3)](https://man7.org/linux/man-pages/man3/hsearch_r.3.html) finds or
141*8d67ca89SAndroid Build Coastguard Worker  * inserts `__entry` in the hash table `__table`, based on `__action`.
142*8d67ca89SAndroid Build Coastguard Worker  *
143*8d67ca89SAndroid Build Coastguard Worker  * Returns *non-zero* on success and returns 0 and sets `errno` on failure.
144*8d67ca89SAndroid Build Coastguard Worker  * A pointer to the entry is returned in `*__result`.
145*8d67ca89SAndroid Build Coastguard Worker  *
146*8d67ca89SAndroid Build Coastguard Worker  * Available since API level 28.
147*8d67ca89SAndroid Build Coastguard Worker  */
148*8d67ca89SAndroid Build Coastguard Worker int hsearch_r(ENTRY __entry, ACTION __action, ENTRY* _Nullable * _Nonnull __result, struct hsearch_data* _Nonnull __table) __INTRODUCED_IN(28);
149*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(28) */
150*8d67ca89SAndroid Build Coastguard Worker 
151*8d67ca89SAndroid Build Coastguard Worker 
152*8d67ca89SAndroid Build Coastguard Worker #endif
153*8d67ca89SAndroid Build Coastguard Worker 
154*8d67ca89SAndroid Build Coastguard Worker /**
155*8d67ca89SAndroid Build Coastguard Worker  * [lfind(3)](https://man7.org/linux/man-pages/man3/lfind.3.html) brute-force
156*8d67ca89SAndroid Build Coastguard Worker  * searches the unsorted array `__array` (of `__count` items each of size `__size`)
157*8d67ca89SAndroid Build Coastguard Worker  * for `__key`, using `__comparator`.
158*8d67ca89SAndroid Build Coastguard Worker  *
159*8d67ca89SAndroid Build Coastguard Worker  * See bsearch() if you have a sorted array.
160*8d67ca89SAndroid Build Coastguard Worker  *
161*8d67ca89SAndroid Build Coastguard Worker  * Returns a pointer to the matching element on success, or NULL on failure.
162*8d67ca89SAndroid Build Coastguard Worker  */
163*8d67ca89SAndroid Build Coastguard Worker void* _Nullable lfind(const void* _Nonnull __key, const void* _Nonnull __array, size_t* _Nonnull __count, size_t __size, int (* _Nonnull __comparator)(const void* _Nonnull, const void* _Nonnull));
164*8d67ca89SAndroid Build Coastguard Worker 
165*8d67ca89SAndroid Build Coastguard Worker /**
166*8d67ca89SAndroid Build Coastguard Worker  * [lsearch(3)](https://man7.org/linux/man-pages/man3/lsearch.3.html) brute-force
167*8d67ca89SAndroid Build Coastguard Worker  * searches the unsorted array `__array` (of `__count` items each of size `__size`)
168*8d67ca89SAndroid Build Coastguard Worker  * for `__key`, using `__comparator`.
169*8d67ca89SAndroid Build Coastguard Worker  *
170*8d67ca89SAndroid Build Coastguard Worker  * Unlike lfind(), on failure lsearch() will *insert* `__key` at the end of
171*8d67ca89SAndroid Build Coastguard Worker  * `__array` and increment `*__count`.
172*8d67ca89SAndroid Build Coastguard Worker  *
173*8d67ca89SAndroid Build Coastguard Worker  * Returns a pointer to the matching element on success, or to the newly-added
174*8d67ca89SAndroid Build Coastguard Worker  * element on failure.
175*8d67ca89SAndroid Build Coastguard Worker  */
176*8d67ca89SAndroid Build Coastguard Worker void* _Nonnull lsearch(const void* _Nonnull __key, void* _Nonnull __array, size_t* _Nonnull __count, size_t __size, int (* _Nonnull __comparator)(const void* _Nonnull, const void* _Nonnull));
177*8d67ca89SAndroid Build Coastguard Worker 
178*8d67ca89SAndroid Build Coastguard Worker /**
179*8d67ca89SAndroid Build Coastguard Worker  * [tdelete(3)](https://man7.org/linux/man-pages/man3/tdelete.3.html) searches
180*8d67ca89SAndroid Build Coastguard Worker  * for and removes an element in the tree `*__root_ptr`. The search is performed
181*8d67ca89SAndroid Build Coastguard Worker  * using `__comparator`.
182*8d67ca89SAndroid Build Coastguard Worker  *
183*8d67ca89SAndroid Build Coastguard Worker  * Returns a pointer to the parent of the deleted node, or NULL on failure.
184*8d67ca89SAndroid Build Coastguard Worker  */
185*8d67ca89SAndroid Build Coastguard Worker void* _Nullable tdelete(const void* _Nonnull __key, void* _Nullable * _Nullable __root_ptr, int (* _Nonnull __comparator)(const void* _Nonnull, const void* _Nonnull));
186*8d67ca89SAndroid Build Coastguard Worker 
187*8d67ca89SAndroid Build Coastguard Worker /**
188*8d67ca89SAndroid Build Coastguard Worker  * [tdestroy(3)](https://man7.org/linux/man-pages/man3/tdestroy.3.html) destroys
189*8d67ca89SAndroid Build Coastguard Worker  * the hash table `__root` using `__free_fn` on each node.
190*8d67ca89SAndroid Build Coastguard Worker  */
191*8d67ca89SAndroid Build Coastguard Worker void tdestroy(void* _Nullable __root, void (* _Nullable __free_fn)(void* _Nullable));
192*8d67ca89SAndroid Build Coastguard Worker 
193*8d67ca89SAndroid Build Coastguard Worker /**
194*8d67ca89SAndroid Build Coastguard Worker  * [tfind(3)](https://man7.org/linux/man-pages/man3/tfind.3.html) searches
195*8d67ca89SAndroid Build Coastguard Worker  * for an element in the tree `*__root_ptr`. The search is performed using
196*8d67ca89SAndroid Build Coastguard Worker  * `__comparator`.
197*8d67ca89SAndroid Build Coastguard Worker  *
198*8d67ca89SAndroid Build Coastguard Worker  * Returns a pointer to the matching node, or NULL on failure.
199*8d67ca89SAndroid Build Coastguard Worker  */
200*8d67ca89SAndroid Build Coastguard Worker void* _Nullable tfind(const void* _Nonnull __key, void* _Nullable const* _Nullable __root_ptr, int (* _Nonnull __comparator)(const void* _Nonnull, const void* _Nonnull));
201*8d67ca89SAndroid Build Coastguard Worker 
202*8d67ca89SAndroid Build Coastguard Worker /**
203*8d67ca89SAndroid Build Coastguard Worker  * [tsearch(3)](https://man7.org/linux/man-pages/man3/tsearch.3.html) searches
204*8d67ca89SAndroid Build Coastguard Worker  * for an element in the tree `*__root_ptr`. The search is performed using
205*8d67ca89SAndroid Build Coastguard Worker  * `__comparator`.
206*8d67ca89SAndroid Build Coastguard Worker  *
207*8d67ca89SAndroid Build Coastguard Worker  * Unlike tfind(), on failure tsearch() will *insert* `__key` into the tree.
208*8d67ca89SAndroid Build Coastguard Worker  *
209*8d67ca89SAndroid Build Coastguard Worker  * Returns a pointer to the matching node, or to the newly-added node.
210*8d67ca89SAndroid Build Coastguard Worker  */
211*8d67ca89SAndroid Build Coastguard Worker void* _Nullable tsearch(const void* _Nonnull __key, void* _Nullable * _Nullable __root_ptr, int (* _Nonnull __comparator)(const void* _Nonnull, const void* _Nonnull));
212*8d67ca89SAndroid Build Coastguard Worker 
213*8d67ca89SAndroid Build Coastguard Worker /**
214*8d67ca89SAndroid Build Coastguard Worker  * [twalk(3)](https://man7.org/linux/man-pages/man3/twalk.3.html) calls
215*8d67ca89SAndroid Build Coastguard Worker  * `__visitor` on every node in the tree.
216*8d67ca89SAndroid Build Coastguard Worker  */
217*8d67ca89SAndroid Build Coastguard Worker void twalk(const void* _Nullable __root, void (* _Nullable __visitor)(const void* _Nullable, VISIT, int));
218*8d67ca89SAndroid Build Coastguard Worker 
219*8d67ca89SAndroid Build Coastguard Worker __END_DECLS
220