X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/729e4ab9bc6618bc3d8a898e575df7f4019e29ca..0f5d89e82340278ed3d7d50029f37cab2c41a57e:/icuSources/common/hash.h diff --git a/icuSources/common/hash.h b/icuSources/common/hash.h index 9fedd0e5..c6be4672 100644 --- a/icuSources/common/hash.h +++ b/icuSources/common/hash.h @@ -1,6 +1,8 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** -* Copyright (C) 1997-2010, International Business Machines +* Copyright (C) 1997-2014, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** * Date Name Description @@ -13,6 +15,7 @@ #include "unicode/unistr.h" #include "unicode/uobject.h" +#include "cmemory.h" #include "uhash.h" U_NAMESPACE_BEGIN @@ -30,6 +33,8 @@ class U_COMMON_API Hashtable : public UMemory { inline void init(UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status); + inline void initSize(UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, int32_t size, UErrorCode& status); + public: /** * Construct a hashtable @@ -38,6 +43,14 @@ public: */ Hashtable(UBool ignoreKeyCase, UErrorCode& status); + /** + * Construct a hashtable + * @param ignoreKeyCase If true, keys are case insensitive. + * @param size initial size allocation + * @param status Error code + */ + Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& status); + /** * Construct a hashtable * @param keyComp Comparator for comparing the keys @@ -73,9 +86,9 @@ public: int32_t puti(const UnicodeString& key, int32_t value, UErrorCode& status); void* get(const UnicodeString& key) const; - + int32_t geti(const UnicodeString& key) const; - + void* remove(const UnicodeString& key); int32_t removei(const UnicodeString& key); @@ -84,10 +97,14 @@ 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; @@ -100,7 +117,7 @@ private: * Implementation ********************************************************************/ -inline void Hashtable::init(UHashFunction *keyHash, UKeyComparator *keyComp, +inline void Hashtable::init(UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status) { if (U_FAILURE(status)) { return; @@ -108,14 +125,27 @@ inline void Hashtable::init(UHashFunction *keyHash, UKeyComparator *keyComp, uhash_init(&hashObj, keyHash, keyComp, valueComp, &status); if (U_SUCCESS(status)) { hash = &hashObj; - uhash_setKeyDeleter(hash, uhash_deleteUnicodeString); + uhash_setKeyDeleter(hash, uprv_deleteUObject); } } -inline Hashtable::Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, +inline void Hashtable::initSize(UHashFunction *keyHash, UKeyComparator *keyComp, + UValueComparator *valueComp, int32_t size, UErrorCode& status) { + if (U_FAILURE(status)) { + return; + } + uhash_initSize(&hashObj, keyHash, keyComp, valueComp, size, &status); + if (U_SUCCESS(status)) { + 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) { @@ -127,6 +157,17 @@ inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status) status); } +inline Hashtable::Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& status) + : hash(0) +{ + initSize(ignoreKeyCase ? uhash_hashCaselessUnicodeString + : uhash_hashUnicodeString, + ignoreKeyCase ? uhash_compareCaselessUnicodeString + : uhash_compareUnicodeString, + NULL, size, + status); +} + inline Hashtable::Hashtable(UErrorCode& status) : hash(0) { @@ -193,7 +234,7 @@ inline void Hashtable::removeAll(void) { inline UKeyComparator* Hashtable::setKeyComparator(UKeyComparator*keyComp){ return uhash_setKeyComparator(hash, keyComp); } - + inline UValueComparator* Hashtable::setValueComparator(UValueComparator* valueComp){ return uhash_setValueComparator(hash, valueComp); }