1 // © 2016 and later: Unicode, Inc. and others. 
   2 // License & terms of use: http://www.unicode.org/copyright.html 
   4 ****************************************************************************** 
   5 *   Copyright (C) 1997-2016, International Business Machines 
   6 *   Corporation and others.  All Rights Reserved. 
   7 ****************************************************************************** 
   8 *   Date        Name        Description 
   9 *   03/22/00    aliu        Adapted from original C++ ICU Hashtable. 
  10 *   07/06/01    aliu        Modified to support int32_t keys on 
  11 *                           platforms with sizeof(void*) < 32. 
  12 ****************************************************************************** 
  16 #include "unicode/ustring.h" 
  22 /* This hashtable is implemented as a double hash.  All elements are 
  23  * stored in a single array with no secondary storage for collision 
  24  * resolution (no linked list, etc.).  When there is a hash collision 
  25  * (when two unequal keys have the same hashcode) we resolve this by 
  26  * using a secondary hash.  The secondary hash is an increment 
  27  * computed as a hash function (a different one) of the primary 
  28  * hashcode.  This increment is added to the initial hash value to 
  29  * obtain further slots assigned to the same hash code.  For this to 
  30  * work, the length of the array and the increment must be relatively 
  31  * prime.  The easiest way to achieve this is to have the length of 
  32  * the array be prime, and the increment be any value from 
  35  * Hashcodes are 32-bit integers.  We make sure all hashcodes are 
  36  * non-negative by masking off the top bit.  This has two effects: (1) 
  37  * modulo arithmetic is simplified.  If we allowed negative hashcodes, 
  38  * then when we computed hashcode % length, we could get a negative 
  39  * result, which we would then have to adjust back into range.  It's 
  40  * simpler to just make hashcodes non-negative. (2) It makes it easy 
  41  * to check for empty vs. occupied slots in the table.  We just mark 
  42  * empty or deleted slots with a negative hashcode. 
  44  * The central function is _uhash_find().  This function looks for a 
  45  * slot matching the given key and hashcode.  If one is found, it 
  46  * returns a pointer to that slot.  If the table is full, and no match 
  47  * is found, it returns NULL -- in theory.  This would make the code 
  48  * more complicated, since all callers of _uhash_find() would then 
  49  * have to check for a NULL result.  To keep this from happening, we 
  50  * don't allow the table to fill.  When there is only one 
  51  * empty/deleted slot left, uhash_put() will refuse to increase the 
  52  * count, and fail.  This simplifies the code.  In practice, one will 
  53  * seldom encounter this using default UHashtables.  However, if a 
  54  * hashtable is set to a U_FIXED resize policy, or if memory is 
  55  * exhausted, then the table may fill. 
  57  * High and low water ratios control rehashing.  They establish levels 
  58  * of fullness (from 0 to 1) outside of which the data array is 
  59  * reallocated and repopulated.  Setting the low water ratio to zero 
  60  * means the table will never shrink.  Setting the high water ratio to 
  61  * one means the table will never grow.  The ratios should be 
  62  * coordinated with the ratio between successive elements of the 
  63  * PRIMES table, so that when the primeIndex is incremented or 
  64  * decremented during rehashing, it brings the ratio of count / length 
  65  * back into the desired range (between low and high water ratios). 
  68 /******************************************************************** 
  69  * PRIVATE Constants, Macros 
  70  ********************************************************************/ 
  72 /* This is a list of non-consecutive primes chosen such that 
  73  * PRIMES[i+1] ~ 2*PRIMES[i].  (Currently, the ratio ranges from 1.81 
  74  * to 2.18; the inverse ratio ranges from 0.459 to 0.552.)  If this 
  75  * ratio is changed, the low and high water ratios should also be 
  78  * These prime numbers were also chosen so that they are the largest 
  79  * prime number while being less than a power of two. 
  81 static const int32_t PRIMES
[] = { 
  82     7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, 
  83     65521, 131071, 262139, 524287, 1048573, 2097143, 4194301, 8388593, 
  84     16777213, 33554393, 67108859, 134217689, 268435399, 536870909, 
  85     1073741789, 2147483647 /*, 4294967291 */ 
  88 #define PRIMES_LENGTH UPRV_LENGTHOF(PRIMES) 
  89 #define DEFAULT_PRIME_INDEX 4 
  91 /* These ratios are tuned to the PRIMES array such that a resize 
  92  * places the table back into the zone of non-resizing.  That is, 
  93  * after a call to _uhash_rehash(), a subsequent call to 
  94  * _uhash_rehash() should do nothing (should not churn).  This is only 
  95  * a potential problem with U_GROW_AND_SHRINK. 
  97 static const float RESIZE_POLICY_RATIO_TABLE
[6] = { 
  98     /* low, high water ratio */ 
  99     0.0F
, 0.5F
, /* U_GROW: Grow on demand, do not shrink */ 
 100     0.1F
, 0.5F
, /* U_GROW_AND_SHRINK: Grow and shrink on demand */ 
 101     0.0F
, 1.0F  
/* U_FIXED: Never change size */ 
 105   Invariants for hashcode values: 
 111   Hashcodes may not start out this way, but internally they are 
 112   adjusted so that they are always positive.  We assume 32-bit 
 113   hashcodes; adjust these constants for other hashcode sizes. 
 115 #define HASH_DELETED    ((int32_t) 0x80000000) 
 116 #define HASH_EMPTY      ((int32_t) HASH_DELETED + 1) 
 118 #define IS_EMPTY_OR_DELETED(x) ((x) < 0) 
 120 /* This macro expects a UHashTok.pointer as its keypointer and 
 121    valuepointer parameters */ 
 122 #define HASH_DELETE_KEY_VALUE(hash, keypointer, valuepointer) \ 
 123             if (hash->keyDeleter != NULL && keypointer != NULL) { \ 
 124                 (*hash->keyDeleter)(keypointer); \ 
 126             if (hash->valueDeleter != NULL && valuepointer != NULL) { \ 
 127                 (*hash->valueDeleter)(valuepointer); \ 
 131  * Constants for hinting whether a key or value is an integer 
 132  * or a pointer.  If a hint bit is zero, then the associated 
 133  * token is assumed to be an integer. 
 135 #define HINT_KEY_POINTER   (1) 
 136 #define HINT_VALUE_POINTER (2) 
 138 /******************************************************************** 
 139  * PRIVATE Implementation 
 140  ********************************************************************/ 
 143 _uhash_setElement(UHashtable 
*hash
, UHashElement
* e
, 
 145                   UHashTok key
, UHashTok value
, int8_t hint
) { 
 147     UHashTok oldValue 
= e
->value
; 
 148     if (hash
->keyDeleter 
!= NULL 
&& e
->key
.pointer 
!= NULL 
&& 
 149         e
->key
.pointer 
!= key
.pointer
) { /* Avoid double deletion */ 
 150         (*hash
->keyDeleter
)(e
->key
.pointer
); 
 152     if (hash
->valueDeleter 
!= NULL
) { 
 153         if (oldValue
.pointer 
!= NULL 
&& 
 154             oldValue
.pointer 
!= value
.pointer
) { /* Avoid double deletion */ 
 155             (*hash
->valueDeleter
)(oldValue
.pointer
); 
 157         oldValue
.pointer 
= NULL
; 
 159     /* Compilers should copy the UHashTok union correctly, but even if 
 160      * they do, memory heap tools (e.g. BoundsChecker) can get 
 161      * confused when a pointer is cloaked in a union and then copied. 
 162      * TO ALLEVIATE THIS, we use hints (based on what API the user is 
 163      * calling) to copy pointers when we know the user thinks 
 164      * something is a pointer. */ 
 165     if (hint 
& HINT_KEY_POINTER
) { 
 166         e
->key
.pointer 
= key
.pointer
; 
 170     if (hint 
& HINT_VALUE_POINTER
) { 
 171         e
->value
.pointer 
= value
.pointer
; 
 175     e
->hashcode 
= hashcode
; 
 180  * Assumes that the given element is not empty or deleted. 
 183 _uhash_internalRemoveElement(UHashtable 
*hash
, UHashElement
* e
) { 
 185     U_ASSERT(!IS_EMPTY_OR_DELETED(e
->hashcode
)); 
 187     empty
.pointer 
= NULL
; empty
.integer 
= 0; 
 188     return _uhash_setElement(hash
, e
, HASH_DELETED
, empty
, empty
, 0); 
 192 _uhash_internalSetResizePolicy(UHashtable 
*hash
, enum UHashResizePolicy policy
) { 
 193     U_ASSERT(hash 
!= NULL
); 
 194     U_ASSERT(((int32_t)policy
) >= 0); 
 195     U_ASSERT(((int32_t)policy
) < 3); 
 196     hash
->lowWaterRatio  
= RESIZE_POLICY_RATIO_TABLE
[policy 
* 2]; 
 197     hash
->highWaterRatio 
= RESIZE_POLICY_RATIO_TABLE
[policy 
* 2 + 1]; 
 201  * Allocate internal data array of a size determined by the given 
 202  * prime index.  If the index is out of range it is pinned into range. 
 203  * If the allocation fails the status is set to 
 204  * U_MEMORY_ALLOCATION_ERROR and all array storage is freed.  In 
 205  * either case the previous array pointer is overwritten. 
 207  * Caller must ensure primeIndex is in range 0..PRIME_LENGTH-1. 
 210 _uhash_allocate(UHashtable 
*hash
, 
 212                 UErrorCode 
*status
) { 
 214     UHashElement 
*p
, *limit
; 
 217     if (U_FAILURE(*status
)) return; 
 219     U_ASSERT(primeIndex 
>= 0 && primeIndex 
< PRIMES_LENGTH
); 
 221     hash
->primeIndex 
= primeIndex
; 
 222     hash
->length 
= PRIMES
[primeIndex
]; 
 224     p 
= hash
->elements 
= (UHashElement
*) 
 225         uprv_malloc(sizeof(UHashElement
) * hash
->length
); 
 227     if (hash
->elements 
== NULL
) { 
 228         *status 
= U_MEMORY_ALLOCATION_ERROR
; 
 232     emptytok
.pointer 
= NULL
; /* Only one of these two is needed */ 
 233     emptytok
.integer 
= 0;    /* but we don't know which one. */ 
 235     limit 
= p 
+ hash
->length
; 
 239         p
->hashcode 
= HASH_EMPTY
; 
 244     hash
->lowWaterMark 
= (int32_t)(hash
->length 
* hash
->lowWaterRatio
); 
 245     hash
->highWaterMark 
= (int32_t)(hash
->length 
* hash
->highWaterRatio
); 
 249 _uhash_init(UHashtable 
*result
, 
 250               UHashFunction 
*keyHash
,  
 251               UKeyComparator 
*keyComp
, 
 252               UValueComparator 
*valueComp
, 
 256     if (U_FAILURE(*status
)) return NULL
; 
 257     U_ASSERT(keyHash 
!= NULL
); 
 258     U_ASSERT(keyComp 
!= NULL
); 
 260     result
->keyHasher       
= keyHash
; 
 261     result
->keyComparator   
= keyComp
; 
 262     result
->valueComparator 
= valueComp
; 
 263     result
->keyDeleter      
= NULL
; 
 264     result
->valueDeleter    
= NULL
; 
 265     result
->allocated       
= FALSE
; 
 266     _uhash_internalSetResizePolicy(result
, U_GROW
); 
 268     _uhash_allocate(result
, primeIndex
, status
); 
 270     if (U_FAILURE(*status
)) { 
 278 _uhash_create(UHashFunction 
*keyHash
,  
 279               UKeyComparator 
*keyComp
, 
 280               UValueComparator 
*valueComp
, 
 282               UErrorCode 
*status
) { 
 285     if (U_FAILURE(*status
)) return NULL
; 
 287     result 
= (UHashtable
*) uprv_malloc(sizeof(UHashtable
)); 
 288     if (result 
== NULL
) { 
 289         *status 
= U_MEMORY_ALLOCATION_ERROR
; 
 293     _uhash_init(result
, keyHash
, keyComp
, valueComp
, primeIndex
, status
); 
 294     result
->allocated       
= TRUE
; 
 296     if (U_FAILURE(*status
)) { 
 305  * Look for a key in the table, or if no such key exists, the first 
 306  * empty slot matching the given hashcode.  Keys are compared using 
 307  * the keyComparator function. 
 309  * First find the start position, which is the hashcode modulo 
 310  * the length.  Test it to see if it is: 
 312  * a. identical:  First check the hash values for a quick check, 
 313  *    then compare keys for equality using keyComparator. 
 317  * Stop if it is identical or empty, otherwise continue by adding a 
 318  * "jump" value (moduloing by the length again to keep it within 
 319  * range) and retesting.  For efficiency, there need enough empty 
 320  * values so that the searchs stop within a reasonable amount of time. 
 321  * This can be changed by changing the high/low water marks. 
 323  * In theory, this function can return NULL, if it is full (no empty 
 324  * or deleted slots) and if no matching key is found.  In practice, we 
 325  * prevent this elsewhere (in uhash_put) by making sure the last slot 
 326  * in the table is never filled. 
 328  * The size of the table should be prime for this algorithm to work; 
 329  * otherwise we are not guaranteed that the jump value (the secondary 
 330  * hash) is relatively prime to the table length. 
 333 _uhash_find(const UHashtable 
*hash
, UHashTok key
, 
 336     int32_t firstDeleted 
= -1;  /* assume invalid index */ 
 337     int32_t theIndex
, startIndex
; 
 338     int32_t jump 
= 0; /* lazy evaluate */ 
 340     UHashElement 
*elements 
= hash
->elements
; 
 342     hashcode 
&= 0x7FFFFFFF; /* must be positive */ 
 343     startIndex 
= theIndex 
= (hashcode 
^ 0x4000000) % hash
->length
; 
 346         tableHash 
= elements
[theIndex
].hashcode
; 
 347         if (tableHash 
== hashcode
) {          /* quick check */ 
 348             if ((*hash
->keyComparator
)(key
, elements
[theIndex
].key
)) { 
 349                 return &(elements
[theIndex
]); 
 351         } else if (!IS_EMPTY_OR_DELETED(tableHash
)) { 
 352             /* We have hit a slot which contains a key-value pair, 
 353              * but for which the hash code does not match.  Keep 
 356         } else if (tableHash 
== HASH_EMPTY
) { /* empty, end o' the line */ 
 358         } else if (firstDeleted 
< 0) { /* remember first deleted */ 
 359             firstDeleted 
= theIndex
; 
 361         if (jump 
== 0) { /* lazy compute jump */ 
 362             /* The jump value must be relatively prime to the table 
 363              * length.  As long as the length is prime, then any value 
 364              * 1..length-1 will be relatively prime to it. 
 366             jump 
= (hashcode 
% (hash
->length 
- 1)) + 1; 
 368         theIndex 
= (theIndex 
+ jump
) % hash
->length
; 
 369     } while (theIndex 
!= startIndex
); 
 371     if (firstDeleted 
>= 0) { 
 372         theIndex 
= firstDeleted
; /* reset if had deleted slot */ 
 373     } else if (tableHash 
!= HASH_EMPTY
) { 
 374         /* We get to this point if the hashtable is full (no empty or 
 375          * deleted slots), and we've failed to find a match.  THIS 
 376          * WILL NEVER HAPPEN as long as uhash_put() makes sure that 
 377          * count is always < length. 
 380         return NULL
; /* Never happens if uhash_put() behaves */ 
 382     return &(elements
[theIndex
]); 
 386  * Attempt to grow or shrink the data arrays in order to make the 
 387  * count fit between the high and low water marks.  hash_put() and 
 388  * hash_remove() call this method when the count exceeds the high or 
 389  * low water marks.  This method may do nothing, if memory allocation 
 390  * fails, or if the count is already in range, or if the length is 
 391  * already at the low or high limit.  In any case, upon return the 
 392  * arrays will be valid. 
 395 _uhash_rehash(UHashtable 
*hash
, UErrorCode 
*status
) { 
 397     UHashElement 
*old 
= hash
->elements
; 
 398     int32_t oldLength 
= hash
->length
; 
 399     int32_t newPrimeIndex 
= hash
->primeIndex
; 
 402     if (hash
->count 
> hash
->highWaterMark
) { 
 403         if (++newPrimeIndex 
>= PRIMES_LENGTH
) { 
 406     } else if (hash
->count 
< hash
->lowWaterMark
) { 
 407         if (--newPrimeIndex 
< 0) { 
 414     _uhash_allocate(hash
, newPrimeIndex
, status
); 
 416     if (U_FAILURE(*status
)) { 
 417         hash
->elements 
= old
; 
 418         hash
->length 
= oldLength
;        
 422     for (i 
= oldLength 
- 1; i 
>= 0; --i
) { 
 423         if (!IS_EMPTY_OR_DELETED(old
[i
].hashcode
)) { 
 424             UHashElement 
*e 
= _uhash_find(hash
, old
[i
].key
, old
[i
].hashcode
); 
 426             U_ASSERT(e
->hashcode 
== HASH_EMPTY
); 
 428             e
->value 
= old
[i
].value
; 
 429             e
->hashcode 
= old
[i
].hashcode
; 
 438 _uhash_remove(UHashtable 
*hash
, 
 440     /* First find the position of the key in the table.  If the object 
 441      * has not been removed already, remove it.  If the user wanted 
 442      * keys deleted, then delete it also.  We have to put a special 
 443      * hashcode in that position that means that something has been 
 444      * deleted, since when we do a find, we have to continue PAST any 
 448     UHashElement
* e 
= _uhash_find(hash
, key
, hash
->keyHasher(key
)); 
 450     result
.pointer 
= NULL
; 
 452     if (!IS_EMPTY_OR_DELETED(e
->hashcode
)) { 
 453         result 
= _uhash_internalRemoveElement(hash
, e
); 
 454         if (hash
->count 
< hash
->lowWaterMark
) { 
 455             UErrorCode status 
= U_ZERO_ERROR
; 
 456             _uhash_rehash(hash
, &status
); 
 463 _uhash_put(UHashtable 
*hash
, 
 467            UErrorCode 
*status
) { 
 469     /* Put finds the position in the table for the new value.  If the 
 470      * key is already in the table, it is deleted, if there is a 
 471      * non-NULL keyDeleter.  Then the key, the hash and the value are 
 472      * all put at the position in their respective arrays. 
 478     if (U_FAILURE(*status
)) { 
 481     U_ASSERT(hash 
!= NULL
); 
 482     /* Cannot always check pointer here or iSeries sees NULL every time. */ 
 483     if ((hint 
& HINT_VALUE_POINTER
) && value
.pointer 
== NULL
) { 
 484         /* Disallow storage of NULL values, since NULL is returned by 
 485          * get() to indicate an absent key.  Storing NULL == removing. 
 487         return _uhash_remove(hash
, key
); 
 489     if (hash
->count 
> hash
->highWaterMark
) { 
 490         _uhash_rehash(hash
, status
); 
 491         if (U_FAILURE(*status
)) { 
 496     hashcode 
= (*hash
->keyHasher
)(key
); 
 497     e 
= _uhash_find(hash
, key
, hashcode
); 
 500     if (IS_EMPTY_OR_DELETED(e
->hashcode
)) { 
 501         /* Important: We must never actually fill the table up.  If we 
 502          * do so, then _uhash_find() will return NULL, and we'll have 
 503          * to check for NULL after every call to _uhash_find().  To 
 504          * avoid this we make sure there is always at least one empty 
 505          * or deleted slot in the table.  This only is a problem if we 
 506          * are out of memory and rehash isn't working. 
 509         if (hash
->count 
== hash
->length
) { 
 510             /* Don't allow count to reach length */ 
 512             *status 
= U_MEMORY_ALLOCATION_ERROR
; 
 517     /* We must in all cases handle storage properly.  If there was an 
 518      * old key, then it must be deleted (if the deleter != NULL). 
 519      * Make hashcodes stored in table positive. 
 521     return _uhash_setElement(hash
, e
, hashcode 
& 0x7FFFFFFF, key
, value
, hint
); 
 524     /* If the deleters are non-NULL, this method adopts its key and/or 
 525      * value arguments, and we must be sure to delete the key and/or 
 526      * value in all cases, even upon failure. 
 528     HASH_DELETE_KEY_VALUE(hash
, key
.pointer
, value
.pointer
); 
 529     emptytok
.pointer 
= NULL
; emptytok
.integer 
= 0; 
 534 /******************************************************************** 
 536  ********************************************************************/ 
 538 U_CAPI UHashtable
* U_EXPORT2
 
 539 uhash_open(UHashFunction 
*keyHash
,  
 540            UKeyComparator 
*keyComp
, 
 541            UValueComparator 
*valueComp
, 
 542            UErrorCode 
*status
) { 
 544     return _uhash_create(keyHash
, keyComp
, valueComp
, DEFAULT_PRIME_INDEX
, status
); 
 547 U_CAPI UHashtable
* U_EXPORT2
 
 548 uhash_openSize(UHashFunction 
*keyHash
,  
 549                UKeyComparator 
*keyComp
, 
 550                UValueComparator 
*valueComp
, 
 552                UErrorCode 
*status
) { 
 554     /* Find the smallest index i for which PRIMES[i] >= size. */ 
 556     while (i
<(PRIMES_LENGTH
-1) && PRIMES
[i
]<size
) { 
 560     return _uhash_create(keyHash
, keyComp
, valueComp
, i
, status
); 
 563 U_CAPI UHashtable
* U_EXPORT2
 
 564 uhash_init(UHashtable 
*fillinResult
, 
 565            UHashFunction 
*keyHash
,  
 566            UKeyComparator 
*keyComp
, 
 567            UValueComparator 
*valueComp
, 
 568            UErrorCode 
*status
) { 
 570     return _uhash_init(fillinResult
, keyHash
, keyComp
, valueComp
, DEFAULT_PRIME_INDEX
, status
); 
 573 U_CAPI UHashtable
* U_EXPORT2
 
 574 uhash_initSize(UHashtable 
*fillinResult
, 
 575                UHashFunction 
*keyHash
,  
 576                UKeyComparator 
*keyComp
, 
 577                UValueComparator 
*valueComp
, 
 579                UErrorCode 
*status
) { 
 581     /* Find the smallest index i for which PRIMES[i] >= size. */ 
 583     while (i
<(PRIMES_LENGTH
-1) && PRIMES
[i
]<size
) { 
 587     return _uhash_init(fillinResult
, keyHash
, keyComp
, valueComp
, i
, status
); 
 590 U_CAPI 
void U_EXPORT2
 
 591 uhash_close(UHashtable 
*hash
) { 
 595     if (hash
->elements 
!= NULL
) { 
 596         if (hash
->keyDeleter 
!= NULL 
|| hash
->valueDeleter 
!= NULL
) { 
 597             int32_t pos
=UHASH_FIRST
; 
 599             while ((e 
= (UHashElement
*) uhash_nextElement(hash
, &pos
)) != NULL
) { 
 600                 HASH_DELETE_KEY_VALUE(hash
, e
->key
.pointer
, e
->value
.pointer
); 
 603         uprv_free(hash
->elements
); 
 604         hash
->elements 
= NULL
; 
 606     if (hash
->allocated
) { 
 611 U_CAPI UHashFunction 
*U_EXPORT2
 
 612 uhash_setKeyHasher(UHashtable 
*hash
, UHashFunction 
*fn
) { 
 613     UHashFunction 
*result 
= hash
->keyHasher
; 
 614     hash
->keyHasher 
= fn
; 
 618 U_CAPI UKeyComparator 
*U_EXPORT2
 
 619 uhash_setKeyComparator(UHashtable 
*hash
, UKeyComparator 
*fn
) { 
 620     UKeyComparator 
*result 
= hash
->keyComparator
; 
 621     hash
->keyComparator 
= fn
; 
 624 U_CAPI UValueComparator 
*U_EXPORT2 
 
 625 uhash_setValueComparator(UHashtable 
*hash
, UValueComparator 
*fn
){ 
 626     UValueComparator 
*result 
= hash
->valueComparator
; 
 627     hash
->valueComparator 
= fn
; 
 631 U_CAPI UObjectDeleter 
*U_EXPORT2
 
 632 uhash_setKeyDeleter(UHashtable 
*hash
, UObjectDeleter 
*fn
) { 
 633     UObjectDeleter 
*result 
= hash
->keyDeleter
; 
 634     hash
->keyDeleter 
= fn
; 
 638 U_CAPI UObjectDeleter 
*U_EXPORT2
 
 639 uhash_setValueDeleter(UHashtable 
*hash
, UObjectDeleter 
*fn
) { 
 640     UObjectDeleter 
*result 
= hash
->valueDeleter
; 
 641     hash
->valueDeleter 
= fn
; 
 645 U_CAPI 
void U_EXPORT2
 
 646 uhash_setResizePolicy(UHashtable 
*hash
, enum UHashResizePolicy policy
) { 
 647     UErrorCode status 
= U_ZERO_ERROR
; 
 648     _uhash_internalSetResizePolicy(hash
, policy
); 
 649     hash
->lowWaterMark  
= (int32_t)(hash
->length 
* hash
->lowWaterRatio
); 
 650     hash
->highWaterMark 
= (int32_t)(hash
->length 
* hash
->highWaterRatio
);     
 651     _uhash_rehash(hash
, &status
); 
 654 U_CAPI 
int32_t U_EXPORT2
 
 655 uhash_count(const UHashtable 
*hash
) { 
 659 U_CAPI 
void* U_EXPORT2
 
 660 uhash_get(const UHashtable 
*hash
, 
 663     keyholder
.pointer 
= (void*) key
; 
 664     return _uhash_find(hash
, keyholder
, hash
->keyHasher(keyholder
))->value
.pointer
; 
 667 U_CAPI 
void* U_EXPORT2
 
 668 uhash_iget(const UHashtable 
*hash
, 
 671     keyholder
.integer 
= key
; 
 672     return _uhash_find(hash
, keyholder
, hash
->keyHasher(keyholder
))->value
.pointer
; 
 675 U_CAPI 
int32_t U_EXPORT2
 
 676 uhash_geti(const UHashtable 
*hash
, 
 679     keyholder
.pointer 
= (void*) key
; 
 680     return _uhash_find(hash
, keyholder
, hash
->keyHasher(keyholder
))->value
.integer
; 
 683 U_CAPI 
int32_t U_EXPORT2
 
 684 uhash_igeti(const UHashtable 
*hash
, 
 687     keyholder
.integer 
= key
; 
 688     return _uhash_find(hash
, keyholder
, hash
->keyHasher(keyholder
))->value
.integer
; 
 691 U_CAPI 
void* U_EXPORT2
 
 692 uhash_put(UHashtable 
*hash
, 
 695           UErrorCode 
*status
) { 
 696     UHashTok keyholder
, valueholder
; 
 697     keyholder
.pointer 
= key
; 
 698     valueholder
.pointer 
= value
; 
 699     return _uhash_put(hash
, keyholder
, valueholder
, 
 700                       HINT_KEY_POINTER 
| HINT_VALUE_POINTER
, 
 704 U_CAPI 
void* U_EXPORT2
 
 705 uhash_iput(UHashtable 
*hash
, 
 708            UErrorCode 
*status
) { 
 709     UHashTok keyholder
, valueholder
; 
 710     keyholder
.integer 
= key
; 
 711     valueholder
.pointer 
= value
; 
 712     return _uhash_put(hash
, keyholder
, valueholder
, 
 717 U_CAPI 
int32_t U_EXPORT2
 
 718 uhash_puti(UHashtable 
*hash
, 
 721            UErrorCode 
*status
) { 
 722     UHashTok keyholder
, valueholder
; 
 723     keyholder
.pointer 
= key
; 
 724     valueholder
.integer 
= value
; 
 725     return _uhash_put(hash
, keyholder
, valueholder
, 
 731 U_CAPI 
int32_t U_EXPORT2
 
 732 uhash_iputi(UHashtable 
*hash
, 
 735            UErrorCode 
*status
) { 
 736     UHashTok keyholder
, valueholder
; 
 737     keyholder
.integer 
= key
; 
 738     valueholder
.integer 
= value
; 
 739     return _uhash_put(hash
, keyholder
, valueholder
, 
 740                       0, /* neither is a ptr */ 
 744 U_CAPI 
void* U_EXPORT2
 
 745 uhash_remove(UHashtable 
*hash
, 
 748     keyholder
.pointer 
= (void*) key
; 
 749     return _uhash_remove(hash
, keyholder
).pointer
; 
 752 U_CAPI 
void* U_EXPORT2
 
 753 uhash_iremove(UHashtable 
*hash
, 
 756     keyholder
.integer 
= key
; 
 757     return _uhash_remove(hash
, keyholder
).pointer
; 
 760 U_CAPI 
int32_t U_EXPORT2
 
 761 uhash_removei(UHashtable 
*hash
, 
 764     keyholder
.pointer 
= (void*) key
; 
 765     return _uhash_remove(hash
, keyholder
).integer
; 
 768 U_CAPI 
int32_t U_EXPORT2
 
 769 uhash_iremovei(UHashtable 
*hash
, 
 772     keyholder
.integer 
= key
; 
 773     return _uhash_remove(hash
, keyholder
).integer
; 
 776 U_CAPI 
void U_EXPORT2
 
 777 uhash_removeAll(UHashtable 
*hash
) { 
 778     int32_t pos 
= UHASH_FIRST
; 
 779     const UHashElement 
*e
; 
 780     U_ASSERT(hash 
!= NULL
); 
 781     if (hash
->count 
!= 0) { 
 782         while ((e 
= uhash_nextElement(hash
, &pos
)) != NULL
) { 
 783             uhash_removeElement(hash
, e
); 
 786     U_ASSERT(hash
->count 
== 0); 
 789 U_CAPI 
const UHashElement
* U_EXPORT2
 
 790 uhash_find(const UHashtable 
*hash
, const void* key
) { 
 792     const UHashElement 
*e
; 
 793     keyholder
.pointer 
= (void*) key
; 
 794     e 
= _uhash_find(hash
, keyholder
, hash
->keyHasher(keyholder
)); 
 795     return IS_EMPTY_OR_DELETED(e
->hashcode
) ? NULL 
: e
; 
 798 U_CAPI 
const UHashElement
* U_EXPORT2
 
 799 uhash_nextElement(const UHashtable 
*hash
, int32_t *pos
) { 
 800     /* Walk through the array until we find an element that is not 
 801      * EMPTY and not DELETED. 
 804     U_ASSERT(hash 
!= NULL
); 
 805     for (i 
= *pos 
+ 1; i 
< hash
->length
; ++i
) { 
 806         if (!IS_EMPTY_OR_DELETED(hash
->elements
[i
].hashcode
)) { 
 808             return &(hash
->elements
[i
]); 
 812     /* No more elements */ 
 816 U_CAPI 
void* U_EXPORT2
 
 817 uhash_removeElement(UHashtable 
*hash
, const UHashElement
* e
) { 
 818     U_ASSERT(hash 
!= NULL
); 
 820     if (!IS_EMPTY_OR_DELETED(e
->hashcode
)) { 
 821         UHashElement 
*nce 
= (UHashElement 
*)e
; 
 822         return _uhash_internalRemoveElement(hash
, nce
).pointer
; 
 827 /******************************************************************** 
 828  * UHashTok convenience 
 829  ********************************************************************/ 
 832  * Return a UHashTok for an integer. 
 834 /*U_CAPI UHashTok U_EXPORT2 
 835 uhash_toki(int32_t i) { 
 842  * Return a UHashTok for a pointer. 
 844 /*U_CAPI UHashTok U_EXPORT2 
 845 uhash_tokp(void* p) { 
 851 /******************************************************************** 
 852  * PUBLIC Key Hash Functions 
 853  ********************************************************************/ 
 855 U_CAPI 
int32_t U_EXPORT2
 
 856 uhash_hashUChars(const UHashTok key
) { 
 857     const UChar 
*s 
= (const UChar 
*)key
.pointer
; 
 858     return s 
== NULL 
? 0 : ustr_hashUCharsN(s
, u_strlen(s
)); 
 861 U_CAPI 
int32_t U_EXPORT2
 
 862 uhash_hashChars(const UHashTok key
) { 
 863     const char *s 
= (const char *)key
.pointer
; 
 864     return s 
== NULL 
? 0 : ustr_hashCharsN(s
, uprv_strlen(s
)); 
 867 U_CAPI 
int32_t U_EXPORT2
 
 868 uhash_hashIChars(const UHashTok key
) { 
 869     const char *s 
= (const char *)key
.pointer
; 
 870     return s 
== NULL 
? 0 : ustr_hashICharsN(s
, uprv_strlen(s
)); 
 873 U_CAPI UBool U_EXPORT2 
 
 874 uhash_equals(const UHashtable
* hash1
, const UHashtable
* hash2
){ 
 875     int32_t count1
, count2
, pos
, i
; 
 882      * Make sure that we are comparing 2 valid hashes of the same type 
 883      * with valid comparison functions. 
 884      * Without valid comparison functions, a binary comparison 
 885      * of the hash values will yield random results on machines 
 886      * with 64-bit pointers and 32-bit integer hashes. 
 887      * A valueComparator is normally optional. 
 889     if (hash1
==NULL 
|| hash2
==NULL 
|| 
 890         hash1
->keyComparator 
!= hash2
->keyComparator 
|| 
 891         hash1
->valueComparator 
!= hash2
->valueComparator 
|| 
 892         hash1
->valueComparator 
== NULL
) 
 895         Normally we would return an error here about incompatible hash tables, 
 896         but we return FALSE instead. 
 901     count1 
= uhash_count(hash1
); 
 902     count2 
= uhash_count(hash2
); 
 908     for(i
=0; i
<count1
; i
++){ 
 909         const UHashElement
* elem1 
= uhash_nextElement(hash1
, &pos
); 
 910         const UHashTok key1 
= elem1
->key
; 
 911         const UHashTok val1 
= elem1
->value
; 
 912         /* here the keys are not compared, instead the key form hash1 is used to fetch 
 913          * value from hash2. If the hashes are equal then then both hashes should  
 914          * contain equal values for the same key! 
 916         const UHashElement
* elem2 
= _uhash_find(hash2
, key1
, hash2
->keyHasher(key1
)); 
 917         const UHashTok val2 
= elem2
->value
; 
 918         if(hash1
->valueComparator(val1
, val2
)==FALSE
){ 
 925 /******************************************************************** 
 926  * PUBLIC Comparator Functions 
 927  ********************************************************************/ 
 929 U_CAPI UBool U_EXPORT2
 
 930 uhash_compareUChars(const UHashTok key1
, const UHashTok key2
) { 
 931     const UChar 
*p1 
= (const UChar
*) key1
.pointer
; 
 932     const UChar 
*p2 
= (const UChar
*) key2
.pointer
; 
 936     if (p1 
== NULL 
|| p2 
== NULL
) { 
 939     while (*p1 
!= 0 && *p1 
== *p2
) { 
 943     return (UBool
)(*p1 
== *p2
); 
 946 U_CAPI UBool U_EXPORT2
 
 947 uhash_compareChars(const UHashTok key1
, const UHashTok key2
) { 
 948     const char *p1 
= (const char*) key1
.pointer
; 
 949     const char *p2 
= (const char*) key2
.pointer
; 
 953     if (p1 
== NULL 
|| p2 
== NULL
) { 
 956     while (*p1 
!= 0 && *p1 
== *p2
) { 
 960     return (UBool
)(*p1 
== *p2
); 
 963 U_CAPI UBool U_EXPORT2
 
 964 uhash_compareIChars(const UHashTok key1
, const UHashTok key2
) { 
 965     const char *p1 
= (const char*) key1
.pointer
; 
 966     const char *p2 
= (const char*) key2
.pointer
; 
 970     if (p1 
== NULL 
|| p2 
== NULL
) { 
 973     while (*p1 
!= 0 && uprv_tolower(*p1
) == uprv_tolower(*p2
)) { 
 977     return (UBool
)(*p1 
== *p2
); 
 980 /******************************************************************** 
 981  * PUBLIC int32_t Support Functions 
 982  ********************************************************************/ 
 984 U_CAPI 
int32_t U_EXPORT2
 
 985 uhash_hashLong(const UHashTok key
) { 
 989 U_CAPI UBool U_EXPORT2
 
 990 uhash_compareLong(const UHashTok key1
, const UHashTok key2
) { 
 991     return (UBool
)(key1
.integer 
== key2
.integer
);