]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/common/hash.h
ICU-551.51.4.tar.gz
[apple/icu.git] / icuSources / common / hash.h
index f1ea543cb67b3b0f7c632a50de8fab75651019f4..ab5fbf6c73c01c236508994a1db3fd100182db04 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ******************************************************************************
-*   Copyright (C) 1997-2004, International Business Machines
+*   Copyright (C) 1997-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 ******************************************************************************
 *   Date        Name        Description
@@ -13,6 +13,7 @@
 
 #include "unicode/unistr.h"
 #include "unicode/uobject.h"
+#include "cmemory.h"
 #include "uhash.h"
 
 U_NAMESPACE_BEGIN
@@ -26,8 +27,9 @@ U_NAMESPACE_BEGIN
  */
 class U_COMMON_API Hashtable : public UMemory {
     UHashtable* hash;
+    UHashtable hashObj;
 
-    inline void init(UHashFunction *keyHash, UKeyComparator *keyComp, UErrorCode& status);
+    inline void init(UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status);
 
 public:
     /**
@@ -37,6 +39,14 @@ public:
     */
     Hashtable(UBool ignoreKeyCase, UErrorCode& status);
 
+    /**
+     * Construct a hashtable
+     * @param keyComp Comparator for comparing the keys
+     * @param valueComp Comparator for comparing the values
+     * @param status Error code
+    */
+    Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status);
+
     /**
      * Construct a hashtable
      * @param status Error code
@@ -75,8 +85,17 @@ public:
 
     const UHashElement* find(const UnicodeString& key) const;
 
+    /**
+     * @param pos - must be UHASH_FIRST on first call, and untouched afterwards.
+     * @see uhash_nextElement
+     */
     const UHashElement* nextElement(int32_t& pos) const;
+    
+    UKeyComparator* setKeyComparator(UKeyComparator*keyComp);
+    
+    UValueComparator* setValueComparator(UValueComparator* valueComp);
 
+    UBool equals(const Hashtable& that) const;
 private:
     Hashtable(const Hashtable &other); // forbid copying of this class
     Hashtable &operator=(const Hashtable &other); // forbid copying of this class
@@ -86,16 +105,22 @@ private:
  * Implementation
  ********************************************************************/
 
-inline void Hashtable::init(UHashFunction *keyHash, UKeyComparator *keyComp, UErrorCode& status) {
+inline void Hashtable::init(UHashFunction *keyHash, UKeyComparator *keyComp, 
+                            UValueComparator *valueComp, UErrorCode& status) {
     if (U_FAILURE(status)) {
         return;
     }
-    hash = uhash_open(keyHash, keyComp, &status);
+    uhash_init(&hashObj, keyHash, keyComp, valueComp, &status);
     if (U_SUCCESS(status)) {
-        uhash_setKeyDeleter(hash, uhash_deleteUnicodeString);
+        hash = &hashObj;
+        uhash_setKeyDeleter(hash, uprv_deleteUObject);
     }
 }
 
+inline Hashtable::Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, 
+                 UErrorCode& status) : hash(0) {
+    init( uhash_hashUnicodeString, keyComp, valueComp, status);
+}
 inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status)
  : hash(0)
 {
@@ -103,26 +128,26 @@ inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status)
                         : uhash_hashUnicodeString,
             ignoreKeyCase ? uhash_compareCaselessUnicodeString
                         : uhash_compareUnicodeString,
+            NULL,
             status);
 }
 
 inline Hashtable::Hashtable(UErrorCode& status)
  : hash(0)
 {
-    init(uhash_hashUnicodeString, uhash_compareUnicodeString, status);
+    init(uhash_hashUnicodeString, uhash_compareUnicodeString, NULL, status);
 }
 
 inline Hashtable::Hashtable()
  : hash(0)
 {
     UErrorCode status = U_ZERO_ERROR;
-    init(uhash_hashUnicodeString, uhash_compareUnicodeString, status);
+    init(uhash_hashUnicodeString, uhash_compareUnicodeString, NULL, status);
 }
 
 inline Hashtable::~Hashtable() {
-    if (hash != 0) {
+    if (hash != NULL) {
         uhash_close(hash);
-        hash = 0;
     }
 }
 
@@ -167,9 +192,21 @@ inline const UHashElement* Hashtable::nextElement(int32_t& pos) const {
 }
 
 inline void Hashtable::removeAll(void) {
-  uhash_removeAll(hash);
+    uhash_removeAll(hash);
+}
+
+inline UKeyComparator* Hashtable::setKeyComparator(UKeyComparator*keyComp){
+    return uhash_setKeyComparator(hash, keyComp);
+}
+    
+inline UValueComparator* Hashtable::setValueComparator(UValueComparator* valueComp){
+    return uhash_setValueComparator(hash, valueComp);
 }
 
+inline UBool Hashtable::equals(const Hashtable& that)const{
+   return uhash_equals(hash, that.hash);
+}
 U_NAMESPACE_END
 
 #endif
+