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