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