xref: /aosp_15_r20/external/icu/libicu/cts_headers/uhash.h (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others.
2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html
3*0e209d39SAndroid Build Coastguard Worker /*
4*0e209d39SAndroid Build Coastguard Worker ******************************************************************************
5*0e209d39SAndroid Build Coastguard Worker *   Copyright (C) 1997-2015, International Business Machines
6*0e209d39SAndroid Build Coastguard Worker *   Corporation and others.  All Rights Reserved.
7*0e209d39SAndroid Build Coastguard Worker ******************************************************************************
8*0e209d39SAndroid Build Coastguard Worker *   Date        Name        Description
9*0e209d39SAndroid Build Coastguard Worker *   03/22/00    aliu        Adapted from original C++ ICU Hashtable.
10*0e209d39SAndroid Build Coastguard Worker *   07/06/01    aliu        Modified to support int32_t keys on
11*0e209d39SAndroid Build Coastguard Worker *                           platforms with sizeof(void*) < 32.
12*0e209d39SAndroid Build Coastguard Worker ******************************************************************************
13*0e209d39SAndroid Build Coastguard Worker */
14*0e209d39SAndroid Build Coastguard Worker 
15*0e209d39SAndroid Build Coastguard Worker #ifndef UHASH_H
16*0e209d39SAndroid Build Coastguard Worker #define UHASH_H
17*0e209d39SAndroid Build Coastguard Worker 
18*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h"
19*0e209d39SAndroid Build Coastguard Worker #include "cmemory.h"
20*0e209d39SAndroid Build Coastguard Worker #include "uelement.h"
21*0e209d39SAndroid Build Coastguard Worker #include "unicode/localpointer.h"
22*0e209d39SAndroid Build Coastguard Worker 
23*0e209d39SAndroid Build Coastguard Worker /**
24*0e209d39SAndroid Build Coastguard Worker  * UHashtable stores key-value pairs and does moderately fast lookup
25*0e209d39SAndroid Build Coastguard Worker  * based on keys.  It provides a good tradeoff between access time and
26*0e209d39SAndroid Build Coastguard Worker  * storage space.  As elements are added to it, it grows to accommodate
27*0e209d39SAndroid Build Coastguard Worker  * them.  By default, the table never shrinks, even if all elements
28*0e209d39SAndroid Build Coastguard Worker  * are removed from it.
29*0e209d39SAndroid Build Coastguard Worker  *
30*0e209d39SAndroid Build Coastguard Worker  * Keys and values are stored as void* pointers.  These void* pointers
31*0e209d39SAndroid Build Coastguard Worker  * may be actual pointers to strings, objects, or any other structure
32*0e209d39SAndroid Build Coastguard Worker  * in memory, or they may simply be integral values cast to void*.
33*0e209d39SAndroid Build Coastguard Worker  * UHashtable doesn't care and manipulates them via user-supplied
34*0e209d39SAndroid Build Coastguard Worker  * functions.  These functions hash keys, compare keys, delete keys,
35*0e209d39SAndroid Build Coastguard Worker  * and delete values.  Some function pointers are optional (may be
36*0e209d39SAndroid Build Coastguard Worker  * NULL); others must be supplied.  Several prebuilt functions exist
37*0e209d39SAndroid Build Coastguard Worker  * to handle common key types.
38*0e209d39SAndroid Build Coastguard Worker  *
39*0e209d39SAndroid Build Coastguard Worker  * UHashtable ownership of keys and values is flexible, and controlled
40*0e209d39SAndroid Build Coastguard Worker  * by whether or not the key deleter and value deleter functions are
41*0e209d39SAndroid Build Coastguard Worker  * set.  If a void* key is actually a pointer to a deletable object,
42*0e209d39SAndroid Build Coastguard Worker  * then UHashtable can be made to delete that object by setting the
43*0e209d39SAndroid Build Coastguard Worker  * key deleter function pointer to a non-NULL value.  If this is done,
44*0e209d39SAndroid Build Coastguard Worker  * then keys passed to uhash_put() are owned by the hashtable and will
45*0e209d39SAndroid Build Coastguard Worker  * be deleted by it at some point, either as keys are replaced, or
46*0e209d39SAndroid Build Coastguard Worker  * when uhash_close() is finally called.  The same is true of values
47*0e209d39SAndroid Build Coastguard Worker  * and the value deleter function pointer.  Keys passed to methods
48*0e209d39SAndroid Build Coastguard Worker  * other than uhash_put() are never owned by the hashtable.
49*0e209d39SAndroid Build Coastguard Worker  *
50*0e209d39SAndroid Build Coastguard Worker  * NULL values are not allowed.  uhash_get() returns NULL to indicate
51*0e209d39SAndroid Build Coastguard Worker  * a key that is not in the table, and having a NULL value in the
52*0e209d39SAndroid Build Coastguard Worker  * table would generate an ambiguous result.  If a key and a NULL
53*0e209d39SAndroid Build Coastguard Worker  * value is passed to uhash_put(), this has the effect of doing a
54*0e209d39SAndroid Build Coastguard Worker  * uhash_remove() on that key.  This keeps uhash_get(), uhash_count(),
55*0e209d39SAndroid Build Coastguard Worker  * and uhash_nextElement() consistent with one another.
56*0e209d39SAndroid Build Coastguard Worker  *
57*0e209d39SAndroid Build Coastguard Worker  * Keys and values can be integers.
58*0e209d39SAndroid Build Coastguard Worker  * Functions that work with an integer key have an "i" prefix.
59*0e209d39SAndroid Build Coastguard Worker  * Functions that work with an integer value have an "i" suffix.
60*0e209d39SAndroid Build Coastguard Worker  * As with putting a NULL value pointer, putting a zero value integer removes the item.
61*0e209d39SAndroid Build Coastguard Worker  * Except, there are pairs of functions that allow setting zero values
62*0e209d39SAndroid Build Coastguard Worker  * and fetching (value, found) pairs.
63*0e209d39SAndroid Build Coastguard Worker  *
64*0e209d39SAndroid Build Coastguard Worker  * To see everything in a hashtable, use uhash_nextElement() to
65*0e209d39SAndroid Build Coastguard Worker  * iterate through its contents.  Each call to this function returns a
66*0e209d39SAndroid Build Coastguard Worker  * UHashElement pointer.  A hash element contains a key, value, and
67*0e209d39SAndroid Build Coastguard Worker  * hashcode.  During iteration an element may be deleted by calling
68*0e209d39SAndroid Build Coastguard Worker  * uhash_removeElement(); iteration may safely continue thereafter.
69*0e209d39SAndroid Build Coastguard Worker  * The uhash_remove() function may also be safely called in
70*0e209d39SAndroid Build Coastguard Worker  * mid-iteration.  If uhash_put() is called during iteration,
71*0e209d39SAndroid Build Coastguard Worker  * the iteration is still guaranteed to terminate reasonably, but
72*0e209d39SAndroid Build Coastguard Worker  * there is no guarantee that every element will be returned or that
73*0e209d39SAndroid Build Coastguard Worker  * some won't be returned more than once.
74*0e209d39SAndroid Build Coastguard Worker  *
75*0e209d39SAndroid Build Coastguard Worker  * Under no circumstances should the UHashElement returned by
76*0e209d39SAndroid Build Coastguard Worker  * uhash_nextElement be modified directly.
77*0e209d39SAndroid Build Coastguard Worker  *
78*0e209d39SAndroid Build Coastguard Worker  * By default, the hashtable grows when necessary, but never shrinks,
79*0e209d39SAndroid Build Coastguard Worker  * even if all items are removed.  For most applications this is
80*0e209d39SAndroid Build Coastguard Worker  * optimal.  However, in a highly dynamic usage where memory is at a
81*0e209d39SAndroid Build Coastguard Worker  * premium, the table can be set to both grow and shrink by calling
82*0e209d39SAndroid Build Coastguard Worker  * uhash_setResizePolicy() with the policy U_GROW_AND_SHRINK.  In a
83*0e209d39SAndroid Build Coastguard Worker  * situation where memory is critical and the client wants a table
84*0e209d39SAndroid Build Coastguard Worker  * that does not grow at all, the constant U_FIXED can be used.
85*0e209d39SAndroid Build Coastguard Worker  */
86*0e209d39SAndroid Build Coastguard Worker 
87*0e209d39SAndroid Build Coastguard Worker /********************************************************************
88*0e209d39SAndroid Build Coastguard Worker  * Data Structures
89*0e209d39SAndroid Build Coastguard Worker  ********************************************************************/
90*0e209d39SAndroid Build Coastguard Worker 
91*0e209d39SAndroid Build Coastguard Worker U_CDECL_BEGIN
92*0e209d39SAndroid Build Coastguard Worker 
93*0e209d39SAndroid Build Coastguard Worker /**
94*0e209d39SAndroid Build Coastguard Worker  * A key or value within a UHashtable.
95*0e209d39SAndroid Build Coastguard Worker  * The hashing and comparison functions take a pointer to a
96*0e209d39SAndroid Build Coastguard Worker  * UHashTok, but the deleter receives the void* pointer within it.
97*0e209d39SAndroid Build Coastguard Worker  */
98*0e209d39SAndroid Build Coastguard Worker typedef UElement UHashTok;
99*0e209d39SAndroid Build Coastguard Worker 
100*0e209d39SAndroid Build Coastguard Worker /**
101*0e209d39SAndroid Build Coastguard Worker  * This is a single hash element.
102*0e209d39SAndroid Build Coastguard Worker  */
103*0e209d39SAndroid Build Coastguard Worker struct UHashElement {
104*0e209d39SAndroid Build Coastguard Worker     /* Reorder these elements to pack nicely if necessary */
105*0e209d39SAndroid Build Coastguard Worker     int32_t  hashcode;
106*0e209d39SAndroid Build Coastguard Worker     UHashTok value;
107*0e209d39SAndroid Build Coastguard Worker     UHashTok key;
108*0e209d39SAndroid Build Coastguard Worker };
109*0e209d39SAndroid Build Coastguard Worker typedef struct UHashElement UHashElement;
110*0e209d39SAndroid Build Coastguard Worker 
111*0e209d39SAndroid Build Coastguard Worker /**
112*0e209d39SAndroid Build Coastguard Worker  * A hashing function.
113*0e209d39SAndroid Build Coastguard Worker  * @param key A key stored in a hashtable
114*0e209d39SAndroid Build Coastguard Worker  * @return A NON-NEGATIVE hash code for parm.
115*0e209d39SAndroid Build Coastguard Worker  */
116*0e209d39SAndroid Build Coastguard Worker typedef int32_t U_CALLCONV UHashFunction(const UHashTok key);
117*0e209d39SAndroid Build Coastguard Worker 
118*0e209d39SAndroid Build Coastguard Worker /**
119*0e209d39SAndroid Build Coastguard Worker  * A key equality (boolean) comparison function.
120*0e209d39SAndroid Build Coastguard Worker  */
121*0e209d39SAndroid Build Coastguard Worker typedef UElementsAreEqual UKeyComparator;
122*0e209d39SAndroid Build Coastguard Worker 
123*0e209d39SAndroid Build Coastguard Worker /**
124*0e209d39SAndroid Build Coastguard Worker  * A value equality (boolean) comparison function.
125*0e209d39SAndroid Build Coastguard Worker  */
126*0e209d39SAndroid Build Coastguard Worker typedef UElementsAreEqual UValueComparator;
127*0e209d39SAndroid Build Coastguard Worker 
128*0e209d39SAndroid Build Coastguard Worker /* see cmemory.h for UObjectDeleter and uprv_deleteUObject() */
129*0e209d39SAndroid Build Coastguard Worker 
130*0e209d39SAndroid Build Coastguard Worker /**
131*0e209d39SAndroid Build Coastguard Worker  * This specifies whether or not, and how, the hashtable resizes itself.
132*0e209d39SAndroid Build Coastguard Worker  * See uhash_setResizePolicy().
133*0e209d39SAndroid Build Coastguard Worker  */
134*0e209d39SAndroid Build Coastguard Worker enum UHashResizePolicy {
135*0e209d39SAndroid Build Coastguard Worker     U_GROW,            /* Grow on demand, do not shrink */
136*0e209d39SAndroid Build Coastguard Worker     U_GROW_AND_SHRINK, /* Grow and shrink on demand */
137*0e209d39SAndroid Build Coastguard Worker     U_FIXED            /* Never change size */
138*0e209d39SAndroid Build Coastguard Worker };
139*0e209d39SAndroid Build Coastguard Worker 
140*0e209d39SAndroid Build Coastguard Worker /**
141*0e209d39SAndroid Build Coastguard Worker  * The UHashtable struct.  Clients should treat this as an opaque data
142*0e209d39SAndroid Build Coastguard Worker  * type and manipulate it only through the uhash_... API.
143*0e209d39SAndroid Build Coastguard Worker  */
144*0e209d39SAndroid Build Coastguard Worker struct UHashtable {
145*0e209d39SAndroid Build Coastguard Worker 
146*0e209d39SAndroid Build Coastguard Worker     /* Main key-value pair storage array */
147*0e209d39SAndroid Build Coastguard Worker 
148*0e209d39SAndroid Build Coastguard Worker     UHashElement *elements;
149*0e209d39SAndroid Build Coastguard Worker 
150*0e209d39SAndroid Build Coastguard Worker     /* Function pointers */
151*0e209d39SAndroid Build Coastguard Worker 
152*0e209d39SAndroid Build Coastguard Worker     UHashFunction *keyHasher;      /* Computes hash from key.
153*0e209d39SAndroid Build Coastguard Worker                                    * Never null. */
154*0e209d39SAndroid Build Coastguard Worker     UKeyComparator *keyComparator; /* Compares keys for equality.
155*0e209d39SAndroid Build Coastguard Worker                                    * Never null. */
156*0e209d39SAndroid Build Coastguard Worker     UValueComparator *valueComparator; /* Compares the values for equality */
157*0e209d39SAndroid Build Coastguard Worker 
158*0e209d39SAndroid Build Coastguard Worker     UObjectDeleter *keyDeleter;    /* Deletes keys when required.
159*0e209d39SAndroid Build Coastguard Worker                                    * If NULL won't do anything */
160*0e209d39SAndroid Build Coastguard Worker     UObjectDeleter *valueDeleter;  /* Deletes values when required.
161*0e209d39SAndroid Build Coastguard Worker                                    * If NULL won't do anything */
162*0e209d39SAndroid Build Coastguard Worker 
163*0e209d39SAndroid Build Coastguard Worker     /* Size parameters */
164*0e209d39SAndroid Build Coastguard Worker 
165*0e209d39SAndroid Build Coastguard Worker     int32_t     count;      /* The number of key-value pairs in this table.
166*0e209d39SAndroid Build Coastguard Worker                              * 0 <= count <= length.  In practice we
167*0e209d39SAndroid Build Coastguard Worker                              * never let count == length (see code). */
168*0e209d39SAndroid Build Coastguard Worker     int32_t     length;     /* The physical size of the arrays hashes, keys
169*0e209d39SAndroid Build Coastguard Worker                              * and values.  Must be prime. */
170*0e209d39SAndroid Build Coastguard Worker 
171*0e209d39SAndroid Build Coastguard Worker     /* Rehashing thresholds */
172*0e209d39SAndroid Build Coastguard Worker 
173*0e209d39SAndroid Build Coastguard Worker     int32_t     highWaterMark;  /* If count > highWaterMark, rehash */
174*0e209d39SAndroid Build Coastguard Worker     int32_t     lowWaterMark;   /* If count < lowWaterMark, rehash */
175*0e209d39SAndroid Build Coastguard Worker     float       highWaterRatio; /* 0..1; high water as a fraction of length */
176*0e209d39SAndroid Build Coastguard Worker     float       lowWaterRatio;  /* 0..1; low water as a fraction of length */
177*0e209d39SAndroid Build Coastguard Worker 
178*0e209d39SAndroid Build Coastguard Worker     int8_t      primeIndex;     /* Index into our prime table for length.
179*0e209d39SAndroid Build Coastguard Worker                                  * length == PRIMES[primeIndex] */
180*0e209d39SAndroid Build Coastguard Worker     UBool       allocated; /* Was this UHashtable allocated? */
181*0e209d39SAndroid Build Coastguard Worker };
182*0e209d39SAndroid Build Coastguard Worker typedef struct UHashtable UHashtable;
183*0e209d39SAndroid Build Coastguard Worker 
184*0e209d39SAndroid Build Coastguard Worker U_CDECL_END
185*0e209d39SAndroid Build Coastguard Worker 
186*0e209d39SAndroid Build Coastguard Worker /********************************************************************
187*0e209d39SAndroid Build Coastguard Worker  * API
188*0e209d39SAndroid Build Coastguard Worker  ********************************************************************/
189*0e209d39SAndroid Build Coastguard Worker 
190*0e209d39SAndroid Build Coastguard Worker /**
191*0e209d39SAndroid Build Coastguard Worker  * Initialize a new UHashtable.
192*0e209d39SAndroid Build Coastguard Worker  * @param keyHash A pointer to the key hashing function.  Must not be
193*0e209d39SAndroid Build Coastguard Worker  * NULL.
194*0e209d39SAndroid Build Coastguard Worker  * @param keyComp A pointer to the function that compares keys.  Must
195*0e209d39SAndroid Build Coastguard Worker  * not be NULL.
196*0e209d39SAndroid Build Coastguard Worker  * @param status A pointer to an UErrorCode to receive any errors.
197*0e209d39SAndroid Build Coastguard Worker  * @return A pointer to a UHashtable, or 0 if an error occurred.
198*0e209d39SAndroid Build Coastguard Worker  * @see uhash_openSize
199*0e209d39SAndroid Build Coastguard Worker  */
200*0e209d39SAndroid Build Coastguard Worker U_CAPI UHashtable* U_EXPORT2
201*0e209d39SAndroid Build Coastguard Worker uhash_open(UHashFunction *keyHash,
202*0e209d39SAndroid Build Coastguard Worker            UKeyComparator *keyComp,
203*0e209d39SAndroid Build Coastguard Worker            UValueComparator *valueComp,
204*0e209d39SAndroid Build Coastguard Worker            UErrorCode *status);
205*0e209d39SAndroid Build Coastguard Worker 
206*0e209d39SAndroid Build Coastguard Worker /**
207*0e209d39SAndroid Build Coastguard Worker  * Initialize a new UHashtable with a given initial size.
208*0e209d39SAndroid Build Coastguard Worker  * @param keyHash A pointer to the key hashing function.  Must not be
209*0e209d39SAndroid Build Coastguard Worker  * NULL.
210*0e209d39SAndroid Build Coastguard Worker  * @param keyComp A pointer to the function that compares keys.  Must
211*0e209d39SAndroid Build Coastguard Worker  * not be NULL.
212*0e209d39SAndroid Build Coastguard Worker  * @param size The initial capacity of this hashtable.
213*0e209d39SAndroid Build Coastguard Worker  * @param status A pointer to an UErrorCode to receive any errors.
214*0e209d39SAndroid Build Coastguard Worker  * @return A pointer to a UHashtable, or 0 if an error occurred.
215*0e209d39SAndroid Build Coastguard Worker  * @see uhash_open
216*0e209d39SAndroid Build Coastguard Worker  */
217*0e209d39SAndroid Build Coastguard Worker U_CAPI UHashtable* U_EXPORT2
218*0e209d39SAndroid Build Coastguard Worker uhash_openSize(UHashFunction *keyHash,
219*0e209d39SAndroid Build Coastguard Worker                UKeyComparator *keyComp,
220*0e209d39SAndroid Build Coastguard Worker                UValueComparator *valueComp,
221*0e209d39SAndroid Build Coastguard Worker                int32_t size,
222*0e209d39SAndroid Build Coastguard Worker                UErrorCode *status);
223*0e209d39SAndroid Build Coastguard Worker 
224*0e209d39SAndroid Build Coastguard Worker /**
225*0e209d39SAndroid Build Coastguard Worker  * Initialize an existing UHashtable.
226*0e209d39SAndroid Build Coastguard Worker  * @param keyHash A pointer to the key hashing function.  Must not be
227*0e209d39SAndroid Build Coastguard Worker  * NULL.
228*0e209d39SAndroid Build Coastguard Worker  * @param keyComp A pointer to the function that compares keys.  Must
229*0e209d39SAndroid Build Coastguard Worker  * not be NULL.
230*0e209d39SAndroid Build Coastguard Worker  * @param status A pointer to an UErrorCode to receive any errors.
231*0e209d39SAndroid Build Coastguard Worker  * @return A pointer to a UHashtable, or 0 if an error occurred.
232*0e209d39SAndroid Build Coastguard Worker  * @see uhash_openSize
233*0e209d39SAndroid Build Coastguard Worker  */
234*0e209d39SAndroid Build Coastguard Worker U_CAPI UHashtable* U_EXPORT2
235*0e209d39SAndroid Build Coastguard Worker uhash_init(UHashtable *hash,
236*0e209d39SAndroid Build Coastguard Worker            UHashFunction *keyHash,
237*0e209d39SAndroid Build Coastguard Worker            UKeyComparator *keyComp,
238*0e209d39SAndroid Build Coastguard Worker            UValueComparator *valueComp,
239*0e209d39SAndroid Build Coastguard Worker            UErrorCode *status);
240*0e209d39SAndroid Build Coastguard Worker 
241*0e209d39SAndroid Build Coastguard Worker /**
242*0e209d39SAndroid Build Coastguard Worker  * Initialize an existing UHashtable.
243*0e209d39SAndroid Build Coastguard Worker  * @param keyHash A pointer to the key hashing function.  Must not be
244*0e209d39SAndroid Build Coastguard Worker  * NULL.
245*0e209d39SAndroid Build Coastguard Worker  * @param keyComp A pointer to the function that compares keys.  Must
246*0e209d39SAndroid Build Coastguard Worker  * not be NULL.
247*0e209d39SAndroid Build Coastguard Worker  * @param size The initial capacity of this hashtable.
248*0e209d39SAndroid Build Coastguard Worker  * @param status A pointer to an UErrorCode to receive any errors.
249*0e209d39SAndroid Build Coastguard Worker  * @return A pointer to a UHashtable, or 0 if an error occurred.
250*0e209d39SAndroid Build Coastguard Worker  * @see uhash_openSize
251*0e209d39SAndroid Build Coastguard Worker  */
252*0e209d39SAndroid Build Coastguard Worker U_CAPI UHashtable* U_EXPORT2
253*0e209d39SAndroid Build Coastguard Worker uhash_initSize(UHashtable *hash,
254*0e209d39SAndroid Build Coastguard Worker                UHashFunction *keyHash,
255*0e209d39SAndroid Build Coastguard Worker                UKeyComparator *keyComp,
256*0e209d39SAndroid Build Coastguard Worker                UValueComparator *valueComp,
257*0e209d39SAndroid Build Coastguard Worker                int32_t size,
258*0e209d39SAndroid Build Coastguard Worker                UErrorCode *status);
259*0e209d39SAndroid Build Coastguard Worker 
260*0e209d39SAndroid Build Coastguard Worker /**
261*0e209d39SAndroid Build Coastguard Worker  * Close a UHashtable, releasing the memory used.
262*0e209d39SAndroid Build Coastguard Worker  * @param hash The UHashtable to close. If hash is NULL no operation is performed.
263*0e209d39SAndroid Build Coastguard Worker  */
264*0e209d39SAndroid Build Coastguard Worker U_CAPI void U_EXPORT2
265*0e209d39SAndroid Build Coastguard Worker uhash_close(UHashtable *hash);
266*0e209d39SAndroid Build Coastguard Worker 
267*0e209d39SAndroid Build Coastguard Worker 
268*0e209d39SAndroid Build Coastguard Worker 
269*0e209d39SAndroid Build Coastguard Worker /**
270*0e209d39SAndroid Build Coastguard Worker  * Set the function used to hash keys.
271*0e209d39SAndroid Build Coastguard Worker  * @param hash The UHashtable to set
272*0e209d39SAndroid Build Coastguard Worker  * @param fn the function to be used hash keys; must not be NULL
273*0e209d39SAndroid Build Coastguard Worker  * @return the previous key hasher; non-NULL
274*0e209d39SAndroid Build Coastguard Worker  */
275*0e209d39SAndroid Build Coastguard Worker U_CAPI UHashFunction *U_EXPORT2
276*0e209d39SAndroid Build Coastguard Worker uhash_setKeyHasher(UHashtable *hash, UHashFunction *fn);
277*0e209d39SAndroid Build Coastguard Worker 
278*0e209d39SAndroid Build Coastguard Worker /**
279*0e209d39SAndroid Build Coastguard Worker  * Set the function used to compare keys.  The default comparison is a
280*0e209d39SAndroid Build Coastguard Worker  * void* pointer comparison.
281*0e209d39SAndroid Build Coastguard Worker  * @param hash The UHashtable to set
282*0e209d39SAndroid Build Coastguard Worker  * @param fn the function to be used compare keys; must not be NULL
283*0e209d39SAndroid Build Coastguard Worker  * @return the previous key comparator; non-NULL
284*0e209d39SAndroid Build Coastguard Worker  */
285*0e209d39SAndroid Build Coastguard Worker U_CAPI UKeyComparator *U_EXPORT2
286*0e209d39SAndroid Build Coastguard Worker uhash_setKeyComparator(UHashtable *hash, UKeyComparator *fn);
287*0e209d39SAndroid Build Coastguard Worker 
288*0e209d39SAndroid Build Coastguard Worker /**
289*0e209d39SAndroid Build Coastguard Worker  * Set the function used to compare values.  The default comparison is a
290*0e209d39SAndroid Build Coastguard Worker  * void* pointer comparison.
291*0e209d39SAndroid Build Coastguard Worker  * @param hash The UHashtable to set
292*0e209d39SAndroid Build Coastguard Worker  * @param fn the function to be used compare keys; must not be NULL
293*0e209d39SAndroid Build Coastguard Worker  * @return the previous key comparator; non-NULL
294*0e209d39SAndroid Build Coastguard Worker  */
295*0e209d39SAndroid Build Coastguard Worker U_CAPI UValueComparator *U_EXPORT2
296*0e209d39SAndroid Build Coastguard Worker uhash_setValueComparator(UHashtable *hash, UValueComparator *fn);
297*0e209d39SAndroid Build Coastguard Worker 
298*0e209d39SAndroid Build Coastguard Worker /**
299*0e209d39SAndroid Build Coastguard Worker  * Set the function used to delete keys.  If this function pointer is
300*0e209d39SAndroid Build Coastguard Worker  * NULL, this hashtable does not delete keys.  If it is non-NULL, this
301*0e209d39SAndroid Build Coastguard Worker  * hashtable does delete keys.  This function should be set once
302*0e209d39SAndroid Build Coastguard Worker  * before any elements are added to the hashtable and should not be
303*0e209d39SAndroid Build Coastguard Worker  * changed thereafter.
304*0e209d39SAndroid Build Coastguard Worker  * @param hash The UHashtable to set
305*0e209d39SAndroid Build Coastguard Worker  * @param fn the function to be used delete keys, or NULL
306*0e209d39SAndroid Build Coastguard Worker  * @return the previous key deleter; may be NULL
307*0e209d39SAndroid Build Coastguard Worker  */
308*0e209d39SAndroid Build Coastguard Worker U_CAPI UObjectDeleter *U_EXPORT2
309*0e209d39SAndroid Build Coastguard Worker uhash_setKeyDeleter(UHashtable *hash, UObjectDeleter *fn);
310*0e209d39SAndroid Build Coastguard Worker 
311*0e209d39SAndroid Build Coastguard Worker /**
312*0e209d39SAndroid Build Coastguard Worker  * Set the function used to delete values.  If this function pointer
313*0e209d39SAndroid Build Coastguard Worker  * is NULL, this hashtable does not delete values.  If it is non-NULL,
314*0e209d39SAndroid Build Coastguard Worker  * this hashtable does delete values.  This function should be set
315*0e209d39SAndroid Build Coastguard Worker  * once before any elements are added to the hashtable and should not
316*0e209d39SAndroid Build Coastguard Worker  * be changed thereafter.
317*0e209d39SAndroid Build Coastguard Worker  * @param hash The UHashtable to set
318*0e209d39SAndroid Build Coastguard Worker  * @param fn the function to be used delete values, or NULL
319*0e209d39SAndroid Build Coastguard Worker  * @return the previous value deleter; may be NULL
320*0e209d39SAndroid Build Coastguard Worker  */
321*0e209d39SAndroid Build Coastguard Worker U_CAPI UObjectDeleter *U_EXPORT2
322*0e209d39SAndroid Build Coastguard Worker uhash_setValueDeleter(UHashtable *hash, UObjectDeleter *fn);
323*0e209d39SAndroid Build Coastguard Worker 
324*0e209d39SAndroid Build Coastguard Worker /**
325*0e209d39SAndroid Build Coastguard Worker  * Specify whether or not, and how, the hashtable resizes itself.
326*0e209d39SAndroid Build Coastguard Worker  * By default, tables grow but do not shrink (policy U_GROW).
327*0e209d39SAndroid Build Coastguard Worker  * See enum UHashResizePolicy.
328*0e209d39SAndroid Build Coastguard Worker  * @param hash The UHashtable to set
329*0e209d39SAndroid Build Coastguard Worker  * @param policy The way the hashtable resizes itself, {U_GROW, U_GROW_AND_SHRINK, U_FIXED}
330*0e209d39SAndroid Build Coastguard Worker  */
331*0e209d39SAndroid Build Coastguard Worker U_CAPI void U_EXPORT2
332*0e209d39SAndroid Build Coastguard Worker uhash_setResizePolicy(UHashtable *hash, enum UHashResizePolicy policy);
333*0e209d39SAndroid Build Coastguard Worker 
334*0e209d39SAndroid Build Coastguard Worker /**
335*0e209d39SAndroid Build Coastguard Worker  * Get the number of key-value pairs stored in a UHashtable.
336*0e209d39SAndroid Build Coastguard Worker  * @param hash The UHashtable to query.
337*0e209d39SAndroid Build Coastguard Worker  * @return The number of key-value pairs stored in hash.
338*0e209d39SAndroid Build Coastguard Worker  */
339*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2
340*0e209d39SAndroid Build Coastguard Worker uhash_count(const UHashtable *hash);
341*0e209d39SAndroid Build Coastguard Worker 
342*0e209d39SAndroid Build Coastguard Worker /**
343*0e209d39SAndroid Build Coastguard Worker  * Put a (key=pointer, value=pointer) item in a UHashtable.  If the
344*0e209d39SAndroid Build Coastguard Worker  * keyDeleter is non-NULL, then the hashtable owns 'key' after this
345*0e209d39SAndroid Build Coastguard Worker  * call.  If the valueDeleter is non-NULL, then the hashtable owns
346*0e209d39SAndroid Build Coastguard Worker  * 'value' after this call.  Storing a NULL value is the same as
347*0e209d39SAndroid Build Coastguard Worker  * calling uhash_remove().
348*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
349*0e209d39SAndroid Build Coastguard Worker  * @param key The key to store.
350*0e209d39SAndroid Build Coastguard Worker  * @param value The value to store, may be NULL (see above).
351*0e209d39SAndroid Build Coastguard Worker  * @param status A pointer to an UErrorCode to receive any errors.
352*0e209d39SAndroid Build Coastguard Worker  * @return The previous value, or NULL if none.
353*0e209d39SAndroid Build Coastguard Worker  * @see uhash_get
354*0e209d39SAndroid Build Coastguard Worker  */
355*0e209d39SAndroid Build Coastguard Worker U_CAPI void* U_EXPORT2
356*0e209d39SAndroid Build Coastguard Worker uhash_put(UHashtable *hash,
357*0e209d39SAndroid Build Coastguard Worker           void *key,
358*0e209d39SAndroid Build Coastguard Worker           void *value,
359*0e209d39SAndroid Build Coastguard Worker           UErrorCode *status);
360*0e209d39SAndroid Build Coastguard Worker 
361*0e209d39SAndroid Build Coastguard Worker /**
362*0e209d39SAndroid Build Coastguard Worker  * Put a (key=integer, value=pointer) item in a UHashtable.
363*0e209d39SAndroid Build Coastguard Worker  * keyDeleter must be NULL.  If the valueDeleter is non-NULL, then the
364*0e209d39SAndroid Build Coastguard Worker  * hashtable owns 'value' after this call.  Storing a NULL value is
365*0e209d39SAndroid Build Coastguard Worker  * the same as calling uhash_remove().
366*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
367*0e209d39SAndroid Build Coastguard Worker  * @param key The integer key to store.
368*0e209d39SAndroid Build Coastguard Worker  * @param value The value to store, may be NULL (see above).
369*0e209d39SAndroid Build Coastguard Worker  * @param status A pointer to an UErrorCode to receive any errors.
370*0e209d39SAndroid Build Coastguard Worker  * @return The previous value, or NULL if none.
371*0e209d39SAndroid Build Coastguard Worker  * @see uhash_get
372*0e209d39SAndroid Build Coastguard Worker  */
373*0e209d39SAndroid Build Coastguard Worker U_CAPI void* U_EXPORT2
374*0e209d39SAndroid Build Coastguard Worker uhash_iput(UHashtable *hash,
375*0e209d39SAndroid Build Coastguard Worker            int32_t key,
376*0e209d39SAndroid Build Coastguard Worker            void* value,
377*0e209d39SAndroid Build Coastguard Worker            UErrorCode *status);
378*0e209d39SAndroid Build Coastguard Worker 
379*0e209d39SAndroid Build Coastguard Worker /**
380*0e209d39SAndroid Build Coastguard Worker  * Put a (key=pointer, value=integer) item in a UHashtable.  If the
381*0e209d39SAndroid Build Coastguard Worker  * keyDeleter is non-NULL, then the hashtable owns 'key' after this
382*0e209d39SAndroid Build Coastguard Worker  * call.  valueDeleter must be NULL.  Storing a 0 value is the same as
383*0e209d39SAndroid Build Coastguard Worker  * calling uhash_remove().
384*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
385*0e209d39SAndroid Build Coastguard Worker  * @param key The key to store.
386*0e209d39SAndroid Build Coastguard Worker  * @param value The integer value to store.
387*0e209d39SAndroid Build Coastguard Worker  * @param status A pointer to an UErrorCode to receive any errors.
388*0e209d39SAndroid Build Coastguard Worker  * @return The previous value, or 0 if none.
389*0e209d39SAndroid Build Coastguard Worker  * @see uhash_get
390*0e209d39SAndroid Build Coastguard Worker  */
391*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2
392*0e209d39SAndroid Build Coastguard Worker uhash_puti(UHashtable *hash,
393*0e209d39SAndroid Build Coastguard Worker            void* key,
394*0e209d39SAndroid Build Coastguard Worker            int32_t value,
395*0e209d39SAndroid Build Coastguard Worker            UErrorCode *status);
396*0e209d39SAndroid Build Coastguard Worker 
397*0e209d39SAndroid Build Coastguard Worker /**
398*0e209d39SAndroid Build Coastguard Worker  * Put a (key=integer, value=integer) item in a UHashtable.  If the
399*0e209d39SAndroid Build Coastguard Worker  * keyDeleter is non-NULL, then the hashtable owns 'key' after this
400*0e209d39SAndroid Build Coastguard Worker  * call.  valueDeleter must be NULL.  Storing a 0 value is the same as
401*0e209d39SAndroid Build Coastguard Worker  * calling uhash_remove().
402*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
403*0e209d39SAndroid Build Coastguard Worker  * @param key The key to store.
404*0e209d39SAndroid Build Coastguard Worker  * @param value The integer value to store.
405*0e209d39SAndroid Build Coastguard Worker  * @param status A pointer to an UErrorCode to receive any errors.
406*0e209d39SAndroid Build Coastguard Worker  * @return The previous value, or 0 if none.
407*0e209d39SAndroid Build Coastguard Worker  * @see uhash_get
408*0e209d39SAndroid Build Coastguard Worker  */
409*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2
410*0e209d39SAndroid Build Coastguard Worker uhash_iputi(UHashtable *hash,
411*0e209d39SAndroid Build Coastguard Worker            int32_t key,
412*0e209d39SAndroid Build Coastguard Worker            int32_t value,
413*0e209d39SAndroid Build Coastguard Worker            UErrorCode *status);
414*0e209d39SAndroid Build Coastguard Worker 
415*0e209d39SAndroid Build Coastguard Worker /**
416*0e209d39SAndroid Build Coastguard Worker  * Put a (key=pointer, value=integer) item in a UHashtable.  If the
417*0e209d39SAndroid Build Coastguard Worker  * keyDeleter is non-NULL, then the hashtable owns 'key' after this
418*0e209d39SAndroid Build Coastguard Worker  * call.  valueDeleter must be NULL.
419*0e209d39SAndroid Build Coastguard Worker  * Storing a 0 value is possible; call uhash_igetiAndFound() to retrieve values including zero.
420*0e209d39SAndroid Build Coastguard Worker  *
421*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
422*0e209d39SAndroid Build Coastguard Worker  * @param key The key to store.
423*0e209d39SAndroid Build Coastguard Worker  * @param value The integer value to store.
424*0e209d39SAndroid Build Coastguard Worker  * @param status A pointer to an UErrorCode to receive any errors.
425*0e209d39SAndroid Build Coastguard Worker  * @return The previous value, or 0 if none.
426*0e209d39SAndroid Build Coastguard Worker  * @see uhash_getiAndFound
427*0e209d39SAndroid Build Coastguard Worker  */
428*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2
429*0e209d39SAndroid Build Coastguard Worker uhash_putiAllowZero(UHashtable *hash,
430*0e209d39SAndroid Build Coastguard Worker                     void *key,
431*0e209d39SAndroid Build Coastguard Worker                     int32_t value,
432*0e209d39SAndroid Build Coastguard Worker                     UErrorCode *status);
433*0e209d39SAndroid Build Coastguard Worker 
434*0e209d39SAndroid Build Coastguard Worker /**
435*0e209d39SAndroid Build Coastguard Worker  * Put a (key=integer, value=integer) item in a UHashtable.  If the
436*0e209d39SAndroid Build Coastguard Worker  * keyDeleter is non-NULL, then the hashtable owns 'key' after this
437*0e209d39SAndroid Build Coastguard Worker  * call.  valueDeleter must be NULL.
438*0e209d39SAndroid Build Coastguard Worker  * Storing a 0 value is possible; call uhash_igetiAndFound() to retrieve values including zero.
439*0e209d39SAndroid Build Coastguard Worker  *
440*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
441*0e209d39SAndroid Build Coastguard Worker  * @param key The key to store.
442*0e209d39SAndroid Build Coastguard Worker  * @param value The integer value to store.
443*0e209d39SAndroid Build Coastguard Worker  * @param status A pointer to an UErrorCode to receive any errors.
444*0e209d39SAndroid Build Coastguard Worker  * @return The previous value, or 0 if none.
445*0e209d39SAndroid Build Coastguard Worker  * @see uhash_igetiAndFound
446*0e209d39SAndroid Build Coastguard Worker  */
447*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2
448*0e209d39SAndroid Build Coastguard Worker uhash_iputiAllowZero(UHashtable *hash,
449*0e209d39SAndroid Build Coastguard Worker                      int32_t key,
450*0e209d39SAndroid Build Coastguard Worker                      int32_t value,
451*0e209d39SAndroid Build Coastguard Worker                      UErrorCode *status);
452*0e209d39SAndroid Build Coastguard Worker 
453*0e209d39SAndroid Build Coastguard Worker /**
454*0e209d39SAndroid Build Coastguard Worker  * Retrieve a pointer value from a UHashtable using a pointer key,
455*0e209d39SAndroid Build Coastguard Worker  * as previously stored by uhash_put().
456*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
457*0e209d39SAndroid Build Coastguard Worker  * @param key A pointer key stored in a hashtable
458*0e209d39SAndroid Build Coastguard Worker  * @return The requested item, or NULL if not found.
459*0e209d39SAndroid Build Coastguard Worker  */
460*0e209d39SAndroid Build Coastguard Worker U_CAPI void* U_EXPORT2
461*0e209d39SAndroid Build Coastguard Worker uhash_get(const UHashtable *hash,
462*0e209d39SAndroid Build Coastguard Worker           const void *key);
463*0e209d39SAndroid Build Coastguard Worker 
464*0e209d39SAndroid Build Coastguard Worker /**
465*0e209d39SAndroid Build Coastguard Worker  * Retrieve a pointer value from a UHashtable using a integer key,
466*0e209d39SAndroid Build Coastguard Worker  * as previously stored by uhash_iput().
467*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
468*0e209d39SAndroid Build Coastguard Worker  * @param key An integer key stored in a hashtable
469*0e209d39SAndroid Build Coastguard Worker  * @return The requested item, or NULL if not found.
470*0e209d39SAndroid Build Coastguard Worker  */
471*0e209d39SAndroid Build Coastguard Worker U_CAPI void* U_EXPORT2
472*0e209d39SAndroid Build Coastguard Worker uhash_iget(const UHashtable *hash,
473*0e209d39SAndroid Build Coastguard Worker            int32_t key);
474*0e209d39SAndroid Build Coastguard Worker 
475*0e209d39SAndroid Build Coastguard Worker /**
476*0e209d39SAndroid Build Coastguard Worker  * Retrieve an integer value from a UHashtable using a pointer key,
477*0e209d39SAndroid Build Coastguard Worker  * as previously stored by uhash_puti().
478*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
479*0e209d39SAndroid Build Coastguard Worker  * @param key A pointer key stored in a hashtable
480*0e209d39SAndroid Build Coastguard Worker  * @return The requested item, or 0 if not found.
481*0e209d39SAndroid Build Coastguard Worker  */
482*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2
483*0e209d39SAndroid Build Coastguard Worker uhash_geti(const UHashtable *hash,
484*0e209d39SAndroid Build Coastguard Worker            const void* key);
485*0e209d39SAndroid Build Coastguard Worker /**
486*0e209d39SAndroid Build Coastguard Worker  * Retrieve an integer value from a UHashtable using an integer key,
487*0e209d39SAndroid Build Coastguard Worker  * as previously stored by uhash_iputi().
488*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
489*0e209d39SAndroid Build Coastguard Worker  * @param key An integer key stored in a hashtable
490*0e209d39SAndroid Build Coastguard Worker  * @return The requested item, or 0 if not found.
491*0e209d39SAndroid Build Coastguard Worker  */
492*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2
493*0e209d39SAndroid Build Coastguard Worker uhash_igeti(const UHashtable *hash,
494*0e209d39SAndroid Build Coastguard Worker            int32_t key);
495*0e209d39SAndroid Build Coastguard Worker 
496*0e209d39SAndroid Build Coastguard Worker /**
497*0e209d39SAndroid Build Coastguard Worker  * Retrieves an integer value from a UHashtable using a pointer key,
498*0e209d39SAndroid Build Coastguard Worker  * as previously stored by uhash_putiAllowZero() or uhash_puti().
499*0e209d39SAndroid Build Coastguard Worker  *
500*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
501*0e209d39SAndroid Build Coastguard Worker  * @param key A pointer key stored in a hashtable
502*0e209d39SAndroid Build Coastguard Worker  * @param found A pointer to a boolean which will be set for whether the key was found.
503*0e209d39SAndroid Build Coastguard Worker  * @return The requested item, or 0 if not found.
504*0e209d39SAndroid Build Coastguard Worker  */
505*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2
506*0e209d39SAndroid Build Coastguard Worker uhash_getiAndFound(const UHashtable *hash,
507*0e209d39SAndroid Build Coastguard Worker                    const void *key,
508*0e209d39SAndroid Build Coastguard Worker                    UBool *found);
509*0e209d39SAndroid Build Coastguard Worker 
510*0e209d39SAndroid Build Coastguard Worker /**
511*0e209d39SAndroid Build Coastguard Worker  * Retrieves an integer value from a UHashtable using an integer key,
512*0e209d39SAndroid Build Coastguard Worker  * as previously stored by uhash_iputiAllowZero() or uhash_iputi().
513*0e209d39SAndroid Build Coastguard Worker  *
514*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
515*0e209d39SAndroid Build Coastguard Worker  * @param key An integer key stored in a hashtable
516*0e209d39SAndroid Build Coastguard Worker  * @param found A pointer to a boolean which will be set for whether the key was found.
517*0e209d39SAndroid Build Coastguard Worker  * @return The requested item, or 0 if not found.
518*0e209d39SAndroid Build Coastguard Worker  */
519*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2
520*0e209d39SAndroid Build Coastguard Worker uhash_igetiAndFound(const UHashtable *hash,
521*0e209d39SAndroid Build Coastguard Worker                     int32_t key,
522*0e209d39SAndroid Build Coastguard Worker                     UBool *found);
523*0e209d39SAndroid Build Coastguard Worker 
524*0e209d39SAndroid Build Coastguard Worker /**
525*0e209d39SAndroid Build Coastguard Worker  * Remove an item from a UHashtable stored by uhash_put().
526*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
527*0e209d39SAndroid Build Coastguard Worker  * @param key A key stored in a hashtable
528*0e209d39SAndroid Build Coastguard Worker  * @return The item removed, or NULL if not found.
529*0e209d39SAndroid Build Coastguard Worker  */
530*0e209d39SAndroid Build Coastguard Worker U_CAPI void* U_EXPORT2
531*0e209d39SAndroid Build Coastguard Worker uhash_remove(UHashtable *hash,
532*0e209d39SAndroid Build Coastguard Worker              const void *key);
533*0e209d39SAndroid Build Coastguard Worker 
534*0e209d39SAndroid Build Coastguard Worker /**
535*0e209d39SAndroid Build Coastguard Worker  * Remove an item from a UHashtable stored by uhash_iput().
536*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
537*0e209d39SAndroid Build Coastguard Worker  * @param key An integer key stored in a hashtable
538*0e209d39SAndroid Build Coastguard Worker  * @return The item removed, or NULL if not found.
539*0e209d39SAndroid Build Coastguard Worker  */
540*0e209d39SAndroid Build Coastguard Worker U_CAPI void* U_EXPORT2
541*0e209d39SAndroid Build Coastguard Worker uhash_iremove(UHashtable *hash,
542*0e209d39SAndroid Build Coastguard Worker               int32_t key);
543*0e209d39SAndroid Build Coastguard Worker 
544*0e209d39SAndroid Build Coastguard Worker /**
545*0e209d39SAndroid Build Coastguard Worker  * Remove an item from a UHashtable stored by uhash_puti().
546*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
547*0e209d39SAndroid Build Coastguard Worker  * @param key An key stored in a hashtable
548*0e209d39SAndroid Build Coastguard Worker  * @return The item removed, or 0 if not found.
549*0e209d39SAndroid Build Coastguard Worker  */
550*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2
551*0e209d39SAndroid Build Coastguard Worker uhash_removei(UHashtable *hash,
552*0e209d39SAndroid Build Coastguard Worker               const void* key);
553*0e209d39SAndroid Build Coastguard Worker 
554*0e209d39SAndroid Build Coastguard Worker /**
555*0e209d39SAndroid Build Coastguard Worker  * Remove an item from a UHashtable stored by uhash_iputi().
556*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
557*0e209d39SAndroid Build Coastguard Worker  * @param key An integer key stored in a hashtable
558*0e209d39SAndroid Build Coastguard Worker  * @return The item removed, or 0 if not found.
559*0e209d39SAndroid Build Coastguard Worker  */
560*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2
561*0e209d39SAndroid Build Coastguard Worker uhash_iremovei(UHashtable *hash,
562*0e209d39SAndroid Build Coastguard Worker                int32_t key);
563*0e209d39SAndroid Build Coastguard Worker 
564*0e209d39SAndroid Build Coastguard Worker /**
565*0e209d39SAndroid Build Coastguard Worker  * Remove all items from a UHashtable.
566*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
567*0e209d39SAndroid Build Coastguard Worker  */
568*0e209d39SAndroid Build Coastguard Worker U_CAPI void U_EXPORT2
569*0e209d39SAndroid Build Coastguard Worker uhash_removeAll(UHashtable *hash);
570*0e209d39SAndroid Build Coastguard Worker 
571*0e209d39SAndroid Build Coastguard Worker /**
572*0e209d39SAndroid Build Coastguard Worker  * Returns true if the UHashtable contains an item with this pointer key.
573*0e209d39SAndroid Build Coastguard Worker  *
574*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
575*0e209d39SAndroid Build Coastguard Worker  * @param key A pointer key stored in a hashtable
576*0e209d39SAndroid Build Coastguard Worker  * @return true if the key is found.
577*0e209d39SAndroid Build Coastguard Worker  */
578*0e209d39SAndroid Build Coastguard Worker U_CAPI UBool U_EXPORT2
579*0e209d39SAndroid Build Coastguard Worker uhash_containsKey(const UHashtable *hash, const void *key);
580*0e209d39SAndroid Build Coastguard Worker 
581*0e209d39SAndroid Build Coastguard Worker /**
582*0e209d39SAndroid Build Coastguard Worker  * Returns true if the UHashtable contains an item with this integer key.
583*0e209d39SAndroid Build Coastguard Worker  *
584*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
585*0e209d39SAndroid Build Coastguard Worker  * @param key An integer key stored in a hashtable
586*0e209d39SAndroid Build Coastguard Worker  * @return true if the key is found.
587*0e209d39SAndroid Build Coastguard Worker  */
588*0e209d39SAndroid Build Coastguard Worker U_CAPI UBool U_EXPORT2
589*0e209d39SAndroid Build Coastguard Worker uhash_icontainsKey(const UHashtable *hash, int32_t key);
590*0e209d39SAndroid Build Coastguard Worker 
591*0e209d39SAndroid Build Coastguard Worker /**
592*0e209d39SAndroid Build Coastguard Worker  * Locate an element of a UHashtable.  The caller must not modify the
593*0e209d39SAndroid Build Coastguard Worker  * returned object.  The primary use of this function is to obtain the
594*0e209d39SAndroid Build Coastguard Worker  * stored key when it may not be identical to the search key.  For
595*0e209d39SAndroid Build Coastguard Worker  * example, if the compare function is a case-insensitive string
596*0e209d39SAndroid Build Coastguard Worker  * compare, then the hash key may be desired in order to obtain the
597*0e209d39SAndroid Build Coastguard Worker  * canonical case corresponding to a search key.
598*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
599*0e209d39SAndroid Build Coastguard Worker  * @param key A key stored in a hashtable
600*0e209d39SAndroid Build Coastguard Worker  * @return a hash element, or NULL if the key is not found.
601*0e209d39SAndroid Build Coastguard Worker  */
602*0e209d39SAndroid Build Coastguard Worker U_CAPI const UHashElement* U_EXPORT2
603*0e209d39SAndroid Build Coastguard Worker uhash_find(const UHashtable *hash, const void* key);
604*0e209d39SAndroid Build Coastguard Worker 
605*0e209d39SAndroid Build Coastguard Worker /**
606*0e209d39SAndroid Build Coastguard Worker  * \def UHASH_FIRST
607*0e209d39SAndroid Build Coastguard Worker  * Constant for use with uhash_nextElement
608*0e209d39SAndroid Build Coastguard Worker  * @see uhash_nextElement
609*0e209d39SAndroid Build Coastguard Worker  */
610*0e209d39SAndroid Build Coastguard Worker #define UHASH_FIRST (-1)
611*0e209d39SAndroid Build Coastguard Worker 
612*0e209d39SAndroid Build Coastguard Worker /**
613*0e209d39SAndroid Build Coastguard Worker  * Iterate through the elements of a UHashtable.  The caller must not
614*0e209d39SAndroid Build Coastguard Worker  * modify the returned object.  However, uhash_removeElement() may be
615*0e209d39SAndroid Build Coastguard Worker  * called during iteration to remove an element from the table.
616*0e209d39SAndroid Build Coastguard Worker  * Iteration may safely be resumed afterwards.  If uhash_put() is
617*0e209d39SAndroid Build Coastguard Worker  * called during iteration the iteration will then be out of sync and
618*0e209d39SAndroid Build Coastguard Worker  * should be restarted.
619*0e209d39SAndroid Build Coastguard Worker  * @param hash The target UHashtable.
620*0e209d39SAndroid Build Coastguard Worker  * @param pos This should be set to UHASH_FIRST initially, and left untouched
621*0e209d39SAndroid Build Coastguard Worker  * thereafter.
622*0e209d39SAndroid Build Coastguard Worker  * @return a hash element, or NULL if no further key-value pairs
623*0e209d39SAndroid Build Coastguard Worker  * exist in the table.
624*0e209d39SAndroid Build Coastguard Worker  */
625*0e209d39SAndroid Build Coastguard Worker U_CAPI const UHashElement* U_EXPORT2
626*0e209d39SAndroid Build Coastguard Worker uhash_nextElement(const UHashtable *hash,
627*0e209d39SAndroid Build Coastguard Worker                   int32_t *pos);
628*0e209d39SAndroid Build Coastguard Worker 
629*0e209d39SAndroid Build Coastguard Worker /**
630*0e209d39SAndroid Build Coastguard Worker  * Remove an element, returned by uhash_nextElement(), from the table.
631*0e209d39SAndroid Build Coastguard Worker  * Iteration may be safely continued afterwards.
632*0e209d39SAndroid Build Coastguard Worker  * @param hash The hashtable
633*0e209d39SAndroid Build Coastguard Worker  * @param e The element, returned by uhash_nextElement(), to remove.
634*0e209d39SAndroid Build Coastguard Worker  * Must not be NULL.  Must not be an empty or deleted element (as long
635*0e209d39SAndroid Build Coastguard Worker  * as this was returned by uhash_nextElement() it will not be empty or
636*0e209d39SAndroid Build Coastguard Worker  * deleted).  Note: Although this parameter is const, it will be
637*0e209d39SAndroid Build Coastguard Worker  * modified.
638*0e209d39SAndroid Build Coastguard Worker  * @return the value that was removed.
639*0e209d39SAndroid Build Coastguard Worker  */
640*0e209d39SAndroid Build Coastguard Worker U_CAPI void* U_EXPORT2
641*0e209d39SAndroid Build Coastguard Worker uhash_removeElement(UHashtable *hash, const UHashElement* e);
642*0e209d39SAndroid Build Coastguard Worker 
643*0e209d39SAndroid Build Coastguard Worker /********************************************************************
644*0e209d39SAndroid Build Coastguard Worker  * UHashTok convenience
645*0e209d39SAndroid Build Coastguard Worker  ********************************************************************/
646*0e209d39SAndroid Build Coastguard Worker 
647*0e209d39SAndroid Build Coastguard Worker /**
648*0e209d39SAndroid Build Coastguard Worker  * Return a UHashTok for an integer.
649*0e209d39SAndroid Build Coastguard Worker  * @param i The given integer
650*0e209d39SAndroid Build Coastguard Worker  * @return a UHashTok for an integer.
651*0e209d39SAndroid Build Coastguard Worker  */
652*0e209d39SAndroid Build Coastguard Worker /*U_CAPI UHashTok U_EXPORT2
653*0e209d39SAndroid Build Coastguard Worker uhash_toki(int32_t i);*/
654*0e209d39SAndroid Build Coastguard Worker 
655*0e209d39SAndroid Build Coastguard Worker /**
656*0e209d39SAndroid Build Coastguard Worker  * Return a UHashTok for a pointer.
657*0e209d39SAndroid Build Coastguard Worker  * @param p The given pointer
658*0e209d39SAndroid Build Coastguard Worker  * @return a UHashTok for a pointer.
659*0e209d39SAndroid Build Coastguard Worker  */
660*0e209d39SAndroid Build Coastguard Worker /*U_CAPI UHashTok U_EXPORT2
661*0e209d39SAndroid Build Coastguard Worker uhash_tokp(void* p);*/
662*0e209d39SAndroid Build Coastguard Worker 
663*0e209d39SAndroid Build Coastguard Worker /********************************************************************
664*0e209d39SAndroid Build Coastguard Worker  * UChar* and char* Support Functions
665*0e209d39SAndroid Build Coastguard Worker  ********************************************************************/
666*0e209d39SAndroid Build Coastguard Worker 
667*0e209d39SAndroid Build Coastguard Worker /**
668*0e209d39SAndroid Build Coastguard Worker  * Generate a hash code for a null-terminated UChar* string.  If the
669*0e209d39SAndroid Build Coastguard Worker  * string is not null-terminated do not use this function.  Use
670*0e209d39SAndroid Build Coastguard Worker  * together with uhash_compareUChars.
671*0e209d39SAndroid Build Coastguard Worker  * @param key The string (const UChar*) to hash.
672*0e209d39SAndroid Build Coastguard Worker  * @return A hash code for the key.
673*0e209d39SAndroid Build Coastguard Worker  */
674*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2
675*0e209d39SAndroid Build Coastguard Worker uhash_hashUChars(const UHashTok key);
676*0e209d39SAndroid Build Coastguard Worker 
677*0e209d39SAndroid Build Coastguard Worker /**
678*0e209d39SAndroid Build Coastguard Worker  * Generate a hash code for a null-terminated char* string.  If the
679*0e209d39SAndroid Build Coastguard Worker  * string is not null-terminated do not use this function.  Use
680*0e209d39SAndroid Build Coastguard Worker  * together with uhash_compareChars.
681*0e209d39SAndroid Build Coastguard Worker  * @param key The string (const char*) to hash.
682*0e209d39SAndroid Build Coastguard Worker  * @return A hash code for the key.
683*0e209d39SAndroid Build Coastguard Worker  */
684*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2
685*0e209d39SAndroid Build Coastguard Worker uhash_hashChars(const UHashTok key);
686*0e209d39SAndroid Build Coastguard Worker 
687*0e209d39SAndroid Build Coastguard Worker /**
688*0e209d39SAndroid Build Coastguard Worker  * Generate a case-insensitive hash code for a null-terminated char*
689*0e209d39SAndroid Build Coastguard Worker  * string.  If the string is not null-terminated do not use this
690*0e209d39SAndroid Build Coastguard Worker  * function.  Use together with uhash_compareIChars.
691*0e209d39SAndroid Build Coastguard Worker  * @param key The string (const char*) to hash.
692*0e209d39SAndroid Build Coastguard Worker  * @return A hash code for the key.
693*0e209d39SAndroid Build Coastguard Worker  */
694*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2
695*0e209d39SAndroid Build Coastguard Worker uhash_hashIChars(const UHashTok key);
696*0e209d39SAndroid Build Coastguard Worker 
697*0e209d39SAndroid Build Coastguard Worker /**
698*0e209d39SAndroid Build Coastguard Worker  * Comparator for null-terminated UChar* strings.  Use together with
699*0e209d39SAndroid Build Coastguard Worker  * uhash_hashUChars.
700*0e209d39SAndroid Build Coastguard Worker  * @param key1 The string for comparison
701*0e209d39SAndroid Build Coastguard Worker  * @param key2 The string for comparison
702*0e209d39SAndroid Build Coastguard Worker  * @return true if key1 and key2 are equal, return false otherwise.
703*0e209d39SAndroid Build Coastguard Worker  */
704*0e209d39SAndroid Build Coastguard Worker U_CAPI UBool U_EXPORT2
705*0e209d39SAndroid Build Coastguard Worker uhash_compareUChars(const UHashTok key1, const UHashTok key2);
706*0e209d39SAndroid Build Coastguard Worker 
707*0e209d39SAndroid Build Coastguard Worker /**
708*0e209d39SAndroid Build Coastguard Worker  * Comparator for null-terminated char* strings.  Use together with
709*0e209d39SAndroid Build Coastguard Worker  * uhash_hashChars.
710*0e209d39SAndroid Build Coastguard Worker  * @param key1 The string for comparison
711*0e209d39SAndroid Build Coastguard Worker  * @param key2 The string for comparison
712*0e209d39SAndroid Build Coastguard Worker  * @return true if key1 and key2 are equal, return false otherwise.
713*0e209d39SAndroid Build Coastguard Worker  */
714*0e209d39SAndroid Build Coastguard Worker U_CAPI UBool U_EXPORT2
715*0e209d39SAndroid Build Coastguard Worker uhash_compareChars(const UHashTok key1, const UHashTok key2);
716*0e209d39SAndroid Build Coastguard Worker 
717*0e209d39SAndroid Build Coastguard Worker /**
718*0e209d39SAndroid Build Coastguard Worker  * Case-insensitive comparator for null-terminated char* strings.  Use
719*0e209d39SAndroid Build Coastguard Worker  * together with uhash_hashIChars.
720*0e209d39SAndroid Build Coastguard Worker  * @param key1 The string for comparison
721*0e209d39SAndroid Build Coastguard Worker  * @param key2 The string for comparison
722*0e209d39SAndroid Build Coastguard Worker  * @return true if key1 and key2 are equal, return false otherwise.
723*0e209d39SAndroid Build Coastguard Worker  */
724*0e209d39SAndroid Build Coastguard Worker U_CAPI UBool U_EXPORT2
725*0e209d39SAndroid Build Coastguard Worker uhash_compareIChars(const UHashTok key1, const UHashTok key2);
726*0e209d39SAndroid Build Coastguard Worker 
727*0e209d39SAndroid Build Coastguard Worker /********************************************************************
728*0e209d39SAndroid Build Coastguard Worker  * UnicodeString Support Functions
729*0e209d39SAndroid Build Coastguard Worker  ********************************************************************/
730*0e209d39SAndroid Build Coastguard Worker 
731*0e209d39SAndroid Build Coastguard Worker /**
732*0e209d39SAndroid Build Coastguard Worker  * Hash function for UnicodeString* keys.
733*0e209d39SAndroid Build Coastguard Worker  * @param key The string (const char*) to hash.
734*0e209d39SAndroid Build Coastguard Worker  * @return A hash code for the key.
735*0e209d39SAndroid Build Coastguard Worker  */
736*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2
737*0e209d39SAndroid Build Coastguard Worker uhash_hashUnicodeString(const UElement key);
738*0e209d39SAndroid Build Coastguard Worker 
739*0e209d39SAndroid Build Coastguard Worker /**
740*0e209d39SAndroid Build Coastguard Worker  * Hash function for UnicodeString* keys (case insensitive).
741*0e209d39SAndroid Build Coastguard Worker  * Make sure to use together with uhash_compareCaselessUnicodeString.
742*0e209d39SAndroid Build Coastguard Worker  * @param key The string (const char*) to hash.
743*0e209d39SAndroid Build Coastguard Worker  * @return A hash code for the key.
744*0e209d39SAndroid Build Coastguard Worker  */
745*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2
746*0e209d39SAndroid Build Coastguard Worker uhash_hashCaselessUnicodeString(const UElement key);
747*0e209d39SAndroid Build Coastguard Worker 
748*0e209d39SAndroid Build Coastguard Worker /********************************************************************
749*0e209d39SAndroid Build Coastguard Worker  * int32_t Support Functions
750*0e209d39SAndroid Build Coastguard Worker  ********************************************************************/
751*0e209d39SAndroid Build Coastguard Worker 
752*0e209d39SAndroid Build Coastguard Worker /**
753*0e209d39SAndroid Build Coastguard Worker  * Hash function for 32-bit integer keys.
754*0e209d39SAndroid Build Coastguard Worker  * @param key The string (const char*) to hash.
755*0e209d39SAndroid Build Coastguard Worker  * @return A hash code for the key.
756*0e209d39SAndroid Build Coastguard Worker  */
757*0e209d39SAndroid Build Coastguard Worker U_CAPI int32_t U_EXPORT2
758*0e209d39SAndroid Build Coastguard Worker uhash_hashLong(const UHashTok key);
759*0e209d39SAndroid Build Coastguard Worker 
760*0e209d39SAndroid Build Coastguard Worker /**
761*0e209d39SAndroid Build Coastguard Worker  * Comparator function for 32-bit integer keys.
762*0e209d39SAndroid Build Coastguard Worker  * @param key1 The integer for comparison
763*0e209d39SAndroid Build Coastguard Worker  * @param Key2 The integer for comparison
764*0e209d39SAndroid Build Coastguard Worker  * @return true if key1 and key2 are equal, return false otherwise
765*0e209d39SAndroid Build Coastguard Worker  */
766*0e209d39SAndroid Build Coastguard Worker U_CAPI UBool U_EXPORT2
767*0e209d39SAndroid Build Coastguard Worker uhash_compareLong(const UHashTok key1, const UHashTok key2);
768*0e209d39SAndroid Build Coastguard Worker 
769*0e209d39SAndroid Build Coastguard Worker /********************************************************************
770*0e209d39SAndroid Build Coastguard Worker  * Other Support Functions
771*0e209d39SAndroid Build Coastguard Worker  ********************************************************************/
772*0e209d39SAndroid Build Coastguard Worker 
773*0e209d39SAndroid Build Coastguard Worker /**
774*0e209d39SAndroid Build Coastguard Worker  * Deleter for Hashtable objects.
775*0e209d39SAndroid Build Coastguard Worker  * @param obj The object to be deleted
776*0e209d39SAndroid Build Coastguard Worker  */
777*0e209d39SAndroid Build Coastguard Worker U_CAPI void U_EXPORT2
778*0e209d39SAndroid Build Coastguard Worker uhash_deleteHashtable(void *obj);
779*0e209d39SAndroid Build Coastguard Worker 
780*0e209d39SAndroid Build Coastguard Worker /* Use uprv_free() itself as a deleter for any key or value allocated using uprv_malloc. */
781*0e209d39SAndroid Build Coastguard Worker 
782*0e209d39SAndroid Build Coastguard Worker /**
783*0e209d39SAndroid Build Coastguard Worker  * Checks if the given hashtables are equal or not.
784*0e209d39SAndroid Build Coastguard Worker  * @param hash1
785*0e209d39SAndroid Build Coastguard Worker  * @param hash2
786*0e209d39SAndroid Build Coastguard Worker  * @return true if the hashtables are equal and false if not.
787*0e209d39SAndroid Build Coastguard Worker  */
788*0e209d39SAndroid Build Coastguard Worker U_CAPI UBool U_EXPORT2
789*0e209d39SAndroid Build Coastguard Worker uhash_equals(const UHashtable* hash1, const UHashtable* hash2);
790*0e209d39SAndroid Build Coastguard Worker 
791*0e209d39SAndroid Build Coastguard Worker 
792*0e209d39SAndroid Build Coastguard Worker #if U_SHOW_CPLUSPLUS_API
793*0e209d39SAndroid Build Coastguard Worker 
794*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN
795*0e209d39SAndroid Build Coastguard Worker 
796*0e209d39SAndroid Build Coastguard Worker /**
797*0e209d39SAndroid Build Coastguard Worker  * \class LocalUHashtablePointer
798*0e209d39SAndroid Build Coastguard Worker  * "Smart pointer" class, closes a UHashtable via uhash_close().
799*0e209d39SAndroid Build Coastguard Worker  * For most methods see the LocalPointerBase base class.
800*0e209d39SAndroid Build Coastguard Worker  *
801*0e209d39SAndroid Build Coastguard Worker  * @see LocalPointerBase
802*0e209d39SAndroid Build Coastguard Worker  * @see LocalPointer
803*0e209d39SAndroid Build Coastguard Worker  * @stable ICU 4.4
804*0e209d39SAndroid Build Coastguard Worker  */
805*0e209d39SAndroid Build Coastguard Worker U_DEFINE_LOCAL_OPEN_POINTER(LocalUHashtablePointer, UHashtable, uhash_close);
806*0e209d39SAndroid Build Coastguard Worker 
807*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END
808*0e209d39SAndroid Build Coastguard Worker 
809*0e209d39SAndroid Build Coastguard Worker #endif
810*0e209d39SAndroid Build Coastguard Worker 
811*0e209d39SAndroid Build Coastguard Worker #endif
812