Home | History | Annotate | Download | only in common
      1 /*
      2 ******************************************************************************
      3 *   Copyright (C) 1997-2010, International Business Machines
      4 *   Corporation and others.  All Rights Reserved.
      5 ******************************************************************************
      6 *   Date        Name        Description
      7 *   03/28/00    aliu        Creation.
      8 ******************************************************************************
      9 */
     10 
     11 #ifndef HASH_H
     12 #define HASH_H
     13 
     14 #include "unicode/unistr.h"
     15 #include "unicode/uobject.h"
     16 #include "uhash.h"
     17 
     18 U_NAMESPACE_BEGIN
     19 
     20 /**
     21  * Hashtable is a thin C++ wrapper around UHashtable, a general-purpose void*
     22  * hashtable implemented in C.  Hashtable is designed to be idiomatic and
     23  * easy-to-use in C++.
     24  *
     25  * Hashtable is an INTERNAL CLASS.
     26  */
     27 class U_COMMON_API Hashtable : public UMemory {
     28     UHashtable* hash;
     29     UHashtable hashObj;
     30 
     31     inline void init(UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status);
     32 
     33 public:
     34     /**
     35      * Construct a hashtable
     36      * @param ignoreKeyCase If true, keys are case insensitive.
     37      * @param status Error code
     38     */
     39     Hashtable(UBool ignoreKeyCase, UErrorCode& status);
     40 
     41     /**
     42      * Construct a hashtable
     43      * @param keyComp Comparator for comparing the keys
     44      * @param valueComp Comparator for comparing the values
     45      * @param status Error code
     46     */
     47     Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status);
     48 
     49     /**
     50      * Construct a hashtable
     51      * @param status Error code
     52     */
     53     Hashtable(UErrorCode& status);
     54 
     55     /**
     56      * Construct a hashtable, _disregarding any error_.  Use this constructor
     57      * with caution.
     58      */
     59     Hashtable();
     60 
     61     /**
     62      * Non-virtual destructor; make this virtual if Hashtable is subclassed
     63      * in the future.
     64      */
     65     ~Hashtable();
     66 
     67     UObjectDeleter *setValueDeleter(UObjectDeleter *fn);
     68 
     69     int32_t count() const;
     70 
     71     void* put(const UnicodeString& key, void* value, UErrorCode& status);
     72 
     73     int32_t puti(const UnicodeString& key, int32_t value, UErrorCode& status);
     74 
     75     void* get(const UnicodeString& key) const;
     76 
     77     int32_t geti(const UnicodeString& key) const;
     78 
     79     void* remove(const UnicodeString& key);
     80 
     81     int32_t removei(const UnicodeString& key);
     82 
     83     void removeAll(void);
     84 
     85     const UHashElement* find(const UnicodeString& key) const;
     86 
     87     const UHashElement* nextElement(int32_t& pos) const;
     88 
     89     UKeyComparator* setKeyComparator(UKeyComparator*keyComp);
     90 
     91     UValueComparator* setValueComparator(UValueComparator* valueComp);
     92 
     93     UBool equals(const Hashtable& that) const;
     94 private:
     95     Hashtable(const Hashtable &other); // forbid copying of this class
     96     Hashtable &operator=(const Hashtable &other); // forbid copying of this class
     97 };
     98 
     99 /*********************************************************************
    100  * Implementation
    101  ********************************************************************/
    102 
    103 inline void Hashtable::init(UHashFunction *keyHash, UKeyComparator *keyComp,
    104                             UValueComparator *valueComp, UErrorCode& status) {
    105     if (U_FAILURE(status)) {
    106         return;
    107     }
    108     uhash_init(&hashObj, keyHash, keyComp, valueComp, &status);
    109     if (U_SUCCESS(status)) {
    110         hash = &hashObj;
    111         uhash_setKeyDeleter(hash, uhash_deleteUnicodeString);
    112     }
    113 }
    114 
    115 inline Hashtable::Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp,
    116                  UErrorCode& status) : hash(0) {
    117     init( uhash_hashUnicodeString, keyComp, valueComp, status);
    118 }
    119 inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status)
    120  : hash(0)
    121 {
    122     init(ignoreKeyCase ? uhash_hashCaselessUnicodeString
    123                         : uhash_hashUnicodeString,
    124             ignoreKeyCase ? uhash_compareCaselessUnicodeString
    125                         : uhash_compareUnicodeString,
    126             NULL,
    127             status);
    128 }
    129 
    130 inline Hashtable::Hashtable(UErrorCode& status)
    131  : hash(0)
    132 {
    133     init(uhash_hashUnicodeString, uhash_compareUnicodeString, NULL, status);
    134 }
    135 
    136 inline Hashtable::Hashtable()
    137  : hash(0)
    138 {
    139     UErrorCode status = U_ZERO_ERROR;
    140     init(uhash_hashUnicodeString, uhash_compareUnicodeString, NULL, status);
    141 }
    142 
    143 inline Hashtable::~Hashtable() {
    144     if (hash != NULL) {
    145         uhash_close(hash);
    146     }
    147 }
    148 
    149 inline UObjectDeleter *Hashtable::setValueDeleter(UObjectDeleter *fn) {
    150     return uhash_setValueDeleter(hash, fn);
    151 }
    152 
    153 inline int32_t Hashtable::count() const {
    154     return uhash_count(hash);
    155 }
    156 
    157 inline void* Hashtable::put(const UnicodeString& key, void* value, UErrorCode& status) {
    158     return uhash_put(hash, new UnicodeString(key), value, &status);
    159 }
    160 
    161 inline int32_t Hashtable::puti(const UnicodeString& key, int32_t value, UErrorCode& status) {
    162     return uhash_puti(hash, new UnicodeString(key), value, &status);
    163 }
    164 
    165 inline void* Hashtable::get(const UnicodeString& key) const {
    166     return uhash_get(hash, &key);
    167 }
    168 
    169 inline int32_t Hashtable::geti(const UnicodeString& key) const {
    170     return uhash_geti(hash, &key);
    171 }
    172 
    173 inline void* Hashtable::remove(const UnicodeString& key) {
    174     return uhash_remove(hash, &key);
    175 }
    176 
    177 inline int32_t Hashtable::removei(const UnicodeString& key) {
    178     return uhash_removei(hash, &key);
    179 }
    180 
    181 inline const UHashElement* Hashtable::find(const UnicodeString& key) const {
    182     return uhash_find(hash, &key);
    183 }
    184 
    185 inline const UHashElement* Hashtable::nextElement(int32_t& pos) const {
    186     return uhash_nextElement(hash, &pos);
    187 }
    188 
    189 inline void Hashtable::removeAll(void) {
    190     uhash_removeAll(hash);
    191 }
    192 
    193 inline UKeyComparator* Hashtable::setKeyComparator(UKeyComparator*keyComp){
    194     return uhash_setKeyComparator(hash, keyComp);
    195 }
    196 
    197 inline UValueComparator* Hashtable::setValueComparator(UValueComparator* valueComp){
    198     return uhash_setValueComparator(hash, valueComp);
    199 }
    200 
    201 inline UBool Hashtable::equals(const Hashtable& that)const{
    202    return uhash_equals(hash, that.hash);
    203 }
    204 U_NAMESPACE_END
    205 
    206 #endif
    207 
    208