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